Bug 912956 part.3 Create mozilla/BasicEvents.h r=roc
authorMasayuki Nakano <masayuki@d-toybox.com>
Tue, 24 Sep 2013 19:04:14 +0900
changeset 148429 70bbbaa3c1d0c2fab1e5c201b6a1c3472f42613e
parent 148428 f2fce6c8e493f9ed6510f1d69291bcf3e8477380
child 148430 ff21dedcf8e743db1ebc461d34a10601e8a3e664
push id25343
push userkwierso@gmail.com
push dateWed, 25 Sep 2013 02:43:37 +0000
treeherdermozilla-central@ce5bc913350a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersroc
bugs912956
milestone27.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 912956 part.3 Create mozilla/BasicEvents.h r=roc
dom/interfaces/events/nsIDOMEvent.idl
js/xpconnect/src/event_impl_gen.py
widget/BasicEvents.h
widget/EventForwards.h
widget/moz.build
widget/nsGUIEvent.h
--- a/dom/interfaces/events/nsIDOMEvent.idl
+++ b/dom/interfaces/events/nsIDOMEvent.idl
@@ -232,113 +232,113 @@ nsresult
 NS_NewDOMDataContainerEvent(nsIDOMEvent** aInstancePtrResult,
                             mozilla::dom::EventTarget* aOwner,
                             nsPresContext* aPresContext,
                             nsEvent* aEvent);
 nsresult
 NS_NewDOMUIEvent(nsIDOMEvent** aInstancePtrResult,
                  mozilla::dom::EventTarget* aOwner,
                  nsPresContext* aPresContext,
-                 class nsGUIEvent* aEvent);
+                 nsGUIEvent* aEvent);
 nsresult
 NS_NewDOMMouseEvent(nsIDOMEvent** aInstancePtrResult,
                     mozilla::dom::EventTarget* aOwner,
                     nsPresContext* aPresContext,
-                    class nsInputEvent* aEvent);
+                    nsInputEvent* aEvent);
 nsresult
 NS_NewDOMFocusEvent(nsIDOMEvent** aInstancePtrResult,
                     mozilla::dom::EventTarget* aOwner,
                     nsPresContext* aPresContext,
-                    class nsFocusEvent* aEvent);
+                    nsFocusEvent* aEvent);
 nsresult
 NS_NewDOMMouseScrollEvent(nsIDOMEvent** aInstancePtrResult,
                           mozilla::dom::EventTarget* aOwner,
                           nsPresContext* aPresContext,
-                          class nsInputEvent* aEvent);
+                          nsInputEvent* aEvent);
 nsresult
 NS_NewDOMWheelEvent(nsIDOMEvent** aInstancePtrResult,
                     mozilla::dom::EventTarget* aOwner,
                     nsPresContext* aPresContext,
                     mozilla::WheelEvent* aEvent);
 nsresult
 NS_NewDOMDragEvent(nsIDOMEvent** aInstancePtrResult,
                    mozilla::dom::EventTarget* aOwner,
                    nsPresContext* aPresContext,
-                   class nsDragEvent* aEvent);
+                   nsDragEvent* aEvent);
 nsresult
 NS_NewDOMClipboardEvent(nsIDOMEvent** aInstancePtrResult,
                         mozilla::dom::EventTarget* aOwner,
                         nsPresContext* aPresContext,
-                        class nsClipboardEvent *aEvent);
+                        nsClipboardEvent *aEvent);
 
 nsresult
 NS_NewDOMKeyboardEvent(nsIDOMEvent** aInstancePtrResult,
                        mozilla::dom::EventTarget* aOwner,
                        nsPresContext* aPresContext,
-                       class nsKeyEvent* aEvent);
+                       nsKeyEvent* aEvent);
 nsresult
 NS_NewDOMCompositionEvent(nsIDOMEvent** aInstancePtrResult,
                           mozilla::dom::EventTarget* aOwner,
                           nsPresContext* aPresContext,
-                          class nsCompositionEvent* aEvent);
+                          nsCompositionEvent* aEvent);
 nsresult
 NS_NewDOMMutationEvent(nsIDOMEvent** aResult,
                        mozilla::dom::EventTarget* aOwner,
                        nsPresContext* aPresContext,
-                       class nsMutationEvent* aEvent);
+                       nsMutationEvent* aEvent);
 nsresult
 NS_NewDOMDeviceMotionEvent(nsIDOMEvent** aResult,
                            mozilla::dom::EventTarget* aOwner,
                            nsPresContext* aPresContext,
                            nsEvent* aEvent);
 nsresult
 NS_NewDOMTextEvent(nsIDOMEvent** aResult,
                    mozilla::dom::EventTarget* aOwner,
                    nsPresContext* aPresContext,
-                   class nsTextEvent* aEvent);
+                   nsTextEvent* aEvent);
 nsresult
 NS_NewDOMBeforeUnloadEvent(nsIDOMEvent** aResult,
                            mozilla::dom::EventTarget* aOwner,
                            nsPresContext* aPresContext,
                            nsEvent* aEvent);
 nsresult
 NS_NewDOMSVGEvent(nsIDOMEvent** aResult,
                   mozilla::dom::EventTarget* aOwner,
                   nsPresContext* aPresContext,
-                  class nsEvent* aEvent);
+                  nsEvent* aEvent);
 nsresult
 NS_NewDOMSVGZoomEvent(nsIDOMEvent** aResult,
                       mozilla::dom::EventTarget* aOwner,
                       nsPresContext* aPresContext,
-                      class nsGUIEvent* aEvent);
+                      nsGUIEvent* aEvent);
 nsresult
 NS_NewDOMTimeEvent(nsIDOMEvent** aResult,
                    mozilla::dom::EventTarget* aOwner,
                    nsPresContext* aPresContext,
-                   class nsEvent* aEvent);
+                   nsEvent* aEvent);
 nsresult
 NS_NewDOMXULCommandEvent(nsIDOMEvent** aResult,
                          mozilla::dom::EventTarget* aOwner,
                          nsPresContext* aPresContext,
-                         class nsInputEvent* aEvent);
+                         nsInputEvent* aEvent);
 nsresult
 NS_NewDOMCommandEvent(nsIDOMEvent** aInstancePtrResult,
                       mozilla::dom::EventTarget* aOwner,
                       nsPresContext* aPresContext,
                       nsCommandEvent* aEvent);
 nsresult
 NS_NewDOMMessageEvent(nsIDOMEvent** aInstancePtrResult,
                       mozilla::dom::EventTarget* aOwner,
                       nsPresContext* aPresContext,
-                      class nsEvent* aEvent);
+                      nsEvent* aEvent);
 nsresult
 NS_NewDOMProgressEvent(nsIDOMEvent** aInstancePtrResult,
                        mozilla::dom::EventTarget* aOwner,
                        nsPresContext* aPresContext,
-                       class nsEvent* aEvent);
+                       nsEvent* aEvent);
 // This empties aInvalidateRequests.
 nsresult
 NS_NewDOMNotifyPaintEvent(nsIDOMEvent** aResult,
                           mozilla::dom::EventTarget* aOwner,
                           nsPresContext* aPresContext,
                           nsEvent* aEvent,
                           uint32_t aEventType = 0,
                           nsInvalidateRequestList* aInvalidateRequests = nullptr);
