1 | /* |
2 | * Copyright (C) 2005, 2007, 2015 Apple Inc. All rights reserved. |
3 | * Copyright (C) 2006 Jon Shier (jshier@iastate.edu) |
4 | * |
5 | * This library is free software; you can redistribute it and/or |
6 | * modify it under the terms of the GNU Library General Public |
7 | * License as published by the Free Software Foundation; either |
8 | * version 2 of the License, or (at your option) any later version. |
9 | * |
10 | * This library is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 | * Library General Public License for more details. |
14 | * |
15 | * You should have received a copy of the GNU Library General Public License |
16 | * along with this library; see the file COPYING.LIB. If not, write to |
17 | * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
18 | * Boston, MA 02110-1301, USA. |
19 | * |
20 | */ |
21 | |
22 | #pragma once |
23 | |
24 | #include "Document.h" |
25 | #include "Quirks.h" |
26 | #include "ThreadGlobalData.h" |
27 | #include <array> |
28 | #include <functional> |
29 | #include <wtf/text/AtomicString.h> |
30 | |
31 | #if ENABLE(TOUCH_EVENTS) |
32 | #include "RuntimeEnabledFeatures.h" |
33 | #endif |
34 | |
35 | namespace WebCore { |
36 | |
37 | #if !defined(ADDITIONAL_DOM_EVENT_NAMES_FOR_EACH) |
38 | #define ADDITIONAL_DOM_EVENT_NAMES_FOR_EACH(macro) |
39 | #endif |
40 | |
41 | #define DOM_EVENT_NAMES_FOR_EACH(macro) \ |
42 | ADDITIONAL_DOM_EVENT_NAMES_FOR_EACH(macro) \ |
43 | macro(DOMActivate) \ |
44 | macro(DOMCharacterDataModified) \ |
45 | macro(DOMContentLoaded) \ |
46 | macro(DOMFocusIn) \ |
47 | macro(DOMFocusOut) \ |
48 | macro(DOMNodeInserted) \ |
49 | macro(DOMNodeInsertedIntoDocument) \ |
50 | macro(DOMNodeRemoved) \ |
51 | macro(DOMNodeRemovedFromDocument) \ |
52 | macro(DOMSubtreeModified) \ |
53 | macro(abort) \ |
54 | macro(activate) \ |
55 | macro(active) \ |
56 | macro(addsourcebuffer) \ |
57 | macro(addstream) \ |
58 | macro(addtrack) \ |
59 | macro(afterprint) \ |
60 | macro(animationcancel) \ |
61 | macro(animationend) \ |
62 | macro(animationiteration) \ |
63 | macro(animationstart) \ |
64 | macro(audioend) \ |
65 | macro(audioprocess) \ |
66 | macro(audiostart) \ |
67 | macro(autocomplete) \ |
68 | macro(autocompleteerror) \ |
69 | macro(beforecopy) \ |
70 | macro(beforecut) \ |
71 | macro(beforeinput) \ |
72 | macro(beforeload) \ |
73 | macro(beforepaste) \ |
74 | macro(beforeprint) \ |
75 | macro(beforeunload) \ |
76 | macro(beginEvent) \ |
77 | macro(blocked) \ |
78 | macro(blur) \ |
79 | macro(boundary) \ |
80 | macro(bufferedamountlow) \ |
81 | macro(cached) \ |
82 | macro(cancel) \ |
83 | macro(canplay) \ |
84 | macro(canplaythrough) \ |
85 | macro(change) \ |
86 | macro(chargingchange) \ |
87 | macro(chargingtimechange) \ |
88 | macro(checking) \ |
89 | macro(click) \ |
90 | macro(close) \ |
91 | macro(complete) \ |
92 | macro(compositionend) \ |
93 | macro(compositionstart) \ |
94 | macro(compositionupdate) \ |
95 | macro(connect) \ |
96 | macro(connectionstatechange) \ |
97 | macro(connecting) \ |
98 | macro(contextmenu) \ |
99 | macro(controllerchange) \ |
100 | macro(copy) \ |
101 | macro(cuechange) \ |
102 | macro(cut) \ |
103 | macro(dataavailable) \ |
104 | macro(datachannel) \ |
105 | macro(dblclick) \ |
106 | macro(devicechange) \ |
107 | macro(devicemotion) \ |
108 | macro(deviceorientation) \ |
109 | macro(dischargingtimechange) \ |
110 | macro(downloading) \ |
111 | macro(drag) \ |
112 | macro(dragend) \ |
113 | macro(dragenter) \ |
114 | macro(dragleave) \ |
115 | macro(dragover) \ |
116 | macro(dragstart) \ |
117 | macro(drop) \ |
118 | macro(durationchange) \ |
119 | macro(emptied) \ |
120 | macro(encrypted) \ |
121 | macro(end) \ |
122 | macro(endEvent) \ |
123 | macro(ended) \ |
124 | macro(enter) \ |
125 | macro(error) \ |
126 | macro(exit) \ |
127 | macro(fetch) \ |
128 | macro(finish) \ |
129 | macro(focus) \ |
130 | macro(focusin) \ |
131 | macro(focusout) \ |
132 | macro(gamepadconnected) \ |
133 | macro(gamepaddisconnected) \ |
134 | macro(gesturechange) \ |
135 | macro(gestureend) \ |
136 | macro(gesturescrollend) \ |
137 | macro(gesturescrollstart) \ |
138 | macro(gesturescrollupdate) \ |
139 | macro(gesturestart) \ |
140 | macro(gesturetap) \ |
141 | macro(gesturetapdown) \ |
142 | macro(gotpointercapture) \ |
143 | macro(hashchange) \ |
144 | macro(icecandidate) \ |
145 | macro(iceconnectionstatechange) \ |
146 | macro(icegatheringstatechange) \ |
147 | macro(inactive) \ |
148 | macro(input) \ |
149 | macro(install) \ |
150 | macro(invalid) \ |
151 | macro(keydown) \ |
152 | macro(keypress) \ |
153 | macro(keystatuseschange) \ |
154 | macro(keyup) \ |
155 | macro(languagechange) \ |
156 | macro(levelchange) \ |
157 | macro(load) \ |
158 | macro(loadeddata) \ |
159 | macro(loadedmetadata) \ |
160 | macro(loadend) \ |
161 | macro(loading) \ |
162 | macro(loadingdone) \ |
163 | macro(loadingerror) \ |
164 | macro(loadstart) \ |
165 | macro(lostpointercapture) \ |
166 | macro(mark) \ |
167 | macro(merchantvalidation) \ |
168 | macro(message) \ |
169 | macro(messageerror) \ |
170 | macro(mousedown) \ |
171 | macro(mouseenter) \ |
172 | macro(mouseleave) \ |
173 | macro(mousemove) \ |
174 | macro(mouseout) \ |
175 | macro(mouseover) \ |
176 | macro(mouseup) \ |
177 | macro(mousewheel) \ |
178 | macro(mute) \ |
179 | macro(negotiationneeded) \ |
180 | macro(nexttrack) \ |
181 | macro(nomatch) \ |
182 | macro(noupdate) \ |
183 | macro(obsolete) \ |
184 | macro(offline) \ |
185 | macro(online) \ |
186 | macro(open) \ |
187 | macro(orientationchange) \ |
188 | macro(overconstrained) \ |
189 | macro(overflowchanged) \ |
190 | macro(pagehide) \ |
191 | macro(pageshow) \ |
192 | macro(paste) \ |
193 | macro(pause) \ |
194 | macro(payerdetailchange) \ |
195 | macro(paymentauthorized) \ |
196 | macro(paymentmethodchange) \ |
197 | macro(paymentmethodselected) \ |
198 | macro(play) \ |
199 | macro(playing) \ |
200 | macro(pointerlockchange) \ |
201 | macro(pointerlockerror) \ |
202 | macro(pointercancel) \ |
203 | macro(pointerdown) \ |
204 | macro(pointerenter) \ |
205 | macro(pointerleave) \ |
206 | macro(pointermove) \ |
207 | macro(pointerout) \ |
208 | macro(pointerover) \ |
209 | macro(pointerup) \ |
210 | macro(popstate) \ |
211 | macro(previoustrack) \ |
212 | macro(progress) \ |
213 | macro(ratechange) \ |
214 | macro(readystatechange) \ |
215 | macro(rejectionhandled) \ |
216 | macro(removesourcebuffer) \ |
217 | macro(removestream) \ |
218 | macro(removetrack) \ |
219 | macro(reset) \ |
220 | macro(resize) \ |
221 | macro(resourcetimingbufferfull) \ |
222 | macro(result) \ |
223 | macro(resume) \ |
224 | macro(scroll) \ |
225 | macro(search) \ |
226 | macro(securitypolicyviolation) \ |
227 | macro(seeked) \ |
228 | macro(seeking) \ |
229 | macro(select) \ |
230 | macro(selectionchange) \ |
231 | macro(selectstart) \ |
232 | macro(shippingaddresschange) \ |
233 | macro(shippingcontactselected) \ |
234 | macro(shippingmethodselected) \ |
235 | macro(shippingoptionchange) \ |
236 | macro(show) \ |
237 | macro(signalingstatechange) \ |
238 | macro(slotchange) \ |
239 | macro(soundend) \ |
240 | macro(soundstart) \ |
241 | macro(sourceclose) \ |
242 | macro(sourceended) \ |
243 | macro(sourceopen) \ |
244 | macro(speechend) \ |
245 | macro(speechstart) \ |
246 | macro(stalled) \ |
247 | macro(start) \ |
248 | macro(started) \ |
249 | macro(statechange) \ |
250 | macro(stop) \ |
251 | macro(storage) \ |
252 | macro(submit) \ |
253 | macro(success) \ |
254 | macro(suspend) \ |
255 | macro(textInput) \ |
256 | macro(timeout) \ |
257 | macro(timeupdate) \ |
258 | macro(toggle) \ |
259 | macro(tonechange) \ |
260 | macro(touchcancel) \ |
261 | macro(touchend) \ |
262 | macro(touchforcechange) \ |
263 | macro(touchmove) \ |
264 | macro(touchstart) \ |
265 | macro(track) \ |
266 | macro(transitioncancel) \ |
267 | macro(transitionend) \ |
268 | macro(transitionrun) \ |
269 | macro(transitionstart) \ |
270 | macro(unhandledrejection) \ |
271 | macro(unload) \ |
272 | macro(unmute) \ |
273 | macro(update) \ |
274 | macro(updateend) \ |
275 | macro(updatefound) \ |
276 | macro(updateready) \ |
277 | macro(updatestart) \ |
278 | macro(upgradeneeded) \ |
279 | macro(validatemerchant) \ |
280 | macro(versionchange) \ |
281 | macro(visibilitychange) \ |
282 | macro(volumechange) \ |
283 | macro(vrdisplayactivate) \ |
284 | macro(vrdisplayblur) \ |
285 | macro(vrdisplayconnect) \ |
286 | macro(vrdisplaydeactivate) \ |
287 | macro(vrdisplaydisconnect) \ |
288 | macro(vrdisplayfocus) \ |
289 | macro(vrdisplaypresentchange) \ |
290 | macro(waiting) \ |
291 | macro(waitingforkey) \ |
292 | macro(webglcontextchanged) \ |
293 | macro(webglcontextcreationerror) \ |
294 | macro(webglcontextlost) \ |
295 | macro(webglcontextrestored) \ |
296 | macro(webkitAnimationEnd) \ |
297 | macro(webkitAnimationIteration) \ |
298 | macro(webkitAnimationStart) \ |
299 | macro(webkitBeforeTextInserted) \ |
300 | macro(webkitTransitionEnd) \ |
301 | macro(webkitbeginfullscreen) \ |
302 | macro(webkitcurrentplaybacktargetiswirelesschanged) \ |
303 | macro(webkitendfullscreen) \ |
304 | macro(webkitfullscreenchange) \ |
305 | macro(webkitfullscreenerror) \ |
306 | macro(webkitkeyadded) \ |
307 | macro(webkitkeyerror) \ |
308 | macro(webkitkeymessage) \ |
309 | macro(webkitmouseforcechanged) \ |
310 | macro(webkitmouseforcedown) \ |
311 | macro(webkitmouseforcewillbegin) \ |
312 | macro(webkitmouseforceup) \ |
313 | macro(webkitneedkey) \ |
314 | macro(webkitnetworkinfochange) \ |
315 | macro(webkitplaybacktargetavailabilitychanged) \ |
316 | macro(webkitpresentationmodechanged) \ |
317 | macro(webkitregionoversetchange) \ |
318 | macro(webkitremovesourcebuffer) \ |
319 | macro(webkitsourceclose) \ |
320 | macro(webkitsourceended) \ |
321 | macro(webkitsourceopen) \ |
322 | macro(webkitspeechchange) \ |
323 | macro(webkitwillrevealbottom) \ |
324 | macro(webkitwillrevealleft) \ |
325 | macro(webkitwillrevealright) \ |
326 | macro(webkitwillrevealtop) \ |
327 | macro(wheel) \ |
328 | macro(write) \ |
329 | macro(writeend) \ |
330 | macro(writestart) \ |
331 | macro(zoom) \ |
332 | // end of DOM_EVENT_NAMES_FOR_EACH |
333 | |
334 | struct EventNames { |
335 | WTF_MAKE_NONCOPYABLE(EventNames); WTF_MAKE_FAST_ALLOCATED; |
336 | |
337 | public: |
338 | #define DOM_EVENT_NAMES_DECLARE(name) const AtomicString name##Event; |
339 | DOM_EVENT_NAMES_FOR_EACH(DOM_EVENT_NAMES_DECLARE) |
340 | #undef DOM_EVENT_NAMES_DECLARE |
341 | |
342 | // FIXME: The friend declaration to std::make_unique below does not work in windows port. |
343 | // |
344 | // template<class T, class... Args> |
345 | // friend typename std::_Unique_if<T>::_Single_object std::make_unique(Args&&...); |
346 | // |
347 | // This create function should be deleted later and is only for keeping EventNames as private. |
348 | // std::make_unique should be used instead. |
349 | // |
350 | template<class... Args> |
351 | static std::unique_ptr<EventNames> create(Args&&... args) |
352 | { |
353 | return std::unique_ptr<EventNames>(new EventNames(std::forward<Args>(args)...)); |
354 | } |
355 | |
356 | // FIXME: Inelegant to call these both event names and event types. |
357 | // We should choose one term and stick to it. |
358 | bool isWheelEventType(const AtomicString& eventType) const; |
359 | bool isGestureEventType(const AtomicString& eventType) const; |
360 | bool isTouchRelatedEventType(const Document&, const AtomicString& eventType) const; |
361 | bool isTouchScrollBlockingEventType(const AtomicString& eventType) const; |
362 | #if ENABLE(GAMEPAD) |
363 | bool isGamepadEventType(const AtomicString& eventType) const; |
364 | #endif |
365 | |
366 | std::array<std::reference_wrapper<const AtomicString>, 9> touchRelatedEventNames() const; |
367 | std::array<std::reference_wrapper<const AtomicString>, 12> extendedTouchRelatedEventNames() const; |
368 | std::array<std::reference_wrapper<const AtomicString>, 3> gestureEventNames() const; |
369 | |
370 | private: |
371 | EventNames(); // Private to prevent accidental call to EventNames() instead of eventNames(). |
372 | friend class ThreadGlobalData; // Allow ThreadGlobalData to create the per-thread EventNames object. |
373 | |
374 | int dummy; // Needed to make initialization macro work. |
375 | }; |
376 | |
377 | const EventNames& eventNames(); |
378 | |
379 | inline const EventNames& eventNames() |
380 | { |
381 | return threadGlobalData().eventNames(); |
382 | } |
383 | |
384 | inline bool EventNames::isGestureEventType(const AtomicString& eventType) const |
385 | { |
386 | return eventType == gesturestartEvent || eventType == gesturechangeEvent || eventType == gestureendEvent; |
387 | } |
388 | |
389 | inline bool EventNames::isTouchScrollBlockingEventType(const AtomicString& eventType) const |
390 | { |
391 | return eventType == touchstartEvent |
392 | || eventType == touchmoveEvent; |
393 | } |
394 | |
395 | inline bool EventNames::isTouchRelatedEventType(const Document& document, const AtomicString& eventType) const |
396 | { |
397 | #if ENABLE(TOUCH_EVENTS) |
398 | if (document.quirks().shouldDispatchSimulatedMouseEvents() || RuntimeEnabledFeatures::sharedFeatures().mouseEventsSimulationEnabled()) { |
399 | if (eventType == mousedownEvent || eventType == mousemoveEvent || eventType == mouseupEvent) |
400 | return true; |
401 | } |
402 | #endif |
403 | UNUSED_PARAM(document); |
404 | return eventType == touchstartEvent |
405 | || eventType == touchmoveEvent |
406 | || eventType == touchendEvent |
407 | || eventType == touchcancelEvent |
408 | || eventType == touchforcechangeEvent |
409 | || eventType == pointerdownEvent |
410 | || eventType == pointermoveEvent |
411 | || eventType == pointerupEvent |
412 | || eventType == pointercancelEvent; |
413 | } |
414 | |
415 | inline bool EventNames::isWheelEventType(const AtomicString& eventType) const |
416 | { |
417 | return eventType == wheelEvent |
418 | || eventType == mousewheelEvent; |
419 | } |
420 | |
421 | inline std::array<std::reference_wrapper<const AtomicString>, 9> EventNames::touchRelatedEventNames() const |
422 | { |
423 | return { { touchstartEvent, touchmoveEvent, touchendEvent, touchcancelEvent, touchforcechangeEvent, pointerdownEvent, pointermoveEvent, pointerupEvent, pointercancelEvent } }; |
424 | } |
425 | |
426 | inline std::array<std::reference_wrapper<const AtomicString>, 12> EventNames::extendedTouchRelatedEventNames() const |
427 | { |
428 | return { { touchstartEvent, touchmoveEvent, touchendEvent, touchcancelEvent, touchforcechangeEvent, pointerdownEvent, pointermoveEvent, pointerupEvent, pointercancelEvent, mousedownEvent, mousemoveEvent, mouseupEvent } }; |
429 | } |
430 | |
431 | inline std::array<std::reference_wrapper<const AtomicString>, 3> EventNames::gestureEventNames() const |
432 | { |
433 | return { { gesturestartEvent, gesturechangeEvent, gestureendEvent } }; |
434 | } |
435 | |
436 | #if ENABLE(GAMEPAD) |
437 | |
438 | inline bool EventNames::isGamepadEventType(const AtomicString& eventType) const |
439 | { |
440 | return eventType == gamepadconnectedEvent |
441 | || eventType == gamepaddisconnectedEvent; |
442 | } |
443 | |
444 | #endif |
445 | |
446 | } // namespace WebCore |
447 | |