Bug 1345324 - Label runnables for CDMProxy sub-classes. r?cpearce
MozReview-Commit-ID: Fpf29Kctmxs
--- a/dom/media/eme/CDMProxy.h
+++ b/dom/media/eme/CDMProxy.h
@@ -89,17 +89,18 @@ public:
{}
// Main thread only.
// Loads the CDM corresponding to mKeySystem.
// Calls MediaKeys::OnCDMCreated() when the CDM is created.
virtual void Init(PromiseId aPromiseId,
const nsAString& aOrigin,
const nsAString& aTopLevelOrigin,
- const nsAString& aName) = 0;
+ const nsAString& aName,
+ nsIEventTarget* aMainThread) = 0;
virtual void OnSetDecryptorId(uint32_t aId) {}
// Main thread only.
// Uses the CDM to create a key session.
// Calls MediaKeys::OnSessionActivated() when session is created.
// Assumes ownership of (Move()s) aInitData's contents.
virtual void CreateSession(uint32_t aCreateSessionToken,
@@ -254,16 +255,19 @@ protected:
// Our reference back to the MediaKeys object.
// WARNING: This is a non-owning reference that is cleared by MediaKeys
// destructor. only use on main thread, and always nullcheck before using!
MainThreadOnlyRawPtr<dom::MediaKeys> mKeys;
const nsString mKeySystem;
+ // The main thread associated with the root document. Must be set in Init().
+ nsCOMPtr<nsIEventTarget> mMainThread;
+
// Onwer specified thread. e.g. Gecko Media Plugin thread.
// All interactions with the out-of-process EME plugin must come from this thread.
RefPtr<nsIThread> mOwnerThread;
nsCString mNodeId;
CDMCaps mCapabilites;
--- a/dom/media/eme/MediaKeys.cpp
+++ b/dom/media/eme/MediaKeys.cpp
@@ -424,17 +424,18 @@ MediaKeys::Init(ErrorResult& aRv)
// here, and hold a self-reference until that promise is resolved or
// rejected.
MOZ_ASSERT(!mCreatePromiseId, "Should only be created once!");
mCreatePromiseId = StorePromise(promise);
AddRef();
mProxy->Init(mCreatePromiseId,
NS_ConvertUTF8toUTF16(origin),
NS_ConvertUTF8toUTF16(topLevelOrigin),
- KeySystemToGMPName(mKeySystem));
+ KeySystemToGMPName(mKeySystem),
+ top->GetExtantDoc()->EventTargetFor(TaskCategory::Other));
return promise.forget();
}
void
MediaKeys::OnCDMCreated(PromiseId aId, const uint32_t aPluginId)
{
RefPtr<DetailedPromise> promise(RetrievePromise(aId));
--- a/dom/media/eme/mediadrm/MediaDrmCDMProxy.cpp
+++ b/dom/media/eme/mediadrm/MediaDrmCDMProxy.cpp
@@ -41,26 +41,29 @@ MediaDrmCDMProxy::~MediaDrmCDMProxy()
{
MOZ_COUNT_DTOR(MediaDrmCDMProxy);
}
void
MediaDrmCDMProxy::Init(PromiseId aPromiseId,
const nsAString& aOrigin,
const nsAString& aTopLevelOrigin,
- const nsAString& aName)
+ const nsAString& aName,
+ nsIEventTarget* aMainThread)
{
MOZ_ASSERT(NS_IsMainThread());
NS_ENSURE_TRUE_VOID(!mKeys.IsNull());
EME_LOG("MediaDrmCDMProxy::Init (%s, %s) %s",
NS_ConvertUTF16toUTF8(aOrigin).get(),
NS_ConvertUTF16toUTF8(aTopLevelOrigin).get(),
NS_ConvertUTF16toUTF8(aName).get());
+ mMainThread = aMainThread;
+
// Create a thread to work with cdm.
if (!mOwnerThread) {
nsresult rv = NS_NewNamedThread("MDCDMThread", getter_AddRefs(mOwnerThread));
if (NS_FAILED(rv)) {
RejectPromise(aPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
NS_LITERAL_CSTRING("Couldn't create CDM thread MediaDrmCDMProxy::Init"));
return;
}
@@ -303,17 +306,17 @@ MediaDrmCDMProxy::RejectPromise(PromiseI
{
if (NS_IsMainThread()) {
if (!mKeys.IsNull()) {
mKeys->RejectPromise(aId, aCode, aReason);
}
} else {
nsCOMPtr<nsIRunnable> task(new RejectPromiseTask(this, aId, aCode,
aReason));
- NS_DispatchToMainThread(task);
+ mMainThread->Dispatch(task.forget(), NS_DISPATCH_NORMAL);
}
}
void
MediaDrmCDMProxy::ResolvePromise(PromiseId aId)
{
if (NS_IsMainThread()) {
if (!mKeys.IsNull()) {
@@ -321,17 +324,17 @@ MediaDrmCDMProxy::ResolvePromise(Promise
} else {
NS_WARNING("MediaDrmCDMProxy unable to resolve promise!");
}
} else {
nsCOMPtr<nsIRunnable> task;
task = NewRunnableMethod<PromiseId>(this,
&MediaDrmCDMProxy::ResolvePromise,
aId);
- NS_DispatchToMainThread(task);
+ mMainThread->Dispatch(task.forget(), NS_DISPATCH_NORMAL);
}
}
const nsString&
MediaDrmCDMProxy::KeySystem() const
{
return mKeySystem;
}
@@ -403,17 +406,17 @@ MediaDrmCDMProxy::md_Init(uint32_t aProm
MOZ_ASSERT(mCDM);
mCallback.reset(new MediaDrmCDMCallbackProxy(this));
mCDM->Init(mCallback.get());
nsCOMPtr<nsIRunnable> task(
NewRunnableMethod<uint32_t>(this,
&MediaDrmCDMProxy::OnCDMCreated,
aPromiseId));
- NS_DispatchToMainThread(task);
+ mMainThread->Dispatch(task.forget(), NS_DISPATCH_NORMAL);
}
void
MediaDrmCDMProxy::md_CreateSession(UniquePtr<CreateSessionData>&& aData)
{
MOZ_ASSERT(IsOnOwnerThread());
if (!mCDM) {
--- a/dom/media/eme/mediadrm/MediaDrmCDMProxy.h
+++ b/dom/media/eme/mediadrm/MediaDrmCDMProxy.h
@@ -32,17 +32,18 @@ public:
MediaDrmCDMProxy(dom::MediaKeys* aKeys,
const nsAString& aKeySystem,
bool aDistinctiveIdentifierRequired,
bool aPersistentStateRequired);
void Init(PromiseId aPromiseId,
const nsAString& aOrigin,
const nsAString& aTopLevelOrigin,
- const nsAString& aGMPName) override;
+ const nsAString& aGMPName,
+ nsIEventTarget* aMainThread) override;
void CreateSession(uint32_t aCreateSessionToken,
MediaKeySessionType aSessionType,
PromiseId aPromiseId,
const nsAString& aInitDataType,
nsTArray<uint8_t>& aInitData) override;
void LoadSession(PromiseId aPromiseId,
--- a/dom/media/gmp/GMPCDMProxy.cpp
+++ b/dom/media/gmp/GMPCDMProxy.cpp
@@ -47,25 +47,28 @@ GMPCDMProxy::~GMPCDMProxy()
{
MOZ_COUNT_DTOR(GMPCDMProxy);
}
void
GMPCDMProxy::Init(PromiseId aPromiseId,
const nsAString& aOrigin,
const nsAString& aTopLevelOrigin,
- const nsAString& aGMPName)
+ const nsAString& aGMPName,
+ nsIEventTarget* aMainThread)
{
MOZ_ASSERT(NS_IsMainThread());
NS_ENSURE_TRUE_VOID(!mKeys.IsNull());
EME_LOG("GMPCDMProxy::Init (%s, %s)",
NS_ConvertUTF16toUTF8(aOrigin).get(),
NS_ConvertUTF16toUTF8(aTopLevelOrigin).get());
+ mMainThread = aMainThread;
+
nsCString pluginVersion;
if (!mOwnerThread) {
nsCOMPtr<mozIGeckoMediaPluginService> mps =
do_GetService("@mozilla.org/gecko-media-plugin-service;1");
if (!mps) {
RejectPromise(aPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
NS_LITERAL_CSTRING("Couldn't get MediaPluginService in GMPCDMProxy::Init"));
return;
@@ -136,17 +139,17 @@ GMPCDMProxy::gmp_InitDone(GMPDecryptorPr
void GMPCDMProxy::OnSetDecryptorId(uint32_t aId)
{
MOZ_ASSERT(mCreatePromiseId);
mDecryptorId = aId;
nsCOMPtr<nsIRunnable> task(
NewRunnableMethod<uint32_t>(this,
&GMPCDMProxy::OnCDMCreated,
mCreatePromiseId));
- NS_DispatchToMainThread(task);
+ mMainThread->Dispatch(task.forget(), NS_DISPATCH_NORMAL);
}
class gmp_InitDoneCallback : public GetGMPDecryptorCallback
{
public:
gmp_InitDoneCallback(GMPCDMProxy* aGMPCDMProxy,
UniquePtr<GMPCDMProxy::InitData>&& aData)
: mGMPCDMProxy(aGMPCDMProxy),
@@ -513,17 +516,17 @@ GMPCDMProxy::RejectPromise(PromiseId aId
{
if (NS_IsMainThread()) {
if (!mKeys.IsNull()) {
mKeys->RejectPromise(aId, aCode, aReason);
}
} else {
nsCOMPtr<nsIRunnable> task(new RejectPromiseTask(this, aId, aCode,
aReason));
- NS_DispatchToMainThread(task);
+ mMainThread->Dispatch(task.forget(), NS_DISPATCH_NORMAL);
}
}
void
GMPCDMProxy::ResolvePromise(PromiseId aId)
{
if (NS_IsMainThread()) {
if (!mKeys.IsNull()) {
@@ -531,17 +534,17 @@ GMPCDMProxy::ResolvePromise(PromiseId aI
} else {
NS_WARNING("GMPCDMProxy unable to resolve promise!");
}
} else {
nsCOMPtr<nsIRunnable> task;
task = NewRunnableMethod<PromiseId>(this,
&GMPCDMProxy::ResolvePromise,
aId);
- NS_DispatchToMainThread(task);
+ mMainThread->Dispatch(task.forget(), NS_DISPATCH_NORMAL);
}
}
const nsCString&
GMPCDMProxy::GetNodeId() const
{
return mNodeId;
}
--- a/dom/media/gmp/GMPCDMProxy.h
+++ b/dom/media/gmp/GMPCDMProxy.h
@@ -26,17 +26,18 @@ public:
const nsAString& aKeySystem,
GMPCrashHelper* aCrashHelper,
bool aDistinctiveIdentifierRequired,
bool aPersistentStateRequired);
void Init(PromiseId aPromiseId,
const nsAString& aOrigin,
const nsAString& aTopLevelOrigin,
- const nsAString& aGMPName) override;
+ const nsAString& aGMPName,
+ nsIEventTarget* aMainThread) override;
void OnSetDecryptorId(uint32_t aId) override;
void CreateSession(uint32_t aCreateSessionToken,
dom::MediaKeySessionType aSessionType,
PromiseId aPromiseId,
const nsAString& aInitDataType,
nsTArray<uint8_t>& aInitData) override;