From 186a0ce621e03b796e3224f337da55037fca61d6 Mon Sep 17 00:00:00 2001 From: Fedor Date: Wed, 25 Dec 2019 15:40:03 +0300 Subject: [PATCH] 1330657 - Enable script type=/module/ behind a pref. --- dom/base/nsScriptLoader.cpp | 18 +++++++++++++++--- dom/base/nsScriptLoader.h | 2 ++ js/src/jit-test/tests/modules/bug-1320993.js | 2 ++ modules/libpref/init/all.js | 3 +++ 4 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 js/src/jit-test/tests/modules/bug-1320993.js diff --git a/dom/base/nsScriptLoader.cpp b/dom/base/nsScriptLoader.cpp index 1e23d6c5f..5577df20b 100644 --- a/dom/base/nsScriptLoader.cpp +++ b/dom/base/nsScriptLoader.cpp @@ -653,6 +653,19 @@ nsScriptLoader::CheckContentPolicy(nsIDocument* aDocument, return NS_OK; } +bool +nsScriptLoader::ModuleScriptsEnabled() +{ + static bool sEnabledForContent = false; + static bool sCachedPref = false; + if (!sCachedPref) { + sCachedPref = true; + Preferences::AddBoolVarCache(&sEnabledForContent, "dom.moduleScripts.enabled", false); + } + + return nsContentUtils::IsChromeDoc(mDocument) || sEnabledForContent; +} + bool nsScriptLoader::ModuleMapContainsModule(nsModuleLoadRequest *aRequest) const { @@ -1448,8 +1461,7 @@ nsScriptLoader::ProcessScriptElement(nsIScriptElement *aElement) nsScriptKind scriptKind = nsScriptKind::Classic; if (!type.IsEmpty()) { - // Support type="module" only for chrome documents. - if (nsContentUtils::IsChromeDoc(mDocument) && type.LowerCaseEqualsASCII("module")) { + if (ModuleScriptsEnabled() && type.LowerCaseEqualsASCII("module")) { scriptKind = nsScriptKind::Module; } else { NS_ENSURE_TRUE(ParseTypeAttribute(type, &version), false); @@ -2768,7 +2780,7 @@ nsScriptLoader::PreloadURI(nsIURI *aURI, const nsAString &aCharset, } // TODO: Preload module scripts. - if (nsContentUtils::IsChromeDoc(mDocument) && aType.LowerCaseEqualsASCII("module")) { + if (ModuleScriptsEnabled() && aType.LowerCaseEqualsASCII("module")) { return; } diff --git a/dom/base/nsScriptLoader.h b/dom/base/nsScriptLoader.h index d30a58441..a00239be5 100644 --- a/dom/base/nsScriptLoader.h +++ b/dom/base/nsScriptLoader.h @@ -568,6 +568,8 @@ private: JS::SourceBufferHolder GetScriptSource(nsScriptLoadRequest* aRequest, nsAutoString& inlineData); + bool ModuleScriptsEnabled(); + void SetModuleFetchStarted(nsModuleLoadRequest *aRequest); void SetModuleFetchFinishedAndResumeWaitingRequests(nsModuleLoadRequest *aRequest, nsresult aResult); diff --git a/js/src/jit-test/tests/modules/bug-1320993.js b/js/src/jit-test/tests/modules/bug-1320993.js new file mode 100644 index 000000000..bece5731a --- /dev/null +++ b/js/src/jit-test/tests/modules/bug-1320993.js @@ -0,0 +1,2 @@ +parseModule("export default (class {})"); +parseModule("export default (class A {})"); diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js index 9eb9c2a7b..1c6c3af09 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -5468,3 +5468,6 @@ pref("dom.storageManager.enabled", false); // >0 = suppress further prompts after the user has canceled the dialog n times // See application preferences for appropriate defaults. pref("prompts.authentication_dialog_abuse_limit", 0); + +// Whether module scripts (