Bug 1247687 - Handle cancellation of long running modules; r=jonco

This is a slightly annoying thing that can happen. When we abruptly cancel (such as an infinitely
running script being forcibly terminated) we will be in a state where the EvaluateModule call will
finish _after_ the loader is destroyed. So, instead we track if there has been a forcible
cancelation, and exit early.

Depends on D155690

Differential Revision: https://phabricator.services.mozilla.com/D155568
This commit is contained in:
Yulia Startsev
2023-01-18 13:46:32 +00:00
parent 12b7052c36
commit 95e113b169
2 changed files with 14 additions and 1 deletions

View File

@@ -761,7 +761,9 @@ bool WorkerScriptLoader::ProcessPendingRequests(JSContext* aCx) {
MOZ_ASSERT(global);
while (!mLoadedRequests.isEmpty()) {
RefPtr<ScriptLoadRequest> req = mLoadedRequests.StealFirst();
// Take a reference, but do not remove it from the list yet. There is a
// possibility that this will need to be cancelled.
RefPtr<ScriptLoadRequest> req = mLoadedRequests.getFirst();
// We don't have a ProcessRequest method (like we do on the DOM), as there
// isn't much processing that we need to do per request that isn't related
// to evaluation (the processsing done for the DOM is handled in
@@ -775,6 +777,8 @@ bool WorkerScriptLoader::ProcessPendingRequests(JSContext* aCx) {
mLoadedRequests.CancelRequestsAndClear();
break;
}
// remove the element from the list.
mLoadedRequests.Remove(req);
}
TryShutdown();
@@ -1076,6 +1080,9 @@ bool WorkerScriptLoader::EvaluateScript(JSContext* aCx,
: EvaluateSourceBuffer(aCx, options,
maybeSource.ref<JS::SourceText<char16_t>>());
if (aRequest->IsCanceled()) {
return false;
}
if (!successfullyEvaluated) {
mRv.StealExceptionFromJSContext(aCx);
return false;