-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
worker script evaluation resulting in abrupt completion shouldn't be …
…a start failure Differential Revision: https://phabricator.services.mozilla.com/D62371 bugzilla-url: https://bugzilla.mozilla.org/show_bug.cgi?id=1603484 gecko-commit: fb7235b2a1b3c94f278ae2175ad826119ffca08f gecko-integration-branch: autoland gecko-reviewers: dom-workers-and-storage-reviewers, asuth
- Loading branch information
1 parent
938bb1c
commit 12dc834
Showing
2 changed files
with
76 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
<!doctype html> | ||
<meta charset=utf-8> | ||
<title></title> | ||
<script src=/resources/testharness.js></script> | ||
<script src=/resources/testharnessreport.js></script> | ||
<script> | ||
|
||
// Tests that a {Dedicated,Shared}Worker keeps running even if its script | ||
// evaluation results in an abrupt completion. This corresponds to the "run a | ||
// worker" algorithm disregarding the return value of "run the {classic,module} | ||
// script" in its step 24: | ||
// | ||
// "If script is a classic script, then run the classic script script. | ||
// Otherwise, it is a module script; run the module script script." | ||
|
||
async function testWorker(worker) { | ||
await new Promise(resolve => { | ||
worker.onerror = e => { | ||
assert_not_equals(e.message.search("uncaught-exception"), -1, | ||
"Correct uncaught exception thrown by worker"); | ||
|
||
// Suppress the exception. | ||
e.preventDefault(); | ||
|
||
resolve(); | ||
} | ||
}); | ||
|
||
return new Promise(resolve => { | ||
const channel = new MessageChannel(); | ||
|
||
channel.port1.onmessage = e => { | ||
assert_equals(e.data, "handler-before-throw", "Correct message handler."); | ||
resolve(); | ||
}; | ||
|
||
if (worker instanceof SharedWorker) { | ||
worker.port.postMessage("", [channel.port2]); | ||
} else { | ||
worker.postMessage("", [channel.port2]); | ||
} | ||
}); | ||
} | ||
|
||
promise_test(async t => { | ||
const worker = new Worker("support/abrupt-completion.js"); | ||
return testWorker(worker); | ||
}, "DedicatedWorker should correctly handle abrupt completion"); | ||
|
||
promise_test(async t => { | ||
const worker = new SharedWorker("support/abrupt-completion.js"); | ||
return testWorker(worker); | ||
}, "SharedWorker should correctly handle abrupt completion"); | ||
|
||
</script> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
const isSharedWorker = | ||
"SharedWorkerGlobalScope" in self && self instanceof SharedWorkerGlobalScope; | ||
|
||
function setMessageHandler(response) { | ||
onmessage = e => { | ||
e.ports[0].postMessage(response); | ||
}; | ||
|
||
if (isSharedWorker) { | ||
onconnect = e => { | ||
e.ports[0].onmessage = onmessage; | ||
}; | ||
} | ||
} | ||
|
||
setMessageHandler("handler-before-throw"); | ||
|
||
throw new Error("uncaught-exception"); | ||
|
||
// This should never be called because of the uncaught exception above. | ||
setMessageHandler("handler-after-throw"); |