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