mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-08 08:48:39 +09:00
Don't build EME-specific subroutines without EME.
- Checks for restricted or encrypted content - Dispatching 'encrypted' events - Dispatching 'key needed' events - HTML Media Element media keys system - EME telemetry - HTML Media Element EME API This is the main bulk for #26, isolating EME-specific code.
This commit is contained in:
parent
90fc779437
commit
c9f70f4de1
9 changed files with 90 additions and 2 deletions
|
|
@ -4977,10 +4977,12 @@ CanvasRenderingContext2D::DrawImage(const CanvasImageSource& aImage,
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef MOZ_EME
|
||||
if (video->ContainsRestrictedContent()) {
|
||||
aError.Throw(NS_ERROR_NOT_AVAILABLE);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
uint16_t readyState;
|
||||
if (NS_SUCCEEDED(video->GetReadyState(&readyState)) &&
|
||||
|
|
|
|||
|
|
@ -11,7 +11,9 @@
|
|||
#include "mozilla/ArrayUtils.h"
|
||||
#include "mozilla/MathAlgorithms.h"
|
||||
#include "mozilla/AsyncEventDispatcher.h"
|
||||
#ifdef MOZ_EME
|
||||
#include "mozilla/dom/MediaEncryptedEvent.h"
|
||||
#endif
|
||||
|
||||
#include "base/basictypes.h"
|
||||
#include "nsIDOMHTMLMediaElement.h"
|
||||
|
|
@ -820,7 +822,9 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(HTMLMediaElement, nsGenericHTM
|
|||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mTextTrackManager)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mAudioTrackList)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mVideoTrackList)
|
||||
#ifdef MOZ_EME
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mMediaKeys)
|
||||
#endif
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSelectedVideoStreamTrack)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
|
||||
|
||||
|
|
@ -845,7 +849,9 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(HTMLMediaElement, nsGenericHTMLE
|
|||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mTextTrackManager)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mAudioTrackList)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mVideoTrackList)
|
||||
#ifdef MOZ_EME
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mMediaKeys)
|
||||
#endif
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mSelectedVideoStreamTrack)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
|
||||
|
||||
|
|
@ -1020,12 +1026,14 @@ void HTMLMediaElement::ShutdownDecoder()
|
|||
|
||||
void HTMLMediaElement::AbortExistingLoads()
|
||||
{
|
||||
#ifdef MOZ_EME
|
||||
// If there is no existing decoder then we don't have anything to
|
||||
// report. This prevents reporting the initial load from an
|
||||
// empty video element as a failed EME load.
|
||||
if (mDecoder) {
|
||||
ReportEMETelemetry();
|
||||
}
|
||||
#endif
|
||||
// Abort any already-running instance of the resource selection algorithm.
|
||||
mLoadWaitStatus = NOT_WAITING;
|
||||
|
||||
|
|
@ -1084,7 +1092,13 @@ void HTMLMediaElement::AbortExistingLoads()
|
|||
mDownloadSuspendedByCache = false;
|
||||
mMediaInfo = MediaInfo();
|
||||
mIsEncrypted = false;
|
||||
<<<<<<< HEAD
|
||||
mPendingEncryptedInitData.mInitDatas.Clear();
|
||||
=======
|
||||
#ifdef MOZ_EME
|
||||
mPendingEncryptedInitData.Reset();
|
||||
#endif
|
||||
>>>>>>> 8b6178ba9d... Don't build EME-specific subroutines without EME.
|
||||
mWaitingForKey = NOT_WAITING_FOR_KEY;
|
||||
mSourcePointer = nullptr;
|
||||
|
||||
|
|
@ -2681,9 +2695,11 @@ HTMLMediaElement::CaptureStreamInternal(bool aFinishWhenEnded,
|
|||
if (!window) {
|
||||
return nullptr;
|
||||
}
|
||||
#ifdef MOZ_EME
|
||||
if (ContainsRestrictedContent()) {
|
||||
return nullptr;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!mOutputStreams.IsEmpty() &&
|
||||
aGraph != mOutputStreams[0].mStream->GetInputStream()->Graph()) {
|
||||
|
|
@ -3638,6 +3654,7 @@ void HTMLMediaElement::HiddenVideoStop()
|
|||
mVideoDecodeSuspendTimer = nullptr;
|
||||
}
|
||||
|
||||
#ifdef MOZ_EME
|
||||
void
|
||||
HTMLMediaElement::ReportEMETelemetry()
|
||||
{
|
||||
|
|
@ -3649,6 +3666,7 @@ HTMLMediaElement::ReportEMETelemetry()
|
|||
this, mLoadedDataFired ? "true" : "false"));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
HTMLMediaElement::ReportTelemetry()
|
||||
|
|
@ -3997,6 +4015,7 @@ nsresult HTMLMediaElement::FinishDecoderSetup(MediaDecoder* aDecoder,
|
|||
ms.mFinishWhenEnded);
|
||||
}
|
||||
|
||||
#ifdef MOZ_EME
|
||||
if (mMediaKeys) {
|
||||
if (mMediaKeys->GetCDMProxy()) {
|
||||
mDecoder->SetCDMProxy(mMediaKeys->GetCDMProxy());
|
||||
|
|
@ -4006,6 +4025,7 @@ nsresult HTMLMediaElement::FinishDecoderSetup(MediaDecoder* aDecoder,
|
|||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
MediaEventSource<void>* waitingForKeyProducer = mDecoder->WaitingForKeyEvent();
|
||||
// Not every decoder will produce waitingForKey events, only add ones that can
|
||||
|
|
@ -4468,7 +4488,11 @@ void HTMLMediaElement::MetadataLoaded(const MediaInfo* aInfo,
|
|||
|
||||
SetMediaInfo(*aInfo);
|
||||
|
||||
mIsEncrypted = aInfo->IsEncrypted() || mPendingEncryptedInitData.IsEncrypted();
|
||||
mIsEncrypted = aInfo->IsEncrypted()
|
||||
#ifdef MOZ_EME
|
||||
|| mPendingEncryptedInitData.IsEncrypted()
|
||||
#endif
|
||||
;
|
||||
mTags = aTags.forget();
|
||||
mLoadedDataFired = false;
|
||||
ChangeReadyState(nsIDOMHTMLMediaElement::HAVE_METADATA);
|
||||
|
|
@ -4494,11 +4518,17 @@ void HTMLMediaElement::MetadataLoaded(const MediaInfo* aInfo,
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef MOZ_EME
|
||||
// Dispatch a distinct 'encrypted' event for each initData we have.
|
||||
for (const auto& initData : mPendingEncryptedInitData.mInitDatas) {
|
||||
DispatchEncrypted(initData.mInitData, initData.mType);
|
||||
}
|
||||
<<<<<<< HEAD
|
||||
mPendingEncryptedInitData.mInitDatas.Clear();
|
||||
=======
|
||||
mPendingEncryptedInitData.Reset();
|
||||
#endif
|
||||
>>>>>>> 8b6178ba9d... Don't build EME-specific subroutines without EME.
|
||||
}
|
||||
|
||||
mWatchManager.ManualNotify(&HTMLMediaElement::UpdateReadyStateInternal);
|
||||
|
|
@ -5431,9 +5461,16 @@ void HTMLMediaElement::SuspendOrResumeElement(bool aPauseElement, bool aSuspendE
|
|||
UpdateAudioChannelPlayingState();
|
||||
if (aPauseElement) {
|
||||
ReportTelemetry();
|
||||
#ifdef MOZ_EME
|
||||
ReportEMETelemetry();
|
||||
#endif
|
||||
|
||||
<<<<<<< HEAD
|
||||
// For EME content, force destruction of the CDM client (and CDM
|
||||
=======
|
||||
#ifdef MOZ_EME
|
||||
// For EME content, we may force destruction of the CDM client (and CDM
|
||||
>>>>>>> 8b6178ba9d... Don't build EME-specific subroutines without EME.
|
||||
// instance if this is the last client for that CDM instance) and
|
||||
// the CDM's decoder. This ensures the CDM gets reliable and prompt
|
||||
// shutdown notifications, as it may have book-keeping it needs
|
||||
|
|
@ -5445,6 +5482,7 @@ void HTMLMediaElement::SuspendOrResumeElement(bool aPauseElement, bool aSuspendE
|
|||
ShutdownDecoder();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (mDecoder) {
|
||||
mDecoder->Pause();
|
||||
mDecoder->Suspend();
|
||||
|
|
@ -5495,6 +5533,20 @@ void HTMLMediaElement::NotifyOwnerDocumentActivityChanged()
|
|||
bool pauseElement = ShouldElementBePaused();
|
||||
SuspendOrResumeElement(pauseElement, !IsActive());
|
||||
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
#ifdef MOZ_EME
|
||||
// If the owning document has become inactive we should shutdown the CDM.
|
||||
if (!OwnerDoc()->IsCurrentActiveDocument() && mMediaKeys) {
|
||||
mMediaKeys->Shutdown();
|
||||
mMediaKeys = nullptr;
|
||||
if (mDecoder) {
|
||||
ShutdownDecoder();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
>>>>>>> 8b6178ba9d... Don't build EME-specific subroutines without EME.
|
||||
AddRemoveSelfReference();
|
||||
}
|
||||
|
||||
|
|
@ -6270,6 +6322,7 @@ HTMLMediaElement::OnVisibilityChange(Visibility aNewVisibility)
|
|||
|
||||
}
|
||||
|
||||
#ifdef MOZ_EME
|
||||
MediaKeys*
|
||||
HTMLMediaElement::GetMediaKeys() const
|
||||
{
|
||||
|
|
@ -6479,6 +6532,7 @@ HTMLMediaElement::GetTopLevelPrincipal()
|
|||
principal = doc->NodePrincipal();
|
||||
return principal.forget();
|
||||
}
|
||||
#endif //MOZ_EME
|
||||
|
||||
void
|
||||
HTMLMediaElement::CannotDecryptWaitingForKey()
|
||||
|
|
|
|||
|
|
@ -20,7 +20,9 @@
|
|||
#include "mozilla/dom/TextTrackManager.h"
|
||||
#include "mozilla/WeakPtr.h"
|
||||
#include "MediaDecoder.h"
|
||||
#ifdef MOZ_EME
|
||||
#include "mozilla/dom/MediaKeys.h"
|
||||
#endif
|
||||
#include "mozilla/StateWatching.h"
|
||||
#include "nsGkAtoms.h"
|
||||
#include "PrincipalChangeObserver.h"
|
||||
|
|
@ -630,6 +632,7 @@ public:
|
|||
|
||||
// XPCOM MozPreservesPitch() is OK
|
||||
|
||||
#ifdef MOZ_EME
|
||||
MediaKeys* GetMediaKeys() const;
|
||||
|
||||
already_AddRefed<Promise> SetMediaKeys(MediaKeys* mediaKeys,
|
||||
|
|
@ -651,6 +654,7 @@ public:
|
|||
already_AddRefed<nsIPrincipal> GetTopLevelPrincipal();
|
||||
|
||||
bool ContainsRestrictedContent();
|
||||
#endif // MOZ_EME
|
||||
|
||||
void CannotDecryptWaitingForKey();
|
||||
|
||||
|
|
@ -1198,7 +1202,9 @@ protected:
|
|||
*/
|
||||
void HiddenVideoStop();
|
||||
|
||||
#ifdef MOZ_EME
|
||||
void ReportEMETelemetry();
|
||||
#endif
|
||||
|
||||
void ReportTelemetry();
|
||||
|
||||
|
|
@ -1471,8 +1477,10 @@ protected:
|
|||
// Timer used to simulate video-suspend.
|
||||
nsCOMPtr<nsITimer> mVideoDecodeSuspendTimer;
|
||||
|
||||
#ifdef MOZ_EME
|
||||
// Encrypted Media Extension media keys.
|
||||
RefPtr<MediaKeys> mMediaKeys;
|
||||
#endif
|
||||
|
||||
// Stores the time at the start of the current 'played' range.
|
||||
double mCurrentPlayRangeStart;
|
||||
|
|
@ -1627,8 +1635,10 @@ protected:
|
|||
// Listens for waitingForKey events from the owned decoder.
|
||||
MediaEventListener mWaitingForKeyListener;
|
||||
|
||||
#ifdef MOZ_EME
|
||||
// Init Data that needs to be sent in 'encrypted' events in MetadataLoaded().
|
||||
EncryptionInfo mPendingEncryptedInitData;
|
||||
#endif
|
||||
|
||||
// True if the media's channel's download has been suspended.
|
||||
Watchable<bool> mDownloadSuspendedByCache;
|
||||
|
|
|
|||
|
|
@ -143,11 +143,13 @@ public:
|
|||
// reference to the decoder to prevent further calls into the decoder.
|
||||
virtual void NotifyXPCOMShutdown() = 0;
|
||||
|
||||
#ifdef MOZ_EME
|
||||
// Dispatches a "encrypted" event to the HTMLMediaElement, with the
|
||||
// provided init data. Actual dispatch may be delayed until HAVE_METADATA.
|
||||
// Main thread only.
|
||||
virtual void DispatchEncrypted(const nsTArray<uint8_t>& aInitData,
|
||||
const nsAString& aInitDataType) = 0;
|
||||
#endif
|
||||
};
|
||||
|
||||
} // namespace mozilla
|
||||
|
|
|
|||
|
|
@ -346,8 +346,12 @@ MediaFormatReader::DecoderFactory::DoCreateDecoder(TrackType aTrack)
|
|||
if (!mOwner->mPlatform) {
|
||||
mOwner->mPlatform = new PDMFactory();
|
||||
if (mOwner->IsEncrypted()) {
|
||||
#ifdef MOZ_EME
|
||||
MOZ_ASSERT(mOwner->mCDMProxy);
|
||||
mOwner->mPlatform->SetCDMProxy(mOwner->mCDMProxy);
|
||||
#else
|
||||
return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, "EME not supported");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -577,6 +581,7 @@ MediaFormatReader::InitInternal()
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
#ifdef MOZ_EME
|
||||
class DispatchKeyNeededEvent : public Runnable {
|
||||
public:
|
||||
DispatchKeyNeededEvent(AbstractMediaDecoder* aDecoder,
|
||||
|
|
@ -602,6 +607,7 @@ private:
|
|||
nsTArray<uint8_t> mInitData;
|
||||
nsString mInitDataType;
|
||||
};
|
||||
#endif
|
||||
|
||||
void
|
||||
MediaFormatReader::SetCDMProxy(CDMProxy* aProxy)
|
||||
|
|
@ -618,7 +624,11 @@ MediaFormatReader::SetCDMProxy(CDMProxy* aProxy)
|
|||
bool
|
||||
MediaFormatReader::IsWaitingOnCDMResource() {
|
||||
MOZ_ASSERT(OnTaskQueue());
|
||||
#ifdef MOZ_EME
|
||||
return IsEncrypted() && !mCDMProxy;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
RefPtr<MediaDecoderReader::MetadataPromise>
|
||||
|
|
@ -725,11 +735,13 @@ MediaFormatReader::OnDemuxerInitDone(nsresult)
|
|||
|
||||
UniquePtr<EncryptionInfo> crypto = mDemuxer->GetCrypto();
|
||||
if (mDecoder && crypto && crypto->IsEncrypted()) {
|
||||
#ifdef MOZ_EME
|
||||
// Try and dispatch 'encrypted'. Won't go if ready state still HAVE_NOTHING.
|
||||
for (uint32_t i = 0; i < crypto->mInitDatas.Length(); i++) {
|
||||
NS_DispatchToMainThread(
|
||||
new DispatchKeyNeededEvent(mDecoder, crypto->mInitDatas[i].mInitData, crypto->mInitDatas[i].mType));
|
||||
}
|
||||
#endif
|
||||
mInfo.mCrypto = *crypto;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -58,6 +58,7 @@ AppendStateToStr(SourceBufferAttributes::AppendState aState)
|
|||
|
||||
static Atomic<uint32_t> sStreamSourceID(0u);
|
||||
|
||||
#ifdef MOZ_EME
|
||||
class DispatchKeyNeededEvent : public Runnable {
|
||||
public:
|
||||
DispatchKeyNeededEvent(AbstractMediaDecoder* aDecoder,
|
||||
|
|
@ -83,6 +84,7 @@ private:
|
|||
nsTArray<uint8_t> mInitData;
|
||||
nsString mInitDataType;
|
||||
};
|
||||
#endif
|
||||
|
||||
TrackBuffersManager::TrackBuffersManager(MediaSourceDecoder* aParentDecoder,
|
||||
const nsACString& aType)
|
||||
|
|
@ -1097,12 +1099,14 @@ TrackBuffersManager::OnDemuxerInitDone(nsresult)
|
|||
|
||||
UniquePtr<EncryptionInfo> crypto = mInputDemuxer->GetCrypto();
|
||||
if (crypto && crypto->IsEncrypted()) {
|
||||
#ifdef MOZ_EME
|
||||
// Try and dispatch 'encrypted'. Won't go if ready state still HAVE_NOTHING.
|
||||
for (uint32_t i = 0; i < crypto->mInitDatas.Length(); i++) {
|
||||
NS_DispatchToMainThread(
|
||||
new DispatchKeyNeededEvent(mParentDecoder, crypto->mInitDatas[i].mInitData,
|
||||
crypto->mInitDatas[i].mType));
|
||||
}
|
||||
#endif
|
||||
info.mCrypto = *crypto;
|
||||
// We clear our crypto init data array, so the MediaFormatReader will
|
||||
// not emit an encrypted event for the same init data again.
|
||||
|
|
|
|||
|
|
@ -153,6 +153,7 @@ partial interface HTMLMediaElement {
|
|||
attribute EventHandler onmozinterruptend;
|
||||
};
|
||||
|
||||
#ifdef MOZ_EME
|
||||
// Encrypted Media Extensions
|
||||
partial interface HTMLMediaElement {
|
||||
[Pref="media.eme.apiVisible"]
|
||||
|
|
@ -168,6 +169,7 @@ partial interface HTMLMediaElement {
|
|||
[Pref="media.eme.apiVisible"]
|
||||
attribute EventHandler onwaitingforkey;
|
||||
};
|
||||
#endif
|
||||
|
||||
// This is just for testing
|
||||
partial interface HTMLMediaElement {
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ GENERATED_WEBIDL_FILES = [
|
|||
]
|
||||
|
||||
PREPROCESSED_WEBIDL_FILES = [
|
||||
'HTMLMediaElement.webidl',
|
||||
'Navigator.webidl',
|
||||
'Node.webidl',
|
||||
'Promise.webidl',
|
||||
|
|
@ -210,7 +211,6 @@ WEBIDL_FILES = [
|
|||
'HTMLLIElement.webidl',
|
||||
'HTMLLinkElement.webidl',
|
||||
'HTMLMapElement.webidl',
|
||||
'HTMLMediaElement.webidl',
|
||||
'HTMLMenuElement.webidl',
|
||||
'HTMLMenuItemElement.webidl',
|
||||
'HTMLMetaElement.webidl',
|
||||
|
|
|
|||
|
|
@ -7242,9 +7242,11 @@ nsLayoutUtils::SurfaceFromElement(HTMLVideoElement* aElement,
|
|||
(aSurfaceFlags & SFE_PREFER_NO_PREMULTIPLY_ALPHA) == 0,
|
||||
"We can't support non-premultiplied alpha for video!");
|
||||
|
||||
#ifdef MOZ_EME
|
||||
if (aElement->ContainsRestrictedContent()) {
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
uint16_t readyState;
|
||||
if (NS_SUCCEEDED(aElement->GetReadyState(&readyState)) &&
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue