OLD | NEW |
---|---|
1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
2 <script src="/js-test-resources/js-test.js"></script> | 2 <script src="/js-test-resources/js-test.js"></script> |
3 <script> | 3 <script> |
4 window.jsTestIsAsync = true; | 4 window.jsTestIsAsync = true; |
5 description('Test that a registered Service Worker with an event handler is not garbage collected prematurely'); | 5 description('Test that a registered Service Worker with an event handler is not garbage collected prematurely'); |
6 var swObservation = null; | 6 var swObservation = null; |
7 var scope = 'gc'; | 7 var scope = 'gc'; |
8 | 8 |
9 if (!window.internals) { | 9 if (!window.internals) { |
10 testFailed('This test requires internals.observeGC'); | 10 testFailed('This test requires internals.observeGC'); |
11 finishJSTest(); | 11 finishJSTest(); |
12 } else { | 12 } else { |
13 setup(); | 13 setup(); |
14 } | 14 } |
15 | 15 |
16 function setup() { | 16 function setup() { |
17 var worker = '../resources/empty-worker.js'; | 17 var worker = '../resources/empty-worker.js'; |
18 unregisterAndRegister(worker, scope).then(onRegister); | 18 unregisterAndRegister(worker, scope).then(onRegister); |
19 } | 19 } |
20 | 20 |
21 function unregisterAndRegister(url, scope) { | 21 function unregisterAndRegister(url, scope) { |
22 return navigator.serviceWorker.unregister(scope).then(function() { | 22 return navigator.serviceWorker.unregister(scope).then(function() { |
23 return navigator.serviceWorker.register(url, { scope: scope }); | 23 return navigator.serviceWorker.register(url, { scope: scope }); |
24 }).catch(function(error) { | 24 }).catch(function(error) { |
25 testFailed('Could not register worker: ' + error); | 25 testFailed('Could not register worker: ' + error); |
26 finishJSTest(); | 26 finishJSTest(); |
27 }); | 27 }); |
28 } | 28 } |
29 | 29 |
30 function onRegister(sw) { | 30 function onRegister(registration) { |
31 registrationObservation = internals.observeGC(registration); | |
falken
2014/08/14 04:46:11
observeGC just returns an observer you can use to
horo
2014/08/14 07:11:46
Done.
| |
32 registration.addEventListener('updatefound', (function() { | |
33 onUpdate(registration.installing); | |
34 })); | |
35 } | |
36 | |
37 function onUpdate(sw) { | |
31 swObservation = internals.observeGC(sw); | 38 swObservation = internals.observeGC(sw); |
32 sw.addEventListener('statechange', onStateChange); | 39 sw.addEventListener('statechange', onStateChange); |
33 } | 40 } |
34 | 41 |
35 function onStateChange(event) { | 42 function onStateChange(event) { |
36 // Use setTimeout to ensure a fresh stack with no references to the worker. | 43 // Use setTimeout to ensure a fresh stack with no references to the worker. |
37 switch (event.target.state) { | 44 switch (event.target.state) { |
38 case 'activated': | 45 case 'activated': |
39 setTimeout(unregister, 0); | 46 setTimeout(unregister, 0); |
40 break; | 47 break; |
(...skipping 14 matching lines...) Expand all Loading... | |
55 }); | 62 }); |
56 } | 63 } |
57 | 64 |
58 function finish() | 65 function finish() |
59 { | 66 { |
60 gc(); | 67 gc(); |
61 shouldBeTrue('swObservation.wasCollected'); | 68 shouldBeTrue('swObservation.wasCollected'); |
62 finishJSTest(); | 69 finishJSTest(); |
63 } | 70 } |
64 </script> | 71 </script> |
OLD | NEW |