<!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>