| <!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; |
| return service_worker_unregister_and_register(test, script, scope) |
| .then(function(registration) { |
| test.add_cleanup(function() { |
| return service_worker_unregister(test, scope); |
| }); |
| |
| return 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(worker, obj) { |
| var channel = new MessageChannel(); |
| worker.postMessage({port: channel.port2}, [channel.port2]); |
| return new Promise(function(resolve) { |
| channel.port1.onmessage = resolve; |
| }).then(function(e) { |
| var message = e.data; |
| assert_equals(message, 'SYNC', |
| 'Should receive sync message from worker.'); |
| obj.synced = true; |
| channel.port1.postMessage('ACK'); |
| }); |
| } |
| |
| promise_test(function(t) { |
| // Passing scope as the test switch for worker script. |
| var scope = 'resources/install-fulfilled'; |
| var onRegister = function(worker) { |
| var obj = {}; |
| |
| return Promise.all([ |
| syncWorker(worker, 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); |
| }); |
| }; |
| return runTest(t, scope, onRegister); |
| }, 'Test install event waitUntil fulfilled'); |
| |
| promise_test(function(t) { |
| var scope = 'resources/install-multiple-fulfilled'; |
| var onRegister = function(worker) { |
| var obj1 = {}; |
| var obj2 = {}; |
| |
| return Promise.all([ |
| syncWorker(worker, obj1), |
| syncWorker(worker, 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.'); |
| }); |
| }; |
| return runTest(t, scope, onRegister); |
| }, 'Test ExtendableEvent multiple waitUntil fulfilled.'); |
| |
| promise_test(function(t) { |
| var scope = 'resources/install-reject-precedence'; |
| var onRegister = function(worker) { |
| var obj1 = {}; |
| var obj2 = {}; |
| |
| return Promise.all([ |
| syncWorker(worker, obj1) |
| .then(function() { |
| syncWorker(worker, obj2); |
| }), |
| wait_for_state(t, worker, 'redundant') |
| ]).then(function() { |
| assert_true( |
| obj1.synced, |
| 'The "redundant" state was entered after the first "extend ' + |
| 'lifetime promise" resolved.' |
| ); |
| assert_true( |
| obj2.synced, |
| 'The "redundant" state was entered after the third "extend ' + |
| 'lifetime promise" resolved.' |
| ); |
| }); |
| }; |
| return runTest(t, scope, onRegister); |
| }, 'Test ExtendableEvent waitUntil reject precedence.'); |
| |
| promise_test(function(t) { |
| var scope = 'resources/activate-fulfilled'; |
| var onRegister = function(worker) { |
| var obj = {}; |
| return wait_for_state(t, worker, 'activating') |
| .then(function() { |
| return Promise.all([ |
| syncWorker(worker, obj), |
| wait_for_state(t, worker, 'activated') |
| ]); |
| }) |
| .then(function() { |
| assert_true( |
| obj.synced, |
| 'state should be "activated" after the waitUntil promise ' + |
| 'for "onactivate" is fulfilled.'); |
| }); |
| }; |
| return runTest(t, scope, onRegister); |
| }, 'Test activate event waitUntil fulfilled'); |
| |
| promise_test(function(t) { |
| var scope = 'resources/install-rejected'; |
| var onRegister = function(worker) { |
| return wait_for_state(t, worker, 'redundant'); |
| }; |
| return runTest(t, scope, onRegister); |
| }, 'Test install event waitUntil rejected'); |
| |
| promise_test(function(t) { |
| var scope = 'resources/activate-rejected'; |
| var onRegister = function(worker) { |
| return wait_for_state(t, worker, 'activated'); |
| }; |
| return runTest(t, scope, onRegister); |
| }, 'Test activate event waitUntil rejected.'); |
| |
| </script> |