| Index: LayoutTests/http/tests/serviceworker/getregistrations.html
|
| diff --git a/LayoutTests/http/tests/serviceworker/getregistrations.html b/LayoutTests/http/tests/serviceworker/getregistrations.html
|
| index 028ee9c4181f785a461dab903724f159398eed7f..3f6fbaba10767f668317472669ec9226e369e8f4 100644
|
| --- a/LayoutTests/http/tests/serviceworker/getregistrations.html
|
| +++ b/LayoutTests/http/tests/serviceworker/getregistrations.html
|
| @@ -10,27 +10,32 @@
|
| // getRegistrations() is used in order to avoid adding additional complexity
|
| // e.g. adding an internal function.
|
| sequential_promise_test(function(t) {
|
| - return navigator.serviceWorker.getRegistrations()
|
| - .then(function(registrations) {
|
| - return registrations.reduce(function(sequence, registration) {
|
| - return sequence.then(function() {
|
| - return registration.unregister();
|
| - });
|
| - }, Promise.resolve());
|
| + 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.');
|
|
|
| sequential_promise_test(function(t) {
|
| - return navigator.serviceWorker.getRegistrations()
|
| - .then(function(value) {
|
| - assert_array_equals(
|
| - value,
|
| - [],
|
| - 'getRegistrations should resolve with an empty array.');
|
| - });
|
| - }, 'getRegistrations');
|
| -
|
| -sequential_promise_test(function(t) {
|
| var scope = 'resources/scope/getregistrations/normal';
|
| var script = 'resources/empty-worker.js';
|
| var registrations = [];
|
| @@ -93,8 +98,8 @@ sequential_promise_test(function(t) {
|
| }, 'Register then Unregister then getRegistrations');
|
|
|
| sequential_promise_test(function(t) {
|
| - // Top-level window's origin is http://127.0.0.1:8000
|
| - // Set frame's origin to http://localhost:8000
|
| + // 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';
|
| @@ -105,32 +110,34 @@ sequential_promise_test(function(t) {
|
|
|
| return with_iframe(frame_url)
|
| .then(function(f) {
|
| - // frame registered its registration scoped
|
| - // http://localhost:8000/serviceworker/resources/scope-for-getregistrations
|
| frame = f;
|
| - // Top-level window registers its registration scoped
|
| - // http://127.0.0.1:8000/serviceworker/resources/scope-for-getregistrations
|
| - 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 only return same origin registrations.');
|
|
|
| - var channel = new MessageChannel();
|
| var resolve;
|
| var p = new Promise(function(r) { resolve = r; });
|
|
|
| + var channel = new MessageChannel();
|
| +
|
| channel.port1.onmessage = function(e) {
|
| - if (e.data == 'unregistered')
|
| + // 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('unregister', '*', [channel.port2]);
|
| + frame.contentWindow.postMessage('register', '*', [channel.port2]);
|
| return p;
|
| })
|
| .then(function() {
|
|
|