<!DOCTYPE html> <title>ExtendableEvent: waitUntil</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="resources/test-helpers.sub.js"></script> <script> function runTest(test, scope, onRegister) { var script = 'resources/extendable-event-waituntil.js?' + scope; service_worker_unregister_and_register(test, script, scope) .then(function(registration) { onRegister(registration.installing); }); } // Sends a SYN to the worker and asynchronously listens for an ACK; sets // |obj.synced| to true once ack'd. function syncWorker(test, worker, obj) { var channel = new MessageChannel(); channel.port1.onmessage = test.step_func(function(e) { var message = e.data; assert_equals(message, 'SYNC', 'Should receive sync message from worker.'); obj.synced = true; channel.port1.postMessage('ACK'); }); worker.postMessage({port: channel.port2}, [channel.port2]); } async_test(function(t) { // Passing scope as the test switch for worker script. var scope = 'resources/install-fulfilled'; var onRegister = function(worker) { var obj = {}; wait_for_state(t, worker, 'installed') .then(function() { assert_true( obj.synced, 'state should be "installed" after the waitUntil promise ' + 'for "oninstall" is fulfilled.'); service_worker_unregister_and_done(t, scope); }) .catch(unreached_rejection(t)); syncWorker(t, worker, obj); }; runTest(t, scope, onRegister); }, 'Test install event waitUntil fulfilled'); async_test(function(t) { var scope = 'resources/install-multiple-fulfilled'; var onRegister = function(worker) { var obj1 = {}; var obj2 = {}; wait_for_state(t, worker, 'installed') .then(function() { assert_true( obj1.synced && obj2.synced, 'state should be "installed" after all waitUntil promises ' + 'for "oninstall" are fulfilled.'); service_worker_unregister_and_done(t, scope); }) .catch(unreached_rejection(t)); syncWorker(t, worker, obj1); syncWorker(t, worker, obj2); }; runTest(t, scope, onRegister); }, 'Test ExtendableEvent multiple waitUntil fulfilled.'); async_test(function(t) { var scope = 'resources/install-reject-precedence'; var onRegister = function(worker) { wait_for_state(t, worker, 'redundant') .then(function() { service_worker_unregister_and_done(t, scope); }) .catch(unreached_rejection(t)); }; runTest(t, scope, onRegister); }, 'Test ExtendableEvent waitUntil reject precedence.'); async_test(function(t) { var scope = 'resources/activate-fulfilled'; var onRegister = function(worker) { var obj = {}; wait_for_state(t, worker, 'activating') .then(function() { syncWorker(t, worker, obj); return wait_for_state(t, worker, 'activated'); }) .then(function() { assert_true( obj.synced, 'state should be "activated" after the waitUntil promise ' + 'for "onactivate" is fulfilled.'); service_worker_unregister_and_done(t, scope); }) .catch(unreached_rejection(t)); }; runTest(t, scope, onRegister); }, 'Test activate event waitUntil fulfilled'); async_test(function(t) { var scope = 'resources/install-rejected'; var onRegister = function(worker) { wait_for_state(t, worker, 'redundant') .then(function() { service_worker_unregister_and_done(t, scope); }) .catch(unreached_rejection(t)); }; runTest(t, scope, onRegister); }, 'Test install event waitUntil rejected'); async_test(function(t) { var scope = 'resources/activate-rejected'; var onRegister = function(worker) { wait_for_state(t, worker, 'activated') .then(function() { service_worker_unregister_and_done(t, scope); }) .catch(unreached_rejection(t)); }; runTest(t, scope, onRegister); }, 'Test activate event waitUntil rejected.'); </script>