Backed out changeset 4107b758e7ae (bug 1501608) as requested by dev

This commit is contained in:
Dorel Luca
2020-05-02 15:03:19 +03:00
parent c51a93d42b
commit c5e566a917
21 changed files with 156 additions and 241 deletions

View File

@@ -88,33 +88,6 @@ using mozilla::Telemetry::LABELS_DOM_SCRIPT_PRELOAD_RESULT;
namespace mozilla {
namespace dom {
JSObject* GetElementCallback(JSContext* aCx, JS::HandleValue aValue) {
JS::RootedValue privateValue(aCx, aValue);
MOZ_ASSERT(!privateValue.isObjectOrNull() && !privateValue.isUndefined());
LoadedScript* script = static_cast<LoadedScript*>(privateValue.toPrivate());
if (!script->GetFetchOptions()) {
return nullptr;
}
nsCOMPtr<Element> domElement = script->GetFetchOptions()->mElement;
if (!domElement) {
return nullptr;
}
JSObject* globalObject =
domElement->OwnerDoc()->GetScopeObject()->GetGlobalJSObject();
JSAutoRealm ar(aCx, globalObject);
JS::Rooted<JS::Value> elementValue(aCx);
nsresult rv = nsContentUtils::WrapNative(aCx, domElement, &elementValue,
/* aAllowWrapping = */ true);
if (NS_FAILED(rv)) {
return nullptr;
}
return elementValue.toObjectOrNull();
}
LazyLogModule ScriptLoader::gCspPRLog("CSP");
LazyLogModule ScriptLoader::gScriptLoaderLog("ScriptLoader");
@@ -876,10 +849,6 @@ static LoadedScript* GetLoadedScriptOrNull(
}
auto script = static_cast<LoadedScript*>(aReferencingPrivate.toPrivate());
if (script->IsEventScript()) {
return nullptr;
}
MOZ_ASSERT_IF(
script->IsModuleScript(),
JS::GetModulePrivate(script->AsModuleScript()->ModuleRecord()) ==
@@ -985,7 +954,7 @@ bool HostImportModuleDynamically(JSContext* aCx,
ScriptFetchOptions* options;
nsIURI* baseURL;
if (script) {
options = script->GetFetchOptions();
options = script->FetchOptions();
baseURL = script->BaseURL();
} else {
// We don't have a referencing script so fall back on using
@@ -1237,6 +1206,12 @@ nsresult ScriptLoader::InitDebuggerDataForModuleTree(
JS::Rooted<JSObject*> module(aCx, moduleScript->ModuleRecord());
MOZ_ASSERT(module);
nsIScriptElement* element = aRequest->Element();
if (element) {
nsresult rv = nsJSUtils::InitModuleSourceElement(aCx, module, element);
NS_ENSURE_SUCCESS(rv, rv);
}
// The script is now ready to be exposed to the debugger.
JS::Rooted<JSScript*> script(aCx, JS::GetModuleScript(module));
JS::ExposeScriptToDebugger(aCx, script);
@@ -1248,7 +1223,7 @@ nsresult ScriptLoader::InitDebuggerDataForModuleTree(
nsresult ScriptLoader::RestartLoad(ScriptLoadRequest* aRequest) {
MOZ_ASSERT(aRequest->IsBytecode());
aRequest->mScriptBytecode.clearAndFree();
TRACE_FOR_TEST(aRequest->GetScriptElement(), "scriptloader_fallback");
TRACE_FOR_TEST(aRequest->Element(), "scriptloader_fallback");
// Start a new channel from which we explicitly request to stream the source
// instead of the bytecode.
@@ -1296,8 +1271,8 @@ nsresult ScriptLoader::StartLoad(ScriptLoadRequest* aRequest) {
nsContentPolicyType contentPolicyType =
ScriptLoadRequestToContentPolicyType(aRequest);
nsCOMPtr<nsINode> context;
if (aRequest->GetScriptElement()) {
context = do_QueryInterface(aRequest->GetScriptElement());
if (aRequest->Element()) {
context = do_QueryInterface(aRequest->Element());
} else {
context = mDocument;
}
@@ -1550,9 +1525,8 @@ ScriptLoadRequest* ScriptLoader::CreateLoadRequest(
nsIPrincipal* aTriggeringPrincipal, CORSMode aCORSMode,
const SRIMetadata& aIntegrity, ReferrerPolicy aReferrerPolicy) {
nsIURI* referrer = mDocument->GetDocumentURIAsReferrer();
nsCOMPtr<Element> domElement = do_QueryInterface(aElement);
ScriptFetchOptions* fetchOptions = new ScriptFetchOptions(
aCORSMode, aReferrerPolicy, domElement, aTriggeringPrincipal);
aCORSMode, aReferrerPolicy, aElement, aTriggeringPrincipal);
if (aKind == ScriptKind::eClassic) {
return new ScriptLoadRequest(aKind, aURI, fetchOptions, aIntegrity,
@@ -1836,7 +1810,7 @@ bool ScriptLoader::ProcessInlineScript(nsIScriptElement* aElement,
request->mLineNo = aElement->GetScriptLineNumber();
request->mProgress = ScriptLoadRequest::Progress::eLoading_Source;
request->SetTextSource();
TRACE_FOR_TEST_BOOL(request->GetScriptElement(), "scriptloader_load_source");
TRACE_FOR_TEST_BOOL(request->Element(), "scriptloader_load_source");
CollectScriptTelemetry(request);
// Only the 'async' attribute is heeded on an inline module script and
@@ -2226,7 +2200,7 @@ nsresult ScriptLoader::GetScriptSource(JSContext* aCx,
// If there's no script text, we try to get it from the element
if (aRequest->mIsInline) {
nsAutoString inlineData;
aRequest->GetScriptElement()->GetScriptText(inlineData);
aRequest->Element()->GetScriptText(inlineData);
size_t nbytes = inlineData.Length() * sizeof(char16_t);
JS::UniqueTwoByteChars chars(
@@ -2308,8 +2282,7 @@ nsresult ScriptLoader::ProcessRequest(ScriptLoadRequest* aRequest) {
}
}
nsCOMPtr<nsINode> scriptElem =
do_QueryInterface(aRequest->GetScriptElement());
nsCOMPtr<nsINode> scriptElem = do_QueryInterface(aRequest->Element());
nsCOMPtr<Document> doc;
if (!aRequest->mIsInline) {
@@ -2320,10 +2293,10 @@ nsresult ScriptLoader::ProcessRequest(ScriptLoadRequest* aRequest) {
uint32_t parserCreated = aRequest->GetParserCreated();
if (parserCreated) {
oldParserInsertedScript = mCurrentParserInsertedScript;
mCurrentParserInsertedScript = aRequest->GetScriptElement();
mCurrentParserInsertedScript = aRequest->Element();
}
aRequest->GetScriptElement()->BeginEvaluating();
aRequest->Element()->BeginEvaluating();
FireScriptAvailable(NS_OK, aRequest);
@@ -2368,7 +2341,7 @@ nsresult ScriptLoader::ProcessRequest(ScriptLoadRequest* aRequest) {
FireScriptEvaluated(rv, aRequest);
aRequest->GetScriptElement()->EndEvaluating();
aRequest->Element()->EndEvaluating();
if (parserCreated) {
mCurrentParserInsertedScript = oldParserInsertedScript;
@@ -2417,9 +2390,8 @@ void ScriptLoader::FireScriptAvailable(nsresult aResult,
ScriptLoadRequest* aRequest) {
for (int32_t i = 0; i < mObservers.Count(); i++) {
nsCOMPtr<nsIScriptLoaderObserver> obs = mObservers[i];
obs->ScriptAvailable(aResult, aRequest->GetScriptElement(),
aRequest->mIsInline, aRequest->mURI,
aRequest->mLineNo);
obs->ScriptAvailable(aResult, aRequest->Element(), aRequest->mIsInline,
aRequest->mURI, aRequest->mLineNo);
}
aRequest->FireScriptAvailable(aResult);
@@ -2429,8 +2401,7 @@ void ScriptLoader::FireScriptEvaluated(nsresult aResult,
ScriptLoadRequest* aRequest) {
for (int32_t i = 0; i < mObservers.Count(); i++) {
nsCOMPtr<nsIScriptLoaderObserver> obs = mObservers[i];
obs->ScriptEvaluated(aResult, aRequest->GetScriptElement(),
aRequest->mIsInline);
obs->ScriptEvaluated(aResult, aRequest->Element(), aRequest->mIsInline);
}
aRequest->FireScriptEvaluated(aResult);
@@ -2490,6 +2461,16 @@ nsresult ScriptLoader::FillCompileOptionsForRequest(
if (aRequest->IsModuleRequest()) {
aOptions->hideScriptFromDebugger = true;
} else {
JSContext* cx = jsapi.cx();
JS::Rooted<JS::Value> elementVal(cx);
MOZ_ASSERT(aRequest->Element());
if (NS_SUCCEEDED(nsContentUtils::WrapNative(cx, aRequest->Element(),
&elementVal,
/* aAllowWrapping = */ true))) {
MOZ_ASSERT(elementVal.isObject());
aOptions->setElement(&elementVal.toObject());
}
}
return NS_OK;
@@ -2613,6 +2594,11 @@ static nsresult ExecuteCompiledScript(JSContext* aCx,
return NS_OK;
}
// Create a ClassicScript object and associate it with the JSScript.
RefPtr<ClassicScript> classicScript =
new ClassicScript(aRequest->mFetchOptions, aRequest->mBaseURL);
classicScript->AssociateWithScript(script);
return aExec.ExecScript();
}
@@ -2671,8 +2657,7 @@ nsresult ScriptLoader::EvaluateScript(ScriptLoadRequest* aRequest) {
bool isDynamicImport = aRequest->IsModuleRequest() &&
aRequest->AsModuleRequest()->IsDynamicImport();
if (!isDynamicImport) {
nsCOMPtr<nsIContent> scriptContent(
do_QueryInterface(aRequest->GetScriptElement()));
nsCOMPtr<nsIContent> scriptContent(do_QueryInterface(aRequest->Element()));
MOZ_ASSERT(scriptContent);
Document* ownerDoc = scriptContent->OwnerDoc();
if (ownerDoc != mDocument) {
@@ -2748,8 +2733,7 @@ nsresult ScriptLoader::EvaluateScript(ScriptLoadRequest* aRequest) {
rv = InitDebuggerDataForModuleTree(cx, request);
NS_ENSURE_SUCCESS(rv, rv);
TRACE_FOR_TEST(aRequest->GetScriptElement(),
"scriptloader_evaluate_module");
TRACE_FOR_TEST(aRequest->Element(), "scriptloader_evaluate_module");
rv = nsJSUtils::ModuleEvaluate(cx, module);
MOZ_ASSERT(NS_FAILED(rv) == aes.HasException());
@@ -2764,25 +2748,18 @@ nsresult ScriptLoader::EvaluateScript(ScriptLoadRequest* aRequest) {
FinishDynamicImport(cx, request, rv);
}
TRACE_FOR_TEST_NONE(aRequest->GetScriptElement(),
"scriptloader_no_encode");
TRACE_FOR_TEST_NONE(aRequest->Element(), "scriptloader_no_encode");
aRequest->mCacheInfo = nullptr;
} else {
// Update our current script.
AutoCurrentScriptUpdater scriptUpdater(this,
aRequest->GetScriptElement());
AutoCurrentScriptUpdater scriptUpdater(this, aRequest->Element());
JS::CompileOptions options(cx);
rv = FillCompileOptionsForRequest(aes, aRequest, global, &options);
// Create a ClassicScript object and associate it with the JSScript.
RefPtr<ClassicScript> classicScript =
new ClassicScript(aRequest->mFetchOptions, aRequest->mBaseURL);
options.setPrivateValue(JS::PrivateValue(classicScript));
if (NS_SUCCEEDED(rv)) {
if (aRequest->IsBytecode()) {
TRACE_FOR_TEST(aRequest->GetScriptElement(), "scriptloader_execute");
TRACE_FOR_TEST(aRequest->Element(), "scriptloader_execute");
nsJSUtils::ExecutionContext exec(cx, global);
if (aRequest->mOffThreadToken) {
LOG(("ScriptLoadRequest (%p): Decode Bytecode & Join and Execute",
@@ -2810,8 +2787,7 @@ nsresult ScriptLoader::EvaluateScript(ScriptLoadRequest* aRequest) {
{
nsJSUtils::ExecutionContext exec(cx, global);
exec.SetEncodeBytecode(encodeBytecode);
TRACE_FOR_TEST(aRequest->GetScriptElement(),
"scriptloader_execute");
TRACE_FOR_TEST(aRequest->Element(), "scriptloader_execute");
if (aRequest->mOffThreadToken) {
// Off-main-thread parsing.
LOG(
@@ -2856,7 +2832,7 @@ nsresult ScriptLoader::EvaluateScript(ScriptLoadRequest* aRequest) {
// Queue the current script load request to later save the bytecode.
if (script && encodeBytecode) {
aRequest->SetScript(script);
TRACE_FOR_TEST(aRequest->GetScriptElement(), "scriptloader_encode");
TRACE_FOR_TEST(aRequest->Element(), "scriptloader_encode");
MOZ_ASSERT(aRequest->mBytecodeOffset ==
aRequest->mScriptBytecode.length());
RegisterForBytecodeEncoding(aRequest);
@@ -2865,8 +2841,7 @@ nsresult ScriptLoader::EvaluateScript(ScriptLoadRequest* aRequest) {
("ScriptLoadRequest (%p): Bytecode-cache: disabled (rv = %X, "
"script = %p)",
aRequest, unsigned(rv), script.get()));
TRACE_FOR_TEST_NONE(aRequest->GetScriptElement(),
"scriptloader_no_encode");
TRACE_FOR_TEST_NONE(aRequest->Element(), "scriptloader_no_encode");
aRequest->mCacheInfo = nullptr;
}
}
@@ -2987,8 +2962,7 @@ void ScriptLoader::EncodeRequestBytecode(JSContext* aCx,
nsresult rv = NS_OK;
MOZ_ASSERT(aRequest->mCacheInfo);
auto bytecodeFailed = mozilla::MakeScopeExit([&]() {
TRACE_FOR_TEST_NONE(aRequest->GetScriptElement(),
"scriptloader_bytecode_failed");
TRACE_FOR_TEST_NONE(aRequest->Element(), "scriptloader_bytecode_failed");
});
JS::RootedScript script(aCx, aRequest->mScript);
@@ -3040,8 +3014,7 @@ void ScriptLoader::EncodeRequestBytecode(JSContext* aCx,
MOZ_RELEASE_ASSERT(aRequest->mScriptBytecode.length() == n);
bytecodeFailed.release();
TRACE_FOR_TEST_NONE(aRequest->GetScriptElement(),
"scriptloader_bytecode_saved");
TRACE_FOR_TEST_NONE(aRequest->Element(), "scriptloader_bytecode_saved");
}
void ScriptLoader::GiveUpBytecodeEncoding() {
@@ -3066,8 +3039,7 @@ void ScriptLoader::GiveUpBytecodeEncoding() {
while (!mBytecodeEncodingQueue.isEmpty()) {
RefPtr<ScriptLoadRequest> request = mBytecodeEncodingQueue.StealFirst();
LOG(("ScriptLoadRequest (%p): Cannot serialize bytecode", request.get()));
TRACE_FOR_TEST_NONE(request->GetScriptElement(),
"scriptloader_bytecode_failed");
TRACE_FOR_TEST_NONE(request->Element(), "scriptloader_bytecode_failed");
if (aes.isSome()) {
JS::RootedScript script(aes->cx(), request->mScript);
@@ -3441,7 +3413,7 @@ void ScriptLoader::ReportErrorToConsole(ScriptLoadRequest* aRequest,
AutoTArray<nsString, 1> params;
CopyUTF8toUTF16(aRequest->mURI->GetSpecOrDefault(), *params.AppendElement());
nsIScriptElement* element = aRequest->GetScriptElement();
nsIScriptElement* element = aRequest->Element();
uint32_t lineNo = element ? element->GetScriptLineNumber() : 0;
uint32_t columnNo = element ? element->GetScriptColumnNumber() : 0;
@@ -3474,7 +3446,7 @@ void ScriptLoader::HandleLoadError(ScriptLoadRequest* aRequest,
*/
if (net::UrlClassifierFeatureFactory::IsClassifierBlockingErrorCode(
aResult)) {
nsCOMPtr<nsIContent> cont = do_QueryInterface(aRequest->GetScriptElement());
nsCOMPtr<nsIContent> cont = do_QueryInterface(aRequest->Element());
mDocument->AddBlockedNodeByClassifier(cont);
}
@@ -3541,12 +3513,12 @@ void ScriptLoader::HandleLoadError(ScriptLoadRequest* aRequest,
mParserBlockingRequest = nullptr;
UnblockParser(aRequest);
// Ensure that we treat aRequest->GetScriptElement() as our current
// parser-inserted script while firing onerror on it.
MOZ_ASSERT(aRequest->GetScriptElement()->GetParserCreated());
// Ensure that we treat aRequest->Element() as our current parser-inserted
// script while firing onerror on it.
MOZ_ASSERT(aRequest->Element()->GetParserCreated());
nsCOMPtr<nsIScriptElement> oldParserInsertedScript =
mCurrentParserInsertedScript;
mCurrentParserInsertedScript = aRequest->GetScriptElement();
mCurrentParserInsertedScript = aRequest->Element();
FireScriptAvailable(aResult, aRequest);
ContinueParserAsync(aRequest);
mCurrentParserInsertedScript = oldParserInsertedScript;
@@ -3558,12 +3530,12 @@ void ScriptLoader::HandleLoadError(ScriptLoadRequest* aRequest,
}
void ScriptLoader::UnblockParser(ScriptLoadRequest* aParserBlockingRequest) {
aParserBlockingRequest->GetScriptElement()->UnblockParser();
aParserBlockingRequest->Element()->UnblockParser();
}
void ScriptLoader::ContinueParserAsync(
ScriptLoadRequest* aParserBlockingRequest) {
aParserBlockingRequest->GetScriptElement()->ContinueParserAsync();
aParserBlockingRequest->Element()->ContinueParserAsync();
}
uint32_t ScriptLoader::NumberOfProcessors() {