зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1342012 - Make load request element optional r=smaug
This commit is contained in:
Родитель
f008add28c
Коммит
045c231468
|
@ -30,6 +30,7 @@ ScriptFetchOptions::ScriptFetchOptions(
|
|||
nsIScriptElement* aElement, nsIPrincipal* aTriggeringPrincipal)
|
||||
: mCORSMode(aCORSMode),
|
||||
mReferrerPolicy(aReferrerPolicy),
|
||||
mIsPreload(false),
|
||||
mElement(aElement),
|
||||
mTriggeringPrincipal(aTriggeringPrincipal) {
|
||||
MOZ_ASSERT(mTriggeringPrincipal);
|
||||
|
|
|
@ -50,6 +50,7 @@ class ScriptFetchOptions {
|
|||
|
||||
const mozilla::CORSMode mCORSMode;
|
||||
const mozilla::net::ReferrerPolicy mReferrerPolicy;
|
||||
bool mIsPreload;
|
||||
nsCOMPtr<nsIScriptElement> mElement;
|
||||
nsCOMPtr<nsIPrincipal> mTriggeringPrincipal;
|
||||
};
|
||||
|
@ -91,7 +92,10 @@ class ScriptLoadRequest
|
|||
Element()->ScriptEvaluated(aResult, Element(), mIsInline);
|
||||
}
|
||||
|
||||
bool IsPreload() { return Element() == nullptr; }
|
||||
bool IsPreload() const {
|
||||
MOZ_ASSERT_IF(mFetchOptions->mIsPreload, !Element());
|
||||
return mFetchOptions->mIsPreload;
|
||||
}
|
||||
|
||||
virtual void Cancel();
|
||||
|
||||
|
@ -199,11 +203,28 @@ class ScriptLoadRequest
|
|||
return mFetchOptions->mTriggeringPrincipal;
|
||||
}
|
||||
|
||||
void SetElement(nsIScriptElement* aElement) {
|
||||
// Called when a preload request is later used for an actual request.
|
||||
// Make this request a preload (speculative) request.
|
||||
void SetIsPreloadRequest() {
|
||||
MOZ_ASSERT(!Element());
|
||||
MOZ_ASSERT(!IsPreload());
|
||||
mFetchOptions->mIsPreload = true;
|
||||
}
|
||||
|
||||
// Make a preload request into an actual load request for the given element.
|
||||
void SetIsLoadRequest(nsIScriptElement* aElement) {
|
||||
MOZ_ASSERT(aElement);
|
||||
MOZ_ASSERT(!Element());
|
||||
MOZ_ASSERT(IsPreload());
|
||||
mFetchOptions->mElement = aElement;
|
||||
mFetchOptions->mIsPreload = false;
|
||||
}
|
||||
|
||||
FromParser GetParserCreated() const {
|
||||
nsIScriptElement* element = Element();
|
||||
if (!element) {
|
||||
return NOT_FROM_PARSER;
|
||||
}
|
||||
return element->GetParserCreated();
|
||||
}
|
||||
|
||||
bool ShouldAcceptBinASTEncoding() const;
|
||||
|
|
|
@ -210,8 +210,6 @@ static void CollectScriptTelemetry(ScriptLoadRequest* aRequest) {
|
|||
if (aRequest->IsLoadingSource()) {
|
||||
if (aRequest->mIsInline) {
|
||||
AccumulateCategorical(LABELS_DOM_SCRIPT_LOADING_SOURCE::Inline);
|
||||
nsAutoString inlineData;
|
||||
aRequest->Element()->GetScriptText(inlineData);
|
||||
} else if (aRequest->IsTextSource()) {
|
||||
AccumulateCategorical(LABELS_DOM_SCRIPT_LOADING_SOURCE::SourceFallback);
|
||||
}
|
||||
|
@ -960,7 +958,7 @@ void ScriptLoader::ProcessLoadedModuleTree(ModuleLoadRequest* aRequest) {
|
|||
RefPtr<ScriptLoadRequest> req = mDynamicImportRequests.Steal(aRequest);
|
||||
RunScriptWhenSafe(req);
|
||||
} else if (aRequest->mIsInline &&
|
||||
aRequest->Element()->GetParserCreated() == NOT_FROM_PARSER) {
|
||||
aRequest->GetParserCreated() == NOT_FROM_PARSER) {
|
||||
MOZ_ASSERT(!aRequest->isInList());
|
||||
RunScriptWhenSafe(aRequest);
|
||||
} else {
|
||||
|
@ -1058,10 +1056,12 @@ nsresult ScriptLoader::AssociateSourceElementsForModuleTree(
|
|||
JS::Rooted<JSObject*> module(aCx, moduleScript->ModuleRecord());
|
||||
MOZ_ASSERT(module);
|
||||
|
||||
nsresult rv =
|
||||
nsJSUtils::InitModuleSourceElement(aCx, module, aRequest->Element());
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
moduleScript->SetSourceElementAssociated();
|
||||
nsIScriptElement* element = aRequest->Element();
|
||||
if (element) {
|
||||
nsresult rv = nsJSUtils::InitModuleSourceElement(aCx, module, element);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
moduleScript->SetSourceElementAssociated();
|
||||
}
|
||||
|
||||
// The script is now ready to be exposed to the debugger.
|
||||
JS::Rooted<JSScript*> script(aCx, JS::GetModuleScript(module));
|
||||
|
@ -1711,7 +1711,7 @@ ScriptLoadRequest* ScriptLoader::LookupPreloadRequest(
|
|||
// Found preloaded request. Note that a script-inserted script can steal a
|
||||
// preload!
|
||||
RefPtr<ScriptLoadRequest> request = mPreloads[i].mRequest;
|
||||
request->SetElement(aElement);
|
||||
request->SetIsLoadRequest(aElement);
|
||||
nsString preloadCharset(mPreloads[i].mCharset);
|
||||
mPreloads.RemoveElementAt(i);
|
||||
|
||||
|
@ -2073,7 +2073,7 @@ nsresult ScriptLoader::ProcessRequest(ScriptLoadRequest* aRequest) {
|
|||
}
|
||||
|
||||
nsCOMPtr<nsIScriptElement> oldParserInsertedScript;
|
||||
uint32_t parserCreated = aRequest->Element()->GetParserCreated();
|
||||
uint32_t parserCreated = aRequest->GetParserCreated();
|
||||
if (parserCreated) {
|
||||
oldParserInsertedScript = mCurrentParserInsertedScript;
|
||||
mCurrentParserInsertedScript = aRequest->Element();
|
||||
|
@ -2379,15 +2379,15 @@ nsresult ScriptLoader::EvaluateScript(ScriptLoadRequest* aRequest) {
|
|||
}
|
||||
|
||||
nsCOMPtr<nsIContent> scriptContent(do_QueryInterface(aRequest->Element()));
|
||||
nsIDocument* ownerDoc = scriptContent->OwnerDoc();
|
||||
if (ownerDoc != mDocument) {
|
||||
// Willful violation of HTML5 as of 2010-12-01
|
||||
return NS_ERROR_FAILURE;
|
||||
MOZ_ASSERT_IF(!scriptContent, aRequest->AsModuleRequest()->IsDynamicImport());
|
||||
if (scriptContent) {
|
||||
nsIDocument* ownerDoc = scriptContent->OwnerDoc();
|
||||
if (ownerDoc != mDocument) {
|
||||
// Willful violation of HTML5 as of 2010-12-01
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
// Get the script-type to be used by this element.
|
||||
NS_ASSERTION(scriptContent, "no content - what is default script-type?");
|
||||
|
||||
nsCOMPtr<nsIScriptGlobalObject> globalObject = GetScriptGlobalObject();
|
||||
if (!globalObject) {
|
||||
return NS_ERROR_FAILURE;
|
||||
|
@ -3106,7 +3106,7 @@ void ScriptLoader::ReportErrorToConsole(ScriptLoadRequest* aRequest,
|
|||
nsresult aResult) const {
|
||||
MOZ_ASSERT(aRequest);
|
||||
|
||||
if (!aRequest->Element()) {
|
||||
if (aRequest->IsPreload()) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -3126,8 +3126,9 @@ void ScriptLoader::ReportErrorToConsole(ScriptLoadRequest* aRequest,
|
|||
NS_ConvertUTF8toUTF16 url(aRequest->mURI->GetSpecOrDefault());
|
||||
const char16_t* params[] = {url.get()};
|
||||
|
||||
uint32_t lineNo = aRequest->Element()->GetScriptLineNumber();
|
||||
uint32_t columnNo = aRequest->Element()->GetScriptColumnNumber();
|
||||
nsIScriptElement* element = aRequest->Element();
|
||||
uint32_t lineNo = element ? element->GetScriptLineNumber() : 0;
|
||||
uint32_t columnNo = element ? element->GetScriptColumnNumber() : 0;
|
||||
|
||||
nsContentUtils::ReportToConsole(
|
||||
nsIScriptError::warningFlag, NS_LITERAL_CSTRING("Script Loader"),
|
||||
|
@ -3459,6 +3460,7 @@ void ScriptLoader::PreloadURI(
|
|||
request->mIsInline = false;
|
||||
request->mScriptFromHead = aScriptFromHead;
|
||||
request->SetScriptMode(aDefer, aAsync);
|
||||
request->SetIsPreloadRequest();
|
||||
|
||||
if (LOG_ENABLED()) {
|
||||
nsAutoCString url;
|
||||
|
|
Загрузка…
Ссылка в новой задаче