Bug 1228215 - Add a 'gmpName' parameter to GMPService::GetNodeId(), so each GMP can see a different nodeId for the same origin. r=jwwang

This commit is contained in:
Chris Pearce 2015-11-27 10:53:31 +13:00
Родитель 8ed9d0fcbd
Коммит 6818d3ec67
12 изменённых файлов: 48 добавлений и 4 удалений

Просмотреть файл

@ -18,6 +18,7 @@
#include "mozilla/PodOperations.h"
#include "mozilla/CDMCallbackProxy.h"
#include "MediaData.h"
#include "nsPrintfCString.h"
namespace mozilla {
@ -41,6 +42,7 @@ void
CDMProxy::Init(PromiseId aPromiseId,
const nsAString& aOrigin,
const nsAString& aTopLevelOrigin,
const nsAString& aGMPName,
bool aInPrivateBrowsing)
{
MOZ_ASSERT(NS_IsMainThread());
@ -68,10 +70,17 @@ CDMProxy::Init(PromiseId aPromiseId,
}
}
if (aGMPName.IsEmpty()) {
RejectPromise(aPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
nsPrintfCString("Unknown GMP for keysystem '%s'", NS_ConvertUTF16toUTF8(mKeySystem).get()));
return;
}
nsAutoPtr<InitData> data(new InitData());
data->mPromiseId = aPromiseId;
data->mOrigin = aOrigin;
data->mTopLevelOrigin = aTopLevelOrigin;
data->mGMPName = aGMPName;
data->mInPrivateBrowsing = aInPrivateBrowsing;
nsCOMPtr<nsIRunnable> task(
NS_NewRunnableMethodWithArg<nsAutoPtr<InitData>>(this,
@ -176,6 +185,7 @@ CDMProxy::gmp_Init(nsAutoPtr<InitData>&& aData)
new gmp_InitGetGMPDecryptorCallback(this, Move(aData)));
nsresult rv = mps->GetNodeId(data.mOrigin,
data.mTopLevelOrigin,
data.mGMPName,
data.mInPrivateBrowsing,
Move(callback));
if (NS_FAILED(rv)) {

Просмотреть файл

@ -57,6 +57,7 @@ public:
void Init(PromiseId aPromiseId,
const nsAString& aOrigin,
const nsAString& aTopLevelOrigin,
const nsAString& aGMPName,
bool aInPrivateBrowsing);
// Main thread only.
@ -186,6 +187,7 @@ private:
uint32_t mPromiseId;
nsAutoString mOrigin;
nsAutoString mTopLevelOrigin;
nsString mGMPName;
bool mInPrivateBrowsing;
};

Просмотреть файл

@ -141,4 +141,17 @@ CopyArrayBufferViewOrArrayBufferData(const dom::ArrayBufferViewOrArrayBuffer& aB
aOutData.AppendElements(data.mData, data.mLength);
}
nsString
KeySystemToGMPName(const nsAString& aKeySystem)
{
if (aKeySystem.EqualsLiteral("com.adobe.primetime")) {
return NS_LITERAL_STRING("gmp-eme-adobe");
}
if (aKeySystem.EqualsLiteral("org.w3.clearkey")) {
return NS_LITERAL_STRING("gmp-clearkey");
}
MOZ_ASSERT(false, "We should only call this for known GMPs");
return EmptyString();
}
} // namespace mozilla

Просмотреть файл

@ -104,6 +104,9 @@ struct ArrayData {
ArrayData
GetArrayBufferViewOrArrayBufferData(const dom::ArrayBufferViewOrArrayBuffer& aBufferOrView);
nsString
KeySystemToGMPName(const nsAString& aKeySystem);
} // namespace mozilla
#endif // EME_LOG_H_

Просмотреть файл

@ -368,6 +368,7 @@ MediaKeys::Init(ErrorResult& aRv)
mProxy->Init(mCreatePromiseId,
origin,
topLevelOrigin,
KeySystemToGMPName(mKeySystem),
inPrivateBrowsing);
return promise.forget();

Просмотреть файл

@ -137,9 +137,11 @@ class GetNodeIdDone : public GetServiceChildCallback
{
public:
GetNodeIdDone(const nsAString& aOrigin, const nsAString& aTopLevelOrigin,
const nsAString& aGMPName,
bool aInPrivateBrowsing, UniquePtr<GetNodeIdCallback>&& aCallback)
: mOrigin(aOrigin),
mTopLevelOrigin(aTopLevelOrigin),
mGMPName(aGMPName),
mInPrivateBrowsing(aInPrivateBrowsing),
mCallback(Move(aCallback))
{
@ -154,6 +156,7 @@ public:
nsCString outId;
if (!aGMPServiceChild->SendGetGMPNodeId(mOrigin, mTopLevelOrigin,
mGMPName,
mInPrivateBrowsing, &outId)) {
mCallback->Done(NS_ERROR_FAILURE, EmptyCString());
return;
@ -165,6 +168,7 @@ public:
private:
nsString mOrigin;
nsString mTopLevelOrigin;
nsString mGMPName;
bool mInPrivateBrowsing;
UniquePtr<GetNodeIdCallback> mCallback;
};
@ -172,11 +176,12 @@ private:
NS_IMETHODIMP
GeckoMediaPluginServiceChild::GetNodeId(const nsAString& aOrigin,
const nsAString& aTopLevelOrigin,
const nsAString& aGMPName,
bool aInPrivateBrowsing,
UniquePtr<GetNodeIdCallback>&& aCallback)
{
UniquePtr<GetServiceChildCallback> callback(
new GetNodeIdDone(aOrigin, aTopLevelOrigin, aInPrivateBrowsing, Move(aCallback)));
new GetNodeIdDone(aOrigin, aTopLevelOrigin, aGMPName, aInPrivateBrowsing, Move(aCallback)));
GetServiceChild(Move(callback));
return NS_OK;
}

Просмотреть файл

@ -47,6 +47,7 @@ public:
nsACString& aOutVersion) override;
NS_IMETHOD GetNodeId(const nsAString& aOrigin,
const nsAString& aTopLevelOrigin,
const nsAString& aGMPName,
bool aInPrivateBrowsingMode,
UniquePtr<GetNodeIdCallback>&& aCallback) override;
NS_IMETHOD UpdateTrialCreateState(const nsAString& aKeySystem,

Просмотреть файл

@ -1212,6 +1212,7 @@ GeckoMediaPluginServiceParent::IsPersistentStorageAllowed(const nsACString& aNod
nsresult
GeckoMediaPluginServiceParent::GetNodeId(const nsAString& aOrigin,
const nsAString& aTopLevelOrigin,
const nsAString& aGMPName,
bool aInPrivateBrowsing,
nsACString& aOutId)
{
@ -1360,11 +1361,12 @@ GeckoMediaPluginServiceParent::GetNodeId(const nsAString& aOrigin,
NS_IMETHODIMP
GeckoMediaPluginServiceParent::GetNodeId(const nsAString& aOrigin,
const nsAString& aTopLevelOrigin,
const nsAString& aGMPName,
bool aInPrivateBrowsing,
UniquePtr<GetNodeIdCallback>&& aCallback)
{
nsCString nodeId;
nsresult rv = GetNodeId(aOrigin, aTopLevelOrigin, aInPrivateBrowsing, nodeId);
nsresult rv = GetNodeId(aOrigin, aTopLevelOrigin, aGMPName, aInPrivateBrowsing, nodeId);
aCallback->Done(rv, nodeId);
return rv;
}
@ -1702,10 +1704,11 @@ GMPServiceParent::RecvLoadGMP(const nsCString& aNodeId,
bool
GMPServiceParent::RecvGetGMPNodeId(const nsString& aOrigin,
const nsString& aTopLevelOrigin,
const nsString& aGMPName,
const bool& aInPrivateBrowsing,
nsCString* aID)
{
nsresult rv = mService->GetNodeId(aOrigin, aTopLevelOrigin,
nsresult rv = mService->GetNodeId(aOrigin, aTopLevelOrigin, aGMPName,
aInPrivateBrowsing, *aID);
return NS_SUCCEEDED(rv);
}

Просмотреть файл

@ -41,6 +41,7 @@ public:
nsACString& aOutVersion) override;
NS_IMETHOD GetNodeId(const nsAString& aOrigin,
const nsAString& aTopLevelOrigin,
const nsAString& aGMPName,
bool aInPrivateBrowsingMode,
UniquePtr<GetNodeIdCallback>&& aCallback) override;
NS_IMETHOD UpdateTrialCreateState(const nsAString& aKeySystem,
@ -73,6 +74,7 @@ private:
size_t* aOutPluginIndex);
nsresult GetNodeId(const nsAString& aOrigin, const nsAString& aTopLevelOrigin,
const nsAString& aGMPName,
bool aInPrivateBrowsing, nsACString& aOutId);
void UnloadPlugins();
@ -215,6 +217,7 @@ public:
uint32_t* aPluginId) override;
virtual bool RecvGetGMPNodeId(const nsString& aOrigin,
const nsString& aTopLevelOrigin,
const nsString& aGMPName,
const bool& aInPrivateBrowsing,
nsCString* aID) override;
static bool RecvGetGMPPluginVersionForAPI(const nsCString& aAPI,

Просмотреть файл

@ -19,6 +19,7 @@ parent:
ProcessId[] alreadyBridgedTo)
returns (ProcessId id, nsCString displayName, uint32_t pluginId);
sync GetGMPNodeId(nsString origin, nsString topLevelOrigin,
nsString gmpName,
bool inPrivateBrowsing)
returns (nsCString id);

Просмотреть файл

@ -52,7 +52,7 @@ native GetGMPVideoDecoderCallback(mozilla::UniquePtr<GetGMPVideoDecoderCallback>
native GetGMPVideoEncoderCallback(mozilla::UniquePtr<GetGMPVideoEncoderCallback>&&);
native GetNodeIdCallback(mozilla::UniquePtr<GetNodeIdCallback>&&);
[scriptable, uuid(661492d6-726b-4ba0-8e6e-14bfaf2b62e4)]
[scriptable, uuid(b5492915-2f0e-4973-9f91-a6fe61ac4749)]
interface mozIGeckoMediaPluginService : nsISupports
{
@ -145,6 +145,7 @@ interface mozIGeckoMediaPluginService : nsISupports
[noscript]
void getNodeId(in AString origin,
in AString topLevelOrigin,
in AString gmpName,
in bool inPrivateBrowsingMode,
in GetNodeIdCallback callback);

Просмотреть файл

@ -469,6 +469,7 @@ GetNodeId(const nsAString& aOrigin,
// GeckoMediaPluginServiceParent is synchronous.
nsresult rv = service->GetNodeId(aOrigin,
aTopLevelOrigin,
NS_LITERAL_STRING("gmp-fake"),
aInPBMode,
Move(callback));
EXPECT_TRUE(NS_SUCCEEDED(rv) && NS_SUCCEEDED(result));