2 <script src="/js-test-resources/js-test.js"></script>
5 window.jsTestIsAsync = true;
6 description('Test that a registered Service Worker with an event handler is not garbage collected prematurely');
10 if (!window.internals) {
11 testFailed('This test requires internals.observeGC');
18 var worker = 'resources/empty-worker.js';
19 unregisterAndRegister(worker, scope).then(onRegister);
22 function unregisterAndRegister(url, scope) {
23 return navigator.serviceWorker.unregister(scope).then(function() {
24 return navigator.serviceWorker.register(url, { scope: scope });
25 }).catch(function(error) {
26 testFailed('Could not register worker: ' + error);
31 function assertServiceWorkerIsNotCollected() {
33 shouldBeFalse('swObservation.wasCollected')
36 function onRegister(sw) {
37 swObservation = internals.observeGC(sw);
38 sw.addEventListener('statechange', onStateChange);
39 setTimeout(assertServiceWorkerIsNotCollected, 0);
42 function onStateChange(event) {
43 assertServiceWorkerIsNotCollected();
45 if (event.target.state != 'active')
47 navigator.serviceWorker.unregister(scope).then(onUnregister);
50 function onUnregister()
52 // FIXME: Assert that the ServiceWorker *is* collected when the 'redundant' state is implemented.
53 assertServiceWorkerIsNotCollected();