@@ -303,9 +303,7 @@ function LocationHashbangInHtml5Url(appBase, hashPrefix) {
303
303
}
304
304
305
305
306
- LocationHashbangInHtml5Url . prototype =
307
- LocationHashbangUrl . prototype =
308
- LocationHtml5Url . prototype = {
306
+ var locationPrototype = {
309
307
310
308
/**
311
309
* Are we in html5 mode?
@@ -314,7 +312,7 @@ LocationHashbangInHtml5Url.prototype =
314
312
$$html5 : false ,
315
313
316
314
/**
317
- * Has any change been replacing ?
315
+ * Has any change been replacing?
318
316
* @private
319
317
*/
320
318
$$replace : false ,
@@ -530,6 +528,100 @@ LocationHashbangInHtml5Url.prototype =
530
528
}
531
529
} ;
532
530
531
+ forEach ( [ LocationHashbangInHtml5Url , LocationHashbangUrl , LocationHtml5Url ] , function ( Location ) {
532
+ extend ( Location . prototype = { } , locationPrototype ) ;
533
+ } ) ;
534
+
535
+ /**
536
+ * @name $location#$$state
537
+ *
538
+ * Current History API state.
539
+ * @private
540
+ */
541
+ LocationHtml5Url . prototype . $$state = null ;
542
+
543
+ /**
544
+ * @name $location#$$title
545
+ *
546
+ * Current History API title.
547
+ * @private
548
+ */
549
+ LocationHtml5Url . prototype . $$title = '' ;
550
+
551
+ /**
552
+ * @ngdoc method
553
+ * @name $location#state.
554
+ *
555
+ * @description
556
+ * Return current history state.
557
+ *
558
+ * NOTE: this method is available only in HTML5 mode and only in browsers supporting
559
+ * HTML5 History API. If you need to support older browsers (like IE9), don't use this
560
+ * method!
561
+ *
562
+ * @return {object } state
563
+ */
564
+ LocationHtml5Url . prototype . state = function ( ) {
565
+ return this . $$state ;
566
+ } ;
567
+
568
+ /**
569
+ * @ngdoc method
570
+ * @name $location#pushState
571
+ *
572
+ * @description
573
+ * Invokes history.pushState. Changes url, state and title.
574
+ *
575
+ * NOTE: this method is available only in HTML5 mode and only in browsers supporting
576
+ * HTML5 History API. If you need to support older browsers (like IE9), don't use this
577
+ * method!
578
+ *
579
+ * @param {object= } state object for pushState
580
+ * @param {string= } title for pushState (ignored by most browsers)
581
+ * @param {string= } url New url without base prefix (e.g. `/path?a=b#hash`)
582
+ * @return {object } $location
583
+ */
584
+ LocationHtml5Url . prototype . pushState = function ( state , title , url , replace ) {
585
+ this . $$state = copy ( state ) ;
586
+ this . $$title = title ;
587
+ this . $$replace = replace ;
588
+ this . url ( url , replace ) ;
589
+ return this ;
590
+ } ;
591
+
592
+ /**
593
+ * @ngdoc method
594
+ * @name $location#replaceState.
595
+ *
596
+ * @description
597
+ * Invokes history.replaceState. Changes url, state and title.
598
+ *
599
+ * NOTE: this method is available only in HTML5 mode and only in browsers supporting
600
+ * HTML5 History API. If you need to support older browsers (like IE9), don't use this
601
+ * method!
602
+ *
603
+ * @param {object= } state object for replaceState
604
+ * @param {string= } title for replaceState (ignored by most browsers)
605
+ * @param {string= } url New url without base prefix (e.g. `/path?a=b#hash`)
606
+ * @return {object } $location
607
+ */
608
+ LocationHtml5Url . prototype . replaceState = function ( state , title , url ) {
609
+ this . pushState ( state , title , url , true ) ;
610
+ return this ;
611
+ } ;
612
+
613
+
614
+ LocationHashbangInHtml5Url . prototype . state =
615
+ LocationHashbangInHtml5Url . prototype . pushState =
616
+ LocationHashbangInHtml5Url . prototype . replaceState =
617
+ LocationHashbangUrl . prototype . state =
618
+ LocationHashbangUrl . prototype . pushState =
619
+ LocationHashbangUrl . prototype . replaceState = function ( ) {
620
+ throw $locationMinErr ( 'psthtml4' , 'History API state-related methods are available only ' +
621
+ 'in HTML5 mode and only in browsers supporting HTML5 History API' ) ;
622
+ } ;
623
+
624
+
533
625
function locationGetter ( property ) {
534
626
return function ( ) {
535
627
return this [ property ] ;
@@ -717,7 +809,7 @@ function $LocationProvider(){
717
809
}
718
810
719
811
// update $location when $browser url changes
720
- $browser . onUrlChange ( function ( newUrl ) {
812
+ $browser . onUrlChange ( function ( newUrl , state , title ) {
721
813
if ( $location . absUrl ( ) != newUrl ) {
722
814
$rootScope . $evalAsync ( function ( ) {
723
815
var oldUrl = $location . absUrl ( ) ;
@@ -726,9 +818,9 @@ function $LocationProvider(){
726
818
if ( $rootScope . $broadcast ( '$locationChangeStart' , newUrl ,
727
819
oldUrl ) . defaultPrevented ) {
728
820
$location . $$parse ( oldUrl ) ;
729
- $browser . url ( oldUrl ) ;
821
+ $browser . url ( $location . absUrl ( ) , false , state , title ) ;
730
822
} else {
731
- afterLocationChange ( oldUrl ) ;
823
+ afterLocationChange ( oldUrl , state , title ) ;
732
824
}
733
825
} ) ;
734
826
if ( ! $rootScope . $$phase ) $rootScope . $digest ( ) ;
@@ -740,28 +832,32 @@ function $LocationProvider(){
740
832
$rootScope . $watch ( function $locationWatch ( ) {
741
833
var oldUrl = $browser . url ( ) ;
742
834
var currentReplace = $location . $$replace ;
835
+ var currentState = $location . $$state ;
836
+ var currentTitle = $location . $$title ;
743
837
744
838
if ( ! changeCounter || oldUrl != $location . absUrl ( ) ) {
745
839
changeCounter ++ ;
746
840
$rootScope . $evalAsync ( function ( ) {
747
- if ( $rootScope . $broadcast ( '$locationChangeStart' , $location . absUrl ( ) , oldUrl ) .
841
+ if ( $rootScope . $broadcast ( '$locationChangeStart' , $location . absUrl ( ) , oldUrl , currentState , currentTitle ) .
748
842
defaultPrevented ) {
749
843
$location . $$parse ( oldUrl ) ;
750
844
} else {
751
- $browser . url ( $location . absUrl ( ) , currentReplace ) ;
752
- afterLocationChange ( oldUrl ) ;
845
+ $browser . url ( $location . absUrl ( ) , currentReplace , currentState , currentTitle ) ;
846
+ afterLocationChange ( oldUrl , currentState , currentTitle ) ;
753
847
}
754
848
} ) ;
755
849
}
756
850
$location . $$replace = false ;
851
+ delete $location . $$state ;
852
+ delete $location . $$title ;
757
853
758
854
return changeCounter ;
759
855
} ) ;
760
856
761
857
return $location ;
762
858
763
- function afterLocationChange ( oldUrl ) {
764
- $rootScope . $broadcast ( '$locationChangeSuccess' , $location . absUrl ( ) , oldUrl ) ;
859
+ function afterLocationChange ( oldUrl , state , title ) {
860
+ $rootScope . $broadcast ( '$locationChangeSuccess' , $location . absUrl ( ) , oldUrl , state , title ) ;
765
861
}
766
862
} ] ;
767
863
}
0 commit comments