Bug 1156560 - Prefer old CDMs on update if they are in use - r=cpearce

This commit is contained in:
Edwin Flores 2015-04-22 10:22:23 +12:00
parent 600801e360
commit 35bb5221ce
9 changed files with 20 additions and 37 deletions

View File

@ -64,19 +64,12 @@ CDMProxy::Init(PromiseId aPromiseId,
RejectPromise(aPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR);
return;
}
bool hasPlugin;
nsTArray<nsCString> tags;
tags.AppendElement(NS_ConvertUTF16toUTF8(mKeySystem));
nsresult rv = mps->GetPluginVersionForAPI(NS_LITERAL_CSTRING(GMP_API_DECRYPTOR),
&tags, &hasPlugin, pluginVersion);
NS_ENSURE_SUCCESS_VOID(rv);
}
nsAutoPtr<InitData> data(new InitData());
data->mPromiseId = aPromiseId;
data->mOrigin = aOrigin;
data->mTopLevelOrigin = aTopLevelOrigin;
data->mPluginVersion = pluginVersion;
data->mInPrivateBrowsing = aInPrivateBrowsing;
nsCOMPtr<nsIRunnable> task(
NS_NewRunnableMethodWithArg<nsAutoPtr<InitData>>(this,
@ -175,7 +168,6 @@ CDMProxy::gmp_Init(nsAutoPtr<InitData>&& aData)
nsresult rv = mps->GetNodeId(data.mOrigin,
data.mTopLevelOrigin,
data.mInPrivateBrowsing,
data.mPluginVersion,
Move(callback));
if (NS_FAILED(rv)) {
RejectPromise(data.mPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR);

View File

@ -181,7 +181,6 @@ private:
uint32_t mPromiseId;
nsAutoString mOrigin;
nsAutoString mTopLevelOrigin;
nsAutoCString mPluginVersion;
bool mInPrivateBrowsing;
};

View File

@ -148,12 +148,10 @@ class GetNodeIdDone : public GetServiceChildCallback
{
public:
GetNodeIdDone(const nsAString& aOrigin, const nsAString& aTopLevelOrigin,
bool aInPrivateBrowsing, const nsACString& aVersion,
UniquePtr<GetNodeIdCallback>&& aCallback)
bool aInPrivateBrowsing, UniquePtr<GetNodeIdCallback>&& aCallback)
: mOrigin(aOrigin),
mTopLevelOrigin(aTopLevelOrigin),
mInPrivateBrowsing(aInPrivateBrowsing),
mVersion(aVersion),
mCallback(Move(aCallback))
{
}
@ -167,8 +165,7 @@ public:
nsCString outId;
if (!aGMPServiceChild->SendGetGMPNodeId(mOrigin, mTopLevelOrigin,
mInPrivateBrowsing, mVersion,
&outId)) {
mInPrivateBrowsing, &outId)) {
mCallback->Done(NS_ERROR_FAILURE, EmptyCString());
return;
}
@ -180,7 +177,6 @@ private:
nsString mOrigin;
nsString mTopLevelOrigin;
bool mInPrivateBrowsing;
nsCString mVersion;
UniquePtr<GetNodeIdCallback> mCallback;
};
@ -188,12 +184,10 @@ NS_IMETHODIMP
GeckoMediaPluginServiceChild::GetNodeId(const nsAString& aOrigin,
const nsAString& aTopLevelOrigin,
bool aInPrivateBrowsing,
const nsACString& aVersion,
UniquePtr<GetNodeIdCallback>&& aCallback)
{
UniquePtr<GetServiceChildCallback> callback(
new GetNodeIdDone(aOrigin, aTopLevelOrigin, aInPrivateBrowsing, aVersion,
Move(aCallback)));
new GetNodeIdDone(aOrigin, aTopLevelOrigin, aInPrivateBrowsing, Move(aCallback)));
GetServiceChild(Move(callback));
return NS_OK;
}

View File

@ -34,7 +34,6 @@ public:
NS_IMETHOD GetNodeId(const nsAString& aOrigin,
const nsAString& aTopLevelOrigin,
bool aInPrivateBrowsingMode,
const nsACString& aVersion,
UniquePtr<GetNodeIdCallback>&& aCallback) override;
NS_DECL_NSIOBSERVER

View File

