no bug - Bumping Firefox l10n changesets r=release a=l10n-bump DONTBUILD CLOSED TREE
[gecko.git] / dom / media / ipc / MFCDMChild.h
blob4a2630d978b7a8d6e4dc784100954fcec547d25a
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"
13 namespace mozilla {
15 class WMFCDMProxyCallback;
17 /**
18 * MFCDMChild is a content process proxy to MFCDMParent and the actual CDM
19 * running in utility process.
21 class MFCDMChild final : public PMFCDMChild {
22 public:
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;
79 if (!mShutdown) {
80 // Remote crashed!
81 mState = NS_ERROR_NOT_AVAILABLE;
84 void Shutdown();
86 nsISerialEventTarget* ManagerThread() { return mManagerThread; }
87 void AssertOnManagerThread() const {
88 MOZ_ASSERT(mManagerThread->IsOnCurrentThread());
91 private:
92 ~MFCDMChild();
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_