MFCDMChild.h (5658B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 #ifndef DOM_MEDIA_IPC_MFCDMCHILD_H_ 6 #define DOM_MEDIA_IPC_MFCDMCHILD_H_ 7 8 #include <unordered_map> 9 10 #include "mozilla/Atomics.h" 11 #include "mozilla/MozPromise.h" 12 #include "mozilla/PMFCDMChild.h" 13 14 namespace mozilla { 15 16 class WMFCDMProxyCallback; 17 18 /** 19 * MFCDMChild is a content process proxy to MFCDMParent and the actual CDM 20 * running in utility process. 21 */ 22 class MFCDMChild final : public PMFCDMChild { 23 public: 24 NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MFCDMChild); 25 26 explicit MFCDMChild(const nsAString& aKeySystem); 27 28 using CapabilitiesPromise = MozPromise<MFCDMCapabilitiesIPDL, nsresult, true>; 29 RefPtr<CapabilitiesPromise> GetCapabilities( 30 MFCDMCapabilitiesRequest&& aRequest); 31 32 template <typename PromiseType> 33 already_AddRefed<PromiseType> InvokeAsync( 34 std::function<void()>&& aCall, StaticString aCallerName, 35 MozPromiseHolder<PromiseType>& aPromise); 36 37 using InitPromise = MozPromise<MFCDMInitIPDL, nsresult, true>; 38 RefPtr<InitPromise> Init( 39 const nsAString& aOrigin, const CopyableTArray<nsString>& aInitDataTypes, 40 const KeySystemConfig::Requirement aPersistentState, 41 const KeySystemConfig::Requirement aDistinctiveID, 42 const CopyableTArray<MFCDMMediaCapability>& aAudioCapabilities, 43 const CopyableTArray<MFCDMMediaCapability>& aVideoCapabilities, 44 WMFCDMProxyCallback* aProxyCallback); 45 46 using SessionPromise = MozPromise<nsString, nsresult, true>; 47 RefPtr<SessionPromise> CreateSessionAndGenerateRequest( 48 uint32_t aPromiseId, const KeySystemConfig::SessionType aSessionType, 49 const nsAString& aInitDataType, const nsTArray<uint8_t>& aInitData); 50 51 RefPtr<GenericPromise> LoadSession( 52 uint32_t aPromiseId, const KeySystemConfig::SessionType aSessionType, 53 const nsAString& aSessionId); 54 55 RefPtr<GenericPromise> UpdateSession(uint32_t aPromiseId, 56 const nsAString& aSessionId, 57 nsTArray<uint8_t>& aResponse); 58 59 RefPtr<GenericPromise> CloseSession(uint32_t aPromiseId, 60 const nsAString& aSessionId); 61 62 RefPtr<GenericPromise> RemoveSession(uint32_t aPromiseId, 63 const nsAString& aSessionId); 64 65 RefPtr<GenericPromise> SetServerCertificate(uint32_t aPromiseId, 66 nsTArray<uint8_t>& aCert); 67 68 RefPtr<GenericPromise> GetStatusForPolicy( 69 uint32_t aPromiseId, const dom::HDCPVersion& aMinHdcpVersion); 70 71 mozilla::ipc::IPCResult RecvOnSessionKeyMessage( 72 const MFCDMKeyMessage& aMessage); 73 mozilla::ipc::IPCResult RecvOnSessionKeyStatusesChanged( 74 const MFCDMKeyStatusChange& aKeyStatuses); 75 mozilla::ipc::IPCResult RecvOnSessionKeyExpiration( 76 const MFCDMKeyExpiration& aExpiration); 77 mozilla::ipc::IPCResult RecvOnSessionClosed( 78 const MFCDMSessionClosedResult& aResult); 79 80 uint64_t Id() const { return mId; } 81 const nsString& KeySystem() const { return mKeySystem; } 82 83 void IPDLActorDestroyed(); 84 85 void EnsureRemote(); 86 void Shutdown(); 87 88 nsISerialEventTarget* ManagerThread() const { return mManagerThread; } 89 void AssertOnManagerThread() const { 90 MOZ_ASSERT(mManagerThread->IsOnCurrentThread()); 91 } 92 93 private: 94 ~MFCDMChild(); 95 96 void AssertSendable(); 97 98 const nsString mKeySystem; 99 100 const nsCOMPtr<nsISerialEventTarget> mManagerThread; 101 RefPtr<MFCDMChild> mIPDLSelfRef; 102 103 using RemotePromise = GenericNonExclusivePromise; 104 RefPtr<RemotePromise> mRemotePromise; 105 MozPromiseHolder<RemotePromise> mRemotePromiseHolder; 106 MozPromiseRequestHolder<RemotePromise> mRemoteRequest; 107 // Before EnsureRemote(): NS_ERROR_NOT_INITIALIZED; After EnsureRemote(): 108 // NS_OK or some error code. 109 Atomic<nsresult> mState; 110 111 MozPromiseHolder<CapabilitiesPromise> mCapabilitiesPromiseHolder; 112 113 Atomic<bool> mShutdown; 114 115 // This represents an unique Id to indentify the CDM in the remote process. 116 // 0(zero) means the CDM is not yet initialized. 117 // Modified on the manager thread, and read on other threads. 118 Atomic<uint64_t> mId; 119 MozPromiseHolder<InitPromise> mInitPromiseHolder; 120 using InitIPDLPromise = MozPromise<mozilla::MFCDMInitResult, 121 mozilla::ipc::ResponseRejectReason, true>; 122 MozPromiseRequestHolder<InitIPDLPromise> mInitRequest; 123 124 MozPromiseHolder<SessionPromise> mCreateSessionPromiseHolder; 125 MozPromiseRequestHolder<CreateSessionAndGenerateRequestPromise> 126 mCreateSessionRequest; 127 128 MozPromiseHolder<GenericPromise> mLoadSessionPromiseHolder; 129 MozPromiseRequestHolder<LoadSessionPromise> mLoadSessionRequest; 130 131 MozPromiseHolder<GenericPromise> mUpdateSessionPromiseHolder; 132 MozPromiseRequestHolder<UpdateSessionPromise> mUpdateSessionRequest; 133 134 MozPromiseHolder<GenericPromise> mCloseSessionPromiseHolder; 135 MozPromiseRequestHolder<CloseSessionPromise> mCloseSessionRequest; 136 137 MozPromiseHolder<GenericPromise> mRemoveSessionPromiseHolder; 138 MozPromiseRequestHolder<RemoveSessionPromise> mRemoveSessionRequest; 139 140 mutable Mutex mMutex{"MFCDMChild"}; 141 142 std::unordered_map<uint32_t, MozPromiseHolder<SessionPromise>> 143 mPendingSessionPromises MOZ_GUARDED_BY(mMutex); 144 145 std::unordered_map<uint32_t, MozPromiseHolder<GenericPromise>> 146 mPendingGenericPromises MOZ_GUARDED_BY(mMutex); 147 148 // This should only be used on the manager thread. 149 RefPtr<WMFCDMProxyCallback> mProxyCallback; 150 }; 151 152 } // namespace mozilla 153 154 #endif // DOM_MEDIA_IPC_MFCDMCHILD_H_