Bug 1813494 - Part 1: Common up code to cancel and remove all load requests r=smaug

Cancellation happend in ParsingComplete() and Destroy() but was inconsistent in
which kinds of requests were cancelled and which were cancelled and removed.
This makes one method that cancels and removes everything and uses it in both
places.

Differential Revision: https://phabricator.services.mozilla.com/D168231
This commit is contained in:
Jon Coppeard
2023-02-07 11:55:50 +00:00
parent 389932eb23
commit 49e375acd8
2 changed files with 27 additions and 64 deletions

View File

@@ -1384,43 +1384,33 @@ ReferrerPolicy ScriptLoader::GetReferrerPolicy(nsIScriptElement* aElement) {
return mDocument->GetReferrerPolicy();
}
void ScriptLoader::CancelScriptLoadRequests() {
// Cancel all requests that have not been executed.
void ScriptLoader::CancelAndClearScriptLoadRequests() {
// Cancel all requests that have not been executed and remove them.
if (mParserBlockingRequest) {
mParserBlockingRequest->Cancel();
mParserBlockingRequest = nullptr;
}
for (ScriptLoadRequest* req = mXSLTRequests.getFirst(); req;
req = req->getNext()) {
req->Cancel();
mDeferRequests.CancelRequestsAndClear();
mLoadingAsyncRequests.CancelRequestsAndClear();
mLoadedAsyncRequests.CancelRequestsAndClear();
mNonAsyncExternalScriptInsertedRequests.CancelRequestsAndClear();
mXSLTRequests.CancelRequestsAndClear();
mOffThreadCompilingRequests.CancelRequestsAndClear();
for (ModuleLoader* loader : mWebExtModuleLoaders) {
loader->CancelAndClearDynamicImports();
}
for (ScriptLoadRequest* req = mDeferRequests.getFirst(); req;
req = req->getNext()) {
req->Cancel();
}
for (ScriptLoadRequest* req = mLoadingAsyncRequests.getFirst(); req;
req = req->getNext()) {
req->Cancel();
}
for (ScriptLoadRequest* req = mLoadedAsyncRequests.getFirst(); req;
req = req->getNext()) {
req->Cancel();
}
for (ScriptLoadRequest* req =
mNonAsyncExternalScriptInsertedRequests.getFirst();
req; req = req->getNext()) {
req->Cancel();
for (ModuleLoader* loader : mShadowRealmModuleLoaders) {
loader->CancelAndClearDynamicImports();
}
for (size_t i = 0; i < mPreloads.Length(); i++) {
mPreloads[i].mRequest->Cancel();
}
mOffThreadCompilingRequests.CancelRequestsAndClear();
mPreloads.Clear();
}
nsresult ScriptLoader::CompileOffThreadOrProcessRequest(
@@ -2455,7 +2445,7 @@ void ScriptLoader::Destroy() {
mShutdownObserver = nullptr;
}
CancelScriptLoadRequests();
CancelAndClearScriptLoadRequests();
GiveUpBytecodeEncoding();
}
@@ -3162,8 +3152,9 @@ void ScriptLoader::HandleLoadError(ScriptLoadRequest* aRequest,
aRequest->Cancel();
}
if (aRequest->IsTopLevel()) {
MOZ_ALWAYS_TRUE(
mPreloads.RemoveElement(aRequest, PreloadRequestComparator()));
// Request may already have been removed by
// CancelAndClearScriptLoadRequests.
mPreloads.RemoveElement(aRequest, PreloadRequestComparator());
}
MOZ_ASSERT(!aRequest->isInList());
AccumulateCategorical(LABELS_DOM_SCRIPT_PRELOAD_RESULT::LoadError);
@@ -3494,40 +3485,12 @@ void ScriptLoader::DeferCheckpointReached() {
}
void ScriptLoader::ParsingComplete(bool aTerminated) {
if (!aTerminated) {
return;
}
mDeferRequests.CancelRequestsAndClear();
mLoadingAsyncRequests.CancelRequestsAndClear();
mLoadedAsyncRequests.CancelRequestsAndClear();
mNonAsyncExternalScriptInsertedRequests.CancelRequestsAndClear();
mXSLTRequests.CancelRequestsAndClear();
if (aTerminated) {
CancelAndClearScriptLoadRequests();
if (mModuleLoader) {
mModuleLoader->CancelAndClearDynamicImports();
// Have to call this even if aTerminated so we'll correctly unblock onload.
DeferCheckpointReached();
}
for (ModuleLoader* loader : mWebExtModuleLoaders) {
loader->CancelAndClearDynamicImports();
}
for (ModuleLoader* loader : mShadowRealmModuleLoaders) {
loader->CancelAndClearDynamicImports();
}
if (mParserBlockingRequest) {
mParserBlockingRequest->Cancel();
mParserBlockingRequest = nullptr;
}
// Cancel any unused scripts that were compiled speculatively
for (size_t i = 0; i < mPreloads.Length(); i++) {
mPreloads[i].mRequest->GetScriptLoadContext()->MaybeCancelOffThreadScript();
}
// Have to call this even if aTerminated so we'll correctly unblock
// onload and all.
DeferCheckpointReached();
}
void ScriptLoader::PreloadURI(nsIURI* aURI, const nsAString& aCharset,