/src/mozilla-central/dom/events/EventTarget.cpp
Line | Count | Source (jump to first uncovered line) |
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 "mozilla/EventListenerManager.h" |
8 | | #include "mozilla/dom/EventTarget.h" |
9 | | #include "mozilla/dom/EventTargetBinding.h" |
10 | | #include "mozilla/dom/ConstructibleEventTarget.h" |
11 | | #include "nsIGlobalObject.h" |
12 | | #include "nsThreadUtils.h" |
13 | | |
14 | | namespace mozilla { |
15 | | namespace dom { |
16 | | |
17 | | /* static */ |
18 | | already_AddRefed<EventTarget> |
19 | | EventTarget::Constructor(const GlobalObject& aGlobal, ErrorResult& aRv) |
20 | 0 | { |
21 | 0 | nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(aGlobal.GetAsSupports()); |
22 | 0 | if (!global) { |
23 | 0 | aRv.Throw(NS_ERROR_UNEXPECTED); |
24 | 0 | return nullptr; |
25 | 0 | } |
26 | 0 | RefPtr<EventTarget> target = new ConstructibleEventTarget(global); |
27 | 0 | return target.forget(); |
28 | 0 | } |
29 | | |
30 | | bool |
31 | | EventTarget::ComputeWantsUntrusted(const Nullable<bool>& aWantsUntrusted, |
32 | | const AddEventListenerOptionsOrBoolean* aOptions, |
33 | | ErrorResult& aRv) |
34 | 0 | { |
35 | 0 | if (aOptions && aOptions->IsAddEventListenerOptions()) { |
36 | 0 | const auto& options = aOptions->GetAsAddEventListenerOptions(); |
37 | 0 | if (options.mWantUntrusted.WasPassed()) { |
38 | 0 | return options.mWantUntrusted.Value(); |
39 | 0 | } |
40 | 0 | } |
41 | 0 | |
42 | 0 | if (!aWantsUntrusted.IsNull()) { |
43 | 0 | return aWantsUntrusted.Value(); |
44 | 0 | } |
45 | 0 | |
46 | 0 | bool defaultWantsUntrusted = ComputeDefaultWantsUntrusted(aRv); |
47 | 0 | if (aRv.Failed()) { |
48 | 0 | return false; |
49 | 0 | } |
50 | 0 | |
51 | 0 | return defaultWantsUntrusted; |
52 | 0 | } |
53 | | |
54 | | void |
55 | | EventTarget::AddEventListener(const nsAString& aType, |
56 | | EventListener* aCallback, |
57 | | const AddEventListenerOptionsOrBoolean& aOptions, |
58 | | const Nullable<bool>& aWantsUntrusted, |
59 | | ErrorResult& aRv) |
60 | 0 | { |
61 | 0 | bool wantsUntrusted = ComputeWantsUntrusted(aWantsUntrusted, &aOptions, aRv); |
62 | 0 | if (aRv.Failed()) { |
63 | 0 | return; |
64 | 0 | } |
65 | 0 | |
66 | 0 | EventListenerManager* elm = GetOrCreateListenerManager(); |
67 | 0 | if (!elm) { |
68 | 0 | aRv.Throw(NS_ERROR_UNEXPECTED); |
69 | 0 | return; |
70 | 0 | } |
71 | 0 | |
72 | 0 | elm->AddEventListener(aType, aCallback, aOptions, wantsUntrusted); |
73 | 0 | } |
74 | | |
75 | | nsresult |
76 | | EventTarget::AddEventListener(const nsAString& aType, |
77 | | nsIDOMEventListener* aListener, |
78 | | bool aUseCapture, |
79 | | const Nullable<bool>& aWantsUntrusted) |
80 | 0 | { |
81 | 0 | ErrorResult rv; |
82 | 0 | bool wantsUntrusted = ComputeWantsUntrusted(aWantsUntrusted, nullptr, rv); |
83 | 0 | if (rv.Failed()) { |
84 | 0 | return rv.StealNSResult(); |
85 | 0 | } |
86 | 0 | |
87 | 0 | EventListenerManager* elm = GetOrCreateListenerManager(); |
88 | 0 | NS_ENSURE_STATE(elm); |
89 | 0 | elm->AddEventListener(aType, aListener, aUseCapture, wantsUntrusted); |
90 | 0 | return NS_OK; |
91 | 0 | } |
92 | | |
93 | | void |
94 | | EventTarget::RemoveEventListener(const nsAString& aType, |
95 | | EventListener* aListener, |
96 | | const EventListenerOptionsOrBoolean& aOptions, |
97 | | ErrorResult& aRv) |
98 | 0 | { |
99 | 0 | EventListenerManager* elm = GetExistingListenerManager(); |
100 | 0 | if (elm) { |
101 | 0 | elm->RemoveEventListener(aType, aListener, aOptions); |
102 | 0 | } |
103 | 0 | } |
104 | | |
105 | | void |
106 | | EventTarget::RemoveEventListener(const nsAString& aType, |
107 | | nsIDOMEventListener* aListener, |
108 | | bool aUseCapture) |
109 | 0 | { |
110 | 0 | EventListenerManager* elm = GetExistingListenerManager(); |
111 | 0 | if (elm) { |
112 | 0 | elm->RemoveEventListener(aType, aListener, aUseCapture); |
113 | 0 | } |
114 | 0 | } |
115 | | |
116 | | nsresult |
117 | | EventTarget::AddSystemEventListener(const nsAString& aType, |
118 | | nsIDOMEventListener* aListener, |
119 | | bool aUseCapture, |
120 | | const Nullable<bool>& aWantsUntrusted) |
121 | 0 | { |
122 | 0 | ErrorResult rv; |
123 | 0 | bool wantsUntrusted = ComputeWantsUntrusted(aWantsUntrusted, nullptr, rv); |
124 | 0 | if (rv.Failed()) { |
125 | 0 | return rv.StealNSResult(); |
126 | 0 | } |
127 | 0 | |
128 | 0 | EventListenerManager* elm = GetOrCreateListenerManager(); |
129 | 0 | NS_ENSURE_STATE(elm); |
130 | 0 |
|
131 | 0 | EventListenerFlags flags; |
132 | 0 | flags.mInSystemGroup = true; |
133 | 0 | flags.mCapture = aUseCapture; |
134 | 0 | flags.mAllowUntrustedEvents = wantsUntrusted; |
135 | 0 | elm->AddEventListenerByType(aListener, aType, flags); |
136 | 0 | return NS_OK; |
137 | 0 | } |
138 | | |
139 | | void |
140 | | EventTarget::RemoveSystemEventListener(const nsAString& aType, |
141 | | nsIDOMEventListener *aListener, |
142 | | bool aUseCapture) |
143 | 0 | { |
144 | 0 | EventListenerManager* elm = GetExistingListenerManager(); |
145 | 0 | if (elm) { |
146 | 0 | EventListenerFlags flags; |
147 | 0 | flags.mInSystemGroup = true; |
148 | 0 | flags.mCapture = aUseCapture; |
149 | 0 | elm->RemoveEventListenerByType(aListener, aType, flags); |
150 | 0 | } |
151 | 0 | } |
152 | | |
153 | | EventHandlerNonNull* |
154 | | EventTarget::GetEventHandler(nsAtom* aType) |
155 | 0 | { |
156 | 0 | EventListenerManager* elm = GetExistingListenerManager(); |
157 | 0 | return elm ? elm->GetEventHandler(aType) : nullptr; |
158 | 0 | } |
159 | | |
160 | | void |
161 | | EventTarget::SetEventHandler(const nsAString& aType, |
162 | | EventHandlerNonNull* aHandler, |
163 | | ErrorResult& aRv) |
164 | 0 | { |
165 | 0 | if (!StringBeginsWith(aType, NS_LITERAL_STRING("on"))) { |
166 | 0 | aRv.Throw(NS_ERROR_INVALID_ARG); |
167 | 0 | return; |
168 | 0 | } |
169 | 0 | RefPtr<nsAtom> type = NS_Atomize(aType); |
170 | 0 | SetEventHandler(type, aHandler); |
171 | 0 | } |
172 | | |
173 | | void |
174 | | EventTarget::SetEventHandler(nsAtom* aType, EventHandlerNonNull* aHandler) |
175 | 0 | { |
176 | 0 | GetOrCreateListenerManager()->SetEventHandler(aType, aHandler); |
177 | 0 | } |
178 | | |
179 | | bool |
180 | | EventTarget::HasNonSystemGroupListenersForUntrustedKeyEvents() const |
181 | 0 | { |
182 | 0 | EventListenerManager* elm = GetExistingListenerManager(); |
183 | 0 | return elm && elm->HasNonSystemGroupListenersForUntrustedKeyEvents(); |
184 | 0 | } |
185 | | |
186 | | bool |
187 | | EventTarget::HasNonPassiveNonSystemGroupListenersForUntrustedKeyEvents() const |
188 | 0 | { |
189 | 0 | EventListenerManager* elm = GetExistingListenerManager(); |
190 | 0 | return elm && elm->HasNonPassiveNonSystemGroupListenersForUntrustedKeyEvents(); |
191 | 0 | } |
192 | | |
193 | | bool |
194 | | EventTarget::IsApzAware() const |
195 | 0 | { |
196 | 0 | EventListenerManager* elm = GetExistingListenerManager(); |
197 | 0 | return elm && elm->HasApzAwareListeners(); |
198 | 0 | } |
199 | | |
200 | | void |
201 | | EventTarget::DispatchEvent(Event& aEvent) |
202 | 0 | { |
203 | 0 | // The caller type doesn't really matter if we don't care about the |
204 | 0 | // return value, but let's be safe and pass NonSystem. |
205 | 0 | Unused << DispatchEvent(aEvent, CallerType::NonSystem, IgnoreErrors()); |
206 | 0 | } |
207 | | |
208 | | void |
209 | | EventTarget::DispatchEvent(Event& aEvent, ErrorResult& aRv) |
210 | 0 | { |
211 | 0 | // The caller type doesn't really matter if we don't care about the |
212 | 0 | // return value, but let's be safe and pass NonSystem. |
213 | 0 | Unused << DispatchEvent(aEvent, CallerType::NonSystem, IgnoreErrors()); |
214 | 0 | } |
215 | | |
216 | | } // namespace dom |
217 | | } // namespace mozilla |