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;