@ -584,9 +584,17 @@ GeckoMediaPluginServiceParent::SelectPluginForAPI(const nsACString& aNodeId,
return gmp;
}
// This GMP has the correct type but has the wrong nodeId; hold on to it
// in case we need to clone it.
gmpToClone = gmp;
if (!gmpToClone ||
(gmpToClone->IsMarkedForDeletion() && !gmp->IsMarkedForDeletion())) {
// This GMP has the correct type but has the wrong nodeId; hold on to it
// in case we need to clone it.
// Prefer GMPs in-use for the case where an upgraded plugin version is
// waiting for the old one to die. If the old plugin is in use, we
// should continue using it so that any persistent state remains
// consistent. Otherwise, just check that the plugin isn't scheduled
// for deletion.
gmpToClone = gmp;
}
// Loop around and try the next plugin; it may be usable from aNodeId.
index++;
}
@ -912,7 +920,6 @@ nsresult
GeckoMediaPluginServiceParent::GetNodeId(const nsAString& aOrigin,
const nsAString& aTopLevelOrigin,
bool aInPrivateBrowsing,
const nsACString& aVersion,
nsACString& aOutId)
{
MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
@ -941,8 +948,7 @@ GeckoMediaPluginServiceParent::GetNodeId(const nsAString& aOrigin,
}
const uint32_t hash = AddToHash(HashString(aOrigin),
HashString(aTopLevelOrigin),
HashString(aVersion));
HashString(aTopLevelOrigin));
if (aInPrivateBrowsing) {
// For PB mode, we store the node id, indexed by the origin pair,
@ -1062,11 +1068,10 @@ NS_IMETHODIMP
GeckoMediaPluginServiceParent::GetNodeId(const nsAString& aOrigin,
const nsAString& aTopLevelOrigin,
bool aInPrivateBrowsing,
const nsACString& aVersion,
UniquePtr<GetNodeIdCallback>&& aCallback)
{
nsCString nodeId;
nsresult rv = GetNodeId(aOrigin, aTopLevelOrigin, aInPrivateBrowsing, aVersion, nodeId);
nsresult rv = GetNodeId(aOrigin, aTopLevelOrigin, aInPrivateBrowsing, nodeId);
aCallback->Done(rv, nodeId);
return rv;
}
@ -1435,11 +1440,10 @@ bool
GMPServiceParent::RecvGetGMPNodeId(const nsString& aOrigin,
const nsString& aTopLevelOrigin,
const bool& aInPrivateBrowsing,
const nsCString& aVersion,
nsCString* aID)
{
nsresult rv = mService->GetNodeId(aOrigin, aTopLevelOrigin,
aInPrivateBrowsing, aVersion, *aID);
aInPrivateBrowsing, *aID);
return NS_SUCCEEDED(rv);
}

View File

@ -42,7 +42,6 @@ public:
NS_IMETHOD GetNodeId(const nsAString& aOrigin,
const nsAString& aTopLevelOrigin,
bool aInPrivateBrowsingMode,
const nsACString& aVersion,
UniquePtr<GetNodeIdCallback>&& aCallback) override;
NS_DECL_MOZIGECKOMEDIAPLUGINCHROMESERVICE
@ -70,8 +69,7 @@ private:
size_t* aOutPluginIndex);
nsresult GetNodeId(const nsAString& aOrigin, const nsAString& aTopLevelOrigin,
bool aInPrivateBrowsing, const nsACString& aVersion,
nsACString& aOutId);
bool aInPrivateBrowsing, nsACString& aOutId);
void UnloadPlugins();
void CrashPlugins();
@ -199,7 +197,6 @@ public:
virtual bool RecvGetGMPNodeId(const nsString& aOrigin,
const nsString& aTopLevelOrigin,
const bool& aInPrivateBrowsing,
const nsCString& aVersion,
nsCString* aID) override;
static bool RecvGetGMPPluginVersionForAPI(const nsCString& aAPI,
nsTArray<nsCString>&& aTags,

View File

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

View File

@ -52,7 +52,7 @@ native GetGMPVideoDecoderCallback(mozilla::UniquePtr<GetGMPVideoDecoderCallback>
native GetGMPVideoEncoderCallback(mozilla::UniquePtr<GetGMPVideoEncoderCallback>&&);
native GetNodeIdCallback(mozilla::UniquePtr<GetNodeIdCallback>&&);
[scriptable, uuid(6e3023f4-d9a2-46b4-8f50-70d4c918471d)]
[scriptable, uuid(787cf744-eea8-48c8-b692-376e0485ef97)]
interface mozIGeckoMediaPluginService : nsISupports
{
@ -146,6 +146,5 @@ interface mozIGeckoMediaPluginService : nsISupports
void getNodeId(in AString origin,
in AString topLevelOrigin,
in bool inPrivateBrowsingMode,
in ACString version,
in GetNodeIdCallback callback);
};

View File

@ -497,7 +497,6 @@ GetNodeId(const nsAString& aOrigin,
nsresult rv = service->GetNodeId(aOrigin,
aTopLevelOrigin,
aInPBMode,
NS_LITERAL_CSTRING(""),
Move(callback));
EXPECT_TRUE(NS_SUCCEEDED(rv) && NS_SUCCEEDED(result));
return nodeId;