MediaEncryptedEvent.cpp (3823B)
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 "MediaEncryptedEvent.h" 8 9 #include "js/ArrayBuffer.h" 10 #include "jsfriendapi.h" 11 #include "mozilla/HoldDropJSObjects.h" 12 #include "mozilla/dom/MediaEncryptedEventBinding.h" 13 #include "mozilla/dom/MediaKeys.h" 14 #include "nsContentUtils.h" 15 #include "nsINode.h" 16 17 namespace mozilla::dom { 18 19 NS_IMPL_CYCLE_COLLECTION_CLASS(MediaEncryptedEvent) 20 21 NS_IMPL_ADDREF_INHERITED(MediaEncryptedEvent, Event) 22 NS_IMPL_RELEASE_INHERITED(MediaEncryptedEvent, Event) 23 24 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(MediaEncryptedEvent, Event) 25 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END 26 27 NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(MediaEncryptedEvent, Event) 28 NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mInitData) 29 NS_IMPL_CYCLE_COLLECTION_TRACE_END 30 31 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(MediaEncryptedEvent, Event) 32 mozilla::DropJSObjects(tmp); 33 NS_IMPL_CYCLE_COLLECTION_UNLINK_END 34 35 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(MediaEncryptedEvent) 36 NS_INTERFACE_MAP_END_INHERITING(Event) 37 38 MediaEncryptedEvent::MediaEncryptedEvent(EventTarget* aOwner) 39 : Event(aOwner, nullptr, nullptr) { 40 mozilla::HoldJSObjects(this); 41 } 42 43 MediaEncryptedEvent::~MediaEncryptedEvent() { mozilla::DropJSObjects(this); } 44 45 JSObject* MediaEncryptedEvent::WrapObjectInternal( 46 JSContext* aCx, JS::Handle<JSObject*> aGivenProto) { 47 return MediaEncryptedEvent_Binding::Wrap(aCx, this, aGivenProto); 48 } 49 50 already_AddRefed<MediaEncryptedEvent> MediaEncryptedEvent::Constructor( 51 EventTarget* aOwner) { 52 RefPtr<MediaEncryptedEvent> e = new MediaEncryptedEvent(aOwner); 53 e->InitEvent(u"encrypted"_ns, CanBubble::eNo, Cancelable::eNo); 54 e->SetTrusted(true); 55 return e.forget(); 56 } 57 58 already_AddRefed<MediaEncryptedEvent> MediaEncryptedEvent::Constructor( 59 EventTarget* aOwner, const nsAString& aInitDataType, 60 const nsTArray<uint8_t>& aInitData) { 61 RefPtr<MediaEncryptedEvent> e = new MediaEncryptedEvent(aOwner); 62 e->InitEvent(u"encrypted"_ns, CanBubble::eNo, Cancelable::eNo); 63 e->mInitDataType = aInitDataType; 64 e->mRawInitData = aInitData.Clone(); 65 e->SetTrusted(true); 66 return e.forget(); 67 } 68 69 already_AddRefed<MediaEncryptedEvent> MediaEncryptedEvent::Constructor( 70 const GlobalObject& aGlobal, const nsAString& aType, 71 const MediaKeyNeededEventInit& aEventInitDict, ErrorResult& aRv) { 72 nsCOMPtr<EventTarget> owner = do_QueryInterface(aGlobal.GetAsSupports()); 73 RefPtr<MediaEncryptedEvent> e = new MediaEncryptedEvent(owner); 74 bool trusted = e->Init(owner); 75 e->InitEvent(aType, aEventInitDict.mBubbles, aEventInitDict.mCancelable); 76 e->mInitDataType = aEventInitDict.mInitDataType; 77 if (!aEventInitDict.mInitData.IsNull()) { 78 JS::Rooted<JSObject*> buffer(aGlobal.Context(), 79 aEventInitDict.mInitData.Value().Obj()); 80 e->mInitData = JS::CopyArrayBuffer(aGlobal.Context(), buffer); 81 if (!e->mInitData) { 82 aRv.NoteJSContextException(aGlobal.Context()); 83 return nullptr; 84 } 85 } 86 e->SetTrusted(trusted); 87 return e.forget(); 88 } 89 90 void MediaEncryptedEvent::GetInitDataType(nsString& aRetVal) const { 91 aRetVal = mInitDataType; 92 } 93 94 void MediaEncryptedEvent::GetInitData(JSContext* cx, 95 JS::MutableHandle<JSObject*> aData, 96 ErrorResult& aRv) { 97 if (mRawInitData.Length()) { 98 mInitData = ArrayBuffer::Create(cx, this, mRawInitData, aRv); 99 if (aRv.Failed()) { 100 return; 101 } 102 mRawInitData.Clear(); 103 } 104 aData.set(mInitData); 105 } 106 107 } // namespace mozilla::dom