| <!DOCTYPE html> |
| <title>Service Worker: Clients.matchAll with exact controller</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="resources/test-helpers.sub.js"></script> |
| <script> |
| const scope = 'resources/blank.html?clients-matchAll'; |
| let frames = []; |
| |
| function checkWorkerClients(worker, expected) { |
| return new Promise((resolve, reject) => { |
| let channel = new MessageChannel(); |
| channel.port1.onmessage = evt => { |
| try { |
| assert_equals(evt.data.length, expected.length); |
| for (let i = 0; i < expected.length; ++i) { |
| assert_array_equals(evt.data[i], expected[i]); |
| } |
| resolve(); |
| } catch (e) { |
| reject(e); |
| } |
| }; |
| |
| worker.postMessage({port:channel.port2}, [channel.port2]); |
| }); |
| } |
| |
| let expected = [ |
| // visibilityState, focused, url, type, frameType |
| ['visible', true, new URL(scope + '#1', location).toString(), 'window', 'nested'], |
| ['visible', false, new URL(scope + '#2', location).toString(), 'window', 'nested'] |
| ]; |
| |
| promise_test(t => { |
| let script = 'resources/clients-matchall-worker.js'; |
| return service_worker_unregister_and_register(t, script, scope) |
| .then(registration => { |
| t.add_cleanup(() => service_worker_unregister(t, scope)); |
| |
| return wait_for_state(t, registration.installing, 'activated'); |
| }) |
| .then(_ => with_iframe(scope + '#1') ) |
| .then(frame1 => { |
| frames.push(frame1); |
| frame1.focus(); |
| return with_iframe(scope + '#2'); |
| }) |
| .then(frame2 => { |
| frames.push(frame2); |
| return navigator.serviceWorker.register(script + '?updated', { scope: scope }); |
| }) |
| .then(registration => { |
| return wait_for_state(t, registration.installing, 'installed') |
| .then(_ => registration); |
| }) |
| .then(registration => { |
| return Promise.all([ |
| checkWorkerClients(registration.waiting, []), |
| checkWorkerClients(registration.active, expected), |
| ]); |
| }) |
| .then(_ => { |
| frames.forEach(f => f.remove() ); |
| }); |
| }, 'Test Clients.matchAll() with exact controller'); |
| </script> |