@@ -350,37 +350,37 @@ NS_NewDOMAudioAvailableEvent(nsIDOMEvent
                              uint32_t aEventType = 0,
                              float* aFrameBuffer = nullptr,
                              uint32_t aFrameBufferLength = 0,
                              float aTime = 0);
 nsresult
 NS_NewDOMSimpleGestureEvent(nsIDOMEvent** aInstancePtrResult,
                             mozilla::dom::EventTarget* aOwner,
                             nsPresContext* aPresContext,
-                            class nsSimpleGestureEvent* aEvent);
+                            nsSimpleGestureEvent* aEvent);
 nsresult
 NS_NewDOMScrollAreaEvent(nsIDOMEvent** aInstancePtrResult,
                          mozilla::dom::EventTarget* aOwner,
                          nsPresContext* aPresContext,
-                         class nsScrollAreaEvent* aEvent);
+                         nsScrollAreaEvent* aEvent);
 nsresult
 NS_NewDOMTransitionEvent(nsIDOMEvent** aInstancePtrResult,
                          mozilla::dom::EventTarget* aOwner,
                          nsPresContext* aPresContext,
-                         class nsTransitionEvent* aEvent);
+                         nsTransitionEvent* aEvent);
 nsresult
 NS_NewDOMAnimationEvent(nsIDOMEvent** aInstancePtrResult,
                         mozilla::dom::EventTarget* aOwner,
                         nsPresContext* aPresContext,
-                        class nsAnimationEvent* aEvent);
+                        nsAnimationEvent* aEvent);
 nsresult
 NS_NewDOMTouchEvent(nsIDOMEvent** aInstancePtrResult,
                     mozilla::dom::EventTarget* aOwner,
                     nsPresContext* aPresContext,
-                    class nsTouchEvent* aEvent);
+                    nsTouchEvent* aEvent);
 nsresult
 NS_NewDOMMozSettingsEvent(nsIDOMEvent** aInstancePtrResult,
                           mozilla::dom::EventTarget* aOwner,
                           nsPresContext* aPresContext,
                           nsEvent* aEvent);
 nsresult
 NS_NewDOMMozApplicationEvent(nsIDOMEvent** aInstancePtrResult,
                              mozilla::dom::EventTarget* aOwner,
--- a/js/xpconnect/src/event_impl_gen.py
+++ b/js/xpconnect/src/event_impl_gen.py
@@ -63,29 +63,29 @@ def getBaseName(iface):
         basename = "nsDOMEvent"
     return basename
 
 def print_header_file(fd, conf):
     fd.write("#ifndef _gen_mozilla_idl_generated_events_h_\n"
              "#define _gen_mozilla_idl_generated_events_h_\n\n")
     fd.write("/* THIS FILE IS AUTOGENERATED - DO NOT EDIT */\n")
     fd.write("#include \"nscore.h\"\n")
-    fd.write("class nsEvent;\n")
     fd.write("class nsIDOMEvent;\n")
     fd.write("class nsPresContext;\n")
     fd.write("namespace mozilla {\n");
+    fd.write("class WidgetEvent;\n")
     fd.write("namespace dom {\n");
     fd.write("class EventTarget;\n")
     fd.write("}\n");
     fd.write("}\n\n");
     for e in conf.simple_events:
         fd.write("nsresult\n")
         fd.write("NS_NewDOM%s(nsIDOMEvent** aInstance, " % e)
         fd.write("mozilla::dom::EventTarget* aOwner, ")
-        fd.write("nsPresContext* aPresContext, nsEvent* aEvent);\n")
+        fd.write("nsPresContext* aPresContext, mozilla::WidgetEvent* aEvent);\n")
  
     fd.write("\n#endif\n")
 
 def print_classes_file(fd, conf):
     fd.write("#ifndef _gen_mozilla_idl_generated_event_declarations_h_\n")
     fd.write("#define _gen_mozilla_idl_generated_event_declarations_h_\n\n")
 
     fd.write("#include \"nsDOMEvent.h\"\n");
@@ -145,17 +145,17 @@ def print_class_declaration(eventname, i
             if isinstance(member, xpidl.Attribute):
                 allattributes.append(member)
     allattributes.extend(attributes);
 
     fd.write("\nclass %s : public %s, public %s\n" % (classname, basename, iface.name))
     fd.write("{\n")
     fd.write("public:\n")
     fd.write("  %s(mozilla::dom::EventTarget* aOwner, " % classname)
-    fd.write("nsPresContext* aPresContext = nullptr, nsEvent* aEvent = nullptr);\n");
+    fd.write("nsPresContext* aPresContext = nullptr, mozilla::WidgetEvent* aEvent = nullptr);\n");
     fd.write("  virtual ~%s();\n\n" % classname)
     fd.write("  NS_DECL_ISUPPORTS_INHERITED\n")
     fd.write("  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(%s, %s)\n" % (classname, basename))
     fd.write("  NS_FORWARD_TO_NSDOMEVENT\n")
 
     for baseiface in baseinterfaces:
         baseimpl = ("%s" % baseiface.name[6:])
         if (baseimpl == "Event"):
@@ -370,17 +370,17 @@ def write_cpp(eventname, iface, fd, conf
     allattributes = []
     allattributes.extend(baseattributes);
     allattributes.extend(attributes);
 
     fd.write("namespace mozilla {\n")
     fd.write("namespace dom {\n\n")
 
     fd.write("%s::%s(mozilla::dom::EventTarget* aOwner, " % (classname, classname))
-    fd.write("nsPresContext* aPresContext, nsEvent* aEvent)\n");
+    fd.write("nsPresContext* aPresContext, mozilla::WidgetEvent* aEvent)\n");
     fd.write(": %s(aOwner, aPresContext, aEvent)" % basename)
     for a in attributes:
         fd.write(",\n  m%s(%s)" % (firstCap(a.name), init_value(a)))
     fd.write("\n{\n")
     fd.write("}\n\n")
 
     fd.write("%s::~%s() {}\n\n" % (classname, classname))
 
@@ -482,17 +482,17 @@ def write_cpp(eventname, iface, fd, conf
     for a in attributes:
         writeAttributeGetter(fd, classname, a)
 
     fd.write("} // namespace dom\n")
     fd.write("} // namespace mozilla\n\n")
 
     fd.write("nsresult\n")
     fd.write("NS_NewDOM%s(nsIDOMEvent** aInstance, "  % eventname)
-    fd.write("mozilla::dom::EventTarget* aOwner, nsPresContext* aPresContext = nullptr, nsEvent* aEvent = nullptr)\n")
+    fd.write("mozilla::dom::EventTarget* aOwner, nsPresContext* aPresContext = nullptr, mozilla::WidgetEvent* aEvent = nullptr)\n")
     fd.write("{\n")
     fd.write("  mozilla::dom::%s* it = new mozilla::dom::%s(aOwner, aPresContext, aEvent);\n" % (classname, classname))
     fd.write("  return CallQueryInterface(it, aInstance);\n")
     fd.write("}\n\n")
 
 def toWebIDLType(attribute, inType=False, onlyInterface=False):
     if attribute.type == "nsIVariant":
         return "any";
new file mode 100644
--- /dev/null
+++ b/widget/BasicEvents.h
@@ -0,0 +1,904 @@
+/* -*- 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 mozilla_BasicEvents_h__
+#define mozilla_BasicEvents_h__
+
+#include <stdint.h>
+
+#include "mozilla/dom/EventTarget.h"
+#include "nsCOMPtr.h"
+#include "nsIAtom.h"
+#include "nsIWidget.h"
+#include "nsString.h"
+#include "nsTraceRefcnt.h"
+#include "Units.h"
+
+/******************************************************************************
+ * Event Struct Types
+ *
+ * TODO: Move it into mozilla namespace.
+ ******************************************************************************/
+enum nsEventStructType
+{
+  // BasicEvents.h
+  NS_EVENT,                          // WidgetEvent
+  NS_GUI_EVENT,                      // WidgetGUIEvent
+  NS_INPUT_EVENT,                    // WidgetInputEvent
+  NS_UI_EVENT,                       // InternalUIEvent
+
+  // Mouse related events
+  NS_MOUSE_EVENT,                    // nsMouseEvent
+  NS_MOUSE_SCROLL_EVENT,             // nsMouseScrollEvent
+  NS_DRAG_EVENT,                     // nsDragEvent
+  NS_WHEEL_EVENT,                    // 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_SCROLLPORT_EVENT,               // nsScrollPortEvent
+  NS_SCROLLAREA_EVENT,               // nsScrollAreaEvent
+
+  // DOM events
+  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,                  // GUIEvent
+  NS_SMIL_TIME_EVENT,                // UIEvent
+
+  // 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
+};
+
+/******************************************************************************
+ * Messages
+ *
+ * TODO: Make them enum.
+ ******************************************************************************/
+
+#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 Event::refPoint.
+#define NS_QUERY_CHARACTER_AT_POINT     (NS_QUERY_CONTENT_EVENT_START + 8)
+// Query if the DOM element under Event::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
+
+namespace mozilla {
+
+/******************************************************************************
+ * mozilla::BaseEventFlags
+ *
+ * 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::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;
+  }
+};
+
+/******************************************************************************
+ * mozilla::EventFlags
+ ******************************************************************************/
+
+struct EventFlags : public BaseEventFlags
+{
+  EventFlags()
+  {
+    Clear();
+  }
+};
+
+/******************************************************************************
+ * mozilla::WidgetEvent
+ ******************************************************************************/
+
+class WidgetEvent
+{
+protected:
+  WidgetEvent(bool aIsTrusted, uint32_t aMessage,
+              nsEventStructType aStructType) :
+    eventStructType(aStructType), message(aMessage), refPoint(0, 0),
+    lastRefPoint(0, 0), time(0), userType(0)
+  {
+    MOZ_COUNT_CTOR(WidgetEvent);
+    mFlags.Clear();
+    mFlags.mIsTrusted = aIsTrusted;
+    mFlags.mCancelable = true;
+    mFlags.mBubbles = true;
+  }
+
+  WidgetEvent()
+  {
+    MOZ_COUNT_CTOR(WidgetEvent);
+  }
+
+public:
+  WidgetEvent(bool aIsTrusted, uint32_t aMessage) :
+    eventStructType(NS_EVENT), message(aMessage), refPoint(0, 0),
+    lastRefPoint(0, 0), time(0), userType(0)
+  {
+    MOZ_COUNT_CTOR(WidgetEvent);
+    mFlags.Clear();
+    mFlags.mIsTrusted = aIsTrusted;
+    mFlags.mCancelable = true;
+    mFlags.mBubbles = true;
+  }
+
+  ~WidgetEvent()
+  {
+    MOZ_COUNT_DTOR(WidgetEvent);
+  }
+
+  WidgetEvent(const WidgetEvent& aOther)
+  {
+    MOZ_COUNT_CTOR(WidgetEvent);
+    *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.
+  LayoutDeviceIntPoint refPoint;
+  // The previous refPoint, if known, used to calculate mouse movement deltas.
+  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.
+  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<dom::EventTarget> target;
+  nsCOMPtr<dom::EventTarget> currentTarget;
+  nsCOMPtr<dom::EventTarget> originalTarget;
+
+  void AssignEventData(const WidgetEvent& 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;
+  }
+};
+
+/******************************************************************************
+ * mozilla::WidgetGUIEvent
+ ******************************************************************************/
+
+class WidgetGUIEvent : public WidgetEvent
+{
+protected:
+  WidgetGUIEvent(bool aIsTrusted, uint32_t aMessage, nsIWidget* aWidget,
+                 nsEventStructType aStructType) :
+    WidgetEvent(aIsTrusted, aMessage, aStructType),
+    widget(aWidget), pluginEvent(nullptr)
+  {
+  }
+
+  WidgetGUIEvent() :
+    pluginEvent(nullptr)
+  {
+  }
+
+public:
+  WidgetGUIEvent(bool aIsTrusted, uint32_t aMessage, nsIWidget* aWidget) :
+    WidgetEvent(aIsTrusted, aMessage, NS_GUI_EVENT),
+    widget(aWidget), pluginEvent(nullptr)
+  {
+  }
+
+  /// Originator of the event
+  nsCOMPtr<nsIWidget> widget;
+
+  /// Event for NPAPI plugin
+  void* pluginEvent;
+
+  void AssignGUIEventData(const WidgetGUIEvent& 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;
+  }
+};
+
+/******************************************************************************
+ * mozilla::Modifier
+ *
+ * All modifier keys should be defined here.  This is used for managing
+ * modifier states for DOM Level 3 or later.
+ ******************************************************************************/
+
+enum Modifier
+{
+  MODIFIER_ALT        = 0x0001,
+  MODIFIER_ALTGRAPH   = 0x0002,
+  MODIFIER_CAPSLOCK   = 0x0004,
+  MODIFIER_CONTROL    = 0x0008,
+  MODIFIER_FN         = 0x0010,
+  MODIFIER_META       = 0x0020,
+  MODIFIER_NUMLOCK    = 0x0040,
+  MODIFIER_SCROLLLOCK = 0x0080,
+  MODIFIER_SHIFT      = 0x0100,
+  MODIFIER_SYMBOLLOCK = 0x0200,
+  MODIFIER_OS         = 0x0400
+};
+
+/******************************************************************************
+ * Modifier key names.
+ ******************************************************************************/
+
+#define NS_DOM_KEYNAME_ALT        "Alt"
+#define NS_DOM_KEYNAME_ALTGRAPH   "AltGraph"
+#define NS_DOM_KEYNAME_CAPSLOCK   "CapsLock"
+#define NS_DOM_KEYNAME_CONTROL    "Control"
+#define NS_DOM_KEYNAME_FN         "Fn"
+#define NS_DOM_KEYNAME_META       "Meta"
+#define NS_DOM_KEYNAME_NUMLOCK    "NumLock"
+#define NS_DOM_KEYNAME_SCROLLLOCK "ScrollLock"
+#define NS_DOM_KEYNAME_SHIFT      "Shift"
+#define NS_DOM_KEYNAME_SYMBOLLOCK "SymbolLock"
+#define NS_DOM_KEYNAME_OS         "OS"
+
+/******************************************************************************
+ * mozilla::Modifiers
+ ******************************************************************************/
+
+typedef uint16_t Modifiers;
+
+/******************************************************************************
+ * mozilla::WidgetInputEvent
+ ******************************************************************************/
+
+class WidgetInputEvent : public WidgetGUIEvent
+{
+protected:
+  WidgetInputEvent(bool aIsTrusted, uint32_t aMessage, nsIWidget* aWidget,
+                   nsEventStructType aStructType) :
+    WidgetGUIEvent(aIsTrusted, aMessage, aWidget, aStructType),
+    modifiers(0)
+  {
+  }
+
+  WidgetInputEvent()
+  {
+  }
+
+public:
+  WidgetInputEvent(bool aIsTrusted, uint32_t aMessage, nsIWidget* aWidget) :
+    WidgetGUIEvent(aIsTrusted, aMessage, aWidget, NS_INPUT_EVENT),
+    modifiers(0)
+  {
+  }
+
+  // true indicates the shift key is down
+  bool IsShift() const
+  {
+    return ((modifiers & MODIFIER_SHIFT) != 0);
+  }
+  // true indicates the control key is down
+  bool IsControl() const
+  {
+    return ((modifiers & MODIFIER_CONTROL) != 0);
+  }
+  // true indicates the alt key is down
+  bool IsAlt() const
+  {
+    return ((modifiers & MODIFIER_ALT) != 0);
+  }
+  // true indicates the meta key is down (or, on Mac, the Command key)
+  bool IsMeta() const
+  {
+    return ((modifiers & 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 & 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 & MODIFIER_ALTGRAPH) != 0);
+  }
+  // true indeicates the CapLock LED is turn on.
+  bool IsCapsLocked() const
+  {
+    return ((modifiers & MODIFIER_CAPSLOCK) != 0);
+  }
+  // true indeicates the NumLock LED is turn on.
+  bool IsNumLocked() const
+  {
+    return ((modifiers & MODIFIER_NUMLOCK) != 0);
+  }
+  // true indeicates the ScrollLock LED is turn on.
+  bool IsScrollLocked() const
+  {
+    return ((modifiers & 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 & MODIFIER_FN) != 0);
+  }
+  // true indeicates the ScrollLock LED is turn on.
+  bool IsSymbolLocked() const
+  {
+    return ((modifiers & MODIFIER_SYMBOLLOCK) != 0);
+  }
+
+  void InitBasicModifiers(bool aCtrlKey,
+                          bool aAltKey,
+                          bool aShiftKey,
+                          bool aMetaKey)
+  {
+    modifiers = 0;
+    if (aCtrlKey) {
+      modifiers |= MODIFIER_CONTROL;
+    }
+    if (aAltKey) {
+      modifiers |= MODIFIER_ALT;
+    }
+    if (aShiftKey) {
+      modifiers |= MODIFIER_SHIFT;
+    }
+    if (aMetaKey) {
+      modifiers |= MODIFIER_META;
+    }
+  }
+
+  Modifiers modifiers;
+
+  void AssignInputEventData(const WidgetInputEvent& aEvent, bool aCopyTargets)
+  {
+    AssignGUIEventData(aEvent, aCopyTargets);
+
+    modifiers = aEvent.modifiers;
+  }
+};
+
+/******************************************************************************
+ * mozilla::InternalUIEvent
+ *
+ * XXX Why this inherits WidgetGUIEvent rather than WidgetEvent?
+ ******************************************************************************/
+
+class InternalUIEvent : public WidgetGUIEvent
+{
+public:
+  InternalUIEvent(bool aIsTrusted, uint32_t aMessage, int32_t aDetail) :
+    WidgetGUIEvent(aIsTrusted, aMessage, nullptr, NS_UI_EVENT),
+    detail(aDetail)
+  {
+  }
+
+  int32_t detail;
+
+  void AssignUIEventData(const InternalUIEvent& aEvent, bool aCopyTargets)
+  {
+    AssignGUIEventData(aEvent, aCopyTargets);
+
+    // detail must have been initialized with the constructor.
+  }
+};
+
+} // namespace mozilla
+
+// TODO: Remove following typedefs
+typedef mozilla::WidgetEvent      nsEvent;
+typedef mozilla::WidgetGUIEvent   nsGUIEvent;
+typedef mozilla::WidgetInputEvent nsInputEvent;
+typedef mozilla::InternalUIEvent  nsUIEvent;
+
+#endif // mozilla_BasicEvents_h__
--- a/widget/EventForwards.h
+++ b/widget/EventForwards.h
@@ -23,35 +23,16 @@ enum nsEventStatus
   // The event is consumed, don't do default processing
   nsEventStatus_eConsumeNoDefault,
   // The event is consumed, but do default processing
   nsEventStatus_eConsumeDoDefault
 };
 
 namespace mozilla {
 
-/**
- * All modifier keys should be defined here.  This is used for managing
- * modifier states for DOM Level 3 or later.
- */
-enum Modifier
-{
-  MODIFIER_ALT        = 0x0001,
-  MODIFIER_ALTGRAPH   = 0x0002,
-  MODIFIER_CAPSLOCK   = 0x0004,
-  MODIFIER_CONTROL    = 0x0008,
-  MODIFIER_FN         = 0x0010,
-  MODIFIER_META       = 0x0020,
-  MODIFIER_NUMLOCK    = 0x0040,
-  MODIFIER_SCROLLLOCK = 0x0080,
-  MODIFIER_SHIFT      = 0x0100,
-  MODIFIER_SYMBOLLOCK = 0x0200,
-  MODIFIER_OS         = 0x0400
-};
-
 typedef uint16_t Modifiers;
 
 #define NS_DEFINE_KEYNAME(aCPPName, aDOMKeyName) \
   KEY_NAME_INDEX_##aCPPName,
 
 enum KeyNameIndex
 {
 #include "nsDOMKeyNameList.h"
@@ -66,23 +47,23 @@ enum KeyNameIndex
 
 /**
  * All header files should include this header instead of *Events.h.
  */
 
 // BasicEvents.h
 namespace mozilla {
 struct EventFlags;
+
+class WidgetEvent;
+class WidgetGUIEvent;
+class WidgetInputEvent;
+class InternalUIEvent;
 } // namespace mozilla
 
-class nsEvent;
-class nsGUIEvent;
-class nsInputEvent;
-class nsUIEvent;
-
 // TextEvents.h
 struct nsAlternativeCharCode;
 struct nsTextRangeStyle;
 struct nsTextRange;
 
 class nsKeyEvent;
 class nsTextEvent;
 class nsCompositionEvent;
@@ -117,9 +98,15 @@ class nsAnimationEvent;
 // MiscEvents.h
 class nsCommandEvent;
 class nsContentCommandEvent;
 class nsPluginEvent;
 
 // content/events/public/nsMutationEvent.h
 class nsMutationEvent;
 
+// TODO: Remove following typedefs
+typedef mozilla::WidgetEvent      nsEvent;
+typedef mozilla::WidgetGUIEvent   nsGUIEvent;
+typedef mozilla::WidgetInputEvent nsInputEvent;
+typedef mozilla::InternalUIEvent  nsUIEvent;
+
 #endif // mozilla_EventForwards_h__
--- a/widget/moz.build
+++ b/widget/moz.build
@@ -106,16 +106,17 @@ EXPORTS += [
     'nsIRollupListener.h',
     'nsIWidget.h',
     'nsIWidgetListener.h',
     'nsWidgetInitData.h',
     'nsWidgetsCID.h',
 ]
 
 EXPORTS.mozilla += [
+    'BasicEvents.h',
     'EventForwards.h',
     'LookAndFeel.h',
     'WidgetUtils.h',
 ]
 
 if CONFIG['MOZ_INSTRUMENT_EVENT_LOOP']:
     EXPORTS.mozilla += [
         'WidgetTraceEvent.h',
--- a/widget/nsGUIEvent.h
+++ b/widget/nsGUIEvent.h
@@ -1,38 +1,31 @@
 /* -*- 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/BasicEvents.h"
 #include "mozilla/MathAlgorithms.h"
 
 #include "nsPoint.h"
 #include "nsRect.h"
-#include "nsString.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/EventForwards.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;
@@ -40,722 +33,20 @@ namespace plugins {
 }
 
 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,                    // 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_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
-
-/**
- * Modifier key names.
- */
-#define NS_DOM_KEYNAME_ALT        "Alt"
-#define NS_DOM_KEYNAME_ALTGRAPH   "AltGraph"
-#define NS_DOM_KEYNAME_CAPSLOCK   "CapsLock"
-#define NS_DOM_KEYNAME_CONTROL    "Control"
-#define NS_DOM_KEYNAME_FN         "Fn"
-#define NS_DOM_KEYNAME_META       "Meta"
-#define NS_DOM_KEYNAME_NUMLOCK    "NumLock"
-#define NS_DOM_KEYNAME_SCROLLLOCK "ScrollLock"
-#define NS_DOM_KEYNAME_SHIFT      "Shift"
-#define NS_DOM_KEYNAME_SYMBOLLOCK "SymbolLock"
-#define NS_DOM_KEYNAME_OS         "OS"
-
-namespace mozilla {
-
-// 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::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 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::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),
@@ -822,128 +113,16 @@ public:
                                  bool aCopyTargets)
   {
     AssignGUIEventData(aEvent, aCopyTargets);
 
     mArea = aEvent.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::MODIFIER_SHIFT) != 0);
-  }
-  // true indicates the control key is down
-  bool IsControl() const
-  {
-    return ((modifiers & mozilla::MODIFIER_CONTROL) != 0);
-  }
-  // true indicates the alt key is down
-  bool IsAlt() const
-  {
-    return ((modifiers & mozilla::MODIFIER_ALT) != 0);
-  }
-  // true indicates the meta key is down (or, on Mac, the Command key)
-  bool IsMeta() const
-  {
-    return ((modifiers & mozilla::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::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::MODIFIER_ALTGRAPH) != 0);
-  }
-  // true indeicates the CapLock LED is turn on.
-  bool IsCapsLocked() const
-  {
-    return ((modifiers & mozilla::MODIFIER_CAPSLOCK) != 0);
-  }
-  // true indeicates the NumLock LED is turn on.
-  bool IsNumLocked() const
-  {
-    return ((modifiers & mozilla::MODIFIER_NUMLOCK) != 0);
-  }
-  // true indeicates the ScrollLock LED is turn on.
-  bool IsScrollLocked() const
-  {
-    return ((modifiers & mozilla::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::MODIFIER_FN) != 0);
-  }
-  // true indeicates the ScrollLock LED is turn on.
-  bool IsSymbolLocked() const
-  {
-    return ((modifiers & mozilla::MODIFIER_SYMBOLLOCK) != 0);
-  }
-
-  void InitBasicModifiers(bool aCtrlKey,
-                          bool aAltKey,
-                          bool aShiftKey,
-                          bool aMetaKey)
-  {
-    modifiers = 0;
-    if (aCtrlKey) {
-      modifiers |= mozilla::MODIFIER_CONTROL;
-    }
-    if (aAltKey) {
-      modifiers |= mozilla::MODIFIER_ALT;
-    }
-    if (aShiftKey) {
-      modifiers |= mozilla::MODIFIER_SHIFT;
-    }
-    if (aMetaKey) {
-      modifiers |= mozilla::MODIFIER_META;
-    }
-  }
-
-  mozilla::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;
@@ -1869,38 +1048,16 @@ public:
                                 bool aCopyTargets)
   {
     AssignEventData(aEvent, aCopyTargets);
 
     clipboardData = aEvent.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;
-
-  void AssignUIEventData(const nsUIEvent& aEvent, bool aCopyTargets)
-  {
-    AssignGUIEventData(aEvent, aCopyTargets);
-
-    // detail must have been initialized with the constructor.
-  }
-};
-
 class nsFocusEvent : public nsUIEvent
 {
 public:
   nsFocusEvent(bool isTrusted, uint32_t msg)
     : nsUIEvent(isTrusted, msg, 0),
       fromRaise(false),
       isRefocus(false)
   {