diff --git a/dom/html/HTMLScriptElement.cpp b/dom/html/HTMLScriptElement.cpp
index ef1fba7d7c..2b7eee510e 100644
--- a/dom/html/HTMLScriptElement.cpp
+++ b/dom/html/HTMLScriptElement.cpp
@@ -166,9 +166,9 @@ HTMLScriptElement::Defer()
}
void
-HTMLScriptElement::SetSrc(const nsAString& aSrc, ErrorResult& rv)
+HTMLScriptElement::SetSrc(const nsAString& aSrc, nsIPrincipal& aTriggeringPrincipal, ErrorResult& rv)
{
- rv = SetAttrHelper(nsGkAtoms::src, aSrc);
+ SetHTMLAttr(nsGkAtoms::src, aSrc, aTriggeringPrincipal, rv);
}
void
@@ -230,16 +230,21 @@ HTMLScriptElement::SetNoModule(bool aValue, ErrorResult& aRv)
}
nsresult
-HTMLScriptElement::AfterSetAttr(int32_t aNamespaceID, nsIAtom* aName,
+HTMLScriptElement::AfterSetAttr(int32_t aNameSpaceID, nsIAtom* aName,
const nsAttrValue* aValue,
const nsAttrValue* aOldValue,
nsIPrincipal* aMaybeScriptedPrincipal,
bool aNotify)
{
- if (nsGkAtoms::async == aName && kNameSpaceID_None == aNamespaceID) {
+ if (aName == nsGkAtoms::async && aNameSpaceID == kNameSpaceID_None) {
mForceAsync = false;
}
- return nsGenericHTMLElement::AfterSetAttr(aNamespaceID, aName,
+ if (aName == nsGkAtoms::src && aNameSpaceID == kNameSpaceID_None) {
+ mSrcTriggeringPrincipal = nsContentUtils::GetAttrTriggeringPrincipal(
+ this, aValue ? aValue->GetStringValue() : EmptyString(),
+ aMaybeScriptedPrincipal);
+ }
+ return nsGenericHTMLElement::AfterSetAttr(aNameSpaceID, aName,
aValue, aOldValue,
aMaybeScriptedPrincipal,
aNotify);
diff --git a/dom/html/HTMLScriptElement.h b/dom/html/HTMLScriptElement.h
index 12d4163be6..05fdaab5e7 100644
--- a/dom/html/HTMLScriptElement.h
+++ b/dom/html/HTMLScriptElement.h
@@ -67,7 +67,11 @@ public:
void SetCharset(const nsAString& aCharset, ErrorResult& rv);
void SetDefer(bool aDefer, ErrorResult& rv);
bool Defer();
- void SetSrc(const nsAString& aSrc, ErrorResult& rv);
+ void GetSrc(nsString& aSrc, nsIPrincipal&)
+ {
+ GetSrc(aSrc);
+ };
+ void SetSrc(const nsAString& aSrc, nsIPrincipal& aTriggeringPrincipal, ErrorResult& rv);
void SetType(const nsAString& aType, ErrorResult& rv);
void SetHtmlFor(const nsAString& aHtmlFor, ErrorResult& rv);
void SetEvent(const nsAString& aEvent, ErrorResult& rv);
diff --git a/dom/script/ScriptLoader.cpp b/dom/script/ScriptLoader.cpp
index dc07d47781..d577eb540b 100644
--- a/dom/script/ScriptLoader.cpp
+++ b/dom/script/ScriptLoader.cpp
@@ -869,6 +869,8 @@ ScriptLoader::StartFetchingModuleAndDependencies(ModuleLoadRequest* aParent,
RefPtr childRequest =
ModuleLoadRequest::CreateStaticImport(aURI, aParent);
+ childRequest->mTriggeringPrincipal = aParent->mTriggeringPrincipal;
+
aParent->mImports.AppendElement(childRequest);
RefPtr ready = childRequest->mReady.Ensure(__func__);
@@ -1329,15 +1331,16 @@ ScriptLoader::StartLoad(ScriptLoadRequest *aRequest, const nsAString &aType,
securityFlags |= nsILoadInfo::SEC_ALLOW_CHROME;
nsCOMPtr channel;
- nsresult rv = NS_NewChannel(getter_AddRefs(channel),
- aRequest->mURI,
- context,
- securityFlags,
- contentPolicyType,
- loadGroup,
- prompter,
- nsIRequest::LOAD_NORMAL |
- nsIChannel::LOAD_CLASSIFY_URI);
+ nsresult rv = NS_NewChannelWithTriggeringPrincipal(
+ getter_AddRefs(channel),
+ aRequest->mURI,
+ context,
+ aRequest->mTriggeringPrincipal,
+ securityFlags,
+ contentPolicyType,
+ loadGroup,
+ prompter,
+ nsIRequest::LOAD_NORMAL);
NS_ENSURE_SUCCESS(rv, rv);
@@ -1638,10 +1641,14 @@ ScriptLoader::ProcessScriptElement(nsIScriptElement *aElement)
}
}
- nsCOMPtr principal = scriptContent->NodePrincipal();
+ nsCOMPtr principal = aElement->GetScriptURITriggeringPrincipal();
+ if (!principal) {
+ principal = scriptContent->NodePrincipal();
+ }
request = CreateLoadRequest(scriptKind, scriptURI, aElement, principal,
ourCORSMode, sriMetadata, referrerPolicy);
+ request->mTriggeringPrincipal = Move(principal);
request->mIsInline = false;
request->SetScriptMode(aElement->GetScriptDeferred(),
aElement->GetScriptAsync());
@@ -1764,6 +1771,7 @@ ScriptLoader::ProcessScriptElement(nsIScriptElement *aElement)
SRIMetadata(), // SRI doesn't apply
referrerPolicy);
request->mIsInline = true;
+ request->mTriggeringPrincipal = mDocument->NodePrincipal();
request->mLineNo = aElement->GetScriptLineNumber();
// Only the 'async' attribute is heeded on an inline module script and
@@ -3077,6 +3085,7 @@ ScriptLoader::PreloadURI(nsIURI *aURI,
mDocument->NodePrincipal(),
Element::StringToCORSMode(aCrossOrigin), sriMetadata,
aReferrerPolicy);
+ request->mTriggeringPrincipal = mDocument->NodePrincipal();
request->mIsInline = false;
request->SetScriptMode(aDefer, aAsync);
request->SetIsPreloadRequest();
diff --git a/dom/script/ScriptLoader.h b/dom/script/ScriptLoader.h
index f66c9ede1d..80248e2dc9 100644
--- a/dom/script/ScriptLoader.h
+++ b/dom/script/ScriptLoader.h
@@ -248,6 +248,7 @@ public:
char16_t* mScriptTextBuf; // Holds script text for non-inline scripts. Don't
size_t mScriptTextLength; // use nsString so we can give ownership to jsapi.
const nsCOMPtr mURI;
+ nsCOMPtr mTriggeringPrincipal;
nsCOMPtr mOriginPrincipal;
nsAutoCString mURL; // Keep the URI's filename alive during off thread parsing.
int32_t mLineNo;
diff --git a/dom/script/nsIScriptElement.h b/dom/script/nsIScriptElement.h
index 6a6f985d33..3149f79cc1 100644
--- a/dom/script/nsIScriptElement.h
+++ b/dom/script/nsIScriptElement.h
@@ -68,6 +68,12 @@ public:
return mUri;
}
+ nsIPrincipal* GetScriptURITriggeringPrincipal()
+ {
+ NS_PRECONDITION(mFrozen, "Not ready for this call yet!");
+ return mSrcTriggeringPrincipal;
+ }
+
/**
* Script source text for inline script elements.
*/
@@ -363,6 +369,11 @@ protected:
*/
nsCOMPtr mUri;
+ /**
+ * The triggering principal for the src URL.
+ */
+ nsCOMPtr mSrcTriggeringPrincipal;
+
/**
* The creator parser of a non-defer, non-async parser-inserted script.
*/
diff --git a/dom/webidl/HTMLScriptElement.webidl b/dom/webidl/HTMLScriptElement.webidl
index bb9618428a..b9f5a2922a 100644
--- a/dom/webidl/HTMLScriptElement.webidl
+++ b/dom/webidl/HTMLScriptElement.webidl
@@ -10,7 +10,7 @@
[HTMLConstructor]
interface HTMLScriptElement : HTMLElement {
- [CEReactions, SetterThrows]
+ [CEReactions, NeedsSubjectPrincipal, SetterThrows]
attribute DOMString src;
[CEReactions, SetterThrows]
attribute DOMString type;