@@ -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 ] ;
@@ -738,7 +830,7 @@ function $LocationProvider(){
738
830
}
739
831
740
832
// update $location when $browser url changes
741
- $browser . onUrlChange ( function ( newUrl ) {
833
+ $browser . onUrlChange ( function ( newUrl , state , title ) {
742
834
if ( $location . absUrl ( ) != newUrl ) {
743
835
$rootScope . $evalAsync ( function ( ) {
744
836
var oldUrl = $location . absUrl ( ) ;
@@ -747,9 +839,9 @@ function $LocationProvider(){
747
839
if ( $rootScope . $broadcast ( '$locationChangeStart' , newUrl ,
748
840
oldUrl ) . defaultPrevented ) {
749
841
$location . $$parse ( oldUrl ) ;
750
- $browser . url ( oldUrl ) ;
842
+ $browser . url ( $location . absUrl ( ) , false , state , title ) ;
751
843
} else {
752
- afterLocationChange ( oldUrl ) ;
844
+ afterLocationChange ( oldUrl , state , title ) ;
753
845
}
754
846
} ) ;
755
847
if ( ! $rootScope . $$phase ) $rootScope . $digest ( ) ;
@@ -761,28 +853,32 @@ function $LocationProvider(){
761
853
$rootScope . $watch ( function $locationWatch ( ) {
762
854
var oldUrl = $browser . url ( ) ;
763
855
var currentReplace = $location . $$replace ;
856
+ var currentState = $location . $$state ;
857
+ var currentTitle = $location . $$title ;
764
858
765
859
if ( ! changeCounter || oldUrl != $location . absUrl ( ) ) {
766
860
changeCounter ++ ;
767
861
$rootScope . $evalAsync ( function ( ) {
768
- if ( $rootScope . $broadcast ( '$locationChangeStart' , $location . absUrl ( ) , oldUrl ) .
862
+ if ( $rootScope . $broadcast ( '$locationChangeStart' , $location . absUrl ( ) , oldUrl , currentState , currentTitle ) .
769
863
defaultPrevented ) {
770
864
$location . $$parse ( oldUrl ) ;
771
865
} else {
772
- $browser . url ( $location . absUrl ( ) , currentReplace ) ;
773
- afterLocationChange ( oldUrl ) ;
866
+ $browser . url ( $location . absUrl ( ) , currentReplace , currentState , currentTitle ) ;
867
+ afterLocationChange ( oldUrl , currentState , currentTitle ) ;
774
868
}
775
869
} ) ;
776
870
}
777
871
$location . $$replace = false ;
872
+ delete $location . $$state ;
873
+ delete $location . $$title ;
778
874
779
875
return changeCounter ;
780
876
} ) ;
781
877
782
878
return $location ;
783
879
784
- function afterLocationChange ( oldUrl ) {
785
- $rootScope . $broadcast ( '$locationChangeSuccess' , $location . absUrl ( ) , oldUrl ) ;
880
+ function afterLocationChange ( oldUrl , state , title ) {
881
+ $rootScope . $broadcast ( '$locationChangeSuccess' , $location . absUrl ( ) , oldUrl , state , title ) ;
786
882
}
787
883
} ] ;
788
884
}
0 commit comments