Index: third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/fetch-waits-for-activate.https.html |
diff --git a/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/fetch-waits-for-activate.https.html b/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/fetch-waits-for-activate.https.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..304680c97e63f55c80abb1827e2e67a0ab8e1749 |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/fetch-waits-for-activate.https.html |
@@ -0,0 +1,63 @@ |
+<!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="resources/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/'; |
+ |
+async_test(function(t) { |
+ var registration; |
+ var frameLoadPromise; |
+ var frame; |
+ service_worker_unregister_and_register(t, worker, scope).then(function(reg) { |
+ 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(); |
+ return service_worker_unregister_and_done(t, scope); |
+ }).catch(unreached_rejection(t)); |
+}, 'Fetch events should wait for the activate event to complete.'); |
+ |
+</script> |
+</body> |