blob: a6f66517910eefd54abc722c7cf16a7d6f3794ac [file] [log] [blame]
<!DOCTYPE html>
<title>Service Worker: postMessage</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<script>
async_test(function(t) {
var scope = 'resources/blank.html';
var registration;
var worker;
service_worker_unregister_and_register(
t, 'resources/postmessage-worker.js', scope)
.then(function(r) {
registration = r;
worker = registration.installing;
var messageChannel = new MessageChannel();
messageChannel.port1.onmessage = t.step_func(onMessage);
worker.postMessage({port: messageChannel.port2},
[messageChannel.port2]);
worker.postMessage({value: 1});
worker.postMessage({value: 2});
worker.postMessage({done: true});
})
.catch(unreached_rejection(t));
var result = [];
var expected = [
'Acking value: 1',
'Acking value: 2',
];
function onMessage(e) {
var message = e.data;
if (message === 'quit') {
assert_array_equals(result, expected,
'Worker should post back expected values.');
postMessageToRedundantWorker();
} else {
result.push(message);
}
};
function postMessageToRedundantWorker() {
registration.unregister(scope)
.then(function() {
return wait_for_state(t, worker, 'redundant');
})
.then(function() {
assert_equals(worker.state, 'redundant');
assert_throws(
{name:'InvalidStateError'},
function() { worker.postMessage(''); },
'Calling postMessage on a redundant ServiceWorker should ' +
'throw InvalidStateError.');
t.done();
})
.catch(unreached_rejection(t));
}
}, 'postMessage to a ServiceWorker (and back via MessagePort)');
</script>