mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
2095 lines
66 KiB
C++
2095 lines
66 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef nsGUIEvent_h__
|
|
#define nsGUIEvent_h__
|
|
|
|
#include "mozilla/MathAlgorithms.h"
|
|
|
|
#include "nsPoint.h"
|
|
#include "nsRect.h"
|
|
#include "nsEvent.h"
|
|
#include "nsStringGlue.h"
|
|
#include "nsCOMPtr.h"
|
|
#include "nsIAtom.h"
|
|
#include "nsIDOMKeyEvent.h"
|
|
#include "nsIDOMMouseEvent.h"
|
|
#include "nsIDOMWheelEvent.h"
|
|
#include "nsIDOMDataTransfer.h"
|
|
#include "nsWeakPtr.h"
|
|
#include "nsIWidget.h"
|
|
#include "nsTArray.h"
|
|
#include "nsTraceRefcnt.h"
|
|
#include "nsITransferable.h"
|
|
#include "nsStyleConsts.h"
|
|
#include "nsAutoPtr.h"
|
|
#include "mozilla/dom/EventTarget.h"
|
|
#include "mozilla/dom/Touch.h"
|
|
#include "Units.h"
|
|
|
|
namespace mozilla {
|
|
namespace dom {
|
|
class PBrowserParent;
|
|
class PBrowserChild;
|
|
}
|
|
namespace plugins {
|
|
class PPluginInstanceChild;
|
|
}
|
|
}
|
|
|
|
class nsRenderingContext;
|
|
class nsIMenuItem;
|
|
class nsIContent;
|
|
class nsIURI;
|
|
class nsHashKey;
|
|
|
|
/**
|
|
* Event Struct Types
|
|
*/
|
|
enum nsEventStructType {
|
|
// Generic events
|
|
NS_EVENT, // nsEvent
|
|
NS_GUI_EVENT, // nsGUIEvent
|
|
NS_INPUT_EVENT, // nsInputEvent
|
|
|
|
// Mouse related events
|
|
NS_MOUSE_EVENT, // nsMouseEvent
|
|
NS_MOUSE_SCROLL_EVENT, // nsMouseScrollEvent
|
|
NS_DRAG_EVENT, // nsDragEvent
|
|
NS_WHEEL_EVENT, // widget::WheelEvent
|
|
|
|
// Touchpad related events
|
|
NS_GESTURENOTIFY_EVENT, // nsGestureNotifyEvent
|
|
NS_SIMPLE_GESTURE_EVENT, // nsSimpleGestureEvent
|
|
NS_TOUCH_EVENT, // nsTouchEvent
|
|
|
|
// Key or IME events
|
|
NS_KEY_EVENT, // nsKeyEvent
|
|
NS_COMPOSITION_EVENT, // nsCompositionEvent
|
|
NS_TEXT_EVENT, // nsTextEvent
|
|
|
|
// IME related events
|
|
NS_QUERY_CONTENT_EVENT, // nsQueryContentEvent
|
|
NS_SELECTION_EVENT, // nsSelectionEvent
|
|
|
|
// Scroll related events
|
|
NS_SCROLLBAR_EVENT, // nsScrollbarEvent
|
|
NS_SCROLLPORT_EVENT, // nsScrollPortEvent
|
|
NS_SCROLLAREA_EVENT, // nsScrollAreaEvent
|
|
|
|
// DOM events
|
|
NS_UI_EVENT, // nsUIEvent
|
|
NS_SCRIPT_ERROR_EVENT, // nsScriptErrorEvent
|
|
NS_MUTATION_EVENT, // nsMutationEvent
|
|
NS_FORM_EVENT, // nsFormEvent
|
|
NS_FOCUS_EVENT, // nsFocusEvent
|
|
NS_CLIPBOARD_EVENT, // nsClipboardEvent
|
|
|
|
// SVG events
|
|
NS_SVGZOOM_EVENT, // nsGUIEvent
|
|
NS_SMIL_TIME_EVENT, // nsUIEvent
|
|
|
|
// CSS events
|
|
NS_TRANSITION_EVENT, // nsTransitionEvent
|
|
NS_ANIMATION_EVENT, // nsAnimationEvent
|
|
|
|
// Command events
|
|
NS_COMMAND_EVENT, // nsCommandEvent
|
|
NS_CONTENT_COMMAND_EVENT, // nsContentCommandEvent
|
|
|
|
// Plugin event
|
|
NS_PLUGIN_EVENT // nsPluginEvent
|
|
};
|
|
|
|
#define NS_EVENT_TYPE_NULL 0
|
|
#define NS_EVENT_TYPE_ALL 1 // Not a real event type
|
|
|
|
/**
|
|
* GUI MESSAGES
|
|
*/
|
|
//@{
|
|
#define NS_EVENT_NULL 0
|
|
|
|
|
|
#define NS_WINDOW_START 100
|
|
|
|
// Widget may be destroyed
|
|
#define NS_XUL_CLOSE (NS_WINDOW_START + 1)
|
|
// Key is pressed within a window
|
|
#define NS_KEY_PRESS (NS_WINDOW_START + 31)
|
|
// Key is released within a window
|
|
#define NS_KEY_UP (NS_WINDOW_START + 32)
|
|
// Key is pressed within a window
|
|
#define NS_KEY_DOWN (NS_WINDOW_START + 33)
|
|
|
|
#define NS_RESIZE_EVENT (NS_WINDOW_START + 60)
|
|
#define NS_SCROLL_EVENT (NS_WINDOW_START + 61)
|
|
|
|
// A plugin was clicked or otherwise focused. NS_PLUGIN_ACTIVATE should be
|
|
// used when the window is not active. NS_PLUGIN_FOCUS should be used when
|
|
// the window is active. In the latter case, the dispatcher of the event
|
|
// is expected to ensure that the plugin's widget is focused beforehand.
|
|
#define NS_PLUGIN_ACTIVATE (NS_WINDOW_START + 62)
|
|
#define NS_PLUGIN_FOCUS (NS_WINDOW_START + 63)
|
|
|
|
#define NS_OFFLINE (NS_WINDOW_START + 64)
|
|
#define NS_ONLINE (NS_WINDOW_START + 65)
|
|
|
|
// Indicates a resize will occur
|
|
#define NS_BEFORERESIZE_EVENT (NS_WINDOW_START + 66)
|
|
|
|
// Indicates that the user is either idle or active
|
|
#define NS_MOZ_USER_IDLE (NS_WINDOW_START + 67)
|
|
#define NS_MOZ_USER_ACTIVE (NS_WINDOW_START + 68)
|
|
|
|
// The resolution at which a plugin should draw has changed, for
|
|
// example as the result of changing from a HiDPI mode to a non-
|
|
// HiDPI mode.
|
|
#define NS_PLUGIN_RESOLUTION_CHANGED (NS_WINDOW_START + 69)
|
|
|
|
#define NS_MOUSE_MESSAGE_START 300
|
|
#define NS_MOUSE_MOVE (NS_MOUSE_MESSAGE_START)
|
|
#define NS_MOUSE_BUTTON_UP (NS_MOUSE_MESSAGE_START + 1)
|
|
#define NS_MOUSE_BUTTON_DOWN (NS_MOUSE_MESSAGE_START + 2)
|
|
#define NS_MOUSE_ENTER (NS_MOUSE_MESSAGE_START + 22)
|
|
#define NS_MOUSE_EXIT (NS_MOUSE_MESSAGE_START + 23)
|
|
#define NS_MOUSE_DOUBLECLICK (NS_MOUSE_MESSAGE_START + 24)
|
|
#define NS_MOUSE_CLICK (NS_MOUSE_MESSAGE_START + 27)
|
|
#define NS_MOUSE_ACTIVATE (NS_MOUSE_MESSAGE_START + 30)
|
|
#define NS_MOUSE_ENTER_SYNTH (NS_MOUSE_MESSAGE_START + 31)
|
|
#define NS_MOUSE_EXIT_SYNTH (NS_MOUSE_MESSAGE_START + 32)
|
|
#define NS_MOUSE_MOZHITTEST (NS_MOUSE_MESSAGE_START + 33)
|
|
#define NS_MOUSEENTER (NS_MOUSE_MESSAGE_START + 34)
|
|
#define NS_MOUSELEAVE (NS_MOUSE_MESSAGE_START + 35)
|
|
|
|
#define NS_CONTEXTMENU_MESSAGE_START 500
|
|
#define NS_CONTEXTMENU (NS_CONTEXTMENU_MESSAGE_START)
|
|
|
|
#define NS_STREAM_EVENT_START 1100
|
|
#define NS_LOAD (NS_STREAM_EVENT_START)
|
|
#define NS_PAGE_UNLOAD (NS_STREAM_EVENT_START + 1)
|
|
#define NS_HASHCHANGE (NS_STREAM_EVENT_START + 2)
|
|
#define NS_IMAGE_ABORT (NS_STREAM_EVENT_START + 3)
|
|
#define NS_LOAD_ERROR (NS_STREAM_EVENT_START + 4)
|
|
#define NS_POPSTATE (NS_STREAM_EVENT_START + 5)
|
|
#define NS_BEFORE_PAGE_UNLOAD (NS_STREAM_EVENT_START + 6)
|
|
#define NS_PAGE_RESTORE (NS_STREAM_EVENT_START + 7)
|
|
#define NS_READYSTATECHANGE (NS_STREAM_EVENT_START + 8)
|
|
|
|
#define NS_FORM_EVENT_START 1200
|
|
#define NS_FORM_SUBMIT (NS_FORM_EVENT_START)
|
|
#define NS_FORM_RESET (NS_FORM_EVENT_START + 1)
|
|
#define NS_FORM_CHANGE (NS_FORM_EVENT_START + 2)
|
|
#define NS_FORM_SELECTED (NS_FORM_EVENT_START + 3)
|
|
#define NS_FORM_INPUT (NS_FORM_EVENT_START + 4)
|
|
#define NS_FORM_INVALID (NS_FORM_EVENT_START + 5)
|
|
|
|
//Need separate focus/blur notifications for non-native widgets
|
|
#define NS_FOCUS_EVENT_START 1300
|
|
#define NS_FOCUS_CONTENT (NS_FOCUS_EVENT_START)
|
|
#define NS_BLUR_CONTENT (NS_FOCUS_EVENT_START + 1)
|
|
|
|
#define NS_DRAGDROP_EVENT_START 1400
|
|
#define NS_DRAGDROP_ENTER (NS_DRAGDROP_EVENT_START)
|
|
#define NS_DRAGDROP_OVER (NS_DRAGDROP_EVENT_START + 1)
|
|
#define NS_DRAGDROP_EXIT (NS_DRAGDROP_EVENT_START + 2)
|
|
#define NS_DRAGDROP_DRAGDROP (NS_DRAGDROP_EVENT_START + 3)
|
|
#define NS_DRAGDROP_GESTURE (NS_DRAGDROP_EVENT_START + 4)
|
|
#define NS_DRAGDROP_DRAG (NS_DRAGDROP_EVENT_START + 5)
|
|
#define NS_DRAGDROP_END (NS_DRAGDROP_EVENT_START + 6)
|
|
#define NS_DRAGDROP_START (NS_DRAGDROP_EVENT_START + 7)
|
|
#define NS_DRAGDROP_DROP (NS_DRAGDROP_EVENT_START + 8)
|
|
#define NS_DRAGDROP_OVER_SYNTH (NS_DRAGDROP_EVENT_START + 1)
|
|
#define NS_DRAGDROP_EXIT_SYNTH (NS_DRAGDROP_EVENT_START + 2)
|
|
#define NS_DRAGDROP_LEAVE_SYNTH (NS_DRAGDROP_EVENT_START + 9)
|
|
|
|
// Events for popups
|
|
#define NS_XUL_EVENT_START 1500
|
|
#define NS_XUL_POPUP_SHOWING (NS_XUL_EVENT_START)
|
|
#define NS_XUL_POPUP_SHOWN (NS_XUL_EVENT_START+1)
|
|
#define NS_XUL_POPUP_HIDING (NS_XUL_EVENT_START+2)
|
|
#define NS_XUL_POPUP_HIDDEN (NS_XUL_EVENT_START+3)
|
|
// NS_XUL_COMMAND used to be here (NS_XUL_EVENT_START+4)
|
|
#define NS_XUL_BROADCAST (NS_XUL_EVENT_START+5)
|
|
#define NS_XUL_COMMAND_UPDATE (NS_XUL_EVENT_START+6)
|
|
//@}
|
|
|
|
// Scroll events
|
|
#define NS_MOUSE_SCROLL_START 1600
|
|
#define NS_MOUSE_SCROLL (NS_MOUSE_SCROLL_START)
|
|
#define NS_MOUSE_PIXEL_SCROLL (NS_MOUSE_SCROLL_START + 1)
|
|
|
|
#define NS_SCROLLPORT_START 1700
|
|
#define NS_SCROLLPORT_UNDERFLOW (NS_SCROLLPORT_START)
|
|
#define NS_SCROLLPORT_OVERFLOW (NS_SCROLLPORT_START+1)
|
|
|
|
// Mutation events defined elsewhere starting at 1800
|
|
|
|
#define NS_USER_DEFINED_EVENT 2000
|
|
|
|
// composition events
|
|
#define NS_COMPOSITION_EVENT_START 2200
|
|
#define NS_COMPOSITION_START (NS_COMPOSITION_EVENT_START)
|
|
#define NS_COMPOSITION_END (NS_COMPOSITION_EVENT_START + 1)
|
|
#define NS_COMPOSITION_UPDATE (NS_COMPOSITION_EVENT_START + 2)
|
|
|
|
// text events
|
|
#define NS_TEXT_START 2400
|
|
#define NS_TEXT_TEXT (NS_TEXT_START)
|
|
|
|
// UI events
|
|
#define NS_UI_EVENT_START 2500
|
|
// this is not to be confused with NS_ACTIVATE!
|
|
#define NS_UI_ACTIVATE (NS_UI_EVENT_START)
|
|
#define NS_UI_FOCUSIN (NS_UI_EVENT_START + 1)
|
|
#define NS_UI_FOCUSOUT (NS_UI_EVENT_START + 2)
|
|
|
|
// pagetransition events
|
|
#define NS_PAGETRANSITION_START 2700
|
|
#define NS_PAGE_SHOW (NS_PAGETRANSITION_START + 1)
|
|
#define NS_PAGE_HIDE (NS_PAGETRANSITION_START + 2)
|
|
|
|
// SVG events
|
|
#define NS_SVG_EVENT_START 2800
|
|
#define NS_SVG_LOAD (NS_SVG_EVENT_START)
|
|
#define NS_SVG_UNLOAD (NS_SVG_EVENT_START + 1)
|
|
#define NS_SVG_ABORT (NS_SVG_EVENT_START + 2)
|
|
#define NS_SVG_ERROR (NS_SVG_EVENT_START + 3)
|
|
#define NS_SVG_RESIZE (NS_SVG_EVENT_START + 4)
|
|
#define NS_SVG_SCROLL (NS_SVG_EVENT_START + 5)
|
|
|
|
// SVG Zoom events
|
|
#define NS_SVGZOOM_EVENT_START 2900
|
|
#define NS_SVG_ZOOM (NS_SVGZOOM_EVENT_START)
|
|
|
|
// XUL command events
|
|
#define NS_XULCOMMAND_EVENT_START 3000
|
|
#define NS_XUL_COMMAND (NS_XULCOMMAND_EVENT_START)
|
|
|
|
// Cut, copy, paste events
|
|
#define NS_CUTCOPYPASTE_EVENT_START 3100
|
|
#define NS_COPY (NS_CUTCOPYPASTE_EVENT_START)
|
|
#define NS_CUT (NS_CUTCOPYPASTE_EVENT_START + 1)
|
|
#define NS_PASTE (NS_CUTCOPYPASTE_EVENT_START + 2)
|
|
|
|
// Query the content information
|
|
#define NS_QUERY_CONTENT_EVENT_START 3200
|
|
// Query for the selected text information, it return the selection offset,
|
|
// selection length and selected text.
|
|
#define NS_QUERY_SELECTED_TEXT (NS_QUERY_CONTENT_EVENT_START)
|
|
// Query for the text content of specified range, it returns actual lengh (if
|
|
// the specified range is too long) and the text of the specified range.
|
|
// Returns the entire text if requested length > actual length.
|
|
#define NS_QUERY_TEXT_CONTENT (NS_QUERY_CONTENT_EVENT_START + 1)
|
|
// Query for the caret rect of nth insertion point. The offset of the result is
|
|
// relative position from the top level widget.
|
|
#define NS_QUERY_CARET_RECT (NS_QUERY_CONTENT_EVENT_START + 3)
|
|
// Query for the bounding rect of a range of characters. This works on any
|
|
// valid character range given offset and length. Result is relative to top
|
|
// level widget coordinates
|
|
#define NS_QUERY_TEXT_RECT (NS_QUERY_CONTENT_EVENT_START + 4)
|
|
// Query for the bounding rect of the current focused frame. Result is relative
|
|
// to top level widget coordinates
|
|
#define NS_QUERY_EDITOR_RECT (NS_QUERY_CONTENT_EVENT_START + 5)
|
|
// Query for the current state of the content. The particular members of
|
|
// mReply that are set for each query content event will be valid on success.
|
|
#define NS_QUERY_CONTENT_STATE (NS_QUERY_CONTENT_EVENT_START + 6)
|
|
// Query for the selection in the form of a nsITransferable.
|
|
#define NS_QUERY_SELECTION_AS_TRANSFERABLE (NS_QUERY_CONTENT_EVENT_START + 7)
|
|
// Query for character at a point. This returns the character offset and its
|
|
// rect. The point is specified by nsEvent::refPoint.
|
|
#define NS_QUERY_CHARACTER_AT_POINT (NS_QUERY_CONTENT_EVENT_START + 8)
|
|
// Query if the DOM element under nsEvent::refPoint belongs to our widget
|
|
// or not.
|
|
#define NS_QUERY_DOM_WIDGET_HITTEST (NS_QUERY_CONTENT_EVENT_START + 9)
|
|
|
|
// Video events
|
|
#define NS_MEDIA_EVENT_START 3300
|
|
#define NS_LOADSTART (NS_MEDIA_EVENT_START)
|
|
#define NS_PROGRESS (NS_MEDIA_EVENT_START+1)
|
|
#define NS_SUSPEND (NS_MEDIA_EVENT_START+2)
|
|
#define NS_EMPTIED (NS_MEDIA_EVENT_START+3)
|
|
#define NS_STALLED (NS_MEDIA_EVENT_START+4)
|
|
#define NS_PLAY (NS_MEDIA_EVENT_START+5)
|
|
#define NS_PAUSE (NS_MEDIA_EVENT_START+6)
|
|
#define NS_LOADEDMETADATA (NS_MEDIA_EVENT_START+7)
|
|
#define NS_LOADEDDATA (NS_MEDIA_EVENT_START+8)
|
|
#define NS_WAITING (NS_MEDIA_EVENT_START+9)
|
|
#define NS_PLAYING (NS_MEDIA_EVENT_START+10)
|
|
#define NS_CANPLAY (NS_MEDIA_EVENT_START+11)
|
|
#define NS_CANPLAYTHROUGH (NS_MEDIA_EVENT_START+12)
|
|
#define NS_SEEKING (NS_MEDIA_EVENT_START+13)
|
|
#define NS_SEEKED (NS_MEDIA_EVENT_START+14)
|
|
#define NS_TIMEUPDATE (NS_MEDIA_EVENT_START+15)
|
|
#define NS_ENDED (NS_MEDIA_EVENT_START+16)
|
|
#define NS_RATECHANGE (NS_MEDIA_EVENT_START+17)
|
|
#define NS_DURATIONCHANGE (NS_MEDIA_EVENT_START+18)
|
|
#define NS_VOLUMECHANGE (NS_MEDIA_EVENT_START+19)
|
|
#define NS_MOZAUDIOAVAILABLE (NS_MEDIA_EVENT_START+20)
|
|
|
|
// paint notification events
|
|
#define NS_NOTIFYPAINT_START 3400
|
|
#define NS_AFTERPAINT (NS_NOTIFYPAINT_START)
|
|
|
|
// Simple gesture events
|
|
#define NS_SIMPLE_GESTURE_EVENT_START 3500
|
|
#define NS_SIMPLE_GESTURE_SWIPE_START (NS_SIMPLE_GESTURE_EVENT_START)
|
|
#define NS_SIMPLE_GESTURE_SWIPE_UPDATE (NS_SIMPLE_GESTURE_EVENT_START+1)
|
|
#define NS_SIMPLE_GESTURE_SWIPE_END (NS_SIMPLE_GESTURE_EVENT_START+2)
|
|
#define NS_SIMPLE_GESTURE_SWIPE (NS_SIMPLE_GESTURE_EVENT_START+3)
|
|
#define NS_SIMPLE_GESTURE_MAGNIFY_START (NS_SIMPLE_GESTURE_EVENT_START+4)
|
|
#define NS_SIMPLE_GESTURE_MAGNIFY_UPDATE (NS_SIMPLE_GESTURE_EVENT_START+5)
|
|
#define NS_SIMPLE_GESTURE_MAGNIFY (NS_SIMPLE_GESTURE_EVENT_START+6)
|
|
#define NS_SIMPLE_GESTURE_ROTATE_START (NS_SIMPLE_GESTURE_EVENT_START+7)
|
|
#define NS_SIMPLE_GESTURE_ROTATE_UPDATE (NS_SIMPLE_GESTURE_EVENT_START+8)
|
|
#define NS_SIMPLE_GESTURE_ROTATE (NS_SIMPLE_GESTURE_EVENT_START+9)
|
|
#define NS_SIMPLE_GESTURE_TAP (NS_SIMPLE_GESTURE_EVENT_START+10)
|
|
#define NS_SIMPLE_GESTURE_PRESSTAP (NS_SIMPLE_GESTURE_EVENT_START+11)
|
|
#define NS_SIMPLE_GESTURE_EDGE_STARTED (NS_SIMPLE_GESTURE_EVENT_START+12)
|
|
#define NS_SIMPLE_GESTURE_EDGE_CANCELED (NS_SIMPLE_GESTURE_EVENT_START+13)
|
|
#define NS_SIMPLE_GESTURE_EDGE_COMPLETED (NS_SIMPLE_GESTURE_EVENT_START+14)
|
|
|
|
// These are used to send native events to plugins.
|
|
#define NS_PLUGIN_EVENT_START 3600
|
|
#define NS_PLUGIN_INPUT_EVENT (NS_PLUGIN_EVENT_START)
|
|
#define NS_PLUGIN_FOCUS_EVENT (NS_PLUGIN_EVENT_START+1)
|
|
|
|
// Events to manipulate selection (nsSelectionEvent)
|
|
#define NS_SELECTION_EVENT_START 3700
|
|
// Clear any previous selection and set the given range as the selection
|
|
#define NS_SELECTION_SET (NS_SELECTION_EVENT_START)
|
|
|
|
// Events of commands for the contents
|
|
#define NS_CONTENT_COMMAND_EVENT_START 3800
|
|
#define NS_CONTENT_COMMAND_CUT (NS_CONTENT_COMMAND_EVENT_START)
|
|
#define NS_CONTENT_COMMAND_COPY (NS_CONTENT_COMMAND_EVENT_START+1)
|
|
#define NS_CONTENT_COMMAND_PASTE (NS_CONTENT_COMMAND_EVENT_START+2)
|
|
#define NS_CONTENT_COMMAND_DELETE (NS_CONTENT_COMMAND_EVENT_START+3)
|
|
#define NS_CONTENT_COMMAND_UNDO (NS_CONTENT_COMMAND_EVENT_START+4)
|
|
#define NS_CONTENT_COMMAND_REDO (NS_CONTENT_COMMAND_EVENT_START+5)
|
|
#define NS_CONTENT_COMMAND_PASTE_TRANSFERABLE (NS_CONTENT_COMMAND_EVENT_START+6)
|
|
// NS_CONTENT_COMMAND_SCROLL scrolls the nearest scrollable element to the
|
|
// currently focused content or latest DOM selection. This would normally be
|
|
// the same element scrolled by keyboard scroll commands, except that this event
|
|
// will scroll an element scrollable in either direction. I.e., if the nearest
|
|
// scrollable ancestor element can only be scrolled vertically, and horizontal
|
|
// scrolling is requested using this event, no scrolling will occur.
|
|
#define NS_CONTENT_COMMAND_SCROLL (NS_CONTENT_COMMAND_EVENT_START+7)
|
|
|
|
// Event to gesture notification
|
|
#define NS_GESTURENOTIFY_EVENT_START 3900
|
|
|
|
#define NS_ORIENTATION_EVENT 4000
|
|
|
|
#define NS_SCROLLAREA_EVENT_START 4100
|
|
#define NS_SCROLLEDAREACHANGED (NS_SCROLLAREA_EVENT_START)
|
|
|
|
#define NS_TRANSITION_EVENT_START 4200
|
|
#define NS_TRANSITION_END (NS_TRANSITION_EVENT_START)
|
|
|
|
#define NS_ANIMATION_EVENT_START 4250
|
|
#define NS_ANIMATION_START (NS_ANIMATION_EVENT_START)
|
|
#define NS_ANIMATION_END (NS_ANIMATION_EVENT_START + 1)
|
|
#define NS_ANIMATION_ITERATION (NS_ANIMATION_EVENT_START + 2)
|
|
|
|
#define NS_SMIL_TIME_EVENT_START 4300
|
|
#define NS_SMIL_BEGIN (NS_SMIL_TIME_EVENT_START)
|
|
#define NS_SMIL_END (NS_SMIL_TIME_EVENT_START + 1)
|
|
#define NS_SMIL_REPEAT (NS_SMIL_TIME_EVENT_START + 2)
|
|
|
|
#define NS_WEBAUDIO_EVENT_START 4350
|
|
#define NS_AUDIO_PROCESS (NS_WEBAUDIO_EVENT_START)
|
|
#define NS_AUDIO_COMPLETE (NS_WEBAUDIO_EVENT_START + 1)
|
|
|
|
// script notification events
|
|
#define NS_NOTIFYSCRIPT_START 4500
|
|
#define NS_BEFORE_SCRIPT_EXECUTE (NS_NOTIFYSCRIPT_START)
|
|
#define NS_AFTER_SCRIPT_EXECUTE (NS_NOTIFYSCRIPT_START+1)
|
|
|
|
#define NS_PRINT_EVENT_START 4600
|
|
#define NS_BEFOREPRINT (NS_PRINT_EVENT_START)
|
|
#define NS_AFTERPRINT (NS_PRINT_EVENT_START + 1)
|
|
|
|
#define NS_MESSAGE_EVENT_START 4700
|
|
#define NS_MESSAGE (NS_MESSAGE_EVENT_START)
|
|
|
|
// Open and close events
|
|
#define NS_OPENCLOSE_EVENT_START 4800
|
|
#define NS_OPEN (NS_OPENCLOSE_EVENT_START)
|
|
#define NS_CLOSE (NS_OPENCLOSE_EVENT_START+1)
|
|
|
|
// Device motion and orientation
|
|
#define NS_DEVICE_ORIENTATION_START 4900
|
|
#define NS_DEVICE_ORIENTATION (NS_DEVICE_ORIENTATION_START)
|
|
#define NS_DEVICE_MOTION (NS_DEVICE_ORIENTATION_START+1)
|
|
#define NS_DEVICE_PROXIMITY (NS_DEVICE_ORIENTATION_START+2)
|
|
#define NS_USER_PROXIMITY (NS_DEVICE_ORIENTATION_START+3)
|
|
#define NS_DEVICE_LIGHT (NS_DEVICE_ORIENTATION_START+4)
|
|
|
|
#define NS_SHOW_EVENT 5000
|
|
|
|
// Fullscreen DOM API
|
|
#define NS_FULL_SCREEN_START 5100
|
|
#define NS_FULLSCREENCHANGE (NS_FULL_SCREEN_START)
|
|
#define NS_FULLSCREENERROR (NS_FULL_SCREEN_START + 1)
|
|
|
|
#define NS_TOUCH_EVENT_START 5200
|
|
#define NS_TOUCH_START (NS_TOUCH_EVENT_START)
|
|
#define NS_TOUCH_MOVE (NS_TOUCH_EVENT_START+1)
|
|
#define NS_TOUCH_END (NS_TOUCH_EVENT_START+2)
|
|
#define NS_TOUCH_ENTER (NS_TOUCH_EVENT_START+3)
|
|
#define NS_TOUCH_LEAVE (NS_TOUCH_EVENT_START+4)
|
|
#define NS_TOUCH_CANCEL (NS_TOUCH_EVENT_START+5)
|
|
|
|
// Pointerlock DOM API
|
|
#define NS_POINTERLOCK_START 5300
|
|
#define NS_POINTERLOCKCHANGE (NS_POINTERLOCK_START)
|
|
#define NS_POINTERLOCKERROR (NS_POINTERLOCK_START + 1)
|
|
|
|
#define NS_WHEEL_EVENT_START 5400
|
|
#define NS_WHEEL_WHEEL (NS_WHEEL_EVENT_START)
|
|
|
|
//System time is changed
|
|
#define NS_MOZ_TIME_CHANGE_EVENT 5500
|
|
|
|
// Network packet events.
|
|
#define NS_NETWORK_EVENT_START 5600
|
|
#define NS_NETWORK_UPLOAD_EVENT (NS_NETWORK_EVENT_START + 1)
|
|
#define NS_NETWORK_DOWNLOAD_EVENT (NS_NETWORK_EVENT_START + 2)
|
|
|
|
// MediaRecorder events.
|
|
#define NS_MEDIARECORDER_EVENT_START 5700
|
|
#define NS_MEDIARECORDER_DATAAVAILABLE (NS_MEDIARECORDER_EVENT_START + 1)
|
|
#define NS_MEDIARECORDER_WARNING (NS_MEDIARECORDER_EVENT_START + 2)
|
|
#define NS_MEDIARECORDER_STOP (NS_MEDIARECORDER_EVENT_START + 3)
|
|
|
|
#ifdef MOZ_GAMEPAD
|
|
// Gamepad input events
|
|
#define NS_GAMEPAD_START 6000
|
|
#define NS_GAMEPAD_BUTTONDOWN (NS_GAMEPAD_START)
|
|
#define NS_GAMEPAD_BUTTONUP (NS_GAMEPAD_START+1)
|
|
#define NS_GAMEPAD_AXISMOVE (NS_GAMEPAD_START+2)
|
|
#define NS_GAMEPAD_CONNECTED (NS_GAMEPAD_START+3)
|
|
#define NS_GAMEPAD_DISCONNECTED (NS_GAMEPAD_START+4)
|
|
// Keep this defined to the same value as the event above
|
|
#define NS_GAMEPAD_END (NS_GAMEPAD_START+4)
|
|
#endif
|
|
|
|
/**
|
|
* Return status for event processors, nsEventStatus, is defined in
|
|
* nsEvent.h.
|
|
*/
|
|
|
|
/**
|
|
* different types of (top-level) window z-level positioning
|
|
*/
|
|
enum nsWindowZ {
|
|
nsWindowZTop = 0, // on top
|
|
nsWindowZBottom, // on bottom
|
|
nsWindowZRelative // just below some specified widget
|
|
};
|
|
|
|
namespace mozilla {
|
|
namespace widget {
|
|
|
|
// BaseEventFlags must be a POD struct for safe to use memcpy (including
|
|
// in ParamTraits<BaseEventFlags>). So don't make virtual methods, constructor,
|
|
// destructor and operators.
|
|
// This is necessary for VC which is NOT C++0x compiler.
|
|
struct BaseEventFlags
|
|
{
|
|
public:
|
|
// If mIsTrusted is true, the event is a trusted event. Otherwise, it's
|
|
// an untrusted event.
|
|
bool mIsTrusted : 1;
|
|
// If mInBubblingPhase is true, the event is in bubbling phase or target
|
|
// phase.
|
|
bool mInBubblingPhase : 1;
|
|
// If mInCapturePhase is true, the event is in capture phase or target phase.
|
|
bool mInCapturePhase : 1;
|
|
// If mInSystemGroup is true, the event is being dispatched in system group.
|
|
bool mInSystemGroup: 1;
|
|
// If mCancelable is true, the event can be consumed. I.e., calling
|
|
// nsDOMEvent::PreventDefault() can prevent the default action.
|
|
bool mCancelable : 1;
|
|
// If mBubbles is true, the event can bubble. Otherwise, cannot be handled
|
|
// in bubbling phase.
|
|
bool mBubbles : 1;
|
|
// If mPropagationStopped is true, nsDOMEvent::StopPropagation() or
|
|
// nsDOMEvent::StopImmediatePropagation() has been called.
|
|
bool mPropagationStopped : 1;
|
|
// If mImmediatePropagationStopped is true,
|
|
// nsDOMEvent::StopImmediatePropagation() has been called.
|
|
// Note that mPropagationStopped must be true when this is true.
|
|
bool mImmediatePropagationStopped : 1;
|
|
// If mDefaultPrevented is true, the event has been consumed.
|
|
// E.g., nsDOMEvent::PreventDefault() has been called or
|
|
// the default action has been performed.
|
|
bool mDefaultPrevented : 1;
|
|
// If mDefaultPreventedByContent is true, the event has been
|
|
// consumed by content.
|
|
// Note that mDefaultPrevented must be true when this is true.
|
|
bool mDefaultPreventedByContent : 1;
|
|
// mMultipleActionsPrevented may be used when default handling don't want to
|
|
// be prevented, but only one of the event targets should handle the event.
|
|
// For example, when a <label> element is in another <label> element and
|
|
// the first <label> element is clicked, that one may set this true.
|
|
// Then, the second <label> element won't handle the event.
|
|
bool mMultipleActionsPrevented : 1;
|
|
// If mIsBeingDispatched is true, the DOM event created from the event is
|
|
// dispatching into the DOM tree and not completed.
|
|
bool mIsBeingDispatched : 1;
|
|
// If mDispatchedAtLeastOnce is true, the event has been dispatched
|
|
// as a DOM event and the dispatch has been completed.
|
|
bool mDispatchedAtLeastOnce : 1;
|
|
// If mIsSynthesizedForTests is true, the event has been synthesized for
|
|
// automated tests or something hacky approach of an add-on.
|
|
bool mIsSynthesizedForTests : 1;
|
|
// If mExceptionHasBeenRisen is true, one of the event handlers has risen an
|
|
// exception.
|
|
bool mExceptionHasBeenRisen : 1;
|
|
// If mRetargetToNonNativeAnonymous is true and the target is in a non-native
|
|
// native anonymous subtree, the event target is set to originalTarget.
|
|
bool mRetargetToNonNativeAnonymous : 1;
|
|
// If mNoCrossProcessBoundaryForwarding is true, the event is not allowed to
|
|
// cross process boundary.
|
|
bool mNoCrossProcessBoundaryForwarding : 1;
|
|
// If mNoContentDispatch is true, the event is never dispatched to the
|
|
// event handlers which are added to the contents, onfoo attributes and
|
|
// properties. Note that this flag is ignored when
|
|
// nsEventChainPreVisitor::mForceContentDispatch is set true. For exapmle,
|
|
// window and document object sets it true. Therefore, web applications
|
|
// can handle the event if they add event listeners to the window or the
|
|
// document.
|
|
bool mNoContentDispatch : 1;
|
|
// If mOnlyChromeDispatch is true, the event is dispatched to only chrome.
|
|
bool mOnlyChromeDispatch : 1;
|
|
|
|
// If the event is being handled in target phase, returns true.
|
|
inline bool InTargetPhase() const
|
|
{
|
|
return (mInBubblingPhase && mInCapturePhase);
|
|
}
|
|
|
|
inline void Clear()
|
|
{
|
|
SetRawFlags(0);
|
|
}
|
|
// Get if either the instance's bit or the aOther's bit is true, the
|
|
// instance's bit becomes true. In other words, this works like:
|
|
// eventFlags |= aOther;
|
|
inline void Union(const BaseEventFlags& aOther)
|
|
{
|
|
RawFlags rawFlags = GetRawFlags() | aOther.GetRawFlags();
|
|
SetRawFlags(rawFlags);
|
|
}
|
|
|
|
private:
|
|
typedef uint32_t RawFlags;
|
|
|
|
inline void SetRawFlags(RawFlags aRawFlags)
|
|
{
|
|
static_assert(sizeof(BaseEventFlags) <= sizeof(RawFlags),
|
|
"mozilla::widget::EventFlags must not be bigger than the RawFlags");
|
|
memcpy(this, &aRawFlags, sizeof(BaseEventFlags));
|
|
}
|
|
inline RawFlags GetRawFlags() const
|
|
{
|
|
RawFlags result = 0;
|
|
memcpy(&result, this, sizeof(BaseEventFlags));
|
|
return result;
|
|
}
|
|
};
|
|
|
|
struct EventFlags : public BaseEventFlags
|
|
{
|
|
EventFlags()
|
|
{
|
|
Clear();
|
|
}
|
|
};
|
|
|
|
} // namespace widget
|
|
} // namespace mozilla
|
|
|
|
/**
|
|
* General event
|
|
*/
|
|
|
|
class nsEvent
|
|
{
|
|
protected:
|
|
nsEvent(bool isTrusted, uint32_t msg, nsEventStructType structType)
|
|
: eventStructType(structType),
|
|
message(msg),
|
|
refPoint(0, 0),
|
|
lastRefPoint(0, 0),
|
|
time(0),
|
|
userType(0)
|
|
{
|
|
MOZ_COUNT_CTOR(nsEvent);
|
|
mFlags.Clear();
|
|
mFlags.mIsTrusted = isTrusted;
|
|
mFlags.mCancelable = true;
|
|
mFlags.mBubbles = true;
|
|
}
|
|
|
|
nsEvent()
|
|
{
|
|
MOZ_COUNT_CTOR(nsEvent);
|
|
}
|
|
|
|
public:
|
|
nsEvent(bool isTrusted, uint32_t msg)
|
|
: eventStructType(NS_EVENT),
|
|
message(msg),
|
|
refPoint(0, 0),
|
|
lastRefPoint(0, 0),
|
|
time(0),
|
|
userType(0)
|
|
{
|
|
MOZ_COUNT_CTOR(nsEvent);
|
|
mFlags.Clear();
|
|
mFlags.mIsTrusted = isTrusted;
|
|
mFlags.mCancelable = true;
|
|
mFlags.mBubbles = true;
|
|
}
|
|
|
|
~nsEvent()
|
|
{
|
|
MOZ_COUNT_DTOR(nsEvent);
|
|
}
|
|
|
|
nsEvent(const nsEvent& aOther)
|
|
{
|
|
MOZ_COUNT_CTOR(nsEvent);
|
|
*this = aOther;
|
|
}
|
|
|
|
// See event struct types
|
|
nsEventStructType eventStructType;
|
|
// See GUI MESSAGES,
|
|
uint32_t message;
|
|
// Relative to the widget of the event, or if there is no widget then it is
|
|
// in screen coordinates. Not modified by layout code.
|
|
mozilla::LayoutDeviceIntPoint refPoint;
|
|
// The previous refPoint, if known, used to calculate mouse movement deltas.
|
|
mozilla::LayoutDeviceIntPoint lastRefPoint;
|
|
// Elapsed time, in milliseconds, from a platform-specific zero time
|
|
// to the time the message was created
|
|
uint64_t time;
|
|
// See BaseEventFlags definition for the detail.
|
|
mozilla::widget::BaseEventFlags mFlags;
|
|
|
|
// Additional type info for user defined events
|
|
nsCOMPtr<nsIAtom> userType;
|
|
|
|
nsString typeString; // always set on non-main-thread events
|
|
|
|
// Event targets, needed by DOM Events
|
|
nsCOMPtr<mozilla::dom::EventTarget> target;
|
|
nsCOMPtr<mozilla::dom::EventTarget> currentTarget;
|
|
nsCOMPtr<mozilla::dom::EventTarget> originalTarget;
|
|
|
|
void AssignEventData(const nsEvent& aEvent, bool aCopyTargets)
|
|
{
|
|
// eventStructType, message should be initialized with the constructor.
|
|
refPoint = aEvent.refPoint;
|
|
// lastRefPoint doesn't need to be copied.
|
|
time = aEvent.time;
|
|
// mFlags should be copied manually if it's necessary.
|
|
userType = aEvent.userType;
|
|
// typeString should be copied manually if it's necessary.
|
|
target = aCopyTargets ? aEvent.target : nullptr;
|
|
currentTarget = aCopyTargets ? aEvent.currentTarget : nullptr;
|
|
originalTarget = aCopyTargets ? aEvent.originalTarget : nullptr;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* General graphic user interface event
|
|
*/
|
|
|
|
class nsGUIEvent : public nsEvent
|
|
{
|
|
protected:
|
|
nsGUIEvent(bool isTrusted, uint32_t msg, nsIWidget *w,
|
|
nsEventStructType structType)
|
|
: nsEvent(isTrusted, msg, structType),
|
|
widget(w), pluginEvent(nullptr)
|
|
{
|
|
}
|
|
|
|
nsGUIEvent()
|
|
: pluginEvent(nullptr)
|
|
{
|
|
}
|
|
|
|
public:
|
|
nsGUIEvent(bool isTrusted, uint32_t msg, nsIWidget *w)
|
|
: nsEvent(isTrusted, msg, NS_GUI_EVENT),
|
|
widget(w), pluginEvent(nullptr)
|
|
{
|
|
}
|
|
|
|
/// Originator of the event
|
|
nsCOMPtr<nsIWidget> widget;
|
|
|
|
/// Event for NPAPI plugin
|
|
void* pluginEvent;
|
|
|
|
void AssignGUIEventData(const nsGUIEvent& aEvent, bool aCopyTargets)
|
|
{
|
|
AssignEventData(aEvent, aCopyTargets);
|
|
|
|
// widget should be initialized with the constructor.
|
|
|
|
// pluginEvent shouldn't be copied because it may be referred after its
|
|
// instance is destroyed.
|
|
pluginEvent = nullptr;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Script error event
|
|
*/
|
|
|
|
class nsScriptErrorEvent : public nsEvent
|
|
{
|
|
public:
|
|
nsScriptErrorEvent(bool isTrusted, uint32_t msg)
|
|
: nsEvent(isTrusted, msg, NS_SCRIPT_ERROR_EVENT),
|
|
lineNr(0), errorMsg(nullptr), fileName(nullptr)
|
|
{
|
|
}
|
|
|
|
int32_t lineNr;
|
|
const PRUnichar* errorMsg;
|
|
const PRUnichar* fileName;
|
|
};
|
|
|
|
/**
|
|
* Scrollbar event
|
|
*/
|
|
|
|
class nsScrollbarEvent : public nsGUIEvent
|
|
{
|
|
public:
|
|
nsScrollbarEvent(bool isTrusted, uint32_t msg, nsIWidget *w)
|
|
: nsGUIEvent(isTrusted, msg, w, NS_SCROLLBAR_EVENT),
|
|
position(0)
|
|
{
|
|
}
|
|
|
|
/// ranges between scrollbar 0 and (maxRange - thumbSize). See nsIScrollbar
|
|
uint32_t position;
|
|
};
|
|
|
|
class nsScrollPortEvent : public nsGUIEvent
|
|
{
|
|
public:
|
|
enum orientType {
|
|
vertical = 0,
|
|
horizontal = 1,
|
|
both = 2
|
|
};
|
|
|
|
nsScrollPortEvent(bool isTrusted, uint32_t msg, nsIWidget *w)
|
|
: nsGUIEvent(isTrusted, msg, w, NS_SCROLLPORT_EVENT),
|
|
orient(vertical)
|
|
{
|
|
}
|
|
|
|
orientType orient;
|
|
};
|
|
|
|
class nsScrollAreaEvent : public nsGUIEvent
|
|
{
|
|
public:
|
|
nsScrollAreaEvent(bool isTrusted, uint32_t msg, nsIWidget *w)
|
|
: nsGUIEvent(isTrusted, msg, w, NS_SCROLLAREA_EVENT)
|
|
{
|
|
}
|
|
|
|
nsRect mArea;
|
|
};
|
|
|
|
class nsInputEvent : public nsGUIEvent
|
|
{
|
|
protected:
|
|
nsInputEvent(bool isTrusted, uint32_t msg, nsIWidget *w,
|
|
nsEventStructType structType)
|
|
: nsGUIEvent(isTrusted, msg, w, structType),
|
|
modifiers(0)
|
|
{
|
|
}
|
|
|
|
nsInputEvent()
|
|
{
|
|
}
|
|
|
|
public:
|
|
nsInputEvent(bool isTrusted, uint32_t msg, nsIWidget *w)
|
|
: nsGUIEvent(isTrusted, msg, w, NS_INPUT_EVENT),
|
|
modifiers(0)
|
|
{
|
|
}
|
|
|
|
// true indicates the shift key is down
|
|
bool IsShift() const
|
|
{
|
|
return ((modifiers & mozilla::widget::MODIFIER_SHIFT) != 0);
|
|
}
|
|
// true indicates the control key is down
|
|
bool IsControl() const
|
|
{
|
|
return ((modifiers & mozilla::widget::MODIFIER_CONTROL) != 0);
|
|
}
|
|
// true indicates the alt key is down
|
|
bool IsAlt() const
|
|
{
|
|
return ((modifiers & mozilla::widget::MODIFIER_ALT) != 0);
|
|
}
|
|
// true indicates the meta key is down (or, on Mac, the Command key)
|
|
bool IsMeta() const
|
|
{
|
|
return ((modifiers & mozilla::widget::MODIFIER_META) != 0);
|
|
}
|
|
// true indicates the win key is down on Windows. Or the Super or Hyper key
|
|
// is down on Linux.
|
|
bool IsOS() const
|
|
{
|
|
return ((modifiers & mozilla::widget::MODIFIER_OS) != 0);
|
|
}
|
|
// true indicates the alt graph key is down
|
|
// NOTE: on Mac, the option key press causes both IsAlt() and IsAltGrpah()
|
|
// return true.
|
|
bool IsAltGraph() const
|
|
{
|
|
return ((modifiers & mozilla::widget::MODIFIER_ALTGRAPH) != 0);
|
|
}
|
|
// true indeicates the CapLock LED is turn on.
|
|
bool IsCapsLocked() const
|
|
{
|
|
return ((modifiers & mozilla::widget::MODIFIER_CAPSLOCK) != 0);
|
|
}
|
|
// true indeicates the NumLock LED is turn on.
|
|
bool IsNumLocked() const
|
|
{
|
|
return ((modifiers & mozilla::widget::MODIFIER_NUMLOCK) != 0);
|
|
}
|
|
// true indeicates the ScrollLock LED is turn on.
|
|
bool IsScrollLocked() const
|
|
{
|
|
return ((modifiers & mozilla::widget::MODIFIER_SCROLLLOCK) != 0);
|
|
}
|
|
|
|
// true indeicates the Fn key is down, but this is not supported by native
|
|
// key event on any platform.
|
|
bool IsFn() const
|
|
{
|
|
return ((modifiers & mozilla::widget::MODIFIER_FN) != 0);
|
|
}
|
|
// true indeicates the ScrollLock LED is turn on.
|
|
bool IsSymbolLocked() const
|
|
{
|
|
return ((modifiers & mozilla::widget::MODIFIER_SYMBOLLOCK) != 0);
|
|
}
|
|
|
|
void InitBasicModifiers(bool aCtrlKey,
|
|
bool aAltKey,
|
|
bool aShiftKey,
|
|
bool aMetaKey)
|
|
{
|
|
modifiers = 0;
|
|
if (aCtrlKey) {
|
|
modifiers |= mozilla::widget::MODIFIER_CONTROL;
|
|
}
|
|
if (aAltKey) {
|
|
modifiers |= mozilla::widget::MODIFIER_ALT;
|
|
}
|
|
if (aShiftKey) {
|
|
modifiers |= mozilla::widget::MODIFIER_SHIFT;
|
|
}
|
|
if (aMetaKey) {
|
|
modifiers |= mozilla::widget::MODIFIER_META;
|
|
}
|
|
}
|
|
|
|
mozilla::widget::Modifiers modifiers;
|
|
|
|
void AssignInputEventData(const nsInputEvent& aEvent, bool aCopyTargets)
|
|
{
|
|
AssignGUIEventData(aEvent, aCopyTargets);
|
|
|
|
modifiers = aEvent.modifiers;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Mouse event
|
|
*/
|
|
|
|
class nsMouseEvent_base : public nsInputEvent
|
|
{
|
|
private:
|
|
friend class mozilla::dom::PBrowserParent;
|
|
friend class mozilla::dom::PBrowserChild;
|
|
|
|
public:
|
|
|
|
nsMouseEvent_base()
|
|
{
|
|
}
|
|
|
|
nsMouseEvent_base(bool isTrusted, uint32_t msg, nsIWidget *w,
|
|
nsEventStructType type)
|
|
: nsInputEvent(isTrusted, msg, w, type), button(0), buttons(0),
|
|
pressure(0), inputSource(nsIDOMMouseEvent::MOZ_SOURCE_MOUSE) {}
|
|
|
|
/// The possible related target
|
|
nsCOMPtr<nsISupports> relatedTarget;
|
|
|
|
int16_t button;
|
|
int16_t buttons;
|
|
|
|
// Finger or touch pressure of event
|
|
// ranges between 0.0 and 1.0
|
|
float pressure;
|
|
|
|
// Possible values at nsIDOMMouseEvent
|
|
uint16_t inputSource;
|
|
|
|
void AssignMouseEventBaseData(const nsMouseEvent_base& aEvent,
|
|
bool aCopyTargets)
|
|
{
|
|
AssignInputEventData(aEvent, aCopyTargets);
|
|
|
|
relatedTarget = aCopyTargets ? aEvent.relatedTarget : nullptr;
|
|
button = aEvent.button;
|
|
buttons = aEvent.buttons;
|
|
pressure = aEvent.pressure;
|
|
inputSource = aEvent.inputSource;
|
|
}
|
|
};
|
|
|
|
class nsMouseEvent : public nsMouseEvent_base
|
|
{
|
|
private:
|
|
friend class mozilla::dom::PBrowserParent;
|
|
friend class mozilla::dom::PBrowserChild;
|
|
|
|
public:
|
|
enum buttonType { eLeftButton = 0, eMiddleButton = 1, eRightButton = 2 };
|
|
enum buttonsFlag { eLeftButtonFlag = 0x01,
|
|
eRightButtonFlag = 0x02,
|
|
eMiddleButtonFlag = 0x04,
|
|
// typicall, "back" button being left side of 5-button
|
|
// mice, see "buttons" attribute document of DOM3 Events.
|
|
e4thButtonFlag = 0x08,
|
|
// typicall, "forward" button being right side of 5-button
|
|
// mice, see "buttons" attribute document of DOM3 Events.
|
|
e5thButtonFlag = 0x10 };
|
|
enum reasonType { eReal, eSynthesized };
|
|
enum contextType { eNormal, eContextMenuKey };
|
|
enum exitType { eChild, eTopLevel };
|
|
|
|
nsMouseEvent()
|
|
{
|
|
}
|
|
|
|
protected:
|
|
nsMouseEvent(bool isTrusted, uint32_t msg, nsIWidget *w,
|
|
nsEventStructType structType, reasonType aReason)
|
|
: nsMouseEvent_base(isTrusted, msg, w, structType),
|
|
acceptActivation(false), ignoreRootScrollFrame(false),
|
|
reason(aReason), context(eNormal), exit(eChild), clickCount(0)
|
|
{
|
|
switch (msg) {
|
|
case NS_MOUSE_MOVE:
|
|
mFlags.mCancelable = false;
|
|
break;
|
|
case NS_MOUSEENTER:
|
|
case NS_MOUSELEAVE:
|
|
mFlags.mBubbles = false;
|
|
mFlags.mCancelable = false;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
public:
|
|
|
|
nsMouseEvent(bool isTrusted, uint32_t msg, nsIWidget *w,
|
|
reasonType aReason, contextType aContext = eNormal)
|
|
: nsMouseEvent_base(isTrusted, msg, w, NS_MOUSE_EVENT),
|
|
acceptActivation(false), ignoreRootScrollFrame(false),
|
|
reason(aReason), context(aContext), exit(eChild), clickCount(0)
|
|
{
|
|
switch (msg) {
|
|
case NS_MOUSE_MOVE:
|
|
mFlags.mCancelable = false;
|
|
break;
|
|
case NS_MOUSEENTER:
|
|
case NS_MOUSELEAVE:
|
|
mFlags.mBubbles = false;
|
|
mFlags.mCancelable = false;
|
|
break;
|
|
case NS_CONTEXTMENU:
|
|
button = (context == eNormal) ? eRightButton : eLeftButton;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
#ifdef DEBUG
|
|
~nsMouseEvent() {
|
|
NS_WARN_IF_FALSE(message != NS_CONTEXTMENU ||
|
|
button ==
|
|
((context == eNormal) ? eRightButton : eLeftButton),
|
|
"Wrong button set to NS_CONTEXTMENU event?");
|
|
}
|
|
#endif
|
|
|
|
/// Special return code for MOUSE_ACTIVATE to signal
|
|
/// if the target accepts activation (1), or denies it (0)
|
|
bool acceptActivation;
|
|
// Whether the event should ignore scroll frame bounds
|
|
// during dispatch.
|
|
bool ignoreRootScrollFrame;
|
|
|
|
reasonType reason : 4;
|
|
contextType context : 4;
|
|
exitType exit;
|
|
|
|
/// The number of mouse clicks
|
|
uint32_t clickCount;
|
|
|
|
void AssignMouseEventData(const nsMouseEvent& aEvent, bool aCopyTargets)
|
|
{
|
|
AssignMouseEventBaseData(aEvent, aCopyTargets);
|
|
|
|
acceptActivation = aEvent.acceptActivation;
|
|
ignoreRootScrollFrame = aEvent.ignoreRootScrollFrame;
|
|
clickCount = aEvent.clickCount;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Drag event
|
|
*/
|
|
|
|
class nsDragEvent : public nsMouseEvent
|
|
{
|
|
public:
|
|
nsDragEvent(bool isTrusted, uint32_t msg, nsIWidget *w)
|
|
: nsMouseEvent(isTrusted, msg, w, NS_DRAG_EVENT, eReal),
|
|
userCancelled(false)
|
|
{
|
|
mFlags.mCancelable =
|
|
(msg != NS_DRAGDROP_EXIT_SYNTH &&
|
|
msg != NS_DRAGDROP_LEAVE_SYNTH &&
|
|
msg != NS_DRAGDROP_END);
|
|
}
|
|
|
|
nsCOMPtr<nsIDOMDataTransfer> dataTransfer;
|
|
bool userCancelled;
|
|
};
|
|
|
|
/**
|
|
* Keyboard event
|
|
*/
|
|
|
|
struct nsAlternativeCharCode {
|
|
nsAlternativeCharCode(uint32_t aUnshiftedCharCode,
|
|
uint32_t aShiftedCharCode) :
|
|
mUnshiftedCharCode(aUnshiftedCharCode), mShiftedCharCode(aShiftedCharCode)
|
|
{
|
|
}
|
|
uint32_t mUnshiftedCharCode;
|
|
uint32_t mShiftedCharCode;
|
|
};
|
|
|
|
class nsKeyEvent : public nsInputEvent
|
|
{
|
|
private:
|
|
friend class mozilla::dom::PBrowserParent;
|
|
friend class mozilla::dom::PBrowserChild;
|
|
|
|
public:
|
|
nsKeyEvent()
|
|
{
|
|
}
|
|
|
|
nsKeyEvent(bool isTrusted, uint32_t msg, nsIWidget *w)
|
|
: nsInputEvent(isTrusted, msg, w, NS_KEY_EVENT),
|
|
keyCode(0), charCode(0),
|
|
location(nsIDOMKeyEvent::DOM_KEY_LOCATION_STANDARD), isChar(0),
|
|
mKeyNameIndex(mozilla::widget::KEY_NAME_INDEX_Unidentified),
|
|
mNativeKeyEvent(nullptr)
|
|
{
|
|
}
|
|
|
|
/// see NS_VK codes
|
|
uint32_t keyCode;
|
|
/// OS translated Unicode char
|
|
uint32_t charCode;
|
|
// One of nsIDOMKeyEvent::DOM_KEY_LOCATION_*
|
|
uint32_t location;
|
|
// OS translated Unicode chars which are used for accesskey and accelkey
|
|
// handling. The handlers will try from first character to last character.
|
|
nsTArray<nsAlternativeCharCode> alternativeCharCodes;
|
|
// indicates whether the event signifies a printable character
|
|
bool isChar;
|
|
// DOM KeyboardEvent.key
|
|
mozilla::widget::KeyNameIndex mKeyNameIndex;
|
|
// OS-specific native event can optionally be preserved
|
|
void* mNativeKeyEvent;
|
|
|
|
void GetDOMKeyName(nsAString& aKeyName)
|
|
{
|
|
GetDOMKeyName(mKeyNameIndex, aKeyName);
|
|
}
|
|
|
|
static void GetDOMKeyName(mozilla::widget::KeyNameIndex aKeyNameIndex,
|
|
nsAString& aKeyName)
|
|
{
|
|
#define NS_DEFINE_KEYNAME(aCPPName, aDOMKeyName) \
|
|
case mozilla::widget::KEY_NAME_INDEX_##aCPPName: \
|
|
aKeyName.Assign(NS_LITERAL_STRING(aDOMKeyName)); return;
|
|
switch (aKeyNameIndex) {
|
|
#include "nsDOMKeyNameList.h"
|
|
default:
|
|
aKeyName.Truncate();
|
|
return;
|
|
}
|
|
#undef NS_DEFINE_KEYNAME
|
|
}
|
|
|
|
void AssignKeyEventData(const nsKeyEvent& aEvent, bool aCopyTargets)
|
|
{
|
|
AssignInputEventData(aEvent, aCopyTargets);
|
|
|
|
keyCode = aEvent.keyCode;
|
|
charCode = aEvent.charCode;
|
|
location = aEvent.location;
|
|
alternativeCharCodes = aEvent.alternativeCharCodes;
|
|
isChar = aEvent.isChar;
|
|
mKeyNameIndex = aEvent.mKeyNameIndex;
|
|
// Don't copy mNativeKeyEvent because it may be referred after its instance
|
|
// is destroyed.
|
|
mNativeKeyEvent = nullptr;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* IME Related Events
|
|
*/
|
|
|
|
struct nsTextRangeStyle
|
|
{
|
|
enum {
|
|
LINESTYLE_NONE = NS_STYLE_TEXT_DECORATION_STYLE_NONE,
|
|
LINESTYLE_SOLID = NS_STYLE_TEXT_DECORATION_STYLE_SOLID,
|
|
LINESTYLE_DOTTED = NS_STYLE_TEXT_DECORATION_STYLE_DOTTED,
|
|
LINESTYLE_DASHED = NS_STYLE_TEXT_DECORATION_STYLE_DASHED,
|
|
LINESTYLE_DOUBLE = NS_STYLE_TEXT_DECORATION_STYLE_DOUBLE,
|
|
LINESTYLE_WAVY = NS_STYLE_TEXT_DECORATION_STYLE_WAVY
|
|
};
|
|
|
|
enum {
|
|
DEFINED_NONE = 0x00,
|
|
DEFINED_LINESTYLE = 0x01,
|
|
DEFINED_FOREGROUND_COLOR = 0x02,
|
|
DEFINED_BACKGROUND_COLOR = 0x04,
|
|
DEFINED_UNDERLINE_COLOR = 0x08
|
|
};
|
|
|
|
// Initialize all members, because nsTextRange instances may be compared by
|
|
// memcomp.
|
|
nsTextRangeStyle()
|
|
{
|
|
Clear();
|
|
}
|
|
|
|
void Clear()
|
|
{
|
|
mDefinedStyles = DEFINED_NONE;
|
|
mLineStyle = LINESTYLE_NONE;
|
|
mIsBoldLine = false;
|
|
mForegroundColor = mBackgroundColor = mUnderlineColor = NS_RGBA(0, 0, 0, 0);
|
|
}
|
|
|
|
bool IsDefined() const { return mDefinedStyles != DEFINED_NONE; }
|
|
|
|
bool IsLineStyleDefined() const
|
|
{
|
|
return (mDefinedStyles & DEFINED_LINESTYLE) != 0;
|
|
}
|
|
|
|
bool IsForegroundColorDefined() const
|
|
{
|
|
return (mDefinedStyles & DEFINED_FOREGROUND_COLOR) != 0;
|
|
}
|
|
|
|
bool IsBackgroundColorDefined() const
|
|
{
|
|
return (mDefinedStyles & DEFINED_BACKGROUND_COLOR) != 0;
|
|
}
|
|
|
|
bool IsUnderlineColorDefined() const
|
|
{
|
|
return (mDefinedStyles & DEFINED_UNDERLINE_COLOR) != 0;
|
|
}
|
|
|
|
bool IsNoChangeStyle() const
|
|
{
|
|
return !IsForegroundColorDefined() && !IsBackgroundColorDefined() &&
|
|
IsLineStyleDefined() && mLineStyle == LINESTYLE_NONE;
|
|
}
|
|
|
|
bool Equals(const nsTextRangeStyle& aOther)
|
|
{
|
|
if (mDefinedStyles != aOther.mDefinedStyles)
|
|
return false;
|
|
if (IsLineStyleDefined() && (mLineStyle != aOther.mLineStyle ||
|
|
!mIsBoldLine != !aOther.mIsBoldLine))
|
|
return false;
|
|
if (IsForegroundColorDefined() &&
|
|
(mForegroundColor != aOther.mForegroundColor))
|
|
return false;
|
|
if (IsBackgroundColorDefined() &&
|
|
(mBackgroundColor != aOther.mBackgroundColor))
|
|
return false;
|
|
if (IsUnderlineColorDefined() &&
|
|
(mUnderlineColor != aOther.mUnderlineColor))
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
bool operator !=(const nsTextRangeStyle &aOther)
|
|
{
|
|
return !Equals(aOther);
|
|
}
|
|
|
|
bool operator ==(const nsTextRangeStyle &aOther)
|
|
{
|
|
return Equals(aOther);
|
|
}
|
|
|
|
uint8_t mDefinedStyles;
|
|
uint8_t mLineStyle; // DEFINED_LINESTYLE
|
|
|
|
bool mIsBoldLine; // DEFINED_LINESTYLE
|
|
|
|
nscolor mForegroundColor; // DEFINED_FOREGROUND_COLOR
|
|
nscolor mBackgroundColor; // DEFINED_BACKGROUND_COLOR
|
|
nscolor mUnderlineColor; // DEFINED_UNDERLINE_COLOR
|
|
};
|
|
|
|
struct nsTextRange
|
|
{
|
|
nsTextRange()
|
|
: mStartOffset(0), mEndOffset(0), mRangeType(0)
|
|
{
|
|
}
|
|
|
|
uint32_t mStartOffset;
|
|
uint32_t mEndOffset;
|
|
uint32_t mRangeType;
|
|
|
|
nsTextRangeStyle mRangeStyle;
|
|
|
|
uint32_t Length() const { return mEndOffset - mStartOffset; }
|
|
};
|
|
|
|
typedef nsTextRange* nsTextRangeArray;
|
|
|
|
class nsTextEvent : public nsInputEvent
|
|
{
|
|
private:
|
|
friend class mozilla::dom::PBrowserParent;
|
|
friend class mozilla::dom::PBrowserChild;
|
|
friend class mozilla::plugins::PPluginInstanceChild;
|
|
|
|
nsTextEvent()
|
|
{
|
|
}
|
|
|
|
public:
|
|
uint32_t seqno;
|
|
|
|
public:
|
|
nsTextEvent(bool isTrusted, uint32_t msg, nsIWidget *w)
|
|
: nsInputEvent(isTrusted, msg, w, NS_TEXT_EVENT),
|
|
rangeCount(0), rangeArray(nullptr), isChar(false)
|
|
{
|
|
}
|
|
|
|
nsString theText;
|
|
uint32_t rangeCount;
|
|
// Note that the range array may not specify a caret position; in that
|
|
// case there will be no range of type NS_TEXTRANGE_CARETPOSITION in the
|
|
// array.
|
|
nsTextRangeArray rangeArray;
|
|
bool isChar;
|
|
};
|
|
|
|
class nsCompositionEvent : public nsGUIEvent
|
|
{
|
|
private:
|
|
friend class mozilla::dom::PBrowserParent;
|
|
friend class mozilla::dom::PBrowserChild;
|
|
|
|
nsCompositionEvent()
|
|
{
|
|
}
|
|
|
|
public:
|
|
uint32_t seqno;
|
|
|
|
public:
|
|
nsCompositionEvent(bool isTrusted, uint32_t msg, nsIWidget *w)
|
|
: nsGUIEvent(isTrusted, msg, w, NS_COMPOSITION_EVENT)
|
|
{
|
|
// XXX compositionstart is cancelable in draft of DOM3 Events.
|
|
// However, it doesn't make sense for us, we cannot cancel composition
|
|
// when we send compositionstart event.
|
|
mFlags.mCancelable = false;
|
|
}
|
|
|
|
nsString data;
|
|
};
|
|
|
|
/**
|
|
* nsMouseScrollEvent is used for legacy DOM mouse scroll events, i.e.,
|
|
* DOMMouseScroll and MozMousePixelScroll event. These events are NOT hanbled
|
|
* by ESM even if widget dispatches them. Use new widget::WheelEvent instead.
|
|
*/
|
|
|
|
class nsMouseScrollEvent : public nsMouseEvent_base
|
|
{
|
|
private:
|
|
nsMouseScrollEvent()
|
|
{
|
|
}
|
|
|
|
public:
|
|
nsMouseScrollEvent(bool isTrusted, uint32_t msg, nsIWidget *w)
|
|
: nsMouseEvent_base(isTrusted, msg, w, NS_MOUSE_SCROLL_EVENT),
|
|
delta(0), isHorizontal(false)
|
|
{
|
|
}
|
|
|
|
int32_t delta;
|
|
bool isHorizontal;
|
|
};
|
|
|
|
/**
|
|
* WheelEvent is used only for DOM Level 3 WheelEvent (dom::DOMWheelEvent).
|
|
*/
|
|
|
|
namespace mozilla {
|
|
namespace widget {
|
|
|
|
class WheelEvent : public nsMouseEvent_base
|
|
{
|
|
private:
|
|
friend class mozilla::dom::PBrowserParent;
|
|
friend class mozilla::dom::PBrowserChild;
|
|
|
|
WheelEvent()
|
|
{
|
|
}
|
|
|
|
public:
|
|
WheelEvent(bool aIsTrusted, uint32_t aMessage, nsIWidget* aWidget) :
|
|
nsMouseEvent_base(aIsTrusted, aMessage, aWidget, NS_WHEEL_EVENT),
|
|
deltaX(0.0), deltaY(0.0), deltaZ(0.0),
|
|
deltaMode(nsIDOMWheelEvent::DOM_DELTA_PIXEL),
|
|
customizedByUserPrefs(false), isMomentum(false), isPixelOnlyDevice(false),
|
|
lineOrPageDeltaX(0), lineOrPageDeltaY(0), scrollType(SCROLL_DEFAULT),
|
|
overflowDeltaX(0.0), overflowDeltaY(0.0)
|
|
{
|
|
}
|
|
|
|
// NOTE: deltaX, deltaY and deltaZ may be customized by
|
|
// mousewheel.*.delta_multiplier_* prefs which are applied by
|
|
// nsEventStateManager. So, after widget dispatches this event,
|
|
// these delta values may have different values than before.
|
|
double deltaX;
|
|
double deltaY;
|
|
double deltaZ;
|
|
|
|
// Should be one of nsIDOMWheelEvent::DOM_DELTA_*
|
|
uint32_t deltaMode;
|
|
|
|
// Following members are for internal use only, not for DOM event.
|
|
|
|
// If the delta values are computed from prefs, this value is true.
|
|
// Otherwise, i.e., they are computed from native events, false.
|
|
bool customizedByUserPrefs;
|
|
|
|
// true if the event is caused by momentum.
|
|
bool isMomentum;
|
|
|
|
// If device event handlers don't know when they should set lineOrPageDeltaX
|
|
// and lineOrPageDeltaY, this is true. Otherwise, false.
|
|
// If isPixelOnlyDevice is true, ESM will generate NS_MOUSE_SCROLL events
|
|
// when accumulated pixel delta values reach a line height.
|
|
bool isPixelOnlyDevice;
|
|
|
|
// If widget sets lineOrPageDelta, nsEventStateManager will dispatch
|
|
// NS_MOUSE_SCROLL event for compatibility. Note that the delta value means
|
|
// pages if the deltaMode is DOM_DELTA_PAGE, otherwise, lines.
|
|
int32_t lineOrPageDeltaX;
|
|
int32_t lineOrPageDeltaY;
|
|
|
|
// When the default action for an wheel event is moving history or zooming,
|
|
// need to chose a delta value for doing it.
|
|
int32_t GetPreferredIntDelta()
|
|
{
|
|
if (!lineOrPageDeltaX && !lineOrPageDeltaY) {
|
|
return 0;
|
|
}
|
|
if (lineOrPageDeltaY && !lineOrPageDeltaX) {
|
|
return lineOrPageDeltaY;
|
|
}
|
|
if (lineOrPageDeltaX && !lineOrPageDeltaY) {
|
|
return lineOrPageDeltaX;
|
|
}
|
|
if ((lineOrPageDeltaX < 0 && lineOrPageDeltaY > 0) ||
|
|
(lineOrPageDeltaX > 0 && lineOrPageDeltaY < 0)) {
|
|
return 0; // We cannot guess the answer in this case.
|
|
}
|
|
return (Abs(lineOrPageDeltaX) > Abs(lineOrPageDeltaY)) ?
|
|
lineOrPageDeltaX : lineOrPageDeltaY;
|
|
}
|
|
|
|
// Scroll type
|
|
// The default value is SCROLL_DEFAULT, which means nsEventStateManager will
|
|
// select preferred scroll type automatically.
|
|
enum ScrollType {
|
|
SCROLL_DEFAULT,
|
|
SCROLL_SYNCHRONOUSLY,
|
|
SCROLL_ASYNCHRONOUSELY,
|
|
SCROLL_SMOOTHLY
|
|
};
|
|
ScrollType scrollType;
|
|
|
|
// overflowed delta values for scroll, these values are set by
|
|
// nsEventStateManger. If the default action of the wheel event isn't scroll,
|
|
// these values always zero. Otherwise, remaning delta values which are
|
|
// not used by scroll are set.
|
|
// NOTE: deltaX, deltaY and deltaZ may be modified by nsEventStateManager.
|
|
// However, overflowDeltaX and overflowDeltaY indicate unused original
|
|
// delta values which are not applied the delta_multiplier prefs.
|
|
// So, if widget wanted to know the actual direction to be scrolled,
|
|
// it would need to check the deltaX and deltaY.
|
|
double overflowDeltaX;
|
|
double overflowDeltaY;
|
|
};
|
|
|
|
} // namespace widget
|
|
} // namespace mozilla
|
|
|
|
/*
|
|
* Gesture Notify Event:
|
|
*
|
|
* This event is the first event generated when the user touches
|
|
* the screen with a finger, and it's meant to decide what kind
|
|
* of action we'll use for that touch interaction.
|
|
*
|
|
* The event is dispatched to the layout and based on what is underneath
|
|
* the initial contact point it's then decided if we should pan
|
|
* (finger scrolling) or drag the target element.
|
|
*/
|
|
class nsGestureNotifyEvent : public nsGUIEvent
|
|
{
|
|
public:
|
|
enum ePanDirection {
|
|
ePanNone,
|
|
ePanVertical,
|
|
ePanHorizontal,
|
|
ePanBoth
|
|
};
|
|
|
|
ePanDirection panDirection;
|
|
bool displayPanFeedback;
|
|
|
|
nsGestureNotifyEvent(bool aIsTrusted, uint32_t aMsg, nsIWidget *aWidget):
|
|
nsGUIEvent(aIsTrusted, aMsg, aWidget, NS_GESTURENOTIFY_EVENT),
|
|
panDirection(ePanNone),
|
|
displayPanFeedback(false)
|
|
{
|
|
}
|
|
};
|
|
|
|
class nsQueryContentEvent : public nsGUIEvent
|
|
{
|
|
private:
|
|
friend class mozilla::dom::PBrowserParent;
|
|
friend class mozilla::dom::PBrowserChild;
|
|
|
|
nsQueryContentEvent()
|
|
{
|
|
mReply.mContentsRoot = nullptr;
|
|
mReply.mFocusedWidget = nullptr;
|
|
}
|
|
|
|
public:
|
|
nsQueryContentEvent(bool aIsTrusted, uint32_t aMsg, nsIWidget *aWidget) :
|
|
nsGUIEvent(aIsTrusted, aMsg, aWidget, NS_QUERY_CONTENT_EVENT),
|
|
mSucceeded(false), mWasAsync(false)
|
|
{
|
|
}
|
|
|
|
void InitForQueryTextContent(uint32_t aOffset, uint32_t aLength)
|
|
{
|
|
NS_ASSERTION(message == NS_QUERY_TEXT_CONTENT,
|
|
"wrong initializer is called");
|
|
mInput.mOffset = aOffset;
|
|
mInput.mLength = aLength;
|
|
}
|
|
|
|
void InitForQueryCaretRect(uint32_t aOffset)
|
|
{
|
|
NS_ASSERTION(message == NS_QUERY_CARET_RECT,
|
|
"wrong initializer is called");
|
|
mInput.mOffset = aOffset;
|
|
}
|
|
|
|
void InitForQueryTextRect(uint32_t aOffset, uint32_t aLength)
|
|
{
|
|
NS_ASSERTION(message == NS_QUERY_TEXT_RECT,
|
|
"wrong initializer is called");
|
|
mInput.mOffset = aOffset;
|
|
mInput.mLength = aLength;
|
|
}
|
|
|
|
void InitForQueryDOMWidgetHittest(const mozilla::LayoutDeviceIntPoint& aPoint)
|
|
{
|
|
NS_ASSERTION(message == NS_QUERY_DOM_WIDGET_HITTEST,
|
|
"wrong initializer is called");
|
|
refPoint = aPoint;
|
|
}
|
|
|
|
uint32_t GetSelectionStart(void) const
|
|
{
|
|
NS_ASSERTION(message == NS_QUERY_SELECTED_TEXT,
|
|
"not querying selection");
|
|
return mReply.mOffset + (mReply.mReversed ? mReply.mString.Length() : 0);
|
|
}
|
|
|
|
uint32_t GetSelectionEnd(void) const
|
|
{
|
|
NS_ASSERTION(message == NS_QUERY_SELECTED_TEXT,
|
|
"not querying selection");
|
|
return mReply.mOffset + (mReply.mReversed ? 0 : mReply.mString.Length());
|
|
}
|
|
|
|
bool mSucceeded;
|
|
bool mWasAsync;
|
|
struct {
|
|
uint32_t mOffset;
|
|
uint32_t mLength;
|
|
} mInput;
|
|
struct {
|
|
void* mContentsRoot;
|
|
uint32_t mOffset;
|
|
nsString mString;
|
|
nsIntRect mRect; // Finally, the coordinates is system coordinates.
|
|
// The return widget has the caret. This is set at all query events.
|
|
nsIWidget* mFocusedWidget;
|
|
bool mReversed; // true if selection is reversed (end < start)
|
|
bool mHasSelection; // true if the selection exists
|
|
bool mWidgetIsHit; // true if DOM element under mouse belongs to widget
|
|
// used by NS_QUERY_SELECTION_AS_TRANSFERABLE
|
|
nsCOMPtr<nsITransferable> mTransferable;
|
|
} mReply;
|
|
|
|
enum {
|
|
NOT_FOUND = UINT32_MAX
|
|
};
|
|
|
|
// values of mComputedScrollAction
|
|
enum {
|
|
SCROLL_ACTION_NONE,
|
|
SCROLL_ACTION_LINE,
|
|
SCROLL_ACTION_PAGE
|
|
};
|
|
};
|
|
|
|
class nsSelectionEvent : public nsGUIEvent
|
|
{
|
|
private:
|
|
friend class mozilla::dom::PBrowserParent;
|
|
friend class mozilla::dom::PBrowserChild;
|
|
|
|
nsSelectionEvent()
|
|
{
|
|
}
|
|
|
|
public:
|
|
uint32_t seqno;
|
|
|
|
public:
|
|
nsSelectionEvent(bool aIsTrusted, uint32_t aMsg, nsIWidget *aWidget) :
|
|
nsGUIEvent(aIsTrusted, aMsg, aWidget, NS_SELECTION_EVENT),
|
|
mExpandToClusterBoundary(true), mSucceeded(false)
|
|
{
|
|
}
|
|
|
|
uint32_t mOffset; // start offset of selection
|
|
uint32_t mLength; // length of selection
|
|
bool mReversed; // selection "anchor" should be in front
|
|
bool mExpandToClusterBoundary; // cluster-based or character-based
|
|
bool mSucceeded;
|
|
};
|
|
|
|
class nsContentCommandEvent : public nsGUIEvent
|
|
{
|
|
public:
|
|
nsContentCommandEvent(bool aIsTrusted, uint32_t aMsg, nsIWidget *aWidget,
|
|
bool aOnlyEnabledCheck = false) :
|
|
nsGUIEvent(aIsTrusted, aMsg, aWidget, NS_CONTENT_COMMAND_EVENT),
|
|
mOnlyEnabledCheck(bool(aOnlyEnabledCheck)),
|
|
mSucceeded(false), mIsEnabled(false)
|
|
{
|
|
}
|
|
|
|
// NS_CONTENT_COMMAND_PASTE_TRANSFERABLE
|
|
nsCOMPtr<nsITransferable> mTransferable; // [in]
|
|
|
|
// NS_CONTENT_COMMAND_SCROLL
|
|
// for mScroll.mUnit
|
|
enum {
|
|
eCmdScrollUnit_Line,
|
|
eCmdScrollUnit_Page,
|
|
eCmdScrollUnit_Whole
|
|
};
|
|
|
|
struct ScrollInfo {
|
|
ScrollInfo() :
|
|
mAmount(0), mUnit(eCmdScrollUnit_Line), mIsHorizontal(false)
|
|
{
|
|
}
|
|
|
|
int32_t mAmount; // [in]
|
|
uint8_t mUnit; // [in]
|
|
bool mIsHorizontal; // [in]
|
|
} mScroll;
|
|
|
|
bool mOnlyEnabledCheck; // [in]
|
|
|
|
bool mSucceeded; // [out]
|
|
bool mIsEnabled; // [out]
|
|
};
|
|
|
|
class nsTouchEvent : public nsInputEvent
|
|
{
|
|
public:
|
|
nsTouchEvent()
|
|
{
|
|
}
|
|
nsTouchEvent(bool isTrusted, nsTouchEvent *aEvent)
|
|
: nsInputEvent(isTrusted,
|
|
aEvent->message,
|
|
aEvent->widget,
|
|
NS_TOUCH_EVENT)
|
|
{
|
|
modifiers = aEvent->modifiers;
|
|
time = aEvent->time;
|
|
touches.AppendElements(aEvent->touches);
|
|
MOZ_COUNT_CTOR(nsTouchEvent);
|
|
}
|
|
nsTouchEvent(bool isTrusted, uint32_t msg, nsIWidget* w)
|
|
: nsInputEvent(isTrusted, msg, w, NS_TOUCH_EVENT)
|
|
{
|
|
MOZ_COUNT_CTOR(nsTouchEvent);
|
|
}
|
|
~nsTouchEvent()
|
|
{
|
|
MOZ_COUNT_DTOR(nsTouchEvent);
|
|
}
|
|
|
|
nsTArray< nsRefPtr<mozilla::dom::Touch> > touches;
|
|
};
|
|
|
|
/**
|
|
* Form event
|
|
*
|
|
* We hold the originating form control for form submit and reset events.
|
|
* originator is a weak pointer (does not hold a strong reference).
|
|
*/
|
|
|
|
class nsFormEvent : public nsEvent
|
|
{
|
|
public:
|
|
nsFormEvent(bool isTrusted, uint32_t msg)
|
|
: nsEvent(isTrusted, msg, NS_FORM_EVENT),
|
|
originator(nullptr)
|
|
{
|
|
}
|
|
|
|
nsIContent *originator;
|
|
};
|
|
|
|
/**
|
|
* Command event
|
|
*
|
|
* Custom commands for example from the operating system.
|
|
*/
|
|
|
|
class nsCommandEvent : public nsGUIEvent
|
|
{
|
|
public:
|
|
nsCommandEvent(bool isTrusted, nsIAtom* aEventType,
|
|
nsIAtom* aCommand, nsIWidget* w)
|
|
: nsGUIEvent(isTrusted, NS_USER_DEFINED_EVENT, w, NS_COMMAND_EVENT)
|
|
{
|
|
userType = aEventType;
|
|
command = aCommand;
|
|
}
|
|
|
|
nsCOMPtr<nsIAtom> command;
|
|
};
|
|
|
|
/**
|
|
* Clipboard event
|
|
*/
|
|
class nsClipboardEvent : public nsEvent
|
|
{
|
|
public:
|
|
nsClipboardEvent(bool isTrusted, uint32_t msg)
|
|
: nsEvent(isTrusted, msg, NS_CLIPBOARD_EVENT)
|
|
{
|
|
}
|
|
|
|
nsCOMPtr<nsIDOMDataTransfer> clipboardData;
|
|
};
|
|
|
|
/**
|
|
* DOM UIEvent
|
|
*/
|
|
class nsUIEvent : public nsGUIEvent
|
|
{
|
|
public:
|
|
nsUIEvent(bool isTrusted, uint32_t msg, int32_t d)
|
|
: nsGUIEvent(isTrusted, msg, nullptr, NS_UI_EVENT),
|
|
detail(d)
|
|
{
|
|
}
|
|
|
|
int32_t detail;
|
|
};
|
|
|
|
class nsFocusEvent : public nsUIEvent
|
|
{
|
|
public:
|
|
nsFocusEvent(bool isTrusted, uint32_t msg)
|
|
: nsUIEvent(isTrusted, msg, 0),
|
|
fromRaise(false),
|
|
isRefocus(false)
|
|
{
|
|
eventStructType = NS_FOCUS_EVENT;
|
|
}
|
|
|
|
/// The possible related target
|
|
nsCOMPtr<mozilla::dom::EventTarget> relatedTarget;
|
|
|
|
bool fromRaise;
|
|
bool isRefocus;
|
|
};
|
|
|
|
/**
|
|
* Simple gesture event
|
|
*/
|
|
class nsSimpleGestureEvent : public nsMouseEvent_base
|
|
{
|
|
public:
|
|
nsSimpleGestureEvent(bool isTrusted, uint32_t msg, nsIWidget* w,
|
|
uint32_t directionArg, double deltaArg)
|
|
: nsMouseEvent_base(isTrusted, msg, w, NS_SIMPLE_GESTURE_EVENT),
|
|
allowedDirections(0), direction(directionArg), delta(deltaArg),
|
|
clickCount(0)
|
|
{
|
|
}
|
|
|
|
nsSimpleGestureEvent(const nsSimpleGestureEvent& other)
|
|
: nsMouseEvent_base(other.mFlags.mIsTrusted,
|
|
other.message, other.widget, NS_SIMPLE_GESTURE_EVENT),
|
|
allowedDirections(other.allowedDirections), direction(other.direction),
|
|
delta(other.delta), clickCount(0)
|
|
{
|
|
}
|
|
uint32_t allowedDirections; // See nsIDOMSimpleGestureEvent for values
|
|
uint32_t direction; // See nsIDOMSimpleGestureEvent for values
|
|
double delta; // Delta for magnify and rotate events
|
|
uint32_t clickCount; // The number of taps for tap events
|
|
};
|
|
|
|
class nsTransitionEvent : public nsEvent
|
|
{
|
|
public:
|
|
nsTransitionEvent(bool isTrusted, uint32_t msg,
|
|
const nsAString& propertyNameArg, float elapsedTimeArg,
|
|
const nsAString& pseudoElementArg)
|
|
: nsEvent(isTrusted, msg, NS_TRANSITION_EVENT),
|
|
propertyName(propertyNameArg), elapsedTime(elapsedTimeArg),
|
|
pseudoElement(pseudoElementArg)
|
|
{
|
|
}
|
|
|
|
nsString propertyName;
|
|
float elapsedTime;
|
|
nsString pseudoElement;
|
|
};
|
|
|
|
class nsAnimationEvent : public nsEvent
|
|
{
|
|
public:
|
|
nsAnimationEvent(bool isTrusted, uint32_t msg,
|
|
const nsAString &animationNameArg, float elapsedTimeArg,
|
|
const nsAString &pseudoElementArg)
|
|
: nsEvent(isTrusted, msg, NS_ANIMATION_EVENT),
|
|
animationName(animationNameArg), elapsedTime(elapsedTimeArg),
|
|
pseudoElement(pseudoElementArg)
|
|
{
|
|
}
|
|
|
|
nsString animationName;
|
|
float elapsedTime;
|
|
nsString pseudoElement;
|
|
};
|
|
|
|
/**
|
|
* Native event pluginEvent for plugins.
|
|
*/
|
|
|
|
class nsPluginEvent : public nsGUIEvent
|
|
{
|
|
public:
|
|
nsPluginEvent(bool isTrusted, uint32_t msg, nsIWidget *w)
|
|
: nsGUIEvent(isTrusted, msg, w, NS_PLUGIN_EVENT),
|
|
retargetToFocusedDocument(false)
|
|
{
|
|
}
|
|
|
|
// If TRUE, this event needs to be retargeted to focused document.
|
|
// Otherwise, never retargeted.
|
|
// Defaults to false.
|
|
bool retargetToFocusedDocument;
|
|
};
|
|
|
|
/**
|
|
* Event status for D&D Event
|
|
*/
|
|
enum nsDragDropEventStatus {
|
|
/// The event is a enter
|
|
nsDragDropEventStatus_eDragEntered,
|
|
/// The event is exit
|
|
nsDragDropEventStatus_eDragExited,
|
|
/// The event is drop
|
|
nsDragDropEventStatus_eDrop
|
|
};
|
|
|
|
#define NS_IS_INPUT_EVENT(evnt) \
|
|
(((evnt)->eventStructType == NS_INPUT_EVENT) || \
|
|
((evnt)->eventStructType == NS_MOUSE_EVENT) || \
|
|
((evnt)->eventStructType == NS_KEY_EVENT) || \
|
|
((evnt)->eventStructType == NS_TEXT_EVENT) || \
|
|
((evnt)->eventStructType == NS_TOUCH_EVENT) || \
|
|
((evnt)->eventStructType == NS_DRAG_EVENT) || \
|
|
((evnt)->eventStructType == NS_MOUSE_SCROLL_EVENT) || \
|
|
((evnt)->eventStructType == NS_SIMPLE_GESTURE_EVENT))
|
|
|
|
#define NS_IS_MOUSE_EVENT(evnt) \
|
|
(((evnt)->message == NS_MOUSE_BUTTON_DOWN) || \
|
|
((evnt)->message == NS_MOUSE_BUTTON_UP) || \
|
|
((evnt)->message == NS_MOUSE_CLICK) || \
|
|
((evnt)->message == NS_MOUSE_DOUBLECLICK) || \
|
|
((evnt)->message == NS_MOUSE_ENTER) || \
|
|
((evnt)->message == NS_MOUSE_EXIT) || \
|
|
((evnt)->message == NS_MOUSE_ACTIVATE) || \
|
|
((evnt)->message == NS_MOUSE_ENTER_SYNTH) || \
|
|
((evnt)->message == NS_MOUSE_EXIT_SYNTH) || \
|
|
((evnt)->message == NS_MOUSE_MOZHITTEST) || \
|
|
((evnt)->message == NS_MOUSE_MOVE))
|
|
|
|
#define NS_IS_MOUSE_EVENT_STRUCT(evnt) \
|
|
((evnt)->eventStructType == NS_MOUSE_EVENT || \
|
|
(evnt)->eventStructType == NS_DRAG_EVENT)
|
|
|
|
#define NS_IS_MOUSE_LEFT_CLICK(evnt) \
|
|
((evnt)->eventStructType == NS_MOUSE_EVENT && \
|
|
(evnt)->message == NS_MOUSE_CLICK && \
|
|
static_cast<nsMouseEvent*>((evnt))->button == nsMouseEvent::eLeftButton)
|
|
|
|
#define NS_IS_CONTEXT_MENU_KEY(evnt) \
|
|
((evnt)->eventStructType == NS_MOUSE_EVENT && \
|
|
(evnt)->message == NS_CONTEXTMENU && \
|
|
static_cast<nsMouseEvent*>((evnt))->context == nsMouseEvent::eContextMenuKey)
|
|
|
|
#define NS_IS_DRAG_EVENT(evnt) \
|
|
(((evnt)->message == NS_DRAGDROP_ENTER) || \
|
|
((evnt)->message == NS_DRAGDROP_OVER) || \
|
|
((evnt)->message == NS_DRAGDROP_EXIT) || \
|
|
((evnt)->message == NS_DRAGDROP_DRAGDROP) || \
|
|
((evnt)->message == NS_DRAGDROP_GESTURE) || \
|
|
((evnt)->message == NS_DRAGDROP_DRAG) || \
|
|
((evnt)->message == NS_DRAGDROP_END) || \
|
|
((evnt)->message == NS_DRAGDROP_START) || \
|
|
((evnt)->message == NS_DRAGDROP_DROP) || \
|
|
((evnt)->message == NS_DRAGDROP_LEAVE_SYNTH))
|
|
|
|
#define NS_IS_KEY_EVENT(evnt) \
|
|
(((evnt)->message == NS_KEY_DOWN) || \
|
|
((evnt)->message == NS_KEY_PRESS) || \
|
|
((evnt)->message == NS_KEY_UP))
|
|
|
|
#define NS_IS_IME_EVENT(evnt) \
|
|
(((evnt)->message == NS_TEXT_TEXT) || \
|
|
((evnt)->message == NS_COMPOSITION_START) || \
|
|
((evnt)->message == NS_COMPOSITION_END) || \
|
|
((evnt)->message == NS_COMPOSITION_UPDATE))
|
|
|
|
#define NS_IS_ACTIVATION_EVENT(evnt) \
|
|
(((evnt)->message == NS_PLUGIN_ACTIVATE) || \
|
|
((evnt)->message == NS_PLUGIN_FOCUS))
|
|
|
|
#define NS_IS_QUERY_CONTENT_EVENT(evnt) \
|
|
((evnt)->eventStructType == NS_QUERY_CONTENT_EVENT)
|
|
|
|
#define NS_IS_SELECTION_EVENT(evnt) \
|
|
(((evnt)->message == NS_SELECTION_SET))
|
|
|
|
#define NS_IS_CONTENT_COMMAND_EVENT(evnt) \
|
|
((evnt)->eventStructType == NS_CONTENT_COMMAND_EVENT)
|
|
|
|
#define NS_IS_PLUGIN_EVENT(evnt) \
|
|
(((evnt)->message == NS_PLUGIN_INPUT_EVENT) || \
|
|
((evnt)->message == NS_PLUGIN_FOCUS_EVENT))
|
|
|
|
#define NS_IS_RETARGETED_PLUGIN_EVENT(evnt) \
|
|
(NS_IS_PLUGIN_EVENT(evnt) && \
|
|
(static_cast<nsPluginEvent*>(evnt)->retargetToFocusedDocument))
|
|
|
|
#define NS_IS_NON_RETARGETED_PLUGIN_EVENT(evnt) \
|
|
(NS_IS_PLUGIN_EVENT(evnt) && \
|
|
!(static_cast<nsPluginEvent*>(evnt)->retargetToFocusedDocument))
|
|
|
|
// Be aware the query content events and the selection events are a part of IME
|
|
// processing. So, you shouldn't use NS_IS_IME_EVENT macro directly in most
|
|
// cases, you should use NS_IS_IME_RELATED_EVENT instead.
|
|
#define NS_IS_IME_RELATED_EVENT(evnt) \
|
|
(NS_IS_IME_EVENT(evnt) || \
|
|
NS_IS_QUERY_CONTENT_EVENT(evnt) || \
|
|
NS_IS_SELECTION_EVENT(evnt))
|
|
|
|
/*
|
|
* Virtual key bindings for keyboard events.
|
|
* These come from nsIDOMKeyEvent.h, which is generated from MouseKeyEvent.idl.
|
|
* Really, it would be better if we phased out the NS_VK symbols altogether
|
|
* in favor of the DOM ones, but at least this way they'll be in sync.
|
|
*/
|
|
|
|
enum {
|
|
#define NS_DEFINE_VK(aDOMKeyName, aDOMKeyCode) NS_##aDOMKeyName = aDOMKeyCode
|
|
#include "nsVKList.h"
|
|
#undef NS_DEFINE_VK
|
|
};
|
|
|
|
// IME Constants -- keep in synch with nsIPrivateTextRange.h
|
|
#define NS_TEXTRANGE_CARETPOSITION 0x01
|
|
#define NS_TEXTRANGE_RAWINPUT 0x02
|
|
#define NS_TEXTRANGE_SELECTEDRAWTEXT 0x03
|
|
#define NS_TEXTRANGE_CONVERTEDTEXT 0x04
|
|
#define NS_TEXTRANGE_SELECTEDCONVERTEDTEXT 0x05
|
|
|
|
/**
|
|
* Whether the event should be handled by the frame of the mouse cursor
|
|
* position or not. When it should be handled there (e.g., the mouse events),
|
|
* this returns TRUE.
|
|
*/
|
|
inline bool NS_IsEventUsingCoordinates(nsEvent* aEvent)
|
|
{
|
|
return !NS_IS_KEY_EVENT(aEvent) && !NS_IS_IME_RELATED_EVENT(aEvent) &&
|
|
!NS_IS_CONTEXT_MENU_KEY(aEvent) && !NS_IS_ACTIVATION_EVENT(aEvent) &&
|
|
!NS_IS_PLUGIN_EVENT(aEvent) &&
|
|
!NS_IS_CONTENT_COMMAND_EVENT(aEvent) &&
|
|
aEvent->message != NS_PLUGIN_RESOLUTION_CHANGED;
|
|
}
|
|
|
|
/**
|
|
* Whether the event should be handled by the focused DOM window in the
|
|
* same top level window's or not. E.g., key events, IME related events
|
|
* (including the query content events, they are used in IME transaction)
|
|
* should be handled by the (last) focused window rather than the dispatched
|
|
* window.
|
|
*
|
|
* NOTE: Even if this returns TRUE, the event isn't going to be handled by the
|
|
* application level active DOM window which is on another top level window.
|
|
* So, when the event is fired on a deactive window, the event is going to be
|
|
* handled by the last focused DOM window in the last focused window.
|
|
*/
|
|
inline bool NS_IsEventTargetedAtFocusedWindow(nsEvent* aEvent)
|
|
{
|
|
return NS_IS_KEY_EVENT(aEvent) || NS_IS_IME_RELATED_EVENT(aEvent) ||
|
|
NS_IS_CONTEXT_MENU_KEY(aEvent) ||
|
|
NS_IS_CONTENT_COMMAND_EVENT(aEvent) ||
|
|
NS_IS_RETARGETED_PLUGIN_EVENT(aEvent);
|
|
}
|
|
|
|
/**
|
|
* Whether the event should be handled by the focused content or not. E.g.,
|
|
* key events, IME related events and other input events which are not handled
|
|
* by the frame of the mouse cursor position.
|
|
*
|
|
* NOTE: Even if this returns TRUE, the event isn't going to be handled by the
|
|
* application level active DOM window which is on another top level window.
|
|
* So, when the event is fired on a deactive window, the event is going to be
|
|
* handled by the last focused DOM element of the last focused DOM window in
|
|
* the last focused window.
|
|
*/
|
|
inline bool NS_IsEventTargetedAtFocusedContent(nsEvent* aEvent)
|
|
{
|
|
return NS_IS_KEY_EVENT(aEvent) || NS_IS_IME_RELATED_EVENT(aEvent) ||
|
|
NS_IS_CONTEXT_MENU_KEY(aEvent) ||
|
|
NS_IS_RETARGETED_PLUGIN_EVENT(aEvent);
|
|
}
|
|
|
|
/**
|
|
* Whether the event should cause a DOM event.
|
|
*/
|
|
inline bool NS_IsAllowedToDispatchDOMEvent(nsEvent* aEvent)
|
|
{
|
|
switch (aEvent->eventStructType) {
|
|
case NS_MOUSE_EVENT:
|
|
// We want synthesized mouse moves to cause mouseover and mouseout
|
|
// DOM events (nsEventStateManager::PreHandleEvent), but not mousemove
|
|
// DOM events.
|
|
// Synthesized button up events also do not cause DOM events because they
|
|
// do not have a reliable refPoint.
|
|
return static_cast<nsMouseEvent*>(aEvent)->reason == nsMouseEvent::eReal;
|
|
|
|
case NS_WHEEL_EVENT: {
|
|
// wheel event whose all delta values are zero by user pref applied, it
|
|
// shouldn't cause a DOM event.
|
|
mozilla::widget::WheelEvent* wheelEvent =
|
|
static_cast<mozilla::widget::WheelEvent*>(aEvent);
|
|
return wheelEvent->deltaX != 0.0 || wheelEvent->deltaY != 0.0 ||
|
|
wheelEvent->deltaZ != 0.0;
|
|
}
|
|
|
|
default:
|
|
return true;
|
|
}
|
|
}
|
|
|
|
#endif // nsGUIEvent_h__
|