| <!doctype html> |
| <title>ServiceWorker: worker objects have synced state</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="resources/test-helpers.sub.js"></script> |
| <script> |
| // Tests that ServiceWorker objects representing the same Service Worker |
| // entity have the same state. JS-level equality is now required according to |
| // the spec. |
| 'use strict'; |
| |
| function nextChange(worker) { |
| return new Promise(function(resolve, reject) { |
| worker.addEventListener('statechange', function handler(event) { |
| try { |
| worker.removeEventListener('statechange', handler); |
| resolve(event.currentTarget.state); |
| } catch (err) { |
| reject(err); |
| } |
| }); |
| }); |
| } |
| |
| promise_test(function(t) { |
| var scope = 'resources/synced-state'; |
| var script = 'resources/empty-worker.js'; |
| var registration, worker; |
| |
| return service_worker_unregister_and_register(t, script, scope) |
| .then(function(r) { |
| registration = r; |
| worker = registration.installing; |
| |
| t.add_cleanup(function() { |
| return r.unregister(); |
| }); |
| |
| return nextChange(worker); |
| }) |
| .then(function(state) { |
| assert_equals(state, 'installed', |
| 'original SW should be installed'); |
| assert_equals(registration.installing, null, |
| 'in installed, .installing should be null'); |
| assert_equals(registration.waiting, worker, |
| 'in installed, .waiting should be equal to the ' + |
| 'original worker'); |
| assert_equals(registration.waiting.state, 'installed', |
| 'in installed, .waiting should be installed'); |
| assert_equals(registration.active, null, |
| 'in installed, .active should be null'); |
| |
| return nextChange(worker); |
| }) |
| .then(function(state) { |
| assert_equals(state, 'activating', |
| 'original SW should be activating'); |
| assert_equals(registration.installing, null, |
| 'in activating, .installing should be null'); |
| assert_equals(registration.waiting, null, |
| 'in activating, .waiting should be null'); |
| assert_equals(registration.active, worker, |
| 'in activating, .active should be equal to the ' + |
| 'original worker'); |
| assert_equals( |
| registration.active.state, 'activating', |
| 'in activating, .active should be activating'); |
| |
| return nextChange(worker); |
| }) |
| .then(function(state) { |
| assert_equals(state, 'activated', |
| 'original SW should be activated'); |
| assert_equals(registration.installing, null, |
| 'in activated, .installing should be null'); |
| assert_equals(registration.waiting, null, |
| 'in activated, .waiting should be null'); |
| assert_equals(registration.active, worker, |
| 'in activated, .active should be equal to the ' + |
| 'original worker'); |
| assert_equals(registration.active.state, 'activated', |
| 'in activated .active should be activated'); |
| }) |
| .then(function() { |
| return navigator.serviceWorker.getRegistration(scope); |
| }) |
| .then(function(r) { |
| assert_equals(r, registration, 'getRegistration should return the ' + |
| 'same object'); |
| }); |
| }, 'worker objects for the same entity have the same state'); |
| </script> |