ChromiumCDMProxy.h (4923B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef ChromiumCDMProxy_h_ 8 #define ChromiumCDMProxy_h_ 9 10 #include "ChromiumCDMParent.h" 11 #include "mozilla/AbstractThread.h" 12 #include "mozilla/CDMProxy.h" 13 14 namespace mozilla { 15 16 class ErrorResult; 17 class MediaRawData; 18 class DecryptJob; 19 class ChromiumCDMCallbackProxy; 20 class ChromiumCDMProxy : public CDMProxy { 21 public: 22 NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ChromiumCDMProxy, override) 23 24 ChromiumCDMProxy(dom::MediaKeys* aKeys, const nsAString& aKeySystem, 25 GMPCrashHelper* aCrashHelper, 26 bool aAllowDistinctiveIdentifier, 27 bool aAllowPersistentState); 28 29 void Init(PromiseId aPromiseId, const nsAString& aOrigin, 30 const nsAString& aTopLevelOrigin, 31 const nsAString& aGMPName) override; 32 33 void CreateSession(uint32_t aCreateSessionToken, 34 dom::MediaKeySessionType aSessionType, 35 PromiseId aPromiseId, const nsAString& aInitDataType, 36 nsTArray<uint8_t>& aInitData) override; 37 38 void LoadSession(PromiseId aPromiseId, dom::MediaKeySessionType aSessionType, 39 const nsAString& aSessionId) override; 40 41 void SetServerCertificate(PromiseId aPromiseId, 42 nsTArray<uint8_t>& aCert) override; 43 44 void UpdateSession(const nsAString& aSessionId, PromiseId aPromiseId, 45 nsTArray<uint8_t>& aResponse) override; 46 47 void CloseSession(const nsAString& aSessionId, PromiseId aPromiseId) override; 48 49 void RemoveSession(const nsAString& aSessionId, 50 PromiseId aPromiseId) override; 51 52 void QueryOutputProtectionStatus() override; 53 54 void NotifyOutputProtectionStatus( 55 OutputProtectionCheckStatus aCheckStatus, 56 OutputProtectionCaptureStatus aCaptureStatus) override; 57 58 void Shutdown() override; 59 60 void Terminated() override; 61 62 void OnSetSessionId(uint32_t aCreateSessionToken, 63 const nsAString& aSessionId) override; 64 65 void OnResolveLoadSessionPromise(uint32_t aPromiseId, bool aSuccess) override; 66 67 void OnSessionMessage(const nsAString& aSessionId, 68 dom::MediaKeyMessageType aMessageType, 69 const nsTArray<uint8_t>& aMessage) override; 70 71 void OnExpirationChange(const nsAString& aSessionId, 72 UnixTime aExpiryTime) override; 73 74 void OnSessionClosed(const nsAString& aSessionId, 75 dom::MediaKeySessionClosedReason aReason) override; 76 77 void OnSessionError(const nsAString& aSessionId, nsresult aException, 78 uint32_t aSystemCode, const nsAString& aMsg) override; 79 80 void OnRejectPromise(uint32_t aPromiseId, ErrorResult&& aException, 81 const nsCString& aMsg) override; 82 83 RefPtr<DecryptPromise> Decrypt(MediaRawData* aSample) override; 84 85 void OnDecrypted(uint32_t aId, DecryptStatus aResult, 86 const nsTArray<uint8_t>& aDecryptedData) override; 87 88 void RejectPromise(PromiseId aId, ErrorResult&& aException, 89 const nsCString& aReason) override; 90 // Reject promise with an InvalidStateError and the given message. 91 void RejectPromiseWithStateError(PromiseId aId, const nsCString& aReason); 92 // For use for moving rejections from off-main thread. 93 void RejectPromiseOnMainThread(PromiseId aId, 94 CopyableErrorResult&& aException, 95 const nsCString& aReason); 96 97 void ResolvePromise(PromiseId aId) override; 98 99 void OnKeyStatusesChange(const nsAString& aSessionId) override; 100 101 void GetStatusForPolicy(PromiseId aPromiseId, 102 const dom::HDCPVersion& aMinHdcpVersion) override; 103 104 #ifdef DEBUG 105 bool IsOnOwnerThread() override; 106 #endif 107 108 ChromiumCDMProxy* AsChromiumCDMProxy() override { return this; } 109 110 // Threadsafe. Note this may return a reference to a shutdown 111 // CDM, which will fail on all operations. 112 already_AddRefed<gmp::ChromiumCDMParent> GetCDMParent(); 113 114 void OnResolvePromiseWithKeyStatus(uint32_t aPromiseId, 115 dom::MediaKeyStatus aKeyStatus); 116 117 private: 118 void OnCDMCreated(uint32_t aPromiseId); 119 void ShutdownCDMIfExists(); 120 121 ~ChromiumCDMProxy(); 122 123 // True if Shutdown() has been called. Should only be read and written on 124 // main thread. 125 bool mIsShutdown = false; 126 127 RefPtr<GMPCrashHelper> mCrashHelper; 128 129 Mutex mCDMMutex MOZ_UNANNOTATED; 130 RefPtr<gmp::ChromiumCDMParent> mCDM; 131 nsCOMPtr<nsISerialEventTarget> mGMPThread; 132 UniquePtr<ChromiumCDMCallbackProxy> mCallback; 133 }; 134 135 } // namespace mozilla 136 137 #endif // ChromiumCDMProxy_h_