| <!DOCTYPE html> |
| <title>Service Worker: Fetch Event Waits for Activate Event</title> |
| <meta name=timeout content=long> |
| <script src="/resources/testharness.js"></script> |
| <script src="resources/testharness-helpers.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> |
| <body> |
| <script> |
| |
| var worker = 'resources/fetch-waits-for-activate-worker.js'; |
| var expected_url = normalizeURL(worker); |
| var scope = 'resources/fetch-waits-for-activate/'; |
| |
| promise_test(function(t) { |
| var registration; |
| var frameLoadPromise; |
| var frame; |
| return service_worker_unregister_and_register(t, worker, scope).then(function(reg) { |
| t.add_cleanup(function() { |
| return service_worker_unregister(t, scope); |
| }); |
| |
| registration = reg; |
| return wait_for_state(t, reg.installing, 'activating'); |
| }).then(function() { |
| assert_equals(registration.active.scriptURL, expected_url, |
| 'active worker should be present'); |
| assert_equals(registration.active.state, 'activating', |
| 'active worker should be in activating state'); |
| |
| // This should block until we message the worker to tell it to complete |
| // the activate event. |
| frameLoadPromise = with_iframe(scope).then(function(f) { |
| frame = f; |
| }); |
| |
| // Wait some time to allow frame loading to proceed. It should not, |
| // however, if the fetch event is blocked on the activate. I don't |
| // see any way to force this race without a timeout, unfortunately. |
| return new Promise(function(resolve) { |
| setTimeout(resolve, 1000); |
| }); |
| }).then(function() { |
| assert_equals(frame, undefined, 'frame should not be loaded'); |
| assert_equals(registration.active.scriptURL, expected_url, |
| 'active worker should be present'); |
| assert_equals(registration.active.state, 'activating', |
| 'active worker should be in activating state'); |
| |
| // This signals the activate event to complete. The frame should now |
| // load. |
| registration.active.postMessage('GO'); |
| return frameLoadPromise; |
| }).then(function() { |
| assert_equals(frame.contentWindow.navigator.serviceWorker.controller.scriptURL, |
| expected_url, 'frame should now be loaded and controlled'); |
| assert_equals(registration.active.state, 'activated', |
| 'active worker should be in activated state'); |
| frame.remove(); |
| }); |
| }, 'Fetch events should wait for the activate event to complete.'); |
| |
| </script> |
| </body> |