| <!DOCTYPE html> |
| <title>Service Worker: postMessage from waiting serviceworker</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/common/get-host-info.sub.js"></script> |
| <script src="resources/test-helpers.sub.js"></script> |
| <script> |
| |
| function echo(worker, data) { |
| return new Promise(resolve => { |
| navigator.serviceWorker.addEventListener('message', function onMsg(evt) { |
| navigator.serviceWorker.removeEventListener('message', onMsg); |
| resolve(evt); |
| }); |
| worker.postMessage(data); |
| }); |
| } |
| |
| promise_test(t => { |
| let script = 'resources/echo-message-to-source-worker.js'; |
| let scope = 'resources/client-postmessage-from-wait-serviceworker'; |
| let registration; |
| let frame; |
| return service_worker_unregister_and_register(t, script, scope) |
| .then(swr => { |
| t.add_cleanup(() => service_worker_unregister(t, scope)); |
| |
| registration = swr; |
| return wait_for_state(t, registration.installing, 'activated'); |
| }).then(_ => { |
| return with_iframe(scope); |
| }).then(f => { |
| frame = f; |
| return navigator.serviceWorker.register(script + '?update', { scope: scope }) |
| }).then(swr => { |
| assert_equals(swr, registration, 'should be same registration'); |
| return wait_for_state(t, registration.installing, 'installed'); |
| }).then(_ => { |
| return echo(registration.waiting, 'waiting'); |
| }).then(evt => { |
| assert_equals(evt.source, registration.waiting, |
| 'message event source should be correct'); |
| return echo(registration.active, 'active'); |
| }).then(evt => { |
| assert_equals(evt.source, registration.active, |
| 'message event source should be correct'); |
| frame.remove(); |
| }); |
| }, 'Client.postMessage() from waiting serviceworker.'); |
| </script> |