Line data Source code
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
5 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #include "CustomEvent.h"
8 : #include "mozilla/dom/CustomEventBinding.h"
9 :
10 : #include "mozilla/dom/BindingUtils.h"
11 : #include "nsContentUtils.h"
12 : #include "nsIXPConnect.h"
13 :
14 : using namespace mozilla;
15 : using namespace mozilla::dom;
16 :
17 9 : CustomEvent::CustomEvent(mozilla::dom::EventTarget* aOwner,
18 : nsPresContext* aPresContext,
19 9 : mozilla::WidgetEvent* aEvent)
20 : : Event(aOwner, aPresContext, aEvent)
21 9 : , mDetail(JS::NullValue())
22 : {
23 9 : mozilla::HoldJSObjects(this);
24 9 : }
25 :
26 0 : CustomEvent::~CustomEvent()
27 : {
28 0 : mozilla::DropJSObjects(this);
29 0 : }
30 :
31 : NS_IMPL_CYCLE_COLLECTION_CLASS(CustomEvent)
32 0 : NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(CustomEvent, Event)
33 0 : tmp->mDetail.setUndefined();
34 0 : mozilla::DropJSObjects(this);
35 0 : NS_IMPL_CYCLE_COLLECTION_UNLINK_END
36 :
37 9 : NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(CustomEvent, Event)
38 9 : NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
39 :
40 20 : NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(CustomEvent, Event)
41 20 : NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mDetail)
42 20 : NS_IMPL_CYCLE_COLLECTION_TRACE_END
43 :
44 20 : NS_IMPL_ADDREF_INHERITED(CustomEvent, Event)
45 11 : NS_IMPL_RELEASE_INHERITED(CustomEvent, Event)
46 :
47 174 : NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(CustomEvent)
48 89 : NS_INTERFACE_MAP_ENTRY(nsIDOMCustomEvent)
49 89 : NS_INTERFACE_MAP_END_INHERITING(Event)
50 :
51 : already_AddRefed<CustomEvent>
52 9 : CustomEvent::Constructor(const GlobalObject& aGlobal,
53 : const nsAString& aType,
54 : const CustomEventInit& aParam,
55 : ErrorResult& aRv)
56 : {
57 18 : nsCOMPtr<mozilla::dom::EventTarget> t = do_QueryInterface(aGlobal.GetAsSupports());
58 27 : RefPtr<CustomEvent> e = new CustomEvent(t, nullptr, nullptr);
59 9 : bool trusted = e->Init(t);
60 18 : JS::Rooted<JS::Value> detail(aGlobal.Context(), aParam.mDetail);
61 9 : e->InitCustomEvent(aGlobal.Context(), aType, aParam.mBubbles, aParam.mCancelable, detail, aRv);
62 9 : e->SetTrusted(trusted);
63 9 : e->SetComposed(aParam.mComposed);
64 18 : return e.forget();
65 : }
66 :
67 : JSObject*
68 9 : CustomEvent::WrapObjectInternal(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
69 : {
70 9 : return mozilla::dom::CustomEventBinding::Wrap(aCx, this, aGivenProto);
71 : }
72 :
73 : NS_IMETHODIMP
74 0 : CustomEvent::InitCustomEvent(const nsAString& aType,
75 : bool aCanBubble,
76 : bool aCancelable,
77 : nsIVariant* aDetail)
78 : {
79 0 : NS_ENSURE_TRUE(!mEvent->mFlags.mIsBeingDispatched, NS_OK);
80 :
81 0 : AutoJSAPI jsapi;
82 0 : NS_ENSURE_STATE(jsapi.Init(GetParentObject()));
83 0 : JSContext* cx = jsapi.cx();
84 0 : JS::Rooted<JS::Value> detail(cx);
85 :
86 0 : if (!aDetail) {
87 0 : detail = JS::NullValue();
88 0 : } else if (NS_WARN_IF(!VariantToJsval(cx, aDetail, &detail))) {
89 0 : JS_ClearPendingException(cx);
90 0 : return NS_ERROR_FAILURE;
91 : }
92 :
93 0 : Event::InitEvent(aType, aCanBubble, aCancelable);
94 0 : mDetail = detail;
95 :
96 0 : return NS_OK;
97 : }
98 :
99 : void
100 9 : CustomEvent::InitCustomEvent(JSContext* aCx,
101 : const nsAString& aType,
102 : bool aCanBubble,
103 : bool aCancelable,
104 : JS::Handle<JS::Value> aDetail,
105 : ErrorResult& aRv)
106 : {
107 9 : NS_ENSURE_TRUE_VOID(!mEvent->mFlags.mIsBeingDispatched);
108 :
109 9 : Event::InitEvent(aType, aCanBubble, aCancelable);
110 9 : mDetail = aDetail;
111 : }
112 :
113 : NS_IMETHODIMP
114 0 : CustomEvent::GetDetail(nsIVariant** aDetail)
115 : {
116 0 : if (mDetail.isNull()) {
117 0 : *aDetail = nullptr;
118 0 : return NS_OK;
119 : }
120 :
121 0 : AutoJSAPI jsapi;
122 0 : NS_ENSURE_STATE(jsapi.Init(GetParentObject()));
123 0 : JSContext* cx = jsapi.cx();
124 0 : JS::Rooted<JS::Value> detail(cx, mDetail);
125 0 : nsIXPConnect* xpc = nsContentUtils::XPConnect();
126 :
127 0 : if (NS_WARN_IF(!xpc)) {
128 0 : return NS_ERROR_FAILURE;
129 : }
130 :
131 0 : return xpc->JSToVariant(cx, detail, aDetail);
132 : }
133 :
134 : void
135 2 : CustomEvent::GetDetail(JSContext* aCx,
136 : JS::MutableHandle<JS::Value> aRetval)
137 : {
138 2 : aRetval.set(mDetail);
139 2 : }
140 :
141 : already_AddRefed<CustomEvent>
142 0 : NS_NewDOMCustomEvent(EventTarget* aOwner,
143 : nsPresContext* aPresContext,
144 : mozilla::WidgetEvent* aEvent)
145 : {
146 : RefPtr<CustomEvent> it =
147 0 : new CustomEvent(aOwner, aPresContext, aEvent);
148 0 : return it.forget();
149 : }
|