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