Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test has a WPT meta file that expects 3 subtest issues.
- This WPT test may be referenced by the following Test IDs:
- /service-workers/service-worker/multi-globals/url-parsing.https.html - WPT Dashboard Interop Dashboard
<!DOCTYPE html>
<title>register()/getRegistration() URL parsing, with multiple globals in play</title>
<link rel="help" href="https://w3c.github.io/ServiceWorker/spec/service_worker/index.html#service-worker-container-register-method">
<link rel="help" href="https://w3c.github.io/ServiceWorker/spec/service_worker/index.html#service-worker-container-getregistration-method">
<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
<script src="/resources/testharness.js"></script>
<script src="../resources/testharness-helpers.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../resources/test-helpers.sub.js"></script>
<!-- This is the entry global -->
<iframe src="incumbent/incumbent.https.html"></iframe>
<script>
'use strict';
const loadPromise = new Promise(resolve => {
window.addEventListener('load', () => resolve());
});
promise_test(t => {
let registration;
return loadPromise.then(() => {
return frames[0].testRegister();
}).then(r => {
registration = r;
return wait_for_state(t, registration.installing, 'activated');
}).then(_ => {
assert_equals(registration.active.scriptURL, normalizeURL('relevant/test-sw.js'), 'the script URL should be parsed against the relevant global');
assert_equals(registration.scope, normalizeURL('relevant/'), 'the default scope URL should be parsed against the parsed script URL');
return registration.unregister();
});
}, 'register should use the relevant global of the object it was called on to resolve the script URL and the default scope URL');
promise_test(t => {
let registration;
return loadPromise.then(() => {
return frames[0].testRegister({ scope: 'scope' });
}).then(r => {
registration = r;
return wait_for_state(t, registration.installing, 'activated');
}).then(_ => {
assert_equals(registration.active.scriptURL, normalizeURL('relevant/test-sw.js'), 'the script URL should be parsed against the relevant global');
assert_equals(registration.scope, normalizeURL('relevant/scope'), 'the given scope URL should be parsed against the relevant global');
return registration.unregister();
});
}, 'register should use the relevant global of the object it was called on to resolve the script URL and the given scope URL');
promise_test(t => {
let registration;
return loadPromise.then(() => {
return navigator.serviceWorker.register(normalizeURL('relevant/test-sw.js'));
}).then(r => {
registration = r;
return frames[0].testGetRegistration();
})
.then(gottenRegistration => {
assert_not_equals(registration, null, 'the registration should not be null');
assert_not_equals(gottenRegistration, null, 'the registration from the other frame should not be null');
assert_equals(gottenRegistration.scope, registration.scope,
'the retrieved registration\'s scope should be equal to the original\'s scope');
return registration.unregister();
});
}, 'getRegistration should use the relevant global of the object it was called on to resolve the script URL');
</script>