diff --git a/dom/html/HTMLMediaElement.cpp b/dom/html/HTMLMediaElement.cpp
index 171861002c6..4f87760aa66 100644
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -1792,7 +1792,11 @@ HTMLMediaElement::CaptureStreamInternal(bool aFinishWhenEnded)
if (!window) {
return nullptr;
}
-
+#ifdef MOZ_EME
+ if (ContainsRestrictedContent()) {
+ return nullptr;
+ }
+#endif
OutputMediaStream* out = mOutputStreams.AppendElement();
#ifdef DEBUG
// Estimate hints based on the type of the media element
@@ -3997,10 +4001,21 @@ HTMLMediaElement::GetMediaKeys() const
return mMediaKeys;
}
+bool
+HTMLMediaElement::ContainsRestrictedContent()
+{
+ return GetMediaKeys() != nullptr;
+}
+
already_AddRefed
HTMLMediaElement::SetMediaKeys(mozilla::dom::MediaKeys* aMediaKeys,
ErrorResult& aRv)
{
+ if (MozAudioCaptured()) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return nullptr;
+ }
+
nsCOMPtr global =
do_QueryInterface(OwnerDoc()->GetInnerWindow());
if (!global) {
@@ -4035,6 +4050,8 @@ HTMLMediaElement::SetMediaKeys(mozilla::dom::MediaKeys* aMediaKeys,
if (mDecoder) {
mDecoder->SetCDMProxy(mMediaKeys->GetCDMProxy());
}
+ // Update the same-origin status.
+ NotifyDecoderPrincipalChanged();
}
promise->MaybeResolve(JS::UndefinedHandleValue);
return promise.forget();
diff --git a/dom/html/HTMLMediaElement.h b/dom/html/HTMLMediaElement.h
index 82996463149..478f830a7ef 100644
--- a/dom/html/HTMLMediaElement.h
+++ b/dom/html/HTMLMediaElement.h
@@ -550,6 +550,7 @@ public:
// in the URL bar of the browser window.
already_AddRefed GetTopLevelPrincipal();
+ bool ContainsRestrictedContent();
#endif // MOZ_EME
bool MozAutoplayEnabled() const
diff --git a/dom/media/test/eme.js b/dom/media/test/eme.js
index ba8652f4170..8f8e7822e41 100644
--- a/dom/media/test/eme.js
+++ b/dom/media/test/eme.js
@@ -150,6 +150,10 @@ function SetupEME(test, token, params)
{
var v = document.createElement("video");
+ var onSetKeysFail = (params && params.onSetKeysFail)
+ ? params.onSetKeysFail
+ : bail(token + " Failed to set MediaKeys on