MediaKeyStatusMap.cpp (3425B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "mozilla/dom/MediaKeyStatusMap.h" 8 9 #include "GMPUtils.h" 10 #include "mozilla/EMEUtils.h" 11 #include "mozilla/dom/BufferSourceBinding.h" 12 #include "mozilla/dom/ToJSValue.h" 13 #include "mozilla/dom/UnionTypes.h" 14 #include "nsPIDOMWindow.h" 15 16 namespace mozilla::dom { 17 18 NS_IMPL_CYCLE_COLLECTING_ADDREF(MediaKeyStatusMap) 19 NS_IMPL_CYCLE_COLLECTING_RELEASE(MediaKeyStatusMap) 20 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(MediaKeyStatusMap) 21 NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY 22 NS_INTERFACE_MAP_ENTRY(nsISupports) 23 NS_INTERFACE_MAP_END 24 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(MediaKeyStatusMap, mParent) 25 26 MediaKeyStatusMap::MediaKeyStatusMap(nsPIDOMWindowInner* aParent) 27 : mParent(aParent) {} 28 29 MediaKeyStatusMap::~MediaKeyStatusMap() = default; 30 31 JSObject* MediaKeyStatusMap::WrapObject(JSContext* aCx, 32 JS::Handle<JSObject*> aGivenProto) { 33 return MediaKeyStatusMap_Binding::Wrap(aCx, this, aGivenProto); 34 } 35 36 nsPIDOMWindowInner* MediaKeyStatusMap::GetParentObject() const { 37 return mParent; 38 } 39 40 const MediaKeyStatusMap::KeyStatus* MediaKeyStatusMap::FindKey( 41 const BufferSource& aKey) const { 42 MOZ_ASSERT(aKey.IsArrayBuffer() || aKey.IsArrayBufferView()); 43 44 return ProcessTypedArrays(aKey, 45 [&](const Span<const uint8_t>& aData, 46 JS::AutoCheckCannotGC&&) -> const KeyStatus* { 47 for (const KeyStatus& status : mStatuses) { 48 if (aData == Span(status.mKeyId)) { 49 return &status; 50 } 51 } 52 return nullptr; 53 }); 54 } 55 56 void MediaKeyStatusMap::Get(const BufferSource& aKey, 57 OwningMediaKeyStatusOrUndefined& aOutValue, 58 ErrorResult& aOutRv) const { 59 const KeyStatus* status = FindKey(aKey); 60 if (!status) { 61 aOutValue.SetUndefined(); 62 return; 63 } 64 65 aOutValue.SetAsMediaKeyStatus() = status->mStatus; 66 } 67 68 bool MediaKeyStatusMap::Has(const BufferSource& aKey) const { 69 return FindKey(aKey); 70 } 71 72 uint32_t MediaKeyStatusMap::GetIterableLength() const { 73 return mStatuses.Length(); 74 } 75 76 TypedArrayCreator<ArrayBuffer> MediaKeyStatusMap::GetKeyAtIndex( 77 uint32_t aIndex) const { 78 MOZ_ASSERT(aIndex < GetIterableLength()); 79 return TypedArrayCreator<ArrayBuffer>(mStatuses[aIndex].mKeyId); 80 } 81 82 nsString MediaKeyStatusMap::GetKeyIDAsHexString(uint32_t aIndex) const { 83 MOZ_ASSERT(aIndex < GetIterableLength()); 84 return NS_ConvertUTF8toUTF16(ToHexString(mStatuses[aIndex].mKeyId)); 85 } 86 87 MediaKeyStatus MediaKeyStatusMap::GetValueAtIndex(uint32_t aIndex) const { 88 MOZ_ASSERT(aIndex < GetIterableLength()); 89 return mStatuses[aIndex].mStatus; 90 } 91 92 uint32_t MediaKeyStatusMap::Size() const { return mStatuses.Length(); } 93 94 void MediaKeyStatusMap::Update(const nsTArray<CDMCaps::KeyStatus>& aKeys) { 95 mStatuses.Clear(); 96 for (const auto& key : aKeys) { 97 mStatuses.InsertElementSorted(KeyStatus(key.mId, key.mStatus)); 98 } 99 } 100 101 } // namespace mozilla::dom