ChromiumCDMCallbackProxy.cpp (6753B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #include "ChromiumCDMCallbackProxy.h" 7 8 #include <type_traits> 9 10 #include "ChromiumCDMProxy.h" 11 #include "content_decryption_module.h" 12 13 namespace mozilla { 14 15 template <class Func, class... Args> 16 void ChromiumCDMCallbackProxy::DispatchToMainThread(const char* const aLabel, 17 Func aFunc, 18 Args&&... aArgs) { 19 mMainThread->Dispatch( 20 // Use decay to ensure all the types are passed by value not by reference. 21 NewRunnableMethod<std::decay_t<Args>...>(aLabel, mProxy, aFunc, 22 std::forward<Args>(aArgs)...), 23 NS_DISPATCH_NORMAL); 24 } 25 26 void ChromiumCDMCallbackProxy::SetSessionId(uint32_t aPromiseId, 27 const nsCString& aSessionId) { 28 DispatchToMainThread("ChromiumCDMProxy::OnSetSessionId", 29 &ChromiumCDMProxy::OnSetSessionId, aPromiseId, 30 NS_ConvertUTF8toUTF16(aSessionId)); 31 } 32 33 void ChromiumCDMCallbackProxy::ResolveLoadSessionPromise(uint32_t aPromiseId, 34 bool aSuccessful) { 35 DispatchToMainThread("ChromiumCDMProxy::OnResolveLoadSessionPromise", 36 &ChromiumCDMProxy::OnResolveLoadSessionPromise, 37 aPromiseId, aSuccessful); 38 } 39 40 void ChromiumCDMCallbackProxy::ResolvePromise(uint32_t aPromiseId) { 41 DispatchToMainThread("ChromiumCDMProxy::ResolvePromise", 42 &ChromiumCDMProxy::ResolvePromise, aPromiseId); 43 } 44 45 void ChromiumCDMCallbackProxy::RejectPromise(uint32_t aPromiseId, 46 ErrorResult&& aException, 47 const nsCString& aErrorMessage) { 48 // Use CopyableErrorResult to store our exception in the runnable, 49 // because ErrorResult is not OK to move across threads. 50 DispatchToMainThread<decltype(&ChromiumCDMProxy::RejectPromiseOnMainThread), 51 int32_t, StoreCopyPassByRRef<CopyableErrorResult>, 52 const nsCString&>( 53 "ChromiumCDMProxy::RejectPromise", 54 &ChromiumCDMProxy::RejectPromiseOnMainThread, aPromiseId, 55 std::move(aException), aErrorMessage); 56 } 57 58 static dom::MediaKeyMessageType ToDOMMessageType(uint32_t aMessageType) { 59 switch (static_cast<cdm::MessageType>(aMessageType)) { 60 case cdm::kLicenseRequest: 61 return dom::MediaKeyMessageType::License_request; 62 case cdm::kLicenseRenewal: 63 return dom::MediaKeyMessageType::License_renewal; 64 case cdm::kLicenseRelease: 65 return dom::MediaKeyMessageType::License_release; 66 case cdm::kIndividualizationRequest: 67 return dom::MediaKeyMessageType::Individualization_request; 68 } 69 MOZ_ASSERT_UNREACHABLE("Invalid cdm::MessageType enum value."); 70 return dom::MediaKeyMessageType::License_request; 71 } 72 73 void ChromiumCDMCallbackProxy::SessionMessage(const nsACString& aSessionId, 74 uint32_t aMessageType, 75 nsTArray<uint8_t>&& aMessage) { 76 DispatchToMainThread("ChromiumCDMProxy::OnSessionMessage", 77 &ChromiumCDMProxy::OnSessionMessage, 78 NS_ConvertUTF8toUTF16(aSessionId), 79 ToDOMMessageType(aMessageType), std::move(aMessage)); 80 } 81 82 static dom::MediaKeyStatus ToDOMMediaKeyStatus(uint32_t aStatus) { 83 switch (static_cast<cdm::KeyStatus>(aStatus)) { 84 case cdm::kUsable: 85 return dom::MediaKeyStatus::Usable; 86 case cdm::kInternalError: 87 return dom::MediaKeyStatus::Internal_error; 88 case cdm::kExpired: 89 return dom::MediaKeyStatus::Expired; 90 case cdm::kOutputRestricted: 91 return dom::MediaKeyStatus::Output_restricted; 92 case cdm::kOutputDownscaled: 93 return dom::MediaKeyStatus::Output_downscaled; 94 case cdm::kStatusPending: 95 return dom::MediaKeyStatus::Status_pending; 96 case cdm::kReleased: 97 return dom::MediaKeyStatus::Released; 98 } 99 MOZ_ASSERT_UNREACHABLE("Invalid cdm::KeyStatus enum value."); 100 return dom::MediaKeyStatus::Internal_error; 101 } 102 103 void ChromiumCDMCallbackProxy::ResolvePromiseWithKeyStatus( 104 uint32_t aPromiseId, uint32_t aKeyStatus) { 105 DispatchToMainThread("ChromiumCDMProxy::OnResolvePromiseWithKeyStatus", 106 &ChromiumCDMProxy::OnResolvePromiseWithKeyStatus, 107 aPromiseId, ToDOMMediaKeyStatus(aKeyStatus)); 108 } 109 110 void ChromiumCDMCallbackProxy::SessionKeysChange( 111 const nsCString& aSessionId, 112 nsTArray<mozilla::gmp::CDMKeyInformation>&& aKeysInfo) { 113 bool keyStatusesChange = false; 114 { 115 auto caps = mProxy->Capabilites().Lock(); 116 for (const auto& keyInfo : aKeysInfo) { 117 keyStatusesChange |= caps->SetKeyStatus( 118 keyInfo.mKeyId(), NS_ConvertUTF8toUTF16(aSessionId), 119 dom::Optional<dom::MediaKeyStatus>( 120 ToDOMMediaKeyStatus(keyInfo.mStatus()))); 121 } 122 } 123 if (keyStatusesChange) { 124 DispatchToMainThread("ChromiumCDMProxy::OnKeyStatusesChange", 125 &ChromiumCDMProxy::OnKeyStatusesChange, 126 NS_ConvertUTF8toUTF16(aSessionId)); 127 } 128 } 129 130 void ChromiumCDMCallbackProxy::ExpirationChange(const nsCString& aSessionId, 131 double aSecondsSinceEpoch) { 132 DispatchToMainThread("ChromiumCDMProxy::OnExpirationChange", 133 &ChromiumCDMProxy::OnExpirationChange, 134 NS_ConvertUTF8toUTF16(aSessionId), 135 UnixTime(aSecondsSinceEpoch * 1000)); 136 } 137 138 void ChromiumCDMCallbackProxy::SessionClosed(const nsCString& aSessionId) { 139 DispatchToMainThread("ChromiumCDMProxy::OnSessionClosed", 140 &ChromiumCDMProxy::OnSessionClosed, 141 NS_ConvertUTF8toUTF16(aSessionId), 142 dom::MediaKeySessionClosedReason::Closed_by_application); 143 } 144 145 void ChromiumCDMCallbackProxy::QueryOutputProtectionStatus() { 146 DispatchToMainThread("ChromiumCDMProxy::QueryOutputProtectionStatus", 147 &ChromiumCDMProxy::QueryOutputProtectionStatus); 148 } 149 150 void ChromiumCDMCallbackProxy::Terminated() { 151 DispatchToMainThread("ChromiumCDMProxy::Terminated", 152 &ChromiumCDMProxy::Terminated); 153 } 154 155 void ChromiumCDMCallbackProxy::Shutdown() { 156 DispatchToMainThread("ChromiumCDMProxy::Shutdown", 157 &ChromiumCDMProxy::Shutdown); 158 } 159 160 } // namespace mozilla