Chromium Code Reviews| 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 |