<!DOCTYPE html> <script src="/resources/testharness.js"></script> <script src="resources/testharness-helpers.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="resources/test-helpers.sub.js"></script> <script> function wait_for_install_event(worker) { return new Promise(function(resolve) { worker.addEventListener('statechange', function(event) { if (worker.state == 'installed') resolve(true); else if (worker.state == 'redundant') resolve(false); }); }); } function make_test(name, script, expect_install) { promise_test(function(t) { var scope = script; return service_worker_unregister_and_register(t, script, scope) .then(function(registration) { return wait_for_install_event(registration.installing); }) .then(function(did_install) { assert_equals(did_install, expect_install, 'The worker was installed'); }) }, name); } [ { name: 'install handler throws an error', script: 'resources/oninstall-throw-error-worker.js', expect_install: false }, { name: 'install handler throws an error, error handler does not cancel', script: 'resources/oninstall-throw-error-with-empty-onerror-worker.js', expect_install: false }, { name: 'install handler dispatches an event that throws an error', script: 'resources/oninstall-throw-error-from-nested-event-worker.js', expect_install: true }, // The following two cases test what happens when the ServiceWorkerGlobalScope // 'error' event handler cancels the resulting error event. Since the // original 'install' event handler through, the installation should still // be stopped in this case. See: // https://github.com/slightlyoff/ServiceWorker/issues/778 { name: 'install handler throws an error that is cancelled', script: 'resources/oninstall-throw-error-then-cancel-worker.js', expect_install: false }, { name: 'install handler throws an error and prevents default', script: 'resources/oninstall-throw-error-then-prevent-default-worker.js', expect_install: false } ].forEach(function(test_case) { make_test(test_case.name, test_case.script, test_case.expect_install); }); </script>