@@ -94,15 +94,26 @@ describe('$anchorScroll', function() {
94
94
elmSpy = { } ;
95
95
windowSpies = { } ;
96
96
97
- $provide . value ( '$window' , {
97
+ var mockedWin = {
98
98
scrollTo : ( windowSpies . scrollTo = jasmine . createSpy ( '$window.scrollTo' ) ) ,
99
99
scrollBy : ( windowSpies . scrollBy = jasmine . createSpy ( '$window.scrollBy' ) ) ,
100
100
document : createMockDocument ( initialReadyState ) ,
101
101
navigator : { } ,
102
102
getComputedStyle : function ( elem ) {
103
103
return getComputedStyle ( elem ) ;
104
+ } ,
105
+ addEventListener : function ( eventType , callback , unsupported ) {
106
+ window . addEventListener ( eventType , callback , unsupported ) ;
107
+ } ,
108
+ removeEventListener : function ( eventType , callback , unsupported ) {
109
+ window . removeEventListener ( eventType , callback , unsupported ) ;
104
110
}
105
- } ) ;
111
+ } ;
112
+
113
+ windowSpies . addEventListener = spyOn ( mockedWin , 'addEventListener' ) . andCallThrough ( ) ;
114
+ windowSpies . removeEventListener = spyOn ( mockedWin , 'removeEventListener' ) . andCallThrough ( ) ;
115
+
116
+ $provide . value ( '$window' , mockedWin ) ;
106
117
} ) ;
107
118
} ;
108
119
}
@@ -152,16 +163,6 @@ describe('$anchorScroll', function() {
152
163
} ;
153
164
}
154
165
155
- function updateMockReadyState ( newState ) {
156
- return function ( $browser , $window ) {
157
- // It is possible that this operation adds tasks to the asyncQueue (needs flushing)
158
- $window . document . updateReadyState ( newState ) ;
159
- if ( $browser . deferredFns . length ) {
160
- $browser . defer . flush ( ) ;
161
- }
162
- } ;
163
- }
164
-
165
166
166
167
afterEach ( inject ( function ( $browser , $document ) {
167
168
expect ( $browser . deferredFns . length ) . toBe ( 0 ) ;
@@ -223,71 +224,73 @@ describe('$anchorScroll', function() {
223
224
224
225
describe ( 'with respect to `document.readyState`' , function ( ) {
225
226
227
+ function triggerLoadEvent ( ) {
228
+ return function ( $browser , $window ) {
229
+ // It is possible that this operation adds tasks to the asyncQueue (needs flushing)
230
+ $window . document . readyState = 'complete' ;
231
+ jqLite ( $window ) . triggerHandler ( 'load' ) ;
232
+ if ( $browser . deferredFns . length ) {
233
+ $browser . defer . flush ( ) ;
234
+ }
235
+ } ;
236
+ }
237
+
226
238
beforeEach ( createMockWindow ( 'interactive' ) ) ;
227
239
228
240
229
- it ( 'should wait for `document.readyState === "complete" ' , inject (
241
+ it ( 'should wait for the `load` event ' , inject (
230
242
addElements ( 'id=some1' ) ,
231
243
232
244
changeHashTo ( 'some1' ) ,
233
245
expectNoScrolling ( ) ,
234
246
235
- updateMockReadyState ( 'some-arbitrary-state' ) ,
236
- expectNoScrolling ( ) ,
237
-
238
- updateMockReadyState ( 'complete' ) ,
247
+ triggerLoadEvent ( ) ,
239
248
expectScrollingTo ( 'id=some1' ) ) ) ;
240
249
241
250
242
- it ( 'should only register once for execution when `document. readyState === "complete"' , inject (
251
+ it ( 'should only register one listener while ` readyState !== "complete"` ' , inject (
243
252
addElements ( 'id=some1' , 'id=some2' ) ,
244
253
245
- changeHashTo ( 'some1' ) ,
246
- changeHashTo ( 'some2' ) ,
247
- updateMockReadyState ( 'some-other-arbitrary-state' ) ,
248
254
changeHashTo ( 'some1' ) ,
249
255
changeHashTo ( 'some2' ) ,
250
256
expectNoScrolling ( ) ,
251
257
252
- updateMockReadyState ( 'complete' ) ,
258
+ triggerLoadEvent ( ) ,
253
259
expectScrollingTo ( 'id=some2' ) ) ) ;
254
260
255
261
256
- it ( 'should properly register and unregister listeners for `readystatechange ` event' , inject (
262
+ it ( 'should properly register and unregister listeners for the `load ` event' , inject (
257
263
addElements ( 'id=some1' , 'id=some2' ) ,
258
264
259
265
changeHashTo ( 'some1' ) ,
260
266
changeHashTo ( 'some2' ) ,
261
- updateMockReadyState ( 'some-other-arbitrary-state' ) ,
262
- changeHashTo ( 'some1' ) ,
263
- changeHashTo ( 'some2' ) ,
264
- updateMockReadyState ( 'complete' ) ,
267
+ triggerLoadEvent ( ) ,
265
268
266
269
function ( ) {
267
- expect ( docSpies . addEventListener . callCount ) . toBe ( 1 ) ;
268
- expect ( docSpies . addEventListener ) .
269
- toHaveBeenCalledWith ( 'readystatechange ' , jasmine . any ( Function ) ) ;
270
+ expect ( windowSpies . addEventListener . callCount ) . toBe ( 1 ) ;
271
+ expect ( windowSpies . addEventListener ) .
272
+ toHaveBeenCalledWith ( 'load ' , jasmine . any ( Function ) , false ) ;
270
273
271
- expect ( docSpies . removeEventListener . callCount ) . toBe ( 1 ) ;
272
- expect ( docSpies . removeEventListener ) .
273
- toHaveBeenCalledWith ( 'readystatechange ' , jasmine . any ( Function ) ) ;
274
+ expect ( windowSpies . removeEventListener . callCount ) . toBe ( 1 ) ;
275
+ expect ( windowSpies . removeEventListener ) .
276
+ toHaveBeenCalledWith ( 'load ' , jasmine . any ( Function ) , false ) ;
274
277
275
- var registeredListener = docSpies . addEventListener . calls [ 0 ] . args [ 1 ] ;
276
- var unregisteredListener = docSpies . removeEventListener . calls [ 0 ] . args [ 1 ] ;
278
+ var registeredListener = windowSpies . addEventListener . calls [ 0 ] . args [ 1 ] ;
279
+ var unregisteredListener = windowSpies . removeEventListener . calls [ 0 ] . args [ 1 ] ;
277
280
expect ( unregisteredListener ) . toBe ( registeredListener ) ;
278
281
} ) ) ;
279
282
280
283
281
284
it ( 'should scroll immediately if already `readyState === "complete"`' , inject (
282
285
addElements ( 'id=some1' ) ,
283
286
284
- updateMockReadyState ( 'complete' ) ,
287
+ triggerLoadEvent ( ) ,
285
288
changeHashTo ( 'some1' ) ,
286
289
287
290
expectScrollingTo ( 'id=some1' ) ,
288
291
function ( ) {
289
- expect ( docSpies . addEventListener . callCount ) . toBe ( 0 ) ;
290
- expect ( docSpies . removeEventListener . callCount ) . toBe ( 0 ) ;
292
+ expect ( windowSpies . addEventListener . callCount ) . toBe ( 0 ) ;
293
+ expect ( windowSpies . removeEventListener . callCount ) . toBe ( 0 ) ;
291
294
} ) ) ;
292
295
} ) ;
293
296
0 commit comments