blob: dcf3cb09f9428da2b9ebad130c8b219221a74e69 [file] [log] [blame]
<!DOCTYPE html>
<!-- This test is prefixed with `chromium.` because the equivalent version in
the Web Platform Tests project is more strict, and Chromium does not
currently satisfy it. This file should be maintained only to preserve test
coverage until the corresponding version in the Web Plaform Tests project can
be made to pass. See https://crbug.com/725616 -->
<title>Service Worker: Skip waiting installed worker</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="resources/test-helpers.js"></script>
<script>
promise_test(function(t) {
var scope = 'resources/blank.html';
var url1 = 'resources/empty.js';
var url2 = 'resources/skip-waiting-installed-worker.js';
var frame, frame_sw, service_worker, onmessage, oncontrollerchanged;
var saw_message = new Promise(function(resolve) {
onmessage = function(e) {
var message = e.data;
assert_equals(
message, 'PASS',
'skipWaiting promise should be resolved after activated');
resolve();
};
});
var saw_controllerchanged = new Promise(function(resolve) {
oncontrollerchanged = function() {
assert_equals(
frame_sw.controller.scriptURL, normalizeURL(url2),
'Controller scriptURL should change to the second one');
resolve();
};
});
return service_worker_unregister_and_register(t, url1, scope)
.then(function(registration) {
return wait_for_state(t, registration.installing, 'activated');
})
.then(function() {
return with_iframe(scope);
})
.then(function(f) {
frame = f;
frame_sw = f.contentWindow.navigator.serviceWorker;
assert_equals(
frame_sw.controller.scriptURL, normalizeURL(url1),
'Document controller scriptURL should equal to the first one');
frame_sw.oncontrollerchange = t.step_func(oncontrollerchanged);
return navigator.serviceWorker.register(url2, {scope: scope});
})
.then(function(registration) {
service_worker = registration.installing;
return wait_for_state(t, service_worker, 'installed');
})
.then(function() {
var channel = new MessageChannel();
channel.port1.onmessage = t.step_func(onmessage);
service_worker.postMessage({port: channel.port2}, [channel.port2]);
return Promise.all([saw_message, saw_controllerchanged]);
})
.then(function() {
frame.remove();
return service_worker_unregister_and_done(t, scope);
});
}, 'Test skipWaiting when a installed worker is waiting');
</script>