@@ -747,6 +747,58 @@ describe('$location', function() {
747
747
} ) ;
748
748
749
749
750
+ //https://github.com/angular/angular.js/issues/16592
751
+ it ( 'should not infinitely digest when initial params contain a quote' , function ( ) {
752
+ initService ( { html5Mode :true , supportHistory :true } ) ;
753
+ mockUpBrowser ( { initialUrl :'http://localhost:9876/?q=\'' , baseHref :'/' } ) ;
754
+ inject ( function ( $location , $browser , $rootScope ) {
755
+ expect ( function ( ) {
756
+ $rootScope . $digest ( ) ;
757
+ } ) . not . toThrow ( ) ;
758
+ } ) ;
759
+ } ) ;
760
+
761
+
762
+ //https://github.com/angular/angular.js/issues/16592
763
+ it ( 'should not infinitely digest when initial params contain an escaped quote' , function ( ) {
764
+ initService ( { html5Mode :true , supportHistory :true } ) ;
765
+ mockUpBrowser ( { initialUrl :'http://localhost:9876/?q=%27' , baseHref :'/' } ) ;
766
+ inject ( function ( $location , $browser , $rootScope ) {
767
+ expect ( function ( ) {
768
+ $rootScope . $digest ( ) ;
769
+ } ) . not . toThrow ( ) ;
770
+ } ) ;
771
+ } ) ;
772
+
773
+
774
+ //https://github.com/angular/angular.js/issues/16592
775
+ it ( 'should not infinitely digest when updating params containing a quote (via $browser.url)' , function ( ) {
776
+ initService ( { html5Mode :true , supportHistory :true } ) ;
777
+ mockUpBrowser ( { initialUrl :'http://localhost:9876/' , baseHref :'/' } ) ;
778
+ inject ( function ( $location , $browser , $rootScope ) {
779
+ $rootScope . $digest ( ) ;
780
+ $browser . url ( 'http://localhost:9876/?q=\'' ) ;
781
+ expect ( function ( ) {
782
+ $rootScope . $digest ( ) ;
783
+ } ) . not . toThrow ( ) ;
784
+ } ) ;
785
+ } ) ;
786
+
787
+
788
+ //https://github.com/angular/angular.js/issues/16592
789
+ it ( 'should not infinitely digest when updating params containing a quote (via window.location + popstate)' , function ( ) {
790
+ initService ( { html5Mode :true , supportHistory :true } ) ;
791
+ mockUpBrowser ( { initialUrl :'http://localhost:9876/' , baseHref :'/' } ) ;
792
+ inject ( function ( $window , $location , $browser , $rootScope ) {
793
+ $rootScope . $digest ( ) ;
794
+ $window . location . href = 'http://localhost:9876/?q=\'' ;
795
+ expect ( function ( ) {
796
+ jqLite ( $window ) . triggerHandler ( 'popstate' ) ;
797
+ } ) . not . toThrow ( ) ;
798
+ } ) ;
799
+ } ) ;
800
+
801
+
750
802
describe ( 'when changing the browser URL/history directly during a `$digest`' , function ( ) {
751
803
752
804
beforeEach ( function ( ) {
@@ -804,10 +856,13 @@ describe('$location', function() {
804
856
} ) ;
805
857
806
858
807
- function updatePathOnLocationChangeSuccessTo ( newPath ) {
859
+ function updatePathOnLocationChangeSuccessTo ( newPath , newParams ) {
808
860
inject ( function ( $rootScope , $location ) {
809
861
$rootScope . $on ( '$locationChangeSuccess' , function ( event , newUrl , oldUrl ) {
810
862
$location . path ( newPath ) ;
863
+ if ( newParams ) {
864
+ $location . search ( newParams ) ;
865
+ }
811
866
} ) ;
812
867
} ) ;
813
868
}
@@ -950,6 +1005,25 @@ describe('$location', function() {
950
1005
expect ( $browserUrl ) . not . toHaveBeenCalled ( ) ;
951
1006
} ) ;
952
1007
} ) ;
1008
+
1009
+ //https://github.com/angular/angular.js/issues/16592
1010
+ it ( 'should not infinite $digest when going to base URL with trailing slash when $locationChangeSuccess watcher changes query params to contain quote' , function ( ) {
1011
+ initService ( { html5Mode : true , supportHistory : true } ) ;
1012
+ mockUpBrowser ( { initialUrl :'http://server/app/' , baseHref :'/app/' } ) ;
1013
+ inject ( function ( $rootScope , $injector , $browser ) {
1014
+ var $browserUrl = spyOnlyCallsWithArgs ( $browser , 'url' ) . and . callThrough ( ) ;
1015
+
1016
+ var $location = $injector . get ( '$location' ) ;
1017
+ updatePathOnLocationChangeSuccessTo ( '/' , { q : '\'' } ) ;
1018
+
1019
+ $rootScope . $digest ( ) ;
1020
+
1021
+ expect ( $browser . url ( ) ) . toEqual ( 'http://server/app/?q=%27' ) ;
1022
+ expect ( $location . path ( ) ) . toEqual ( '/' ) ;
1023
+ expect ( $location . search ( ) ) . toEqual ( { q : '\'' } ) ;
1024
+ expect ( $browserUrl ) . toHaveBeenCalledTimes ( 1 ) ;
1025
+ } ) ;
1026
+ } ) ;
953
1027
} ) ;
954
1028
955
1029
} ) ;
@@ -1140,6 +1214,42 @@ describe('$location', function() {
1140
1214
} ) ;
1141
1215
} ) ;
1142
1216
1217
+ //https://github.com/angular/angular.js/issues/16592
1218
+ it ( 'should not infinite $digest on pushState() with quote in param' , function ( ) {
1219
+ initService ( { html5Mode : true , supportHistory : true } ) ;
1220
+ mockUpBrowser ( { initialUrl :'http://server/app/' , baseHref :'/app/' } ) ;
1221
+ inject ( function ( $rootScope , $injector , $browser , $window ) {
1222
+ var $location = $injector . get ( '$location' ) ;
1223
+ $rootScope . $digest ( ) ; //allow $location initialization to finish
1224
+
1225
+ $window . history . pushState ( { } , null , 'http://server/app/Home?q=\'' ) ;
1226
+ $rootScope . $digest ( ) ;
1227
+
1228
+ expect ( $browser . url ( ) ) . toEqual ( 'http://server/app/Home?q=%27' ) ;
1229
+ expect ( $location . absUrl ( ) ) . toEqual ( 'http://server/app/Home?q=\'' ) ;
1230
+ expect ( $location . path ( ) ) . toEqual ( '/Home' ) ;
1231
+ expect ( $location . search ( ) ) . toEqual ( { q : '\'' } ) ;
1232
+ } ) ;
1233
+ } ) ;
1234
+
1235
+ //https://github.com/angular/angular.js/issues/16592
1236
+ it ( 'should not infinite $digest on popstate event with quote in param' , function ( ) {
1237
+ initService ( { html5Mode : true , supportHistory : true } ) ;
1238
+ mockUpBrowser ( { initialUrl :'http://server/app/' , baseHref :'/app/' } ) ;
1239
+ inject ( function ( $rootScope , $injector , $browser , $window ) {
1240
+ var $location = $injector . get ( '$location' ) ;
1241
+ $rootScope . $digest ( ) ; //allow $location initialization to finish
1242
+
1243
+ $window . location . href = 'http://server/app/Home?q=\'' ;
1244
+ jqLite ( $window ) . triggerHandler ( 'popstate' ) ;
1245
+
1246
+ expect ( $browser . url ( ) ) . toEqual ( 'http://server/app/Home?q=%27' ) ;
1247
+ expect ( $location . absUrl ( ) ) . toEqual ( 'http://server/app/Home?q=\'' ) ;
1248
+ expect ( $location . path ( ) ) . toEqual ( '/Home' ) ;
1249
+ expect ( $location . search ( ) ) . toEqual ( { q : '\'' } ) ;
1250
+ } ) ;
1251
+ } ) ;
1252
+
1143
1253
it ( 'should replace browser url & state when replace() was called at least once' , function ( ) {
1144
1254
initService ( { html5Mode :true , supportHistory : true } ) ;
1145
1255
mockUpBrowser ( { initialUrl :'http://new.com/a/b/' , baseHref :'/a/b/' } ) ;
0 commit comments