Chromium Code Reviews| Index: LayoutTests/http/tests/serviceworker/service-worker-gc.html |
| diff --git a/LayoutTests/http/tests/serviceworker/service-worker-gc.html b/LayoutTests/http/tests/serviceworker/service-worker-gc.html |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..0b64e05cf65b9779d9b316b57035847de43686a6 |
| --- /dev/null |
| +++ b/LayoutTests/http/tests/serviceworker/service-worker-gc.html |
| @@ -0,0 +1,65 @@ |
| +<!DOCTYPE html> |
| +<script src="/js-test-resources/js-test.js"></script> |
| +<body> |
| +<script> |
| +(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.
|
| + window.jsTestIsAsync = true; |
| + description('Test that a registered Service Worker with an event handler is not garbage collected prematurely'); |
| + var worker = 'resources/empty-worker.js'; |
| + var scope = 'gc'; |
| + swObservation = null; |
| + failed = false; |
| + |
| + unregister_and_register(worker, scope).then(onRegister); |
| + |
| + function unregister_and_register(url, scope) { |
| + return navigator.serviceWorker.unregister(scope).then(function() { |
| + return navigator.serviceWorker.register(url, { scope: scope }); |
| + }).catch(function(error) { |
| + debug('Could not register worker: ' + error); |
| + finishJSTest(); |
| + }); |
| + } |
| + |
| + 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.
|
| + debug('FAIL: ' + message); |
| + failed = true; |
| + } |
| + |
| + function collectGarbage(shouldBeCollected, message) { |
| + gc(); |
| + if (swObservation.wasCollected != shouldBeCollected) |
| + fail(message); |
| + } |
| + |
| + function onUnregister() { |
| + // FIXME: The expectation should be reversed, but our implementation currently 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.
|
| + // When properly implemented, the SW not leak here. It may be better to move this test into a separate, targeted file. |
| + collectGarbage(false, 'Service Worker should not leak after unregistration'); |
| + if (!failed) |
| + debug('Test passed'); |
| + finishJSTest(); |
| + } |
| + |
| + function onRegister(sw) { |
| + if (window.internals) |
| + swObservation = internals.observeGC(sw); |
| + 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.
|
| + fail('This test requires internals.observeGC'); |
| + finishJSTest(); |
| + return; |
| + } |
| + |
| + sw.addEventListener('statechange', onStateChange); |
| + 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
|
| + } |
| + |
| + function onStateChange(event) { |
| + collectGarbage(false, 'Service Worker should not be gc\'d in ' + event.target.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
|
| + if (event.target.state != 'active') |
| + return; |
| + navigator.serviceWorker.unregister(scope).then(onUnregister); |
| + } |
| +}()); |
| +</script> |
| +</body> |