summaryrefslogtreecommitdiff
path: root/dom/media/gmp/GMPDecryptorParent.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/gmp/GMPDecryptorParent.cpp')
-rw-r--r--dom/media/gmp/GMPDecryptorParent.cpp524
1 files changed, 0 insertions, 524 deletions
diff --git a/dom/media/gmp/GMPDecryptorParent.cpp b/dom/media/gmp/GMPDecryptorParent.cpp
deleted file mode 100644
index c41d5d18f5..0000000000
--- a/dom/media/gmp/GMPDecryptorParent.cpp
+++ /dev/null
@@ -1,524 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "GMPDecryptorParent.h"
-
-#include "GMPContentParent.h"
-#include "GMPUtils.h"
-#include "MediaData.h"
-#include "mozilla/Unused.h"
-
-namespace mozilla {
-
-#ifdef LOG
-#undef LOG
-#endif
-
-extern LogModule* GetGMPLog();
-
-#define LOGV(msg) MOZ_LOG(GetGMPLog(), mozilla::LogLevel::Verbose, msg)
-#define LOGD(msg) MOZ_LOG(GetGMPLog(), mozilla::LogLevel::Debug, msg)
-#define LOG(level, msg) MOZ_LOG(GetGMPLog(), (level), msg)
-
-namespace gmp {
-
-GMPDecryptorParent::GMPDecryptorParent(GMPContentParent* aPlugin)
- : mIsOpen(false)
- , mShuttingDown(false)
- , mActorDestroyed(false)
- , mPlugin(aPlugin)
- , mPluginId(aPlugin->GetPluginId())
- , mCallback(nullptr)
-#ifdef DEBUG
- , mGMPThread(aPlugin->GMPThread())
-#endif
-{
- MOZ_ASSERT(mPlugin && mGMPThread);
-}
-
-GMPDecryptorParent::~GMPDecryptorParent()
-{
-}
-
-nsresult
-GMPDecryptorParent::Init(GMPDecryptorProxyCallback* aCallback,
- bool aDistinctiveIdentifierRequired,
- bool aPersistentStateRequired)
-{
- LOGD(("GMPDecryptorParent[%p]::Init()", this));
-
- if (mIsOpen) {
- NS_WARNING("Trying to re-use an in-use GMP decrypter!");
- return NS_ERROR_FAILURE;
- }
- mCallback = aCallback;
- if (!SendInit(aDistinctiveIdentifierRequired, aPersistentStateRequired)) {
- return NS_ERROR_FAILURE;
- }
- mIsOpen = true;
- return NS_OK;
-}
-
-void
-GMPDecryptorParent::CreateSession(uint32_t aCreateSessionToken,
- uint32_t aPromiseId,
- const nsCString& aInitDataType,
- const nsTArray<uint8_t>& aInitData,
- GMPSessionType aSessionType)
-{
- LOGD(("GMPDecryptorParent[%p]::CreateSession(token=%u, promiseId=%u, aInitData='%s')",
- this, aCreateSessionToken, aPromiseId, ToBase64(aInitData).get()));
-
- if (!mIsOpen) {
- NS_WARNING("Trying to use a dead GMP decrypter!");
- return;
- }
- // Caller should ensure parameters passed in from JS are valid.
- MOZ_ASSERT(!aInitDataType.IsEmpty() && !aInitData.IsEmpty());
- Unused << SendCreateSession(aCreateSessionToken, aPromiseId, aInitDataType, aInitData, aSessionType);
-}
-
-void
-GMPDecryptorParent::LoadSession(uint32_t aPromiseId,
- const nsCString& aSessionId)
-{
- LOGD(("GMPDecryptorParent[%p]::LoadSession(sessionId='%s', promiseId=%u)",
- this, aSessionId.get(), aPromiseId));
- if (!mIsOpen) {
- NS_WARNING("Trying to use a dead GMP decrypter!");
- return;
- }
- // Caller should ensure parameters passed in from JS are valid.
- MOZ_ASSERT(!aSessionId.IsEmpty());
- Unused << SendLoadSession(aPromiseId, aSessionId);
-}
-
-void
-GMPDecryptorParent::UpdateSession(uint32_t aPromiseId,
- const nsCString& aSessionId,
- const nsTArray<uint8_t>& aResponse)
-{
- LOGD(("GMPDecryptorParent[%p]::UpdateSession(sessionId='%s', promiseId=%u response='%s')",
- this, aSessionId.get(), aPromiseId, ToBase64(aResponse).get()));
-
- if (!mIsOpen) {
- NS_WARNING("Trying to use a dead GMP decrypter!");
- return;
- }
- // Caller should ensure parameters passed in from JS are valid.
- MOZ_ASSERT(!aSessionId.IsEmpty() && !aResponse.IsEmpty());
- Unused << SendUpdateSession(aPromiseId, aSessionId, aResponse);
-}
-
-void
-GMPDecryptorParent::CloseSession(uint32_t aPromiseId,
- const nsCString& aSessionId)
-{
- LOGD(("GMPDecryptorParent[%p]::CloseSession(sessionId='%s', promiseId=%u)",
- this, aSessionId.get(), aPromiseId));
-
- if (!mIsOpen) {
- NS_WARNING("Trying to use a dead GMP decrypter!");
- return;
- }
- // Caller should ensure parameters passed in from JS are valid.
- MOZ_ASSERT(!aSessionId.IsEmpty());
- Unused << SendCloseSession(aPromiseId, aSessionId);
-}
-
-void
-GMPDecryptorParent::RemoveSession(uint32_t aPromiseId,
- const nsCString& aSessionId)
-{
- LOGD(("GMPDecryptorParent[%p]::RemoveSession(sessionId='%s', promiseId=%u)",
- this, aSessionId.get(), aPromiseId));
-
- if (!mIsOpen) {
- NS_WARNING("Trying to use a dead GMP decrypter!");
- return;
- }
- // Caller should ensure parameters passed in from JS are valid.
- MOZ_ASSERT(!aSessionId.IsEmpty());
- Unused << SendRemoveSession(aPromiseId, aSessionId);
-}
-
-void
-GMPDecryptorParent::SetServerCertificate(uint32_t aPromiseId,
- const nsTArray<uint8_t>& aServerCert)
-{
- LOGD(("GMPDecryptorParent[%p]::SetServerCertificate(promiseId=%u)",
- this, aPromiseId));
-
- if (!mIsOpen) {
- NS_WARNING("Trying to use a dead GMP decrypter!");
- return;
- }
- // Caller should ensure parameters passed in from JS are valid.
- MOZ_ASSERT(!aServerCert.IsEmpty());
- Unused << SendSetServerCertificate(aPromiseId, aServerCert);
-}
-
-void
-GMPDecryptorParent::Decrypt(uint32_t aId,
- const CryptoSample& aCrypto,
- const nsTArray<uint8_t>& aBuffer)
-{
- LOGV(("GMPDecryptorParent[%p]::Decrypt(id=%d)", this, aId));
-
- if (!mIsOpen) {
- NS_WARNING("Trying to use a dead GMP decrypter!");
- return;
- }
-
- // Caller should ensure parameters passed in are valid.
- MOZ_ASSERT(!aBuffer.IsEmpty());
-
- if (aCrypto.mValid) {
- GMPDecryptionData data(aCrypto.mKeyId,
- aCrypto.mIV,
- aCrypto.mPlainSizes,
- aCrypto.mEncryptedSizes,
- aCrypto.mSessionIds);
-
- Unused << SendDecrypt(aId, aBuffer, data);
- } else {
- GMPDecryptionData data;
- Unused << SendDecrypt(aId, aBuffer, data);
- }
-}
-
-bool
-GMPDecryptorParent::RecvSetSessionId(const uint32_t& aCreateSessionId,
- const nsCString& aSessionId)
-{
-#ifdef MOZ_EME
- LOGD(("GMPDecryptorParent[%p]::RecvSetSessionId(token=%u, sessionId='%s')",
- this, aCreateSessionId, aSessionId.get()));
-
- if (!mIsOpen) {
- NS_WARNING("Trying to use a dead GMP decrypter!");
- return false;
- }
- mCallback->SetSessionId(aCreateSessionId, aSessionId);
-#endif
- return true;
-}
-
-bool
-GMPDecryptorParent::RecvResolveLoadSessionPromise(const uint32_t& aPromiseId,
- const bool& aSuccess)
-{
-#ifdef MOZ_EME
- LOGD(("GMPDecryptorParent[%p]::RecvResolveLoadSessionPromise(promiseId=%u)",
- this, aPromiseId));
-
- if (!mIsOpen) {
- NS_WARNING("Trying to use a dead GMP decrypter!");
- return false;
- }
- mCallback->ResolveLoadSessionPromise(aPromiseId, aSuccess);
-#endif
- return true;
-}
-
-bool
-GMPDecryptorParent::RecvResolvePromise(const uint32_t& aPromiseId)
-{
-#ifdef MOZ_EME
- LOGD(("GMPDecryptorParent[%p]::RecvResolvePromise(promiseId=%u)",
- this, aPromiseId));
-
- if (!mIsOpen) {
- NS_WARNING("Trying to use a dead GMP decrypter!");
- return false;
- }
- mCallback->ResolvePromise(aPromiseId);
-#endif
- return true;
-}
-
-nsresult
-GMPExToNsresult(GMPDOMException aDomException) {
- switch (aDomException) {
- case kGMPNoModificationAllowedError: return NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR;
- case kGMPNotFoundError: return NS_ERROR_DOM_NOT_FOUND_ERR;
- case kGMPNotSupportedError: return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
- case kGMPInvalidStateError: return NS_ERROR_DOM_INVALID_STATE_ERR;
- case kGMPSyntaxError: return NS_ERROR_DOM_SYNTAX_ERR;
- case kGMPInvalidModificationError: return NS_ERROR_DOM_INVALID_MODIFICATION_ERR;
- case kGMPInvalidAccessError: return NS_ERROR_DOM_INVALID_ACCESS_ERR;
- case kGMPSecurityError: return NS_ERROR_DOM_SECURITY_ERR;
- case kGMPAbortError: return NS_ERROR_DOM_ABORT_ERR;
- case kGMPQuotaExceededError: return NS_ERROR_DOM_QUOTA_EXCEEDED_ERR;
- case kGMPTimeoutError: return NS_ERROR_DOM_TIMEOUT_ERR;
- case kGMPTypeError: return NS_ERROR_DOM_TYPE_ERR;
- default: return NS_ERROR_DOM_UNKNOWN_ERR;
- }
-}
-
-bool
-GMPDecryptorParent::RecvRejectPromise(const uint32_t& aPromiseId,
- const GMPDOMException& aException,
- const nsCString& aMessage)
-{
-#ifdef MOZ_EME
- LOGD(("GMPDecryptorParent[%p]::RecvRejectPromise(promiseId=%u, exception=%d, msg='%s')",
- this, aPromiseId, aException, aMessage.get()));
-
- if (!mIsOpen) {
- NS_WARNING("Trying to use a dead GMP decrypter!");
- return false;
- }
- mCallback->RejectPromise(aPromiseId, GMPExToNsresult(aException), aMessage);
-#endif
- return true;
-}
-
-#ifdef MOZ_EME
-static dom::MediaKeyMessageType
-ToMediaKeyMessageType(GMPSessionMessageType aMessageType) {
- switch (aMessageType) {
- case kGMPLicenseRequest: return dom::MediaKeyMessageType::License_request;
- case kGMPLicenseRenewal: return dom::MediaKeyMessageType::License_renewal;
- case kGMPLicenseRelease: return dom::MediaKeyMessageType::License_release;
- case kGMPIndividualizationRequest: return dom::MediaKeyMessageType::Individualization_request;
- default: return dom::MediaKeyMessageType::License_request;
- };
-};
-#endif
-
-bool
-GMPDecryptorParent::RecvSessionMessage(const nsCString& aSessionId,
- const GMPSessionMessageType& aMessageType,
- nsTArray<uint8_t>&& aMessage)
-{
-#ifdef MOZ_EME
- LOGD(("GMPDecryptorParent[%p]::RecvSessionMessage(sessionId='%s', type=%d, msg='%s')",
- this, aSessionId.get(), aMessageType, ToBase64(aMessage).get()));
-
- if (!mIsOpen) {
- NS_WARNING("Trying to use a dead GMP decrypter!");
- return false;
- }
- mCallback->SessionMessage(aSessionId, ToMediaKeyMessageType(aMessageType), aMessage);
-#endif
- return true;
-}
-
-bool
-GMPDecryptorParent::RecvExpirationChange(const nsCString& aSessionId,
- const double& aExpiryTime)
-{
-#ifdef MOZ_EME
- LOGD(("GMPDecryptorParent[%p]::RecvExpirationChange(sessionId='%s', expiry=%lf)",
- this, aSessionId.get(), aExpiryTime));
-
- if (!mIsOpen) {
- NS_WARNING("Trying to use a dead GMP decrypter!");
- return false;
- }
- mCallback->ExpirationChange(aSessionId, aExpiryTime);
-#endif
- return true;
-}
-
-bool
-GMPDecryptorParent::RecvSessionClosed(const nsCString& aSessionId)
-{
-#ifdef MOZ_EME
- LOGD(("GMPDecryptorParent[%p]::RecvSessionClosed(sessionId='%s')",
- this, aSessionId.get()));
-
- if (!mIsOpen) {
- NS_WARNING("Trying to use a dead GMP decrypter!");
- return false;
- }
- mCallback->SessionClosed(aSessionId);
-#endif
- return true;
-}
-
-bool
-GMPDecryptorParent::RecvSessionError(const nsCString& aSessionId,
- const GMPDOMException& aException,
- const uint32_t& aSystemCode,
- const nsCString& aMessage)
-{
-#ifdef MOZ_EME
- LOGD(("GMPDecryptorParent[%p]::RecvSessionError(sessionId='%s', exception=%d, sysCode=%d, msg='%s')",
- this, aSessionId.get(),
- aException, aSystemCode, aMessage.get()));
-
- if (!mIsOpen) {
- NS_WARNING("Trying to use a dead GMP decrypter!");
- return false;
- }
- mCallback->SessionError(aSessionId,
- GMPExToNsresult(aException),
- aSystemCode,
- aMessage);
-#endif
- return true;
-}
-
-#ifdef MOZ_EME
-static dom::MediaKeyStatus
-ToMediaKeyStatus(GMPMediaKeyStatus aStatus) {
- switch (aStatus) {
- case kGMPUsable: return dom::MediaKeyStatus::Usable;
- case kGMPExpired: return dom::MediaKeyStatus::Expired;
- case kGMPOutputDownscaled: return dom::MediaKeyStatus::Output_downscaled;
- case kGMPOutputRestricted: return dom::MediaKeyStatus::Output_restricted;
- case kGMPInternalError: return dom::MediaKeyStatus::Internal_error;
- case kGMPReleased: return dom::MediaKeyStatus::Released;
- case kGMPStatusPending: return dom::MediaKeyStatus::Status_pending;
- default: return dom::MediaKeyStatus::Internal_error;
- }
-}
-#endif
-
-bool
-GMPDecryptorParent::RecvBatchedKeyStatusChanged(const nsCString& aSessionId,
- InfallibleTArray<GMPKeyInformation>&& aKeyInfos)
-{
-#ifdef MOZ_EME
- LOGD(("GMPDecryptorParent[%p]::RecvBatchedKeyStatusChanged(sessionId='%s', KeyInfos len='%d')",
- this, aSessionId.get(), aKeyInfos.Length()));
-
- if (mIsOpen) {
- nsTArray<CDMKeyInfo> cdmKeyInfos(aKeyInfos.Length());
- for (uint32_t i = 0; i < aKeyInfos.Length(); i++) {
- LOGD(("GMPDecryptorParent[%p]::RecvBatchedKeyStatusChanged(keyId=%s, gmp-status=%d)",
- this, ToBase64(aKeyInfos[i].keyId()).get(), aKeyInfos[i].status()));
- // If the status is kGMPUnknown, we're going to forget(remove) that key info.
- if (aKeyInfos[i].status() != kGMPUnknown) {
- auto status = ToMediaKeyStatus(aKeyInfos[i].status());
- cdmKeyInfos.AppendElement(CDMKeyInfo(aKeyInfos[i].keyId(),
- dom::Optional<dom::MediaKeyStatus>(status)));
- } else {
- cdmKeyInfos.AppendElement(CDMKeyInfo(aKeyInfos[i].keyId()));
- }
- }
- mCallback->BatchedKeyStatusChanged(aSessionId, cdmKeyInfos);
- }
-#endif
- return true;
-}
-
-#ifdef MOZ_EME
-DecryptStatus
-ToDecryptStatus(GMPErr aError)
-{
- switch (aError) {
- case GMPNoErr: return Ok;
- case GMPNoKeyErr: return NoKeyErr;
- case GMPAbortedErr: return AbortedErr;
- default: return GenericErr;
- }
-}
-#endif
-
-bool
-GMPDecryptorParent::RecvDecrypted(const uint32_t& aId,
- const GMPErr& aErr,
- InfallibleTArray<uint8_t>&& aBuffer)
-{
-#ifdef MOZ_EME
- LOGV(("GMPDecryptorParent[%p]::RecvDecrypted(id=%d, err=%d)",
- this, aId, aErr));
-
- if (!mIsOpen) {
- NS_WARNING("Trying to use a dead GMP decrypter!");
- return false;
- }
- mCallback->Decrypted(aId, ToDecryptStatus(aErr), aBuffer);
-#endif
- return true;
-}
-
-bool
-GMPDecryptorParent::RecvShutdown()
-{
- LOGD(("GMPDecryptorParent[%p]::RecvShutdown()", this));
-
- Shutdown();
- return true;
-}
-
-// Note: may be called via Terminated()
-void
-GMPDecryptorParent::Close()
-{
- LOGD(("GMPDecryptorParent[%p]::Close()", this));
- MOZ_ASSERT(mGMPThread == NS_GetCurrentThread());
-
- // Consumer is done with us; we can shut down. No more callbacks should
- // be made to mCallback. Note: do this before Shutdown()!
- mCallback = nullptr;
- // Let Shutdown mark us as dead so it knows if we had been alive
-
- // In case this is the last reference
- RefPtr<GMPDecryptorParent> kungfudeathgrip(this);
- this->Release();
- Shutdown();
-}
-
-void
-GMPDecryptorParent::Shutdown()
-{
- LOGD(("GMPDecryptorParent[%p]::Shutdown()", this));
- MOZ_ASSERT(mGMPThread == NS_GetCurrentThread());
-
- if (mShuttingDown) {
- return;
- }
- mShuttingDown = true;
-
- // Notify client we're gone! Won't occur after Close()
- if (mCallback) {
- mCallback->Terminated();
- mCallback = nullptr;
- }
-
- mIsOpen = false;
- if (!mActorDestroyed) {
- Unused << SendDecryptingComplete();
- }
-}
-
-// Note: Keep this sync'd up with Shutdown
-void
-GMPDecryptorParent::ActorDestroy(ActorDestroyReason aWhy)
-{
- LOGD(("GMPDecryptorParent[%p]::ActorDestroy(reason=%d)", this, aWhy));
-
- mIsOpen = false;
- mActorDestroyed = true;
- if (mCallback) {
- // May call Close() (and Shutdown()) immediately or with a delay
- mCallback->Terminated();
- mCallback = nullptr;
- }
- if (mPlugin) {
- mPlugin->DecryptorDestroyed(this);
- mPlugin = nullptr;
- }
- MaybeDisconnect(aWhy == AbnormalShutdown);
-}
-
-bool
-GMPDecryptorParent::Recv__delete__()
-{
- LOGD(("GMPDecryptorParent[%p]::Recv__delete__()", this));
-
- if (mPlugin) {
- mPlugin->DecryptorDestroyed(this);
- mPlugin = nullptr;
- }
- return true;
-}
-
-} // namespace gmp
-} // namespace mozilla