tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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_