From ed16ab739e32e9f7026b7b76ae76443567aa10b1 Mon Sep 17 00:00:00 2001 From: roytam1 Date: Tue, 1 Oct 2024 11:59:37 +0800 Subject: [PATCH] ported from mozilla: Bug 1460920 - Part 2 : Support referrerpolicy attribute in script HTMLScriptElement r=hsivonen (3309aa6d27) --- dom/html/HTMLScriptElement.cpp | 6 ++++++ dom/html/HTMLScriptElement.h | 9 +++++++++ dom/html/test/test_bug1260664.html | 2 +- dom/script/ScriptLoader.cpp | 19 +++++++++++++++---- dom/script/ScriptLoader.h | 6 ++++++ dom/script/nsIScriptElement.h | 9 +++++++++ dom/webidl/HTMLScriptElement.webidl | 2 ++ 7 files changed, 48 insertions(+), 5 deletions(-) diff --git a/dom/html/HTMLScriptElement.cpp b/dom/html/HTMLScriptElement.cpp index 48fa96ac90..a1a58e4fa2 100644 --- a/dom/html/HTMLScriptElement.cpp +++ b/dom/html/HTMLScriptElement.cpp @@ -324,6 +324,12 @@ HTMLScriptElement::GetCORSMode() const return AttrValueToCORSMode(GetParsedAttr(nsGkAtoms::crossorigin)); } +mozilla::net::ReferrerPolicy +HTMLScriptElement::GetReferrerPolicy() +{ + return GetReferrerPolicyAsEnum(); +} + bool HTMLScriptElement::HasScriptContent() { diff --git a/dom/html/HTMLScriptElement.h b/dom/html/HTMLScriptElement.h index a80f0262a1..b9affc49a1 100644 --- a/dom/html/HTMLScriptElement.h +++ b/dom/html/HTMLScriptElement.h @@ -42,6 +42,7 @@ public: virtual void GetScriptCharset(nsAString& charset) override; virtual void FreezeExecutionAttrs(nsIDocument* aOwnerDoc) override; virtual CORSMode GetCORSMode() const override; + virtual mozilla::net::ReferrerPolicy GetReferrerPolicy() override; // nsIContent virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent, @@ -96,6 +97,14 @@ public: { SetHTMLAttr(nsGkAtoms::integrity, aIntegrity, rv); } + void SetReferrerPolicy(const nsAString& aReferrerPolicy, ErrorResult& aError) + { + SetHTMLAttr(nsGkAtoms::referrerpolicy, aReferrerPolicy, aError); + } + void GetReferrerPolicy(nsAString& aReferrerPolicy) + { + GetEnumAttr(nsGkAtoms::referrerpolicy, EmptyCString().get(), aReferrerPolicy); + } bool Async(); void SetAsync(bool aValue, ErrorResult& rv); bool NoModule(); diff --git a/dom/html/test/test_bug1260664.html b/dom/html/test/test_bug1260664.html index f034328956..9bc43fdb3c 100644 --- a/dom/html/test/test_bug1260664.html +++ b/dom/html/test/test_bug1260664.html @@ -24,7 +24,7 @@ SimpleTest.waitForExplicitFinish(); SimpleTest.waitForFocus(runTests); function runTests() { - var elements = [ "iframe", "img", "a", "area", "link" ]; + var elements = [ "iframe", "img", "a", "area", "link", "script"]; for (var i = 0; i < elements.length; ++i) { reflectLimitedEnumerated({ diff --git a/dom/script/ScriptLoader.cpp b/dom/script/ScriptLoader.cpp index cbe4265181..42e1694a3e 100644 --- a/dom/script/ScriptLoader.cpp +++ b/dom/script/ScriptLoader.cpp @@ -1563,7 +1563,7 @@ ScriptLoader::ProcessScriptElement(nsIScriptElement *aElement) // Step 15. and later in the HTML5 spec nsresult rv = NS_OK; RefPtr request; - mozilla::net::ReferrerPolicy ourRefPolicy = mDocument->GetReferrerPolicy(); + mozilla::net::ReferrerPolicy referrerPolicy = GetReferrerPolicy(aElement); if (aElement->GetScriptExternal()) { // external script nsCOMPtr scriptURI = aElement->GetScriptURI(); @@ -1593,7 +1593,7 @@ ScriptLoader::ProcessScriptElement(nsIScriptElement *aElement) aElement->GetScriptCharset(elementCharset); if (elementCharset.Equals(preloadCharset) && ourCORSMode == request->CORSMode() && - ourRefPolicy == request->ReferrerPolicy() && + referrerPolicy == request->ReferrerPolicy() && scriptKind == request->mKind) { rv = CheckContentPolicy(mDocument, aElement, request->mURI, type, false); if (NS_FAILED(rv)) { @@ -1639,7 +1639,7 @@ ScriptLoader::ProcessScriptElement(nsIScriptElement *aElement) nsCOMPtr principal = scriptContent->NodePrincipal(); request = CreateLoadRequest(scriptKind, scriptURI, aElement, principal, - ourCORSMode, sriMetadata, ourRefPolicy); + ourCORSMode, sriMetadata, referrerPolicy); request->mIsInline = false; request->SetScriptMode(aElement->GetScriptDeferred(), aElement->GetScriptAsync()); @@ -1760,7 +1760,7 @@ ScriptLoader::ProcessScriptElement(nsIScriptElement *aElement) mDocument->NodePrincipal(), CORS_NONE, SRIMetadata(), // SRI doesn't apply - ourRefPolicy); + referrerPolicy); request->mIsInline = true; request->mLineNo = aElement->GetScriptLineNumber(); @@ -1826,6 +1826,17 @@ ScriptLoader::ProcessScriptElement(nsIScriptElement *aElement) return ProcessRequest(request) == NS_ERROR_HTMLPARSER_BLOCK; } +mozilla::net::ReferrerPolicy +ScriptLoader::GetReferrerPolicy(nsIScriptElement* aElement) +{ + mozilla::net::ReferrerPolicy scriptReferrerPolicy = + aElement->GetReferrerPolicy(); + if (scriptReferrerPolicy != mozilla::net::RP_Unset) { + return scriptReferrerPolicy; + } + return mDocument->GetReferrerPolicy(); +} + namespace { class NotifyOffThreadScriptLoadCompletedRunnable : public Runnable diff --git a/dom/script/ScriptLoader.h b/dom/script/ScriptLoader.h index 6cf108e331..f9492fd049 100644 --- a/dom/script/ScriptLoader.h +++ b/dom/script/ScriptLoader.h @@ -619,6 +619,12 @@ private: void ContinueParserAsync(ScriptLoadRequest* aParserBlockingRequest); + /** + * Given a script element, get the referrer policy should be applied to load + * requests. + */ + mozilla::net::ReferrerPolicy GetReferrerPolicy(nsIScriptElement* aElement); + /** * Helper function to check the content policy for a given request. */ diff --git a/dom/script/nsIScriptElement.h b/dom/script/nsIScriptElement.h index a654291aa0..6a6f985d33 100644 --- a/dom/script/nsIScriptElement.h +++ b/dom/script/nsIScriptElement.h @@ -16,6 +16,7 @@ #include "nsContentCreatorFunctions.h" #include "nsIDOMHTMLScriptElement.h" #include "mozilla/CORSMode.h" +#include "mozilla/net/ReferrerPolicy.h" #define NS_ISCRIPTELEMENT_IID \ { 0xe60fca9b, 0x1b96, 0x4e4e, \ @@ -263,6 +264,14 @@ public: return mozilla::CORS_NONE; } + /** + * Get referrer policy of the script element + */ + virtual mozilla::net::ReferrerPolicy GetReferrerPolicy() + { + return mozilla::net::RP_Unset; + } + /** * Fire an error event */ diff --git a/dom/webidl/HTMLScriptElement.webidl b/dom/webidl/HTMLScriptElement.webidl index 6b48a52443..bb9618428a 100644 --- a/dom/webidl/HTMLScriptElement.webidl +++ b/dom/webidl/HTMLScriptElement.webidl @@ -25,6 +25,8 @@ interface HTMLScriptElement : HTMLElement { [CEReactions, SetterThrows] attribute DOMString? crossOrigin; [CEReactions, SetterThrows] + attribute DOMString referrerPolicy; + [CEReactions, SetterThrows] attribute DOMString text; [CEReactions, SetterThrows, Pure] attribute DOMString nonce;