Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(196)

Unified Diff: LayoutTests/http/tests/serviceworker/service-worker-gc.html

Issue 330173003: Make ServiceWorker an ActiveDOMObject (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: revise test Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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>

Powered by Google App Engine
This is Rietveld 408576698