mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-02 13:58:40 +09:00
Issue #618 - Split handling of load errors out from OnStreamComplete.
This commit is contained in:
parent
9f5805eee2
commit
7e6cd5def1
2 changed files with 67 additions and 59 deletions
|
|
@ -2292,65 +2292,7 @@ ScriptLoader::OnStreamComplete(nsIIncrementalStreamLoader* aLoader,
|
|||
}
|
||||
|
||||
if (NS_FAILED(rv)) {
|
||||
/*
|
||||
* Handle script not loading error because source was a tracking URL.
|
||||
* We make a note of this script node by including it in a dedicated
|
||||
* array of blocked tracking nodes under its parent document.
|
||||
*/
|
||||
if (rv == NS_ERROR_TRACKING_URI) {
|
||||
nsCOMPtr<nsIContent> cont = do_QueryInterface(request->mElement);
|
||||
mDocument->AddBlockedTrackingNode(cont);
|
||||
}
|
||||
|
||||
if (request->mIsDefer) {
|
||||
MOZ_ASSERT_IF(request->IsModuleRequest(),
|
||||
request->AsModuleRequest()->IsTopLevel());
|
||||
if (request->isInList()) {
|
||||
RefPtr<ScriptLoadRequest> req = mDeferRequests.Steal(request);
|
||||
FireScriptAvailable(rv, req);
|
||||
}
|
||||
} else if (request->mIsAsync) {
|
||||
MOZ_ASSERT_IF(request->IsModuleRequest(),
|
||||
request->AsModuleRequest()->IsTopLevel());
|
||||
if (request->isInList()) {
|
||||
RefPtr<ScriptLoadRequest> req = mLoadingAsyncRequests.Steal(request);
|
||||
FireScriptAvailable(rv, req);
|
||||
}
|
||||
} else if (request->mIsNonAsyncScriptInserted) {
|
||||
if (request->isInList()) {
|
||||
RefPtr<ScriptLoadRequest> req =
|
||||
mNonAsyncExternalScriptInsertedRequests.Steal(request);
|
||||
FireScriptAvailable(rv, req);
|
||||
}
|
||||
} else if (request->mIsXSLT) {
|
||||
if (request->isInList()) {
|
||||
RefPtr<ScriptLoadRequest> req = mXSLTRequests.Steal(request);
|
||||
FireScriptAvailable(rv, req);
|
||||
}
|
||||
} else if (request->IsModuleRequest()) {
|
||||
ModuleLoadRequest* modReq = request->AsModuleRequest();
|
||||
MOZ_ASSERT(!modReq->IsTopLevel());
|
||||
MOZ_ASSERT(!modReq->isInList());
|
||||
modReq->Cancel();
|
||||
// A single error is fired for the top level module, so don't use
|
||||
// FireScriptAvailable here.
|
||||
} else if (mParserBlockingRequest == request) {
|
||||
MOZ_ASSERT(!request->isInList());
|
||||
mParserBlockingRequest = nullptr;
|
||||
UnblockParser(request);
|
||||
|
||||
// Ensure that we treat request->mElement as our current parser-inserted
|
||||
// script while firing onerror on it.
|
||||
MOZ_ASSERT(request->mElement->GetParserCreated());
|
||||
nsCOMPtr<nsIScriptElement> oldParserInsertedScript =
|
||||
mCurrentParserInsertedScript;
|
||||
mCurrentParserInsertedScript = request->mElement;
|
||||
FireScriptAvailable(rv, request);
|
||||
ContinueParserAsync(request);
|
||||
mCurrentParserInsertedScript = oldParserInsertedScript;
|
||||
} else {
|
||||
mPreloads.RemoveElement(request, PreloadRequestComparator());
|
||||
}
|
||||
HandleLoadError(request, rv);
|
||||
}
|
||||
|
||||
// Process our request and/or any pending ones
|
||||
|
|
@ -2359,6 +2301,70 @@ ScriptLoader::OnStreamComplete(nsIIncrementalStreamLoader* aLoader,
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
void
|
||||
ScriptLoader::HandleLoadError(ScriptLoadRequest *aRequest, nsresult aResult) {
|
||||
/*
|
||||
* Handle script not loading error because source was a tracking URL.
|
||||
* We make a note of this script node by including it in a dedicated
|
||||
* array of blocked tracking nodes under its parent document.
|
||||
*/
|
||||
if (aResult == NS_ERROR_TRACKING_URI) {
|
||||
nsCOMPtr<nsIContent> cont = do_QueryInterface(aRequest->mElement);
|
||||
mDocument->AddBlockedTrackingNode(cont);
|
||||
}
|
||||
|
||||
if (aRequest->mIsDefer) {
|
||||
MOZ_ASSERT_IF(aRequest->IsModuleRequest(),
|
||||
aRequest->AsModuleRequest()->IsTopLevel());
|
||||
if (aRequest->isInList()) {
|
||||
RefPtr<ScriptLoadRequest> req = mDeferRequests.Steal(aRequest);
|
||||
FireScriptAvailable(aResult, req);
|
||||
}
|
||||
} else if (aRequest->mIsAsync) {
|
||||
MOZ_ASSERT_IF(aRequest->IsModuleRequest(),
|
||||
aRequest->AsModuleRequest()->IsTopLevel());
|
||||
if (aRequest->isInList()) {
|
||||
RefPtr<ScriptLoadRequest> req = mLoadingAsyncRequests.Steal(aRequest);
|
||||
FireScriptAvailable(aResult, req);
|
||||
}
|
||||
} else if (aRequest->mIsNonAsyncScriptInserted) {
|
||||
if (aRequest->isInList()) {
|
||||
RefPtr<ScriptLoadRequest> req =
|
||||
mNonAsyncExternalScriptInsertedRequests.Steal(aRequest);
|
||||
FireScriptAvailable(aResult, req);
|
||||
}
|
||||
} else if (aRequest->mIsXSLT) {
|
||||
if (aRequest->isInList()) {
|
||||
RefPtr<ScriptLoadRequest> req = mXSLTRequests.Steal(aRequest);
|
||||
FireScriptAvailable(aResult, req);
|
||||
}
|
||||
} else if (aRequest->IsModuleRequest()) {
|
||||
ModuleLoadRequest* modReq = aRequest->AsModuleRequest();
|
||||
MOZ_ASSERT(!modReq->IsTopLevel());
|
||||
MOZ_ASSERT(!modReq->isInList());
|
||||
modReq->Cancel();
|
||||
// A single error is fired for the top level module, so don't use
|
||||
// FireScriptAvailable here.
|
||||
} else if (mParserBlockingRequest == aRequest) {
|
||||
MOZ_ASSERT(!aRequest->isInList());
|
||||
mParserBlockingRequest = nullptr;
|
||||
UnblockParser(aRequest);
|
||||
|
||||
// Ensure that we treat request->mElement as our current parser-inserted
|
||||
// script while firing onerror on it.
|
||||
MOZ_ASSERT(aRequest->mElement->GetParserCreated());
|
||||
nsCOMPtr<nsIScriptElement> oldParserInsertedScript =
|
||||
mCurrentParserInsertedScript;
|
||||
mCurrentParserInsertedScript = aRequest->mElement;
|
||||
FireScriptAvailable(aResult, aRequest);
|
||||
ContinueParserAsync(aRequest);
|
||||
mCurrentParserInsertedScript = oldParserInsertedScript;
|
||||
} else {
|
||||
mPreloads.RemoveElement(aRequest, PreloadRequestComparator());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ScriptLoader::UnblockParser(ScriptLoadRequest* aParserBlockingRequest)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -407,6 +407,8 @@ public:
|
|||
mozilla::Vector<char16_t> &aString,
|
||||
mozilla::dom::SRICheckDataVerifier* aSRIDataVerifier);
|
||||
|
||||
void HandleLoadError(ScriptLoadRequest *aRequest, nsresult aResult);
|
||||
|
||||
/**
|
||||
* Processes any pending requests that are ready for processing.
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue