@@ -1024,6 +1024,7 @@ bool ScriptLoader::PreloadURIComparator::Equals(const PreloadInfo& aPi,
10241024}
10251025
10261026static bool CSPAllowsInlineScript (nsIScriptElement* aElement,
1027+ const nsAString& aSourceText,
10271028 const nsAString& aNonce,
10281029 Document* aDocument) {
10291030 nsCOMPtr<nsIContentSecurityPolicy> csp =
@@ -1041,7 +1042,7 @@ static bool CSPAllowsInlineScript(nsIScriptElement* aElement,
10411042 nsresult rv = csp->GetAllowsInline (
10421043 nsIContentSecurityPolicy::SCRIPT_SRC_ELEM_DIRECTIVE,
10431044 false /* aHasUnsafeHash */ , aNonce, parserCreated, element,
1044- nullptr /* nsICSPEventListener */ , VoidString () ,
1045+ nullptr /* nsICSPEventListener */ , aSourceText ,
10451046 aElement->GetScriptLineNumber (),
10461047 aElement->GetScriptColumnNumber ().oneOriginValue (), &allowInlineScript);
10471048 return NS_SUCCEEDED(rv) && allowInlineScript;
@@ -1102,15 +1103,17 @@ void ScriptLoader::NotifyObserversForCachedScript(
11021103
11031104already_AddRefed<ScriptLoadRequest> ScriptLoader::CreateLoadRequest (
11041105 ScriptKind aKind, nsIURI* aURI, nsIScriptElement* aElement,
1105- nsIPrincipal* aTriggeringPrincipal, CORSMode aCORSMode,
1106- const nsAString& aNonce, RequestPriority aRequestPriority,
1107- const SRIMetadata& aIntegrity, ReferrerPolicy aReferrerPolicy,
1108- ParserMetadata aParserMetadata, ScriptLoadRequestType aRequestType) {
1106+ const nsAString& aScriptContent, nsIPrincipal* aTriggeringPrincipal,
1107+ CORSMode aCORSMode, const nsAString& aNonce,
1108+ RequestPriority aRequestPriority, const SRIMetadata& aIntegrity,
1109+ ReferrerPolicy aReferrerPolicy, ParserMetadata aParserMetadata,
1110+ ScriptLoadRequestType aRequestType) {
11091111 nsIURI* referrer = mDocument ->GetDocumentURIAsReferrer ();
11101112 RefPtr<ScriptFetchOptions> fetchOptions =
11111113 new ScriptFetchOptions (aCORSMode, aNonce, aRequestPriority,
11121114 aParserMetadata, aTriggeringPrincipal);
1113- RefPtr<ScriptLoadContext> context = new ScriptLoadContext (aElement);
1115+ RefPtr<ScriptLoadContext> context =
1116+ new ScriptLoadContext (aElement, aScriptContent);
11141117
11151118 if (aKind == ScriptKind::eModule) {
11161119 RefPtr<ModuleLoadRequest> request = mModuleLoader ->CreateTopLevel (
@@ -1199,7 +1202,8 @@ void ScriptLoader::EmulateNetworkEvents(ScriptLoadRequest* aRequest) {
11991202 }
12001203}
12011204
1202- bool ScriptLoader::ProcessScriptElement (nsIScriptElement* aElement) {
1205+ bool ScriptLoader::ProcessScriptElement (nsIScriptElement* aElement,
1206+ const nsAString& aSourceText) {
12031207 // We need a document to evaluate scripts.
12041208 NS_ENSURE_TRUE (mDocument , false );
12051209
@@ -1240,7 +1244,7 @@ bool ScriptLoader::ProcessScriptElement(nsIScriptElement* aElement) {
12401244 return ProcessExternalScript (aElement, scriptKind, scriptContent);
12411245 }
12421246
1243- return ProcessInlineScript (aElement, scriptKind);
1247+ return ProcessInlineScript (aElement, scriptKind, aSourceText );
12441248}
12451249
12461250static ParserMetadata GetParserMetadata (nsIScriptElement* aElement) {
@@ -1347,8 +1351,8 @@ bool ScriptLoader::ProcessExternalScript(nsIScriptElement* aElement,
13471351 ParserMetadata parserMetadata = GetParserMetadata (aElement);
13481352
13491353 request = CreateLoadRequest (
1350- aScriptKind, scriptURI, aElement, principal, ourCORSMode, nonce ,
1351- FetchPriorityToRequestPriority (fetchPriority), sriMetadata,
1354+ aScriptKind, scriptURI, aElement, VoidString (), principal, ourCORSMode ,
1355+ nonce, FetchPriorityToRequestPriority (fetchPriority), sriMetadata,
13521356 referrerPolicy, parserMetadata, ScriptLoadRequestType::External);
13531357 request->GetScriptLoadContext ()->mIsInline = false ;
13541358 request->GetScriptLoadContext ()->SetScriptMode (
@@ -1528,7 +1532,8 @@ bool ScriptLoader::ProcessExternalScript(nsIScriptElement* aElement,
15281532}
15291533
15301534bool ScriptLoader::ProcessInlineScript(nsIScriptElement* aElement,
1531- ScriptKind aScriptKind) {
1535+ ScriptKind aScriptKind,
1536+ const nsAString& aSourceText) {
15321537 // Is this document sandboxed without 'allow-scripts'?
15331538 if (mDocument->HasScriptsBlockedBySandbox()) {
15341539 return false;
@@ -1538,7 +1543,7 @@ bool ScriptLoader::ProcessInlineScript(nsIScriptElement* aElement,
15381543 nsString nonce = nsContentSecurityUtils::GetIsElementNonceableNonce(*element);
15391544
15401545 // Does CSP allow this inline script to run?
1541- if (!CSPAllowsInlineScript(aElement, nonce, mDocument)) {
1546+ if (!CSPAllowsInlineScript(aElement, aSourceText, nonce, mDocument)) {
15421547 return false;
15431548 }
15441549
@@ -1581,7 +1586,7 @@ bool ScriptLoader::ProcessInlineScript(nsIScriptElement* aElement,
15811586 // NOTE: The `nonce` as specified here is significant, because it's inherited
15821587 // by other scripts (e.g. modules created via dynamic imports).
15831588 RefPtr<ScriptLoadRequest> request = CreateLoadRequest(
1584- aScriptKind, mDocument->GetDocumentURI(), aElement,
1589+ aScriptKind, mDocument->GetDocumentURI(), aElement, aSourceText,
15851590 mDocument->NodePrincipal(), corsMode, nonce,
15861591 FetchPriorityToRequestPriority(fetchPriority),
15871592 SRIMetadata(), // SRI doesn't apply
@@ -1684,9 +1689,6 @@ bool ScriptLoader::ProcessInlineScript(nsIScriptElement* aElement,
16841689 return true ;
16851690 }
16861691 if (aElement->GetParserCreated () == NOT_FROM_PARSER) {
1687- NS_ASSERTION (
1688- !nsContentUtils::IsSafeToRunScript(),
1689- "A script-inserted script is inserted without an update batch?");
16901692 RunScriptWhenSafe (request);
16911693 return false ;
16921694 }
@@ -4597,13 +4599,13 @@ void ScriptLoader::PreloadURI(
45974599 // We treat speculative <script> loads as parser-inserted, because they
45984600 // come from a parser. This will also match how they should be treated
45994601 // as a normal load.
4600- RefPtr<ScriptLoadRequest> request =
4601- CreateLoadRequest ( scriptKind, aURI, nullptr , mDocument ->NodePrincipal (),
4602- Element::StringToCORSMode (aCrossOrigin), aNonce,
4603- requestPriority, sriMetadata, aReferrerPolicy,
4604- aLinkPreload ? ParserMetadata::NotParserInserted
4605- : ParserMetadata::ParserInserted,
4606- ScriptLoadRequestType::Preload);
4602+ RefPtr<ScriptLoadRequest> request = CreateLoadRequest (
4603+ scriptKind, aURI, nullptr , VoidString () , mDocument ->NodePrincipal (),
4604+ Element::StringToCORSMode (aCrossOrigin), aNonce, requestPriority ,
4605+ sriMetadata, aReferrerPolicy,
4606+ aLinkPreload ? ParserMetadata::NotParserInserted
4607+ : ParserMetadata::ParserInserted,
4608+ ScriptLoadRequestType::Preload);
46074609 request->GetScriptLoadContext ()->mIsInline = false ;
46084610 request->GetScriptLoadContext ()->mScriptFromHead = aScriptFromHead;
46094611 request->GetScriptLoadContext ()->SetScriptMode (aDefer, aAsync, aLinkPreload);
0 commit comments