diff --git a/dom/html/HTMLMediaElement.cpp b/dom/html/HTMLMediaElement.cpp
index ffd643124f..5a5af2fe09 100644
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -3734,6 +3734,9 @@ HTMLMediaElement::AfterSetAttr(int32_t aNameSpaceID, nsIAtom* aName,
if (aNameSpaceID == kNameSpaceID_None) {
if (aName == nsGkAtoms::src) {
mSrcMediaSource = nullptr;
+ mSrcAttrTriggeringPrincipal = nsContentUtils::GetAttrTriggeringPrincipal(
+ this, aValue ? aValue->GetStringValue() : EmptyString(),
+ aMaybeScriptedPrincipal);
if (aValue) {
nsString srcStr = aValue->GetStringValue();
nsCOMPtr uri;
diff --git a/dom/html/HTMLMediaElement.h b/dom/html/HTMLMediaElement.h
index 9cdc376e82..5943c08419 100644
--- a/dom/html/HTMLMediaElement.h
+++ b/dom/html/HTMLMediaElement.h
@@ -410,10 +410,13 @@ public:
MediaError* GetError() const;
- // XPCOM GetSrc() is OK
- void SetSrc(const nsAString& aSrc, ErrorResult& aRv)
+ void GetSrc(nsString& aSrc, nsIPrincipal&)
{
- SetHTMLAttr(nsGkAtoms::src, aSrc, aRv);
+ GetSrc(aSrc); // XPCOM
+ }
+ void SetSrc(const nsAString& aSrc, nsIPrincipal& aTriggeringPrincipal, ErrorResult& aRv)
+ {
+ SetHTMLAttr(nsGkAtoms::src, aSrc, aTriggeringPrincipal, aRv);
}
// XPCOM GetCurrentSrc() is OK
@@ -1326,6 +1329,9 @@ protected:
// set in the src attribute.
RefPtr mSrcAttrStream;
+ // Holds the triggering principal for the src attribute.
+ nsCOMPtr mSrcAttrTriggeringPrincipal;
+
// Holds a reference to the DOM wrapper for the MediaStream that we're
// actually playing.
// At most one of mDecoder and mSrcStream can be non-null.
diff --git a/dom/webidl/HTMLMediaElement.webidl b/dom/webidl/HTMLMediaElement.webidl
index ad31f38cbc..8da82efdc4 100644
--- a/dom/webidl/HTMLMediaElement.webidl
+++ b/dom/webidl/HTMLMediaElement.webidl
@@ -17,7 +17,7 @@ interface HTMLMediaElement : HTMLElement {
readonly attribute MediaError? error;
// network state
- [CEReactions, SetterThrows]
+ [CEReactions, NeedsSubjectPrincipal, SetterThrows]
attribute DOMString src;
readonly attribute DOMString currentSrc;