void MediaKeySession::UpdateKeyStatusMap() { MOZ_ASSERT(!IsClosed()); if (!mKeys->GetCDMProxy()) { return; } nsTArray<CDMCaps::KeyStatus> keyStatuses; { CDMCaps::AutoLock caps(mKeys->GetCDMProxy()->Capabilites()); caps.GetKeyStatusesForSession(mSessionId, keyStatuses); } mKeyStatusMap->Update(keyStatuses); if (EME_LOG_ENABLED()) { nsAutoCString message( nsPrintfCString("MediaKeySession[%p,'%s'] key statuses change {", this, NS_ConvertUTF16toUTF8(mSessionId).get())); for (const CDMCaps::KeyStatus& status : keyStatuses) { message.Append(nsPrintfCString(" (%s,%s)", ToBase64(status.mId).get(), MediaKeyStatusValues::strings[status.mStatus].value)); } message.Append(" }"); EME_LOG(message.get()); } }
already_AddRefed<Promise> MediaKeySession::GenerateRequest(const nsAString& aInitDataType, const ArrayBufferViewOrArrayBuffer& aInitData, ErrorResult& aRv) { nsRefPtr<DetailedPromise> promise(MakePromise(aRv, NS_LITERAL_CSTRING("MediaKeySession.generateRequest"))); if (aRv.Failed()) { return nullptr; } if (!mUninitialized) { EME_LOG("MediaKeySession[%p,'%s'] GenerateRequest() failed, uninitialized", this, NS_ConvertUTF16toUTF8(mSessionId).get()); promise->MaybeReject(NS_ERROR_DOM_INVALID_ACCESS_ERR, NS_LITERAL_CSTRING("Session is already initialized in MediaKeySession.generateRequest()")); return promise.forget(); } mUninitialized = false; nsTArray<uint8_t> data; if (aInitDataType.IsEmpty() || !CopyArrayBufferViewOrArrayBufferData(aInitData, data)) { promise->MaybeReject(NS_ERROR_DOM_INVALID_ACCESS_ERR, NS_LITERAL_CSTRING("Bad arguments to MediaKeySession.generateRequest()")); EME_LOG("MediaKeySession[%p,'%s'] GenerateRequest() failed, " "invalid initData or initDataType", this, NS_ConvertUTF16toUTF8(mSessionId).get()); return promise.forget(); } // Convert initData to base64 for easier logging. // Note: UpdateSession() Move()s the data out of the array, so we have // to copy it here. nsAutoCString base64InitData; if (EME_LOG_ENABLED()) { nsDependentCSubstring rawInitData(reinterpret_cast<const char*>(data.Elements()), data.Length()); if (NS_FAILED(Base64Encode(rawInitData, base64InitData))) { NS_WARNING("Failed to base64 encode initData for logging"); } } PromiseId pid = mKeys->StorePromise(promise); mKeys->GetCDMProxy()->CreateSession(Token(), mSessionType, pid, aInitDataType, data); EME_LOG("MediaKeySession[%p,'%s'] GenerateRequest() sent, " "promiseId=%d initData(base64)='%s'", this, NS_ConvertUTF16toUTF8(mSessionId).get(), pid, base64InitData.get()); return promise.forget(); }
already_AddRefed<Promise> MediaKeySession::Update(const ArrayBufferViewOrArrayBuffer& aResponse, ErrorResult& aRv) { nsRefPtr<DetailedPromise> promise(MakePromise(aRv, NS_LITERAL_CSTRING("MediaKeySession.update"))); if (aRv.Failed()) { return nullptr; } nsTArray<uint8_t> data; if (IsClosed() || !mKeys->GetCDMProxy()) { promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR, NS_LITERAL_CSTRING("Session is closed or was not properly initialized")); EME_LOG("MediaKeySession[%p,'%s'] Update() failed, session is closed or was not properly initialised.", this, NS_ConvertUTF16toUTF8(mSessionId).get()); return promise.forget(); } if (!CopyArrayBufferViewOrArrayBufferData(aResponse, data)) { promise->MaybeReject(NS_ERROR_DOM_INVALID_ACCESS_ERR, NS_LITERAL_CSTRING("Invalid response buffer")); EME_LOG("MediaKeySession[%p,'%s'] Update() failed, invalid response buffer", this, NS_ConvertUTF16toUTF8(mSessionId).get()); return promise.forget(); } // Convert response to base64 for easier logging. // Note: UpdateSession() Move()s the data out of the array, so we have // to copy it here. nsAutoCString base64Response; if (EME_LOG_ENABLED()) { nsDependentCSubstring rawResponse(reinterpret_cast<const char*>(data.Elements()), data.Length()); if (NS_FAILED(Base64Encode(rawResponse, base64Response))) { NS_WARNING("Failed to base64 encode response for logging"); } } PromiseId pid = mKeys->StorePromise(promise); mKeys->GetCDMProxy()->UpdateSession(mSessionId, pid, data); EME_LOG("MediaKeySession[%p,'%s'] Update() sent to CDM, " "promiseId=%d Response(base64)='%s'", this, NS_ConvertUTF16toUTF8(mSessionId).get(), pid, base64Response.get()); return promise.forget(); }
void MediaKeySession::DispatchKeyMessage(MediaKeyMessageType aMessageType, const nsTArray<uint8_t>& aMessage) { if (EME_LOG_ENABLED()) { EME_LOG("MediaKeySession[%p,'%s'] DispatchKeyMessage() type=%s message(base64)='%s'", this, NS_ConvertUTF16toUTF8(mSessionId).get(), MediaKeyMessageTypeValues::strings[uint32_t(aMessageType)].value, ToBase64(aMessage).get()); } RefPtr<MediaKeyMessageEvent> event( MediaKeyMessageEvent::Constructor(this, aMessageType, aMessage)); RefPtr<AsyncEventDispatcher> asyncDispatcher = new AsyncEventDispatcher(this, event); asyncDispatcher->PostDOMEvent(); }
void MediaKeySession::DispatchKeyMessage(MediaKeyMessageType aMessageType, const nsTArray<uint8_t>& aMessage) { if (EME_LOG_ENABLED()) { nsAutoCString base64MsgData; nsDependentCSubstring rawMsgData(reinterpret_cast<const char*>(aMessage.Elements()), aMessage.Length()); if (NS_FAILED(Base64Encode(rawMsgData, base64MsgData))) { NS_WARNING("Failed to base64 encode message for logging"); } EME_LOG("MediaKeySession[%p,'%s'] DispatchKeyMessage() type=%s message(base64)='%s'", this, NS_ConvertUTF16toUTF8(mSessionId).get(), MediaKeyMessageTypeValues::strings[uint32_t(aMessageType)].value, base64MsgData.get()); } nsRefPtr<MediaKeyMessageEvent> event( MediaKeyMessageEvent::Constructor(this, aMessageType, aMessage)); nsRefPtr<AsyncEventDispatcher> asyncDispatcher = new AsyncEventDispatcher(this, event); asyncDispatcher->PostDOMEvent(); }