blob: 7cf54e033f4a8d4670997795a7f7207532d30e4e [file] [log] [blame]
<!DOCTYPE html>
<!-- This is in chromium/ because the equivalent version available in Web
Platform Tests also asserts the presence of the Client's `type` attribute.
This less precise version (and its resources) should be maintained only to
preserve test coverage until the attribute is implemented. See
https://crbug.com/705685 -->
<title>Service Worker: Clients.get with window and worker clients</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../resources/test-helpers.js"></script>
<script>
var scope = 'resources/clients-get-client-types';
var frame_url = scope + '-frame.html';
var shared_worker_url = scope + '-shared-worker.js';
var client_ids = [];
var frame;
promise_test(function(t) {
return service_worker_unregister_and_register(
t, 'resources/clients-get-worker.js', scope)
.then(function(registration) {
add_completion_callback(function() { registration.unregister(); });
return wait_for_state(t, registration.installing, 'activated');
})
.then(function() {
return with_iframe(frame_url);
})
.then(function(f) {
frame = f;
add_completion_callback(function() { frame.remove(); });
frame.focus();
return wait_for_clientId();
})
.then(function(client_id) {
client_ids.push(client_id);
return new Promise(function(resolve) {
var w = new SharedWorker(shared_worker_url);
w.port.onmessage = function(e) {
resolve(e.data.clientId);
};
});
})
.then(function(client_id) {
client_ids.push(client_id);
var channel = new MessageChannel();
var saw_message = new Promise(function(resolve) {
channel.port1.onmessage = resolve;
});
frame.contentWindow.navigator.serviceWorker.controller.postMessage(
{port: channel.port2, clientIds: client_ids}, [channel.port2]);
return saw_message;
})
.then(function(e) {
assert_equals(e.data.length, 2);
assert_array_equals(e.data[0], expected[0]);
assert_array_equals(e.data[1], expected[1]);
});
}, 'Test Clients.get() with window and worker clients');
function wait_for_clientId() {
return new Promise(function(resolve) {
function get_client_id(e) {
window.removeEventListener('message', get_client_id);
resolve(e.data.clientId);
}
window.addEventListener('message', get_client_id, false);
});
}
var expected = [
/* visibilityState, focused, url, frameType */
['visible', true, normalizeURL(scope) + '-frame.html', 'nested'],
[undefined, undefined, normalizeURL(scope) + '-shared-worker.js', 'none']
];
</script>