blob: 2dfb8522ecdf20fc57480fa45d2a12f9ad86cb84 [file] [log] [blame]
<!DOCTYPE html>
<!-- This test is prefixed with `chromium.` because the equivalent version
available in Web Platform Tests is known to cause timeout errors in the
Chromium automated build system. It should be maintained only to preserve
test converage until the corresponding versions in Web Platform Tests can be
made to pass consistently. See https://crbug.com/658997 -->
<title>Service Worker: getRegistrations()</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="resources/test-helpers.js"></script>
<script src="../resources/get-host-info.js"></script>
<script>
// Purge the existing registrations for the origin.
// getRegistrations() is used in order to avoid adding additional complexity
// e.g. adding an internal function.
promise_test(function(t) {
var resolve;
var timer;
var p = new Promise(function(r) { resolve = r; });
navigator.serviceWorker.getRegistrations()
.then(function(regs) {
return Promise.all(regs.map(function(r) { r.unregister(); }));
})
.then(function() {
// As registration.unregister() promises resolve before the
// corresponding registrations are deleted from the storage, we must
// wait until the registrations are actually removed from the storage.
// Spec reference: https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#unregister-algorithm
timer = setInterval(function() {
navigator.serviceWorker.getRegistrations()
.then(function(regs) {
if (regs.length == 0) {
clearInterval(timer);
resolve();
}
});
}, 100);
});
return p;
}, 'Purge the existing registrations.');
promise_test(function(t) {
var scope = 'resources/scope/getregistrations/normal';
var script = 'resources/empty-worker.js';
var registrations = [];
return service_worker_unregister_and_register(t, script, scope)
.then(function(r) {
registrations.push(r);
return navigator.serviceWorker.getRegistrations();
})
.then(function(value) {
assert_array_equals(
value,
registrations,
'getRegistrations should resolve with array of registrations.');
return service_worker_unregister(t, scope);
});
}, 'Register then getRegistrations');
promise_test(function(t) {
var scope1 = 'resources/scope/getregistrations/scope1';
var scope2 = 'resources/scope/getregistrations/scope2';
var script = 'resources/empty-worker.js';
var registrations = [];
return service_worker_unregister_and_register(t, script, scope1)
.then(function(r) {
registrations.push(r);
return service_worker_unregister_and_register(t, script, scope2);
})
.then(function(r) {
registrations.push(r);
return navigator.serviceWorker.getRegistrations();
})
.then(function(value) {
assert_array_equals(
value,
registrations,
'getRegistrations should resolve with array of registrations.');
return service_worker_unregister(t, scope1);
})
.then(function() {
return service_worker_unregister(t, scope2);
});
}, 'Register multiple times then getRegistrations');
promise_test(function(t) {
var scope = 'resources/scope/getregistrations/register-unregister';
var script = 'resources/empty-worker.js';
return service_worker_unregister_and_register(t, script, scope)
.then(function(registration) {
return registration.unregister();
})
.then(function() {
return navigator.serviceWorker.getRegistrations();
})
.then(function(value) {
assert_array_equals(
value,
[],
'getRegistrations should resolve with an empty array.');
});
}, 'Register then Unregister then getRegistrations');
promise_test(function(t) {
// Top-level window's origin: http://127.0.0.1:8000.
// Frame's origin: http://localhost:8000.
var host_info = get_host_info();
var frame_url = host_info['HTTP_REMOTE_ORIGIN'] +
'/serviceworker/resources/frame-for-getregistrations.html';
var scope = 'resources/scope-for-getregistrations';
var script = 'resources/empty-worker.js';
var frame;
var registrations = [];
return with_iframe(frame_url)
.then(function(f) {
frame = f;
var resolve;
var p = new Promise(function(r) { resolve = r; });
var channel = new MessageChannel();
channel.port1.onmessage = function(e) {
// Frame's registration is registered.
if (e.data == 'registered') {
// Top-level window registers a registration scoped
// http://127.0.0.1:8000/serviceworker/resources/scope-for-getregistrations.
service_worker_unregister_and_register(t, script, scope)
.then(function(r) {
registrations.push(r);
return navigator.serviceWorker.getRegistrations();
})
.then(function(value) {
assert_array_equals(value, registrations,
'getRegistrations should return only the same origin ' +
'registrations.');
channel.port1.postMessage('unregister');
});
} else if (e.data == 'unregistered') {
resolve();
}
};
frame.contentWindow.postMessage('register', '*', [channel.port2]);
return p;
})
.then(function() {
frame.remove();
return service_worker_unregister(t, scope);
});
}, 'getRegistrations promise resolves only with same origin registrations.');
done();
</script>