1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
9 #include "nsCOMArray.h"
14 #include "nsStringGlue.h"
17 #include "nsIDOMKeyEvent.h"
18 #include "nsIDOMMouseEvent.h"
19 #include "nsIDOMWheelEvent.h"
20 #include "nsIDOMDataTransfer.h"
21 #include "nsIDOMEventTarget.h"
22 #include "nsIDOMTouchEvent.h"
23 #include "nsWeakPtr.h"
24 #include "nsIWidget.h"
26 #include "nsTraceRefcnt.h"
27 #include "nsITransferable.h"
28 #include "nsIVariant.h"
29 #include "nsStyleConsts.h"
30 #include "nsAutoPtr.h"
38 class PPluginInstanceChild
;
42 class nsRenderingContext
;
52 #define NS_GUI_EVENT 2
53 #define NS_SIZE_EVENT 3
54 #define NS_SIZEMODE_EVENT 4
55 #define NS_ZLEVEL_EVENT 5
56 #define NS_PAINT_EVENT 6
57 #define NS_SCROLLBAR_EVENT 7
58 #define NS_INPUT_EVENT 8
59 #define NS_KEY_EVENT 9
60 #define NS_MOUSE_EVENT 10
61 #define NS_SCRIPT_ERROR_EVENT 12
62 #define NS_TEXT_EVENT 13
63 #define NS_COMPOSITION_EVENT 14
64 #define NS_MOUSE_SCROLL_EVENT 16
65 #define NS_SCROLLPORT_EVENT 18
66 #define NS_MUTATION_EVENT 19 // |nsMutationEvent| in content
67 #define NS_FORM_EVENT 21
68 #define NS_FOCUS_EVENT 22
69 #define NS_POPUP_EVENT 23
70 #define NS_COMMAND_EVENT 24
71 #define NS_SCROLLAREA_EVENT 25
72 #define NS_TRANSITION_EVENT 26
73 #define NS_ANIMATION_EVENT 27
75 #define NS_UI_EVENT 28
76 #define NS_SVG_EVENT 30
77 #define NS_SVGZOOM_EVENT 31
78 #define NS_SMIL_TIME_EVENT 32
80 #define NS_QUERY_CONTENT_EVENT 33
82 #define NS_DRAG_EVENT 35
83 #define NS_NOTIFYPAINT_EVENT 36
84 #define NS_SIMPLE_GESTURE_EVENT 37
85 #define NS_SELECTION_EVENT 38
86 #define NS_CONTENT_COMMAND_EVENT 39
87 #define NS_GESTURENOTIFY_EVENT 40
88 #define NS_PLUGIN_EVENT 43
89 #define NS_TOUCH_EVENT 44
90 #define NS_WHEEL_EVENT 45
92 // These flags are sort of a mess. They're sort of shared between event
93 // listener flags and event flags, but only some of them. You've been
95 #define NS_EVENT_FLAG_NONE 0x0000
96 #define NS_EVENT_FLAG_TRUSTED 0x0001
97 #define NS_EVENT_FLAG_BUBBLE 0x0002
98 #define NS_EVENT_FLAG_CAPTURE 0x0004
99 #define NS_EVENT_FLAG_STOP_DISPATCH 0x0008
100 #define NS_EVENT_FLAG_NO_DEFAULT 0x0010
101 #define NS_EVENT_FLAG_CANT_CANCEL 0x0020
102 #define NS_EVENT_FLAG_CANT_BUBBLE 0x0040
103 #define NS_PRIV_EVENT_FLAG_SCRIPT 0x0080
104 #define NS_EVENT_FLAG_NO_CONTENT_DISPATCH 0x0100
105 #define NS_EVENT_FLAG_SYSTEM_EVENT 0x0200
106 // Event has been dispatched at least once
107 #define NS_EVENT_DISPATCHED 0x0400
108 #define NS_EVENT_FLAG_DISPATCHING 0x0800
109 // When an event is synthesized for testing, this flag will be set.
110 // Note that this is currently used only with mouse events, because this
111 // flag is not needed on other events now. It could be added to other
113 #define NS_EVENT_FLAG_SYNTHETIC_TEST_EVENT 0x1000
115 // Use this flag if the event should be dispatched only to chrome.
116 #define NS_EVENT_FLAG_ONLY_CHROME_DISPATCH 0x2000
118 // A flag for drag&drop handling.
119 #define NS_EVENT_FLAG_NO_DEFAULT_CALLED_IN_CONTENT 0x4000
121 #define NS_PRIV_EVENT_UNTRUSTED_PERMITTED 0x8000
123 #define NS_EVENT_FLAG_EXCEPTION_THROWN 0x10000
125 #define NS_EVENT_FLAG_PREVENT_MULTIPLE_ACTIONS 0x20000
127 #define NS_EVENT_RETARGET_TO_NON_NATIVE_ANONYMOUS 0x40000
129 #define NS_EVENT_FLAG_STOP_DISPATCH_IMMEDIATELY 0x80000
131 #define NS_EVENT_FLAG_DONT_FORWARD_CROSS_PROCESS 0x100000
133 #define NS_EVENT_CAPTURE_MASK (~(NS_EVENT_FLAG_BUBBLE | NS_EVENT_FLAG_NO_CONTENT_DISPATCH))
134 #define NS_EVENT_BUBBLE_MASK (~(NS_EVENT_FLAG_CAPTURE | NS_EVENT_FLAG_NO_CONTENT_DISPATCH))
136 #define NS_EVENT_TYPE_NULL 0
142 #define NS_EVENT_NULL 0
145 #define NS_WINDOW_START 100
147 // Widget may be destroyed
148 #define NS_XUL_CLOSE (NS_WINDOW_START + 1)
149 // Key is pressed within a window
150 #define NS_KEY_PRESS (NS_WINDOW_START + 31)
151 // Key is released within a window
152 #define NS_KEY_UP (NS_WINDOW_START + 32)
153 // Key is pressed within a window
154 #define NS_KEY_DOWN (NS_WINDOW_START + 33)
156 #define NS_RESIZE_EVENT (NS_WINDOW_START + 60)
157 #define NS_SCROLL_EVENT (NS_WINDOW_START + 61)
159 // A plugin was clicked or otherwise focused. NS_PLUGIN_ACTIVATE should be
160 // used when the window is not active. NS_PLUGIN_FOCUS should be used when
161 // the window is active. In the latter case, the dispatcher of the event
162 // is expected to ensure that the plugin's widget is focused beforehand.
163 #define NS_PLUGIN_ACTIVATE (NS_WINDOW_START + 62)
164 #define NS_PLUGIN_FOCUS (NS_WINDOW_START + 63)
166 #define NS_OFFLINE (NS_WINDOW_START + 64)
167 #define NS_ONLINE (NS_WINDOW_START + 65)
169 // Indicates a resize will occur
170 #define NS_BEFORERESIZE_EVENT (NS_WINDOW_START + 66)
172 // Indicates that the user is either idle or active
173 #define NS_MOZ_USER_IDLE (NS_WINDOW_START + 67)
174 #define NS_MOZ_USER_ACTIVE (NS_WINDOW_START + 68)
176 #define NS_MOUSE_MESSAGE_START 300
177 #define NS_MOUSE_MOVE (NS_MOUSE_MESSAGE_START)
178 #define NS_MOUSE_BUTTON_UP (NS_MOUSE_MESSAGE_START + 1)
179 #define NS_MOUSE_BUTTON_DOWN (NS_MOUSE_MESSAGE_START + 2)
180 #define NS_MOUSE_ENTER (NS_MOUSE_MESSAGE_START + 22)
181 #define NS_MOUSE_EXIT (NS_MOUSE_MESSAGE_START + 23)
182 #define NS_MOUSE_DOUBLECLICK (NS_MOUSE_MESSAGE_START + 24)
183 #define NS_MOUSE_CLICK (NS_MOUSE_MESSAGE_START + 27)
184 #define NS_MOUSE_ACTIVATE (NS_MOUSE_MESSAGE_START + 30)
185 #define NS_MOUSE_ENTER_SYNTH (NS_MOUSE_MESSAGE_START + 31)
186 #define NS_MOUSE_EXIT_SYNTH (NS_MOUSE_MESSAGE_START + 32)
187 #define NS_MOUSE_MOZHITTEST (NS_MOUSE_MESSAGE_START + 33)
188 #define NS_MOUSEENTER (NS_MOUSE_MESSAGE_START + 34)
189 #define NS_MOUSELEAVE (NS_MOUSE_MESSAGE_START + 35)
191 #define NS_CONTEXTMENU_MESSAGE_START 500
192 #define NS_CONTEXTMENU (NS_CONTEXTMENU_MESSAGE_START)
194 #define NS_STREAM_EVENT_START 1100
195 #define NS_LOAD (NS_STREAM_EVENT_START)
196 #define NS_PAGE_UNLOAD (NS_STREAM_EVENT_START + 1)
197 #define NS_HASHCHANGE (NS_STREAM_EVENT_START + 2)
198 #define NS_IMAGE_ABORT (NS_STREAM_EVENT_START + 3)
199 #define NS_LOAD_ERROR (NS_STREAM_EVENT_START + 4)
200 #define NS_POPSTATE (NS_STREAM_EVENT_START + 5)
201 #define NS_BEFORE_PAGE_UNLOAD (NS_STREAM_EVENT_START + 6)
202 #define NS_PAGE_RESTORE (NS_STREAM_EVENT_START + 7)
203 #define NS_READYSTATECHANGE (NS_STREAM_EVENT_START + 8)
205 #define NS_FORM_EVENT_START 1200
206 #define NS_FORM_SUBMIT (NS_FORM_EVENT_START)
207 #define NS_FORM_RESET (NS_FORM_EVENT_START + 1)
208 #define NS_FORM_CHANGE (NS_FORM_EVENT_START + 2)
209 #define NS_FORM_SELECTED (NS_FORM_EVENT_START + 3)
210 #define NS_FORM_INPUT (NS_FORM_EVENT_START + 4)
211 #define NS_FORM_INVALID (NS_FORM_EVENT_START + 5)
213 //Need separate focus/blur notifications for non-native widgets
214 #define NS_FOCUS_EVENT_START 1300
215 #define NS_FOCUS_CONTENT (NS_FOCUS_EVENT_START)
216 #define NS_BLUR_CONTENT (NS_FOCUS_EVENT_START + 1)
218 #define NS_DRAGDROP_EVENT_START 1400
219 #define NS_DRAGDROP_ENTER (NS_DRAGDROP_EVENT_START)
220 #define NS_DRAGDROP_OVER (NS_DRAGDROP_EVENT_START + 1)
221 #define NS_DRAGDROP_EXIT (NS_DRAGDROP_EVENT_START + 2)
222 #define NS_DRAGDROP_DRAGDROP (NS_DRAGDROP_EVENT_START + 3)
223 #define NS_DRAGDROP_GESTURE (NS_DRAGDROP_EVENT_START + 4)
224 #define NS_DRAGDROP_DRAG (NS_DRAGDROP_EVENT_START + 5)
225 #define NS_DRAGDROP_END (NS_DRAGDROP_EVENT_START + 6)
226 #define NS_DRAGDROP_START (NS_DRAGDROP_EVENT_START + 7)
227 #define NS_DRAGDROP_DROP (NS_DRAGDROP_EVENT_START + 8)
228 #define NS_DRAGDROP_OVER_SYNTH (NS_DRAGDROP_EVENT_START + 1)
229 #define NS_DRAGDROP_EXIT_SYNTH (NS_DRAGDROP_EVENT_START + 2)
230 #define NS_DRAGDROP_LEAVE_SYNTH (NS_DRAGDROP_EVENT_START + 9)
233 #define NS_XUL_EVENT_START 1500
234 #define NS_XUL_POPUP_SHOWING (NS_XUL_EVENT_START)
235 #define NS_XUL_POPUP_SHOWN (NS_XUL_EVENT_START+1)
236 #define NS_XUL_POPUP_HIDING (NS_XUL_EVENT_START+2)
237 #define NS_XUL_POPUP_HIDDEN (NS_XUL_EVENT_START+3)
238 // NS_XUL_COMMAND used to be here (NS_XUL_EVENT_START+4)
239 #define NS_XUL_BROADCAST (NS_XUL_EVENT_START+5)
240 #define NS_XUL_COMMAND_UPDATE (NS_XUL_EVENT_START+6)
244 #define NS_MOUSE_SCROLL_START 1600
245 #define NS_MOUSE_SCROLL (NS_MOUSE_SCROLL_START)
246 #define NS_MOUSE_PIXEL_SCROLL (NS_MOUSE_SCROLL_START + 1)
248 #define NS_SCROLLPORT_START 1700
249 #define NS_SCROLLPORT_UNDERFLOW (NS_SCROLLPORT_START)
250 #define NS_SCROLLPORT_OVERFLOW (NS_SCROLLPORT_START+1)
252 // Mutation events defined elsewhere starting at 1800
254 #define NS_USER_DEFINED_EVENT 2000
256 // composition events
257 #define NS_COMPOSITION_EVENT_START 2200
258 #define NS_COMPOSITION_START (NS_COMPOSITION_EVENT_START)
259 #define NS_COMPOSITION_END (NS_COMPOSITION_EVENT_START + 1)
260 #define NS_COMPOSITION_UPDATE (NS_COMPOSITION_EVENT_START + 2)
263 #define NS_TEXT_START 2400
264 #define NS_TEXT_TEXT (NS_TEXT_START)
267 #define NS_UI_EVENT_START 2500
268 // this is not to be confused with NS_ACTIVATE!
269 #define NS_UI_ACTIVATE (NS_UI_EVENT_START)
270 #define NS_UI_FOCUSIN (NS_UI_EVENT_START + 1)
271 #define NS_UI_FOCUSOUT (NS_UI_EVENT_START + 2)
273 // pagetransition events
274 #define NS_PAGETRANSITION_START 2700
275 #define NS_PAGE_SHOW (NS_PAGETRANSITION_START + 1)
276 #define NS_PAGE_HIDE (NS_PAGETRANSITION_START + 2)
279 #define NS_SVG_EVENT_START 2800
280 #define NS_SVG_LOAD (NS_SVG_EVENT_START)
281 #define NS_SVG_UNLOAD (NS_SVG_EVENT_START + 1)
282 #define NS_SVG_ABORT (NS_SVG_EVENT_START + 2)
283 #define NS_SVG_ERROR (NS_SVG_EVENT_START + 3)
284 #define NS_SVG_RESIZE (NS_SVG_EVENT_START + 4)
285 #define NS_SVG_SCROLL (NS_SVG_EVENT_START + 5)
288 #define NS_SVGZOOM_EVENT_START 2900
289 #define NS_SVG_ZOOM (NS_SVGZOOM_EVENT_START)
291 // XUL command events
292 #define NS_XULCOMMAND_EVENT_START 3000
293 #define NS_XUL_COMMAND (NS_XULCOMMAND_EVENT_START)
295 // Cut, copy, paste events
296 #define NS_CUTCOPYPASTE_EVENT_START 3100
297 #define NS_COPY (NS_CUTCOPYPASTE_EVENT_START)
298 #define NS_CUT (NS_CUTCOPYPASTE_EVENT_START + 1)
299 #define NS_PASTE (NS_CUTCOPYPASTE_EVENT_START + 2)
301 // Query the content information
302 #define NS_QUERY_CONTENT_EVENT_START 3200
303 // Query for the selected text information, it return the selection offset,
304 // selection length and selected text.
305 #define NS_QUERY_SELECTED_TEXT (NS_QUERY_CONTENT_EVENT_START)
306 // Query for the text content of specified range, it returns actual lengh (if
307 // the specified range is too long) and the text of the specified range.
308 // Returns the entire text if requested length > actual length.
309 #define NS_QUERY_TEXT_CONTENT (NS_QUERY_CONTENT_EVENT_START + 1)
310 // Query for the caret rect of nth insertion point. The offset of the result is
311 // relative position from the top level widget.
312 #define NS_QUERY_CARET_RECT (NS_QUERY_CONTENT_EVENT_START + 3)
313 // Query for the bounding rect of a range of characters. This works on any
314 // valid character range given offset and length. Result is relative to top
315 // level widget coordinates
316 #define NS_QUERY_TEXT_RECT (NS_QUERY_CONTENT_EVENT_START + 4)
317 // Query for the bounding rect of the current focused frame. Result is relative
318 // to top level widget coordinates
319 #define NS_QUERY_EDITOR_RECT (NS_QUERY_CONTENT_EVENT_START + 5)
320 // Query for the current state of the content. The particular members of
321 // mReply that are set for each query content event will be valid on success.
322 #define NS_QUERY_CONTENT_STATE (NS_QUERY_CONTENT_EVENT_START + 6)
323 // Query for the selection in the form of a nsITransferable.
324 #define NS_QUERY_SELECTION_AS_TRANSFERABLE (NS_QUERY_CONTENT_EVENT_START + 7)
325 // Query for character at a point. This returns the character offset and its
326 // rect. The point is specified by nsEvent::refPoint.
327 #define NS_QUERY_CHARACTER_AT_POINT (NS_QUERY_CONTENT_EVENT_START + 8)
328 // Query if the DOM element under nsEvent::refPoint belongs to our widget
330 #define NS_QUERY_DOM_WIDGET_HITTEST (NS_QUERY_CONTENT_EVENT_START + 9)
333 #define NS_MEDIA_EVENT_START 3300
334 #define NS_LOADSTART (NS_MEDIA_EVENT_START)
335 #define NS_PROGRESS (NS_MEDIA_EVENT_START+1)
336 #define NS_SUSPEND (NS_MEDIA_EVENT_START+2)
337 #define NS_EMPTIED (NS_MEDIA_EVENT_START+3)
338 #define NS_STALLED (NS_MEDIA_EVENT_START+4)
339 #define NS_PLAY (NS_MEDIA_EVENT_START+5)
340 #define NS_PAUSE (NS_MEDIA_EVENT_START+6)
341 #define NS_LOADEDMETADATA (NS_MEDIA_EVENT_START+7)
342 #define NS_LOADEDDATA (NS_MEDIA_EVENT_START+8)
343 #define NS_WAITING (NS_MEDIA_EVENT_START+9)
344 #define NS_PLAYING (NS_MEDIA_EVENT_START+10)
345 #define NS_CANPLAY (NS_MEDIA_EVENT_START+11)
346 #define NS_CANPLAYTHROUGH (NS_MEDIA_EVENT_START+12)
347 #define NS_SEEKING (NS_MEDIA_EVENT_START+13)
348 #define NS_SEEKED (NS_MEDIA_EVENT_START+14)
349 #define NS_TIMEUPDATE (NS_MEDIA_EVENT_START+15)
350 #define NS_ENDED (NS_MEDIA_EVENT_START+16)
351 #define NS_RATECHANGE (NS_MEDIA_EVENT_START+17)
352 #define NS_DURATIONCHANGE (NS_MEDIA_EVENT_START+18)
353 #define NS_VOLUMECHANGE (NS_MEDIA_EVENT_START+19)
354 #define NS_MOZAUDIOAVAILABLE (NS_MEDIA_EVENT_START+20)
356 // paint notification events
357 #define NS_NOTIFYPAINT_START 3400
358 #define NS_AFTERPAINT (NS_NOTIFYPAINT_START)
360 // Simple gesture events
361 #define NS_SIMPLE_GESTURE_EVENT_START 3500
362 #define NS_SIMPLE_GESTURE_SWIPE (NS_SIMPLE_GESTURE_EVENT_START)
363 #define NS_SIMPLE_GESTURE_MAGNIFY_START (NS_SIMPLE_GESTURE_EVENT_START+1)
364 #define NS_SIMPLE_GESTURE_MAGNIFY_UPDATE (NS_SIMPLE_GESTURE_EVENT_START+2)
365 #define NS_SIMPLE_GESTURE_MAGNIFY (NS_SIMPLE_GESTURE_EVENT_START+3)
366 #define NS_SIMPLE_GESTURE_ROTATE_START (NS_SIMPLE_GESTURE_EVENT_START+4)
367 #define NS_SIMPLE_GESTURE_ROTATE_UPDATE (NS_SIMPLE_GESTURE_EVENT_START+5)
368 #define NS_SIMPLE_GESTURE_ROTATE (NS_SIMPLE_GESTURE_EVENT_START+6)
369 #define NS_SIMPLE_GESTURE_TAP (NS_SIMPLE_GESTURE_EVENT_START+7)
370 #define NS_SIMPLE_GESTURE_PRESSTAP (NS_SIMPLE_GESTURE_EVENT_START+8)
371 #define NS_SIMPLE_GESTURE_EDGEUI (NS_SIMPLE_GESTURE_EVENT_START+9)
373 // These are used to send native events to plugins.
374 #define NS_PLUGIN_EVENT_START 3600
375 #define NS_PLUGIN_INPUT_EVENT (NS_PLUGIN_EVENT_START)
376 #define NS_PLUGIN_FOCUS_EVENT (NS_PLUGIN_EVENT_START+1)
378 // Events to manipulate selection (nsSelectionEvent)
379 #define NS_SELECTION_EVENT_START 3700
380 // Clear any previous selection and set the given range as the selection
381 #define NS_SELECTION_SET (NS_SELECTION_EVENT_START)
383 // Events of commands for the contents
384 #define NS_CONTENT_COMMAND_EVENT_START 3800
385 #define NS_CONTENT_COMMAND_CUT (NS_CONTENT_COMMAND_EVENT_START)
386 #define NS_CONTENT_COMMAND_COPY (NS_CONTENT_COMMAND_EVENT_START+1)
387 #define NS_CONTENT_COMMAND_PASTE (NS_CONTENT_COMMAND_EVENT_START+2)
388 #define NS_CONTENT_COMMAND_DELETE (NS_CONTENT_COMMAND_EVENT_START+3)
389 #define NS_CONTENT_COMMAND_UNDO (NS_CONTENT_COMMAND_EVENT_START+4)
390 #define NS_CONTENT_COMMAND_REDO (NS_CONTENT_COMMAND_EVENT_START+5)
391 #define NS_CONTENT_COMMAND_PASTE_TRANSFERABLE (NS_CONTENT_COMMAND_EVENT_START+6)
392 // NS_CONTENT_COMMAND_SCROLL scrolls the nearest scrollable element to the
393 // currently focused content or latest DOM selection. This would normally be
394 // the same element scrolled by keyboard scroll commands, except that this event
395 // will scroll an element scrollable in either direction. I.e., if the nearest
396 // scrollable ancestor element can only be scrolled vertically, and horizontal
397 // scrolling is requested using this event, no scrolling will occur.
398 #define NS_CONTENT_COMMAND_SCROLL (NS_CONTENT_COMMAND_EVENT_START+7)
400 // Event to gesture notification
401 #define NS_GESTURENOTIFY_EVENT_START 3900
403 #define NS_ORIENTATION_EVENT 4000
405 #define NS_SCROLLAREA_EVENT_START 4100
406 #define NS_SCROLLEDAREACHANGED (NS_SCROLLAREA_EVENT_START)
408 #define NS_TRANSITION_EVENT_START 4200
409 #define NS_TRANSITION_END (NS_TRANSITION_EVENT_START)
411 #define NS_ANIMATION_EVENT_START 4250
412 #define NS_ANIMATION_START (NS_ANIMATION_EVENT_START)
413 #define NS_ANIMATION_END (NS_ANIMATION_EVENT_START + 1)
414 #define NS_ANIMATION_ITERATION (NS_ANIMATION_EVENT_START + 2)
416 #define NS_SMIL_TIME_EVENT_START 4300
417 #define NS_SMIL_BEGIN (NS_SMIL_TIME_EVENT_START)
418 #define NS_SMIL_END (NS_SMIL_TIME_EVENT_START + 1)
419 #define NS_SMIL_REPEAT (NS_SMIL_TIME_EVENT_START + 2)
421 // script notification events
422 #define NS_NOTIFYSCRIPT_START 4500
423 #define NS_BEFORE_SCRIPT_EXECUTE (NS_NOTIFYSCRIPT_START)
424 #define NS_AFTER_SCRIPT_EXECUTE (NS_NOTIFYSCRIPT_START+1)
426 #define NS_PRINT_EVENT_START 4600
427 #define NS_BEFOREPRINT (NS_PRINT_EVENT_START)
428 #define NS_AFTERPRINT (NS_PRINT_EVENT_START + 1)
430 #define NS_MESSAGE_EVENT_START 4700
431 #define NS_MESSAGE (NS_MESSAGE_EVENT_START)
433 // Open and close events
434 #define NS_OPENCLOSE_EVENT_START 4800
435 #define NS_OPEN (NS_OPENCLOSE_EVENT_START)
436 #define NS_CLOSE (NS_OPENCLOSE_EVENT_START+1)
438 // Device motion and orientation
439 #define NS_DEVICE_ORIENTATION_START 4900
440 #define NS_DEVICE_ORIENTATION (NS_DEVICE_ORIENTATION_START)
441 #define NS_DEVICE_MOTION (NS_DEVICE_ORIENTATION_START+1)
442 #define NS_DEVICE_PROXIMITY (NS_DEVICE_ORIENTATION_START+2)
443 #define NS_USER_PROXIMITY (NS_DEVICE_ORIENTATION_START+3)
444 #define NS_DEVICE_LIGHT (NS_DEVICE_ORIENTATION_START+4)
446 #define NS_SHOW_EVENT 5000
448 // Fullscreen DOM API
449 #define NS_FULL_SCREEN_START 5100
450 #define NS_FULLSCREENCHANGE (NS_FULL_SCREEN_START)
451 #define NS_FULLSCREENERROR (NS_FULL_SCREEN_START + 1)
453 #define NS_TOUCH_EVENT_START 5200
454 #define NS_TOUCH_START (NS_TOUCH_EVENT_START)
455 #define NS_TOUCH_MOVE (NS_TOUCH_EVENT_START+1)
456 #define NS_TOUCH_END (NS_TOUCH_EVENT_START+2)
457 #define NS_TOUCH_ENTER (NS_TOUCH_EVENT_START+3)
458 #define NS_TOUCH_LEAVE (NS_TOUCH_EVENT_START+4)
459 #define NS_TOUCH_CANCEL (NS_TOUCH_EVENT_START+5)
461 // Pointerlock DOM API
462 #define NS_POINTERLOCK_START 5300
463 #define NS_POINTERLOCKCHANGE (NS_POINTERLOCK_START)
464 #define NS_POINTERLOCKERROR (NS_POINTERLOCK_START + 1)
466 #define NS_WHEEL_EVENT_START 5400
467 #define NS_WHEEL_WHEEL (NS_WHEEL_EVENT_START)
469 //System time is changed
470 #define NS_MOZ_TIME_CHANGE_EVENT 5500
472 // Network packet events.
473 #define NS_NETWORK_EVENT_START 5600
474 #define NS_NETWORK_UPLOAD_EVENT (NS_NETWORK_EVENT_START + 1)
475 #define NS_NETWORK_DOWNLOAD_EVENT (NS_NETWORK_EVENT_START + 2)
478 * Return status for event processors, nsEventStatus, is defined in
483 * different types of (top-level) window z-level positioning
486 nsWindowZTop
= 0, // on top
487 nsWindowZBottom
, // on bottom
488 nsWindowZRelative
// just below some specified widget
498 nsEvent(bool isTrusted
, uint32_t msg
, uint8_t structType
)
499 : eventStructType(structType
),
504 flags(isTrusted
? NS_EVENT_FLAG_TRUSTED
: NS_EVENT_FLAG_NONE
),
507 MOZ_COUNT_CTOR(nsEvent
);
512 MOZ_COUNT_CTOR(nsEvent
);
516 nsEvent(bool isTrusted
, uint32_t msg
)
517 : eventStructType(NS_EVENT
),
522 flags(isTrusted
? NS_EVENT_FLAG_TRUSTED
: NS_EVENT_FLAG_NONE
),
525 MOZ_COUNT_CTOR(nsEvent
);
530 MOZ_COUNT_DTOR(nsEvent
);
533 nsEvent(const nsEvent
& aOther
)
535 MOZ_COUNT_CTOR(nsEvent
);
539 // See event struct types
540 uint8_t eventStructType
;
543 // Relative to the widget of the event, or if there is no widget then it is
544 // in screen coordinates. Not modified by layout code.
546 // The previous refPoint, if known, used to calculate mouse movement deltas.
547 nsIntPoint lastRefPoint
;
548 // Elapsed time, in milliseconds, from a platform-specific zero time
549 // to the time the message was created
551 // Flags to hold event flow stage and capture/bubble cancellation
552 // status. This is used also to indicate whether the event is trusted.
554 // Additional type info for user defined events
555 nsCOMPtr
<nsIAtom
> userType
;
556 // Event targets, needed by DOM Events
557 nsCOMPtr
<nsIDOMEventTarget
> target
;
558 nsCOMPtr
<nsIDOMEventTarget
> currentTarget
;
559 nsCOMPtr
<nsIDOMEventTarget
> originalTarget
;
563 * General graphic user interface event
566 class nsGUIEvent
: public nsEvent
569 nsGUIEvent(bool isTrusted
, uint32_t msg
, nsIWidget
*w
, uint8_t structType
)
570 : nsEvent(isTrusted
, msg
, structType
),
571 widget(w
), pluginEvent(nullptr)
576 : pluginEvent(nullptr)
581 nsGUIEvent(bool isTrusted
, uint32_t msg
, nsIWidget
*w
)
582 : nsEvent(isTrusted
, msg
, NS_GUI_EVENT
),
583 widget(w
), pluginEvent(nullptr)
587 /// Originator of the event
588 nsCOMPtr
<nsIWidget
> widget
;
590 /// Event for NPAPI plugin
598 class nsScriptErrorEvent
: public nsEvent
601 nsScriptErrorEvent(bool isTrusted
, uint32_t msg
)
602 : nsEvent(isTrusted
, msg
, NS_SCRIPT_ERROR_EVENT
),
603 lineNr(0), errorMsg(nullptr), fileName(nullptr)
608 const PRUnichar
* errorMsg
;
609 const PRUnichar
* fileName
;
616 class nsScrollbarEvent
: public nsGUIEvent
619 nsScrollbarEvent(bool isTrusted
, uint32_t msg
, nsIWidget
*w
)
620 : nsGUIEvent(isTrusted
, msg
, w
, NS_SCROLLBAR_EVENT
),
625 /// ranges between scrollbar 0 and (maxRange - thumbSize). See nsIScrollbar
629 class nsScrollPortEvent
: public nsGUIEvent
638 nsScrollPortEvent(bool isTrusted
, uint32_t msg
, nsIWidget
*w
)
639 : nsGUIEvent(isTrusted
, msg
, w
, NS_SCROLLPORT_EVENT
),
647 class nsScrollAreaEvent
: public nsGUIEvent
650 nsScrollAreaEvent(bool isTrusted
, uint32_t msg
, nsIWidget
*w
)
651 : nsGUIEvent(isTrusted
, msg
, w
, NS_SCROLLAREA_EVENT
)
658 class nsInputEvent
: public nsGUIEvent
661 nsInputEvent(bool isTrusted
, uint32_t msg
, nsIWidget
*w
,
663 : nsGUIEvent(isTrusted
, msg
, w
, structType
),
673 nsInputEvent(bool isTrusted
, uint32_t msg
, nsIWidget
*w
)
674 : nsGUIEvent(isTrusted
, msg
, w
, NS_INPUT_EVENT
),
679 // true indicates the shift key is down
682 return ((modifiers
& mozilla::widget::MODIFIER_SHIFT
) != 0);
684 // true indicates the control key is down
685 bool IsControl() const
687 return ((modifiers
& mozilla::widget::MODIFIER_CONTROL
) != 0);
689 // true indicates the alt key is down
692 return ((modifiers
& mozilla::widget::MODIFIER_ALT
) != 0);
694 // true indicates the meta key is down (or, on Mac, the Command key)
697 return ((modifiers
& mozilla::widget::MODIFIER_META
) != 0);
699 // true indicates the win key is down on Windows. Or the Super or Hyper key
703 return ((modifiers
& mozilla::widget::MODIFIER_OS
) != 0);
705 // true indicates the alt graph key is down
706 // NOTE: on Mac, the option key press causes both IsAlt() and IsAltGrpah()
708 bool IsAltGraph() const
710 return ((modifiers
& mozilla::widget::MODIFIER_ALTGRAPH
) != 0);
712 // true indeicates the CapLock LED is turn on.
713 bool IsCapsLocked() const
715 return ((modifiers
& mozilla::widget::MODIFIER_CAPSLOCK
) != 0);
717 // true indeicates the NumLock LED is turn on.
718 bool IsNumLocked() const
720 return ((modifiers
& mozilla::widget::MODIFIER_NUMLOCK
) != 0);
722 // true indeicates the ScrollLock LED is turn on.
723 bool IsScrollLocked() const
725 return ((modifiers
& mozilla::widget::MODIFIER_SCROLLLOCK
) != 0);
728 // true indeicates the Fn key is down, but this is not supported by native
729 // key event on any platform.
732 return ((modifiers
& mozilla::widget::MODIFIER_FN
) != 0);
734 // true indeicates the ScrollLock LED is turn on.
735 bool IsSymbolLocked() const
737 return ((modifiers
& mozilla::widget::MODIFIER_SYMBOLLOCK
) != 0);
740 void InitBasicModifiers(bool aCtrlKey
,
747 modifiers
|= mozilla::widget::MODIFIER_CONTROL
;
750 modifiers
|= mozilla::widget::MODIFIER_ALT
;
753 modifiers
|= mozilla::widget::MODIFIER_SHIFT
;
756 modifiers
|= mozilla::widget::MODIFIER_META
;
760 mozilla::widget::Modifiers modifiers
;
767 class nsMouseEvent_base
: public nsInputEvent
770 friend class mozilla::dom::PBrowserParent
;
771 friend class mozilla::dom::PBrowserChild
;
779 nsMouseEvent_base(bool isTrusted
, uint32_t msg
, nsIWidget
*w
, uint8_t type
)
780 : nsInputEvent(isTrusted
, msg
, w
, type
), button(0), buttons(0),
781 pressure(0), inputSource(nsIDOMMouseEvent::MOZ_SOURCE_MOUSE
) {}
783 /// The possible related target
784 nsCOMPtr
<nsISupports
> relatedTarget
;
789 // Finger or touch pressure of event
790 // ranges between 0.0 and 1.0
793 // Possible values at nsIDOMMouseEvent
794 uint16_t inputSource
;
797 class nsMouseEvent
: public nsMouseEvent_base
800 friend class mozilla::dom::PBrowserParent
;
801 friend class mozilla::dom::PBrowserChild
;
804 enum buttonType
{ eLeftButton
= 0, eMiddleButton
= 1, eRightButton
= 2 };
805 enum buttonsFlag
{ eLeftButtonFlag
= 0x01,
806 eRightButtonFlag
= 0x02,
807 eMiddleButtonFlag
= 0x04,
808 // typicall, "back" button being left side of 5-button
809 // mice, see "buttons" attribute document of DOM3 Events.
810 e4thButtonFlag
= 0x08,
811 // typicall, "forward" button being right side of 5-button
812 // mice, see "buttons" attribute document of DOM3 Events.
813 e5thButtonFlag
= 0x10 };
814 enum reasonType
{ eReal
, eSynthesized
};
815 enum contextType
{ eNormal
, eContextMenuKey
};
816 enum exitType
{ eChild
, eTopLevel
};
823 nsMouseEvent(bool isTrusted
, uint32_t msg
, nsIWidget
*w
,
824 uint8_t structType
, reasonType aReason
)
825 : nsMouseEvent_base(isTrusted
, msg
, w
, structType
),
826 acceptActivation(false), ignoreRootScrollFrame(false),
827 reason(aReason
), context(eNormal
), exit(eChild
), clickCount(0)
831 flags
|= NS_EVENT_FLAG_CANT_CANCEL
;
835 flags
|= (NS_EVENT_FLAG_CANT_CANCEL
& NS_EVENT_FLAG_CANT_BUBBLE
);
844 nsMouseEvent(bool isTrusted
, uint32_t msg
, nsIWidget
*w
,
845 reasonType aReason
, contextType aContext
= eNormal
)
846 : nsMouseEvent_base(isTrusted
, msg
, w
, NS_MOUSE_EVENT
),
847 acceptActivation(false), ignoreRootScrollFrame(false),
848 reason(aReason
), context(aContext
), exit(eChild
), clickCount(0)
852 flags
|= NS_EVENT_FLAG_CANT_CANCEL
;
856 flags
|= (NS_EVENT_FLAG_CANT_CANCEL
| NS_EVENT_FLAG_CANT_BUBBLE
);
859 button
= (context
== eNormal
) ? eRightButton
: eLeftButton
;
868 NS_WARN_IF_FALSE(message
!= NS_CONTEXTMENU
||
870 ((context
== eNormal
) ? eRightButton
: eLeftButton
),
871 "Wrong button set to NS_CONTEXTMENU event?");
875 /// Special return code for MOUSE_ACTIVATE to signal
876 /// if the target accepts activation (1), or denies it (0)
877 bool acceptActivation
;
878 // Whether the event should ignore scroll frame bounds
880 bool ignoreRootScrollFrame
;
882 reasonType reason
: 4;
883 contextType context
: 4;
886 /// The number of mouse clicks
894 class nsDragEvent
: public nsMouseEvent
897 nsDragEvent(bool isTrusted
, uint32_t msg
, nsIWidget
*w
)
898 : nsMouseEvent(isTrusted
, msg
, w
, NS_DRAG_EVENT
, eReal
),
901 if (msg
== NS_DRAGDROP_EXIT_SYNTH
||
902 msg
== NS_DRAGDROP_LEAVE_SYNTH
||
903 msg
== NS_DRAGDROP_END
) {
904 flags
|= NS_EVENT_FLAG_CANT_CANCEL
;
908 nsCOMPtr
<nsIDOMDataTransfer
> dataTransfer
;
916 struct nsAlternativeCharCode
{
917 nsAlternativeCharCode(uint32_t aUnshiftedCharCode
,
918 uint32_t aShiftedCharCode
) :
919 mUnshiftedCharCode(aUnshiftedCharCode
), mShiftedCharCode(aShiftedCharCode
)
922 uint32_t mUnshiftedCharCode
;
923 uint32_t mShiftedCharCode
;
926 class nsKeyEvent
: public nsInputEvent
929 friend class mozilla::dom::PBrowserParent
;
930 friend class mozilla::dom::PBrowserChild
;
937 nsKeyEvent(bool isTrusted
, uint32_t msg
, nsIWidget
*w
)
938 : nsInputEvent(isTrusted
, msg
, w
, NS_KEY_EVENT
),
939 keyCode(0), charCode(0),
940 location(nsIDOMKeyEvent::DOM_KEY_LOCATION_STANDARD
), isChar(0)
946 /// OS translated Unicode char
948 // One of nsIDOMKeyEvent::DOM_KEY_LOCATION_*
950 // OS translated Unicode chars which are used for accesskey and accelkey
951 // handling. The handlers will try from first character to last character.
952 nsTArray
<nsAlternativeCharCode
> alternativeCharCodes
;
953 // indicates whether the event signifies a printable character
961 struct nsTextRangeStyle
964 LINESTYLE_NONE
= NS_STYLE_TEXT_DECORATION_STYLE_NONE
,
965 LINESTYLE_SOLID
= NS_STYLE_TEXT_DECORATION_STYLE_SOLID
,
966 LINESTYLE_DOTTED
= NS_STYLE_TEXT_DECORATION_STYLE_DOTTED
,
967 LINESTYLE_DASHED
= NS_STYLE_TEXT_DECORATION_STYLE_DASHED
,
968 LINESTYLE_DOUBLE
= NS_STYLE_TEXT_DECORATION_STYLE_DOUBLE
,
969 LINESTYLE_WAVY
= NS_STYLE_TEXT_DECORATION_STYLE_WAVY
974 DEFINED_LINESTYLE
= 0x01,
975 DEFINED_FOREGROUND_COLOR
= 0x02,
976 DEFINED_BACKGROUND_COLOR
= 0x04,
977 DEFINED_UNDERLINE_COLOR
= 0x08
980 // Initialize all members, because nsTextRange instances may be compared by
989 mDefinedStyles
= DEFINED_NONE
;
990 mLineStyle
= LINESTYLE_NONE
;
992 mForegroundColor
= mBackgroundColor
= mUnderlineColor
= NS_RGBA(0, 0, 0, 0);
995 bool IsDefined() const { return mDefinedStyles
!= DEFINED_NONE
; }
997 bool IsLineStyleDefined() const
999 return (mDefinedStyles
& DEFINED_LINESTYLE
) != 0;
1002 bool IsForegroundColorDefined() const
1004 return (mDefinedStyles
& DEFINED_FOREGROUND_COLOR
) != 0;
1007 bool IsBackgroundColorDefined() const
1009 return (mDefinedStyles
& DEFINED_BACKGROUND_COLOR
) != 0;
1012 bool IsUnderlineColorDefined() const
1014 return (mDefinedStyles
& DEFINED_UNDERLINE_COLOR
) != 0;
1017 bool IsNoChangeStyle() const
1019 return !IsForegroundColorDefined() && !IsBackgroundColorDefined() &&
1020 IsLineStyleDefined() && mLineStyle
== LINESTYLE_NONE
;
1023 bool Equals(const nsTextRangeStyle
& aOther
)
1025 if (mDefinedStyles
!= aOther
.mDefinedStyles
)
1027 if (IsLineStyleDefined() && (mLineStyle
!= aOther
.mLineStyle
||
1028 !mIsBoldLine
!= !aOther
.mIsBoldLine
))
1030 if (IsForegroundColorDefined() &&
1031 (mForegroundColor
!= aOther
.mForegroundColor
))
1033 if (IsBackgroundColorDefined() &&
1034 (mBackgroundColor
!= aOther
.mBackgroundColor
))
1036 if (IsUnderlineColorDefined() &&
1037 (mUnderlineColor
!= aOther
.mUnderlineColor
))
1042 bool operator !=(const nsTextRangeStyle
&aOther
)
1044 return !Equals(aOther
);
1047 bool operator ==(const nsTextRangeStyle
&aOther
)
1049 return Equals(aOther
);
1052 uint8_t mDefinedStyles
;
1053 uint8_t mLineStyle
; // DEFINED_LINESTYLE
1055 bool mIsBoldLine
; // DEFINED_LINESTYLE
1057 nscolor mForegroundColor
; // DEFINED_FOREGROUND_COLOR
1058 nscolor mBackgroundColor
; // DEFINED_BACKGROUND_COLOR
1059 nscolor mUnderlineColor
; // DEFINED_UNDERLINE_COLOR
1065 : mStartOffset(0), mEndOffset(0), mRangeType(0)
1069 uint32_t mStartOffset
;
1070 uint32_t mEndOffset
;
1071 uint32_t mRangeType
;
1073 nsTextRangeStyle mRangeStyle
;
1076 typedef nsTextRange
* nsTextRangeArray
;
1078 class nsTextEvent
: public nsInputEvent
1081 friend class mozilla::dom::PBrowserParent
;
1082 friend class mozilla::dom::PBrowserChild
;
1083 friend class mozilla::plugins::PPluginInstanceChild
;
1093 nsTextEvent(bool isTrusted
, uint32_t msg
, nsIWidget
*w
)
1094 : nsInputEvent(isTrusted
, msg
, w
, NS_TEXT_EVENT
),
1095 rangeCount(0), rangeArray(nullptr), isChar(false)
1100 uint32_t rangeCount
;
1101 // Note that the range array may not specify a caret position; in that
1102 // case there will be no range of type NS_TEXTRANGE_CARETPOSITION in the
1104 nsTextRangeArray rangeArray
;
1108 class nsCompositionEvent
: public nsGUIEvent
1111 friend class mozilla::dom::PBrowserParent
;
1112 friend class mozilla::dom::PBrowserChild
;
1114 nsCompositionEvent()
1122 nsCompositionEvent(bool isTrusted
, uint32_t msg
, nsIWidget
*w
)
1123 : nsGUIEvent(isTrusted
, msg
, w
, NS_COMPOSITION_EVENT
)
1125 // XXX compositionstart is cancelable in draft of DOM3 Events.
1126 // However, it doesn't make sense for us, we cannot cancel composition
1127 // when we send compositionstart event.
1128 flags
|= NS_EVENT_FLAG_CANT_CANCEL
;
1135 * nsMouseScrollEvent is used for legacy DOM mouse scroll events, i.e.,
1136 * DOMMouseScroll and MozMousePixelScroll event. These events are NOT hanbled
1137 * by ESM even if widget dispatches them. Use new widget::WheelEvent instead.
1140 class nsMouseScrollEvent
: public nsMouseEvent_base
1143 nsMouseScrollEvent()
1148 nsMouseScrollEvent(bool isTrusted
, uint32_t msg
, nsIWidget
*w
)
1149 : nsMouseEvent_base(isTrusted
, msg
, w
, NS_MOUSE_SCROLL_EVENT
),
1150 delta(0), isHorizontal(false)
1159 * WheelEvent is used only for DOM Level 3 WheelEvent (dom::DOMWheelEvent).
1165 class WheelEvent
: public nsMouseEvent_base
1168 friend class mozilla::dom::PBrowserParent
;
1169 friend class mozilla::dom::PBrowserChild
;
1176 WheelEvent(bool aIsTrusted
, uint32_t aMessage
, nsIWidget
* aWidget
) :
1177 nsMouseEvent_base(aIsTrusted
, aMessage
, aWidget
, NS_WHEEL_EVENT
),
1178 deltaX(0.0), deltaY(0.0), deltaZ(0.0),
1179 deltaMode(nsIDOMWheelEvent::DOM_DELTA_PIXEL
),
1180 customizedByUserPrefs(false), isMomentum(false), isPixelOnlyDevice(false),
1181 lineOrPageDeltaX(0), lineOrPageDeltaY(0), scrollType(SCROLL_DEFAULT
),
1182 overflowDeltaX(0.0), overflowDeltaY(0.0)
1186 // NOTE: deltaX, deltaY and deltaZ may be customized by
1187 // mousewheel.*.delta_multiplier_* prefs which are applied by
1188 // nsEventStateManager. So, after widget dispatches this event,
1189 // these delta values may have different values than before.
1194 // Should be one of nsIDOMWheelEvent::DOM_DELTA_*
1197 // Following members are for internal use only, not for DOM event.
1199 // If the delta values are computed from prefs, this value is true.
1200 // Otherwise, i.e., they are computed from native events, false.
1201 bool customizedByUserPrefs
;
1203 // true if the event is caused by momentum.
1206 // If device event handlers don't know when they should set lineOrPageDeltaX
1207 // and lineOrPageDeltaY, this is true. Otherwise, false.
1208 // If isPixelOnlyDevice is true, ESM will generate NS_MOUSE_SCROLL events
1209 // when accumulated pixel delta values reach a line height.
1210 bool isPixelOnlyDevice
;
1212 // If widget sets lineOrPageDelta, nsEventStateManager will dispatch
1213 // NS_MOUSE_SCROLL event for compatibility. Note that the delta value means
1214 // pages if the deltaMode is DOM_DELTA_PAGE, otherwise, lines.
1215 int32_t lineOrPageDeltaX
;
1216 int32_t lineOrPageDeltaY
;
1218 // When the default action for an wheel event is moving history or zooming,
1219 // need to chose a delta value for doing it.
1220 int32_t GetPreferredIntDelta()
1222 if (!lineOrPageDeltaX
&& !lineOrPageDeltaY
) {
1225 if (lineOrPageDeltaY
&& !lineOrPageDeltaX
) {
1226 return lineOrPageDeltaY
;
1228 if (lineOrPageDeltaX
&& !lineOrPageDeltaY
) {
1229 return lineOrPageDeltaX
;
1231 if ((lineOrPageDeltaX
< 0 && lineOrPageDeltaY
> 0) ||
1232 (lineOrPageDeltaX
> 0 && lineOrPageDeltaY
< 0)) {
1233 return 0; // We cannot guess the answer in this case.
1235 return (NS_ABS(lineOrPageDeltaX
) > NS_ABS(lineOrPageDeltaY
)) ?
1236 lineOrPageDeltaX
: lineOrPageDeltaY
;
1240 // The default value is SCROLL_DEFAULT, which means nsEventStateManager will
1241 // select preferred scroll type automatically.
1244 SCROLL_SYNCHRONOUSLY
,
1245 SCROLL_ASYNCHRONOUSELY
,
1248 ScrollType scrollType
;
1250 // overflowed delta values for scroll, these values are set by
1251 // nsEventStateManger. If the default action of the wheel event isn't scroll,
1252 // these values always zero. Otherwise, remaning delta values which are
1253 // not used by scroll are set.
1254 // NOTE: deltaX, deltaY and deltaZ may be modified by nsEventStateManager.
1255 // However, overflowDeltaX and overflowDeltaY indicate unused original
1256 // delta values which are not applied the delta_multiplier prefs.
1257 // So, if widget wanted to know the actual direction to be scrolled,
1258 // it would need to check the deltaX and deltaY.
1259 double overflowDeltaX
;
1260 double overflowDeltaY
;
1263 } // namespace widget
1264 } // namespace mozilla
1267 * Gesture Notify Event:
1269 * This event is the first event generated when the user touches
1270 * the screen with a finger, and it's meant to decide what kind
1271 * of action we'll use for that touch interaction.
1273 * The event is dispatched to the layout and based on what is underneath
1274 * the initial contact point it's then decided if we should pan
1275 * (finger scrolling) or drag the target element.
1277 class nsGestureNotifyEvent
: public nsGUIEvent
1280 enum ePanDirection
{
1287 ePanDirection panDirection
;
1288 bool displayPanFeedback
;
1290 nsGestureNotifyEvent(bool aIsTrusted
, uint32_t aMsg
, nsIWidget
*aWidget
):
1291 nsGUIEvent(aIsTrusted
, aMsg
, aWidget
, NS_GESTURENOTIFY_EVENT
),
1292 panDirection(ePanNone
),
1293 displayPanFeedback(false)
1298 class nsQueryContentEvent
: public nsGUIEvent
1301 friend class mozilla::dom::PBrowserParent
;
1302 friend class mozilla::dom::PBrowserChild
;
1304 nsQueryContentEvent()
1306 mReply
.mContentsRoot
= nullptr;
1307 mReply
.mFocusedWidget
= nullptr;
1311 nsQueryContentEvent(bool aIsTrusted
, uint32_t aMsg
, nsIWidget
*aWidget
) :
1312 nsGUIEvent(aIsTrusted
, aMsg
, aWidget
, NS_QUERY_CONTENT_EVENT
),
1313 mSucceeded(false), mWasAsync(false)
1317 void InitForQueryTextContent(uint32_t aOffset
, uint32_t aLength
)
1319 NS_ASSERTION(message
== NS_QUERY_TEXT_CONTENT
,
1320 "wrong initializer is called");
1321 mInput
.mOffset
= aOffset
;
1322 mInput
.mLength
= aLength
;
1325 void InitForQueryCaretRect(uint32_t aOffset
)
1327 NS_ASSERTION(message
== NS_QUERY_CARET_RECT
,
1328 "wrong initializer is called");
1329 mInput
.mOffset
= aOffset
;
1332 void InitForQueryTextRect(uint32_t aOffset
, uint32_t aLength
)
1334 NS_ASSERTION(message
== NS_QUERY_TEXT_RECT
,
1335 "wrong initializer is called");
1336 mInput
.mOffset
= aOffset
;
1337 mInput
.mLength
= aLength
;
1340 void InitForQueryDOMWidgetHittest(nsIntPoint
& aPoint
)
1342 NS_ASSERTION(message
== NS_QUERY_DOM_WIDGET_HITTEST
,
1343 "wrong initializer is called");
1347 uint32_t GetSelectionStart(void) const
1349 NS_ASSERTION(message
== NS_QUERY_SELECTED_TEXT
,
1350 "not querying selection");
1351 return mReply
.mOffset
+ (mReply
.mReversed
? mReply
.mString
.Length() : 0);
1354 uint32_t GetSelectionEnd(void) const
1356 NS_ASSERTION(message
== NS_QUERY_SELECTED_TEXT
,
1357 "not querying selection");
1358 return mReply
.mOffset
+ (mReply
.mReversed
? 0 : mReply
.mString
.Length());
1368 void* mContentsRoot
;
1371 nsIntRect mRect
; // Finally, the coordinates is system coordinates.
1372 // The return widget has the caret. This is set at all query events.
1373 nsIWidget
* mFocusedWidget
;
1374 bool mReversed
; // true if selection is reversed (end < start)
1375 bool mHasSelection
; // true if the selection exists
1376 bool mWidgetIsHit
; // true if DOM element under mouse belongs to widget
1377 // used by NS_QUERY_SELECTION_AS_TRANSFERABLE
1378 nsCOMPtr
<nsITransferable
> mTransferable
;
1382 NOT_FOUND
= UINT32_MAX
1385 // values of mComputedScrollAction
1393 class nsFocusEvent
: public nsEvent
1396 nsFocusEvent(bool isTrusted
, uint32_t msg
)
1397 : nsEvent(isTrusted
, msg
, NS_FOCUS_EVENT
),
1407 class nsSelectionEvent
: public nsGUIEvent
1410 friend class mozilla::dom::PBrowserParent
;
1411 friend class mozilla::dom::PBrowserChild
;
1421 nsSelectionEvent(bool aIsTrusted
, uint32_t aMsg
, nsIWidget
*aWidget
) :
1422 nsGUIEvent(aIsTrusted
, aMsg
, aWidget
, NS_SELECTION_EVENT
),
1423 mExpandToClusterBoundary(true), mSucceeded(false)
1427 uint32_t mOffset
; // start offset of selection
1428 uint32_t mLength
; // length of selection
1429 bool mReversed
; // selection "anchor" should be in front
1430 bool mExpandToClusterBoundary
; // cluster-based or character-based
1434 class nsContentCommandEvent
: public nsGUIEvent
1437 nsContentCommandEvent(bool aIsTrusted
, uint32_t aMsg
, nsIWidget
*aWidget
,
1438 bool aOnlyEnabledCheck
= false) :
1439 nsGUIEvent(aIsTrusted
, aMsg
, aWidget
, NS_CONTENT_COMMAND_EVENT
),
1440 mOnlyEnabledCheck(bool(aOnlyEnabledCheck
)),
1441 mSucceeded(false), mIsEnabled(false)
1445 // NS_CONTENT_COMMAND_PASTE_TRANSFERABLE
1446 nsCOMPtr
<nsITransferable
> mTransferable
; // [in]
1448 // NS_CONTENT_COMMAND_SCROLL
1449 // for mScroll.mUnit
1451 eCmdScrollUnit_Line
,
1452 eCmdScrollUnit_Page
,
1453 eCmdScrollUnit_Whole
1458 mAmount(0), mUnit(eCmdScrollUnit_Line
), mIsHorizontal(false)
1462 int32_t mAmount
; // [in]
1463 uint8_t mUnit
; // [in]
1464 bool mIsHorizontal
; // [in]
1467 bool mOnlyEnabledCheck
; // [in]
1469 bool mSucceeded
; // [out]
1470 bool mIsEnabled
; // [out]
1473 class nsTouchEvent
: public nsInputEvent
1479 nsTouchEvent(bool isTrusted
, nsTouchEvent
*aEvent
)
1480 : nsInputEvent(isTrusted
,
1485 modifiers
= aEvent
->modifiers
;
1486 time
= aEvent
->time
;
1487 touches
.AppendElements(aEvent
->touches
);
1488 MOZ_COUNT_CTOR(nsTouchEvent
);
1490 nsTouchEvent(bool isTrusted
, uint32_t msg
, nsIWidget
* w
)
1491 : nsInputEvent(isTrusted
, msg
, w
, NS_TOUCH_EVENT
)
1493 MOZ_COUNT_CTOR(nsTouchEvent
);
1497 MOZ_COUNT_DTOR(nsTouchEvent
);
1500 nsTArray
<nsCOMPtr
<nsIDOMTouch
> > touches
;
1506 * We hold the originating form control for form submit and reset events.
1507 * originator is a weak pointer (does not hold a strong reference).
1510 class nsFormEvent
: public nsEvent
1513 nsFormEvent(bool isTrusted
, uint32_t msg
)
1514 : nsEvent(isTrusted
, msg
, NS_FORM_EVENT
),
1519 nsIContent
*originator
;
1525 * Custom commands for example from the operating system.
1528 class nsCommandEvent
: public nsGUIEvent
1531 nsCommandEvent(bool isTrusted
, nsIAtom
* aEventType
,
1532 nsIAtom
* aCommand
, nsIWidget
* w
)
1533 : nsGUIEvent(isTrusted
, NS_USER_DEFINED_EVENT
, w
, NS_COMMAND_EVENT
)
1535 userType
= aEventType
;
1539 nsCOMPtr
<nsIAtom
> command
;
1545 class nsUIEvent
: public nsEvent
1548 nsUIEvent(bool isTrusted
, uint32_t msg
, int32_t d
)
1549 : nsEvent(isTrusted
, msg
, NS_UI_EVENT
),
1558 * Simple gesture event
1560 class nsSimpleGestureEvent
: public nsMouseEvent_base
1563 nsSimpleGestureEvent(bool isTrusted
, uint32_t msg
, nsIWidget
* w
,
1564 uint32_t directionArg
, double deltaArg
)
1565 : nsMouseEvent_base(isTrusted
, msg
, w
, NS_SIMPLE_GESTURE_EVENT
),
1566 direction(directionArg
), delta(deltaArg
), clickCount(0)
1570 nsSimpleGestureEvent(const nsSimpleGestureEvent
& other
)
1571 : nsMouseEvent_base((other
.flags
& NS_EVENT_FLAG_TRUSTED
) != 0,
1572 other
.message
, other
.widget
, NS_SIMPLE_GESTURE_EVENT
),
1573 direction(other
.direction
), delta(other
.delta
), clickCount(0)
1577 uint32_t direction
; // See nsIDOMSimpleGestureEvent for values
1578 double delta
; // Delta for magnify and rotate events
1579 uint32_t clickCount
; // The number of taps for tap events
1582 class nsTransitionEvent
: public nsEvent
1585 nsTransitionEvent(bool isTrusted
, uint32_t msg
,
1586 const nsString
&propertyNameArg
, float elapsedTimeArg
)
1587 : nsEvent(isTrusted
, msg
, NS_TRANSITION_EVENT
),
1588 propertyName(propertyNameArg
), elapsedTime(elapsedTimeArg
)
1592 nsString propertyName
;
1596 class nsAnimationEvent
: public nsEvent
1599 nsAnimationEvent(bool isTrusted
, uint32_t msg
,
1600 const nsString
&animationNameArg
, float elapsedTimeArg
)
1601 : nsEvent(isTrusted
, msg
, NS_ANIMATION_EVENT
),
1602 animationName(animationNameArg
), elapsedTime(elapsedTimeArg
)
1606 nsString animationName
;
1611 * Native event pluginEvent for plugins.
1614 class nsPluginEvent
: public nsGUIEvent
1617 nsPluginEvent(bool isTrusted
, uint32_t msg
, nsIWidget
*w
)
1618 : nsGUIEvent(isTrusted
, msg
, w
, NS_PLUGIN_EVENT
),
1619 retargetToFocusedDocument(false)
1623 // If TRUE, this event needs to be retargeted to focused document.
1624 // Otherwise, never retargeted.
1625 // Defaults to false.
1626 bool retargetToFocusedDocument
;
1630 * Event status for D&D Event
1632 enum nsDragDropEventStatus
{
1633 /// The event is a enter
1634 nsDragDropEventStatus_eDragEntered
,
1635 /// The event is exit
1636 nsDragDropEventStatus_eDragExited
,
1637 /// The event is drop
1638 nsDragDropEventStatus_eDrop
1641 #define NS_IS_INPUT_EVENT(evnt) \
1642 (((evnt)->eventStructType == NS_INPUT_EVENT) || \
1643 ((evnt)->eventStructType == NS_MOUSE_EVENT) || \
1644 ((evnt)->eventStructType == NS_KEY_EVENT) || \
1645 ((evnt)->eventStructType == NS_TEXT_EVENT) || \
1646 ((evnt)->eventStructType == NS_TOUCH_EVENT) || \
1647 ((evnt)->eventStructType == NS_DRAG_EVENT) || \
1648 ((evnt)->eventStructType == NS_MOUSE_SCROLL_EVENT) || \
1649 ((evnt)->eventStructType == NS_SIMPLE_GESTURE_EVENT))
1651 #define NS_IS_MOUSE_EVENT(evnt) \
1652 (((evnt)->message == NS_MOUSE_BUTTON_DOWN) || \
1653 ((evnt)->message == NS_MOUSE_BUTTON_UP) || \
1654 ((evnt)->message == NS_MOUSE_CLICK) || \
1655 ((evnt)->message == NS_MOUSE_DOUBLECLICK) || \
1656 ((evnt)->message == NS_MOUSE_ENTER) || \
1657 ((evnt)->message == NS_MOUSE_EXIT) || \
1658 ((evnt)->message == NS_MOUSE_ACTIVATE) || \
1659 ((evnt)->message == NS_MOUSE_ENTER_SYNTH) || \
1660 ((evnt)->message == NS_MOUSE_EXIT_SYNTH) || \
1661 ((evnt)->message == NS_MOUSE_MOZHITTEST) || \
1662 ((evnt)->message == NS_MOUSE_MOVE))
1664 #define NS_IS_MOUSE_EVENT_STRUCT(evnt) \
1665 ((evnt)->eventStructType == NS_MOUSE_EVENT || \
1666 (evnt)->eventStructType == NS_DRAG_EVENT)
1668 #define NS_IS_MOUSE_LEFT_CLICK(evnt) \
1669 ((evnt)->eventStructType == NS_MOUSE_EVENT && \
1670 (evnt)->message == NS_MOUSE_CLICK && \
1671 static_cast<nsMouseEvent*>((evnt))->button == nsMouseEvent::eLeftButton)
1673 #define NS_IS_CONTEXT_MENU_KEY(evnt) \
1674 ((evnt)->eventStructType == NS_MOUSE_EVENT && \
1675 (evnt)->message == NS_CONTEXTMENU && \
1676 static_cast<nsMouseEvent*>((evnt))->context == nsMouseEvent::eContextMenuKey)
1678 #define NS_IS_DRAG_EVENT(evnt) \
1679 (((evnt)->message == NS_DRAGDROP_ENTER) || \
1680 ((evnt)->message == NS_DRAGDROP_OVER) || \
1681 ((evnt)->message == NS_DRAGDROP_EXIT) || \
1682 ((evnt)->message == NS_DRAGDROP_DRAGDROP) || \
1683 ((evnt)->message == NS_DRAGDROP_GESTURE) || \
1684 ((evnt)->message == NS_DRAGDROP_DRAG) || \
1685 ((evnt)->message == NS_DRAGDROP_END) || \
1686 ((evnt)->message == NS_DRAGDROP_START) || \
1687 ((evnt)->message == NS_DRAGDROP_DROP) || \
1688 ((evnt)->message == NS_DRAGDROP_LEAVE_SYNTH))
1690 #define NS_IS_KEY_EVENT(evnt) \
1691 (((evnt)->message == NS_KEY_DOWN) || \
1692 ((evnt)->message == NS_KEY_PRESS) || \
1693 ((evnt)->message == NS_KEY_UP))
1695 #define NS_IS_IME_EVENT(evnt) \
1696 (((evnt)->message == NS_TEXT_TEXT) || \
1697 ((evnt)->message == NS_COMPOSITION_START) || \
1698 ((evnt)->message == NS_COMPOSITION_END) || \
1699 ((evnt)->message == NS_COMPOSITION_UPDATE))
1701 #define NS_IS_ACTIVATION_EVENT(evnt) \
1702 (((evnt)->message == NS_PLUGIN_ACTIVATE) || \
1703 ((evnt)->message == NS_PLUGIN_FOCUS))
1705 #define NS_IS_QUERY_CONTENT_EVENT(evnt) \
1706 ((evnt)->eventStructType == NS_QUERY_CONTENT_EVENT)
1708 #define NS_IS_SELECTION_EVENT(evnt) \
1709 (((evnt)->message == NS_SELECTION_SET))
1711 #define NS_IS_CONTENT_COMMAND_EVENT(evnt) \
1712 ((evnt)->eventStructType == NS_CONTENT_COMMAND_EVENT)
1714 #define NS_IS_PLUGIN_EVENT(evnt) \
1715 (((evnt)->message == NS_PLUGIN_INPUT_EVENT) || \
1716 ((evnt)->message == NS_PLUGIN_FOCUS_EVENT))
1718 #define NS_IS_RETARGETED_PLUGIN_EVENT(evnt) \
1719 (NS_IS_PLUGIN_EVENT(evnt) && \
1720 (static_cast<nsPluginEvent*>(evnt)->retargetToFocusedDocument))
1722 #define NS_IS_NON_RETARGETED_PLUGIN_EVENT(evnt) \
1723 (NS_IS_PLUGIN_EVENT(evnt) && \
1724 !(static_cast<nsPluginEvent*>(evnt)->retargetToFocusedDocument))
1726 #define NS_IS_TRUSTED_EVENT(event) \
1727 (((event)->flags & NS_EVENT_FLAG_TRUSTED) != 0)
1729 // Mark an event as being dispatching.
1730 #define NS_MARK_EVENT_DISPATCH_STARTED(event) \
1731 (event)->flags |= NS_EVENT_FLAG_DISPATCHING;
1733 #define NS_IS_EVENT_IN_DISPATCH(event) \
1734 (((event)->flags & NS_EVENT_FLAG_DISPATCHING) != 0)
1736 // Mark an event as being done dispatching.
1737 #define NS_MARK_EVENT_DISPATCH_DONE(event) \
1738 NS_ASSERTION(NS_IS_EVENT_IN_DISPATCH(event), \
1739 "Event never got marked for dispatch!"); \
1740 (event)->flags &= ~NS_EVENT_FLAG_DISPATCHING; \
1741 (event)->flags |= NS_EVENT_DISPATCHED;
1743 // Be aware the query content events and the selection events are a part of IME
1744 // processing. So, you shouldn't use NS_IS_IME_EVENT macro directly in most
1745 // cases, you should use NS_IS_IME_RELATED_EVENT instead.
1746 #define NS_IS_IME_RELATED_EVENT(evnt) \
1747 (NS_IS_IME_EVENT(evnt) || \
1748 NS_IS_QUERY_CONTENT_EVENT(evnt) || \
1749 NS_IS_SELECTION_EVENT(evnt))
1752 * Virtual key bindings for keyboard events.
1753 * These come from nsIDOMKeyEvent.h, which is generated from MouseKeyEvent.idl.
1754 * Really, it would be better if we phased out the NS_VK symbols altogether
1755 * in favor of the DOM ones, but at least this way they'll be in sync.
1759 #define NS_DEFINE_VK(aDOMKeyName, aDOMKeyCode) NS_##aDOMKeyName = aDOMKeyCode
1760 #include "nsVKList.h"
1764 // IME Constants -- keep in synch with nsIPrivateTextRange.h
1765 #define NS_TEXTRANGE_CARETPOSITION 0x01
1766 #define NS_TEXTRANGE_RAWINPUT 0x02
1767 #define NS_TEXTRANGE_SELECTEDRAWTEXT 0x03
1768 #define NS_TEXTRANGE_CONVERTEDTEXT 0x04
1769 #define NS_TEXTRANGE_SELECTEDCONVERTEDTEXT 0x05
1772 * Whether the event should be handled by the frame of the mouse cursor
1773 * position or not. When it should be handled there (e.g., the mouse events),
1774 * this returns TRUE.
1776 inline bool NS_IsEventUsingCoordinates(nsEvent
* aEvent
)
1778 return !NS_IS_KEY_EVENT(aEvent
) && !NS_IS_IME_RELATED_EVENT(aEvent
) &&
1779 !NS_IS_CONTEXT_MENU_KEY(aEvent
) && !NS_IS_ACTIVATION_EVENT(aEvent
) &&
1780 !NS_IS_PLUGIN_EVENT(aEvent
) &&
1781 !NS_IS_CONTENT_COMMAND_EVENT(aEvent
);
1785 * Whether the event should be handled by the focused DOM window in the
1786 * same top level window's or not. E.g., key events, IME related events
1787 * (including the query content events, they are used in IME transaction)
1788 * should be handled by the (last) focused window rather than the dispatched
1791 * NOTE: Even if this returns TRUE, the event isn't going to be handled by the
1792 * application level active DOM window which is on another top level window.
1793 * So, when the event is fired on a deactive window, the event is going to be
1794 * handled by the last focused DOM window in the last focused window.
1796 inline bool NS_IsEventTargetedAtFocusedWindow(nsEvent
* aEvent
)
1798 return NS_IS_KEY_EVENT(aEvent
) || NS_IS_IME_RELATED_EVENT(aEvent
) ||
1799 NS_IS_CONTEXT_MENU_KEY(aEvent
) ||
1800 NS_IS_CONTENT_COMMAND_EVENT(aEvent
) ||
1801 NS_IS_RETARGETED_PLUGIN_EVENT(aEvent
);
1805 * Whether the event should be handled by the focused content or not. E.g.,
1806 * key events, IME related events and other input events which are not handled
1807 * by the frame of the mouse cursor position.
1809 * NOTE: Even if this returns TRUE, the event isn't going to be handled by the
1810 * application level active DOM window which is on another top level window.
1811 * So, when the event is fired on a deactive window, the event is going to be
1812 * handled by the last focused DOM element of the last focused DOM window in
1813 * the last focused window.
1815 inline bool NS_IsEventTargetedAtFocusedContent(nsEvent
* aEvent
)
1817 return NS_IS_KEY_EVENT(aEvent
) || NS_IS_IME_RELATED_EVENT(aEvent
) ||
1818 NS_IS_CONTEXT_MENU_KEY(aEvent
) ||
1819 NS_IS_RETARGETED_PLUGIN_EVENT(aEvent
);
1823 * Whether the event should cause a DOM event.
1825 inline bool NS_IsAllowedToDispatchDOMEvent(nsEvent
* aEvent
)
1827 switch (aEvent
->eventStructType
) {
1828 case NS_MOUSE_EVENT
:
1829 // We want synthesized mouse moves to cause mouseover and mouseout
1830 // DOM events (nsEventStateManager::PreHandleEvent), but not mousemove
1832 // Synthesized button up events also do not cause DOM events because they
1833 // do not have a reliable refPoint.
1834 return static_cast<nsMouseEvent
*>(aEvent
)->reason
== nsMouseEvent::eReal
;
1836 case NS_WHEEL_EVENT
: {
1837 // wheel event whose all delta values are zero by user pref applied, it
1838 // shouldn't cause a DOM event.
1839 mozilla::widget::WheelEvent
* wheelEvent
=
1840 static_cast<mozilla::widget::WheelEvent
*>(aEvent
);
1841 return wheelEvent
->deltaX
!= 0.0 || wheelEvent
->deltaY
!= 0.0 ||
1842 wheelEvent
->deltaZ
!= 0.0;
1850 #endif // nsGUIEvent_h__