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/. */
5 #ifndef DOM_MEDIA_IPC_MFCDMCHILD_H_
6 #define DOM_MEDIA_IPC_MFCDMCHILD_H_
8 #include <unordered_map>
9 #include "mozilla/Atomics.h"
10 #include "mozilla/MozPromise.h"
11 #include "mozilla/PMFCDMChild.h"
15 class WMFCDMProxyCallback
;
18 * MFCDMChild is a content process proxy to MFCDMParent and the actual CDM
19 * running in utility process.
21 class MFCDMChild final
: public PMFCDMChild
{
23 NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MFCDMChild
);
25 explicit MFCDMChild(const nsAString
& aKeySystem
);
27 using CapabilitiesPromise
= MozPromise
<MFCDMCapabilitiesIPDL
, nsresult
, true>;
28 RefPtr
<CapabilitiesPromise
> GetCapabilities(bool aIsHWSecured
);
30 template <typename PromiseType
>
31 already_AddRefed
<PromiseType
> InvokeAsync(
32 std::function
<void()>&& aCall
, const char* aCallerName
,
33 MozPromiseHolder
<PromiseType
>& aPromise
);
35 using InitPromise
= MozPromise
<MFCDMInitIPDL
, nsresult
, true>;
36 RefPtr
<InitPromise
> Init(
37 const nsAString
& aOrigin
, const CopyableTArray
<nsString
>& aInitDataTypes
,
38 const KeySystemConfig::Requirement aPersistentState
,
39 const KeySystemConfig::Requirement aDistinctiveID
,
40 const CopyableTArray
<MFCDMMediaCapability
>& aAudioCapabilities
,
41 const CopyableTArray
<MFCDMMediaCapability
>& aVideoCapabilities
,
42 WMFCDMProxyCallback
* aProxyCallback
);
44 using SessionPromise
= MozPromise
<nsString
, nsresult
, true>;
45 RefPtr
<SessionPromise
> CreateSessionAndGenerateRequest(
46 uint32_t aPromiseId
, const KeySystemConfig::SessionType aSessionType
,
47 const nsAString
& aInitDataType
, const nsTArray
<uint8_t>& aInitData
);
49 RefPtr
<GenericPromise
> LoadSession(
50 uint32_t aPromiseId
, const KeySystemConfig::SessionType aSessionType
,
51 const nsAString
& aSessionId
);
53 RefPtr
<GenericPromise
> UpdateSession(uint32_t aPromiseId
,
54 const nsAString
& aSessionId
,
55 nsTArray
<uint8_t>& aResponse
);
57 RefPtr
<GenericPromise
> CloseSession(uint32_t aPromiseId
,
58 const nsAString
& aSessionId
);
60 RefPtr
<GenericPromise
> RemoveSession(uint32_t aPromiseId
,
61 const nsAString
& aSessionId
);
63 RefPtr
<GenericPromise
> SetServerCertificate(uint32_t aPromiseId
,
64 nsTArray
<uint8_t>& aCert
);
66 mozilla::ipc::IPCResult
RecvOnSessionKeyMessage(
67 const MFCDMKeyMessage
& aMessage
);
68 mozilla::ipc::IPCResult
RecvOnSessionKeyStatusesChanged(
69 const MFCDMKeyStatusChange
& aKeyStatuses
);
70 mozilla::ipc::IPCResult
RecvOnSessionKeyExpiration(
71 const MFCDMKeyExpiration
& aExpiration
);
73 uint64_t Id() const { return mId
; }
74 const nsString
& KeySystem() const { return mKeySystem
; }
76 void IPDLActorDestroyed() {
77 AssertOnManagerThread();
78 mIPDLSelfRef
= nullptr;
81 mState
= NS_ERROR_NOT_AVAILABLE
;
86 nsISerialEventTarget
* ManagerThread() { return mManagerThread
; }
87 void AssertOnManagerThread() const {
88 MOZ_ASSERT(mManagerThread
->IsOnCurrentThread());
94 using RemotePromise
= GenericNonExclusivePromise
;
95 RefPtr
<RemotePromise
> EnsureRemote();
97 void AssertSendable();
99 const nsString mKeySystem
;
101 const RefPtr
<nsISerialEventTarget
> mManagerThread
;
102 RefPtr
<MFCDMChild
> mIPDLSelfRef
;
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
;
111 MozPromiseHolder
<CapabilitiesPromise
> mCapabilitiesPromiseHolder
;
113 Atomic
<bool> mShutdown
;
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
;
124 MozPromiseHolder
<SessionPromise
> mCreateSessionPromiseHolder
;
125 MozPromiseRequestHolder
<CreateSessionAndGenerateRequestPromise
>
126 mCreateSessionRequest
;
128 MozPromiseHolder
<GenericPromise
> mLoadSessionPromiseHolder
;
129 MozPromiseRequestHolder
<LoadSessionPromise
> mLoadSessionRequest
;
131 MozPromiseHolder
<GenericPromise
> mUpdateSessionPromiseHolder
;
132 MozPromiseRequestHolder
<UpdateSessionPromise
> mUpdateSessionRequest
;
134 MozPromiseHolder
<GenericPromise
> mCloseSessionPromiseHolder
;
135 MozPromiseRequestHolder
<CloseSessionPromise
> mCloseSessionRequest
;
137 MozPromiseHolder
<GenericPromise
> mRemoveSessionPromiseHolder
;
138 MozPromiseRequestHolder
<RemoveSessionPromise
> mRemoveSessionRequest
;
140 std::unordered_map
<uint32_t, MozPromiseHolder
<SessionPromise
>>
141 mPendingSessionPromises
;
143 std::unordered_map
<uint32_t, MozPromiseHolder
<GenericPromise
>>
144 mPendingGenericPromises
;
146 RefPtr
<WMFCDMProxyCallback
> mProxyCallback
;
149 } // namespace mozilla
151 #endif // DOM_MEDIA_IPC_MFCDMCHILD_H_