OLD | NEW |
---|---|
(Empty) | |
1 <!DOCTYPE html> | |
2 <script src="/js-test-resources/js-test.js"></script> | |
3 <body> | |
4 <script> | |
5 (function() { | |
dominicc (has gone to gerrit)
2014/06/14 20:02:47
I think that this test would be OK without this cl
falken
2014/06/16 00:58:57
Done.
| |
6 window.jsTestIsAsync = true; | |
7 description('Test that a registered Service Worker with an event handler is not garbage collected prematurely'); | |
8 var worker = 'resources/empty-worker.js'; | |
9 var scope = 'gc'; | |
10 swObservation = null; | |
11 failed = false; | |
12 | |
13 unregister_and_register(worker, scope).then(onRegister); | |
14 | |
15 function unregister_and_register(url, scope) { | |
16 return navigator.serviceWorker.unregister(scope).then(function() { | |
17 return navigator.serviceWorker.register(url, { scope: scope }); | |
18 }).catch(function(error) { | |
19 debug('Could not register worker: ' + error); | |
20 finishJSTest(); | |
21 }); | |
22 } | |
23 | |
24 function fail(message) { | |
dominicc (has gone to gerrit)
2014/06/14 20:02:47
Doesn't the thing that provides debug also have th
falken
2014/06/16 00:58:57
Done.
| |
25 debug('FAIL: ' + message); | |
26 failed = true; | |
27 } | |
28 | |
29 function collectGarbage(shouldBeCollected, message) { | |
30 gc(); | |
31 if (swObservation.wasCollected != shouldBeCollected) | |
32 fail(message); | |
33 } | |
34 | |
35 function onUnregister() { | |
36 // FIXME: The expectation should be reversed, but our implementation cur rently fails it. | |
dominicc (has gone to gerrit)
2014/06/14 20:02:47
I think you can make the FIXME clearer, something
falken
2014/06/16 00:58:57
Done.
| |
37 // When properly implemented, the SW not leak here. It may be better to move this test into a separate, targeted file. | |
38 collectGarbage(false, 'Service Worker should not leak after unregistrati on'); | |
39 if (!failed) | |
40 debug('Test passed'); | |
41 finishJSTest(); | |
42 } | |
43 | |
44 function onRegister(sw) { | |
45 if (window.internals) | |
46 swObservation = internals.observeGC(sw); | |
47 if (!swObservation) { | |
dominicc (has gone to gerrit)
2014/06/14 20:02:47
It might be simpler to test for window.internals a
falken
2014/06/16 00:58:57
Done.
| |
48 fail('This test requires internals.observeGC'); | |
49 finishJSTest(); | |
50 return; | |
51 } | |
52 | |
53 sw.addEventListener('statechange', onStateChange); | |
54 setTimeout(collectGarbage.bind(undefined, false, 'Service Worker should not be gc\'d after registration'), 0); | |
dominicc (has gone to gerrit)
2014/06/14 20:02:47
setTimeout and the statechange events inevitably r
| |
55 } | |
56 | |
57 function onStateChange(event) { | |
58 collectGarbage(false, 'Service Worker should not be gc\'d in ' + event.t arget.state + ' state'); | |
dominicc (has gone to gerrit)
2014/06/14 20:02:47
The calls to collectGarbage are confusing in that
falken
2014/06/16 00:58:57
OK, done. I thought it'd be nice to avoid time out
| |
59 if (event.target.state != 'active') | |
60 return; | |
61 navigator.serviceWorker.unregister(scope).then(onUnregister); | |
62 } | |
63 }()); | |
64 </script> | |
65 </body> | |
OLD | NEW |