diff options
Diffstat (limited to 'widget/EventForwards.h')
-rw-r--r-- | widget/EventForwards.h | 497 |
1 files changed, 497 insertions, 0 deletions
diff --git a/widget/EventForwards.h b/widget/EventForwards.h new file mode 100644 index 0000000000..e6a1ad6274 --- /dev/null +++ b/widget/EventForwards.h @@ -0,0 +1,497 @@ +/* -*- 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_EventForwards_h__ +#define mozilla_EventForwards_h__ + +#include <stdint.h> + +#include "nsStringFwd.h" +#include "nsTArray.h" + +#ifdef DEBUG +# include "mozilla/StaticPrefs_dom.h" +#endif // #ifdef DEBUG + +class nsCommandParams; + +/** + * XXX Following enums should be in BasicEvents.h. However, currently, it's + * impossible to use foward delearation for enum. + */ + +/** + * Return status for event processors. + */ +enum nsEventStatus { + // The event is ignored, do default processing + nsEventStatus_eIgnore, + // The event is consumed, don't do default processing + nsEventStatus_eConsumeNoDefault, + // The event is consumed, but do default processing + nsEventStatus_eConsumeDoDefault, + // Value is not for use, only for serialization + nsEventStatus_eSentinel +}; + +namespace mozilla { + +enum class CanBubble { eYes, eNo }; + +enum class Cancelable { eYes, eNo }; + +enum class ChromeOnlyDispatch { eYes, eNo }; + +enum class Trusted { eYes, eNo }; + +enum class Composed { eYes, eNo, eDefault }; + +/** + * Event messages + */ + +typedef uint16_t EventMessageType; + +enum EventMessage : EventMessageType { + +#define NS_EVENT_MESSAGE(aMessage) aMessage, +#define NS_EVENT_MESSAGE_FIRST_LAST(aMessage, aFirst, aLast) \ + aMessage##First = aFirst, aMessage##Last = aLast, + +#include "mozilla/EventMessageList.h" + +#undef NS_EVENT_MESSAGE +#undef NS_EVENT_MESSAGE_FIRST_LAST + + // For preventing bustage due to "," after the last item. + eEventMessage_MaxValue +}; + +const char* ToChar(EventMessage aEventMessage); + +/** + * Event class IDs + */ + +typedef uint8_t EventClassIDType; + +enum EventClassID : EventClassIDType { +// The event class name will be: +// eBasicEventClass for WidgetEvent +// eFooEventClass for WidgetFooEvent or InternalFooEvent +#define NS_ROOT_EVENT_CLASS(aPrefix, aName) eBasic##aName##Class +#define NS_EVENT_CLASS(aPrefix, aName) , e##aName##Class + +#include "mozilla/EventClassList.h" + +#undef NS_EVENT_CLASS +#undef NS_ROOT_EVENT_CLASS +}; + +const char* ToChar(EventClassID aEventClassID); + +typedef uint16_t Modifiers; + +#define NS_DEFINE_KEYNAME(aCPPName, aDOMKeyName) KEY_NAME_INDEX_##aCPPName, + +typedef uint16_t KeyNameIndexType; +enum KeyNameIndex : KeyNameIndexType { +#include "mozilla/KeyNameList.h" + // If a DOM keyboard event is synthesized by script, this is used. Then, + // specified key name should be stored and use it as .key value. + KEY_NAME_INDEX_USE_STRING +}; + +#undef NS_DEFINE_KEYNAME + +const nsCString ToString(KeyNameIndex aKeyNameIndex); + +#define NS_DEFINE_PHYSICAL_KEY_CODE_NAME(aCPPName, aDOMCodeName) \ + CODE_NAME_INDEX_##aCPPName, + +typedef uint8_t CodeNameIndexType; +enum CodeNameIndex : CodeNameIndexType { +#include "mozilla/PhysicalKeyCodeNameList.h" + // If a DOM keyboard event is synthesized by script, this is used. Then, + // specified code name should be stored and use it as .code value. + CODE_NAME_INDEX_USE_STRING +}; + +#undef NS_DEFINE_PHYSICAL_KEY_CODE_NAME + +const nsCString ToString(CodeNameIndex aCodeNameIndex); + +#define NS_DEFINE_INPUTTYPE(aCPPName, aDOMName) e##aCPPName, + +typedef uint8_t EditorInputTypeType; +enum class EditorInputType : EditorInputTypeType { +#include "mozilla/InputTypeList.h" + // If a DOM input event is synthesized by script, this is used. Then, + // specified input type should be stored as string and use it as .inputType + // value. + eUnknown, +}; + +#undef NS_DEFINE_INPUTTYPE + +inline bool ExposesClipboardDataOrDataTransfer(EditorInputType aInputType) { + switch (aInputType) { + case EditorInputType::eInsertFromPaste: + case EditorInputType::eInsertFromPasteAsQuotation: + return true; + default: + return false; + } +} + +/** + * IsDataAvailableOnTextEditor() returns true if aInputType on TextEditor + * should have non-null InputEvent.data value. + */ +inline bool IsDataAvailableOnTextEditor(EditorInputType aInputType) { + switch (aInputType) { + case EditorInputType::eInsertText: + case EditorInputType::eInsertCompositionText: + case EditorInputType::eInsertFromComposition: // Only level 2 + case EditorInputType::eInsertFromPaste: + case EditorInputType::eInsertFromPasteAsQuotation: + case EditorInputType::eInsertTranspose: + case EditorInputType::eInsertFromDrop: + case EditorInputType::eInsertReplacementText: + case EditorInputType::eInsertFromYank: + case EditorInputType::eFormatSetBlockTextDirection: + case EditorInputType::eFormatSetInlineTextDirection: + return true; + default: + return false; + } +} + +/** + * IsDataAvailableOnHTMLEditor() returns true if aInputType on HTMLEditor + * should have non-null InputEvent.data value. + */ +inline bool IsDataAvailableOnHTMLEditor(EditorInputType aInputType) { + switch (aInputType) { + case EditorInputType::eInsertText: + case EditorInputType::eInsertCompositionText: + case EditorInputType::eInsertFromComposition: // Only level 2 + case EditorInputType::eFormatSetBlockTextDirection: + case EditorInputType::eFormatSetInlineTextDirection: + case EditorInputType::eInsertLink: + case EditorInputType::eFormatBackColor: + case EditorInputType::eFormatFontColor: + case EditorInputType::eFormatFontName: + return true; + default: + return false; + } +} + +/** + * IsDataTransferAvailableOnHTMLEditor() returns true if aInputType on + * HTMLEditor should have non-null InputEvent.dataTransfer value. + */ +inline bool IsDataTransferAvailableOnHTMLEditor(EditorInputType aInputType) { + switch (aInputType) { + case EditorInputType::eInsertFromPaste: + case EditorInputType::eInsertFromPasteAsQuotation: + case EditorInputType::eInsertFromDrop: + case EditorInputType::eInsertTranspose: + case EditorInputType::eInsertReplacementText: + case EditorInputType::eInsertFromYank: + return true; + default: + return false; + } +} + +/** + * MayHaveTargetRangesOnHTMLEditor() returns true if "beforeinput" event whose + * whose inputType is aInputType on HTMLEditor may return non-empty static + * range array from getTargetRanges(). + * Note that TextEditor always sets empty array. Therefore, there is no + * method for TextEditor. + */ +inline bool MayHaveTargetRangesOnHTMLEditor(EditorInputType aInputType) { + switch (aInputType) { + // Explicitly documented by the specs. + case EditorInputType::eHistoryRedo: + case EditorInputType::eHistoryUndo: + // Not documented, but other browsers use empty array. + case EditorInputType::eFormatSetBlockTextDirection: + return false; + default: + return true; + } +} + +/** + * IsCancelableBeforeInputEvent() returns true if `beforeinput` event for + * aInputType should be cancelable. + * + * Input Events Level 1: + * https://rawgit.com/w3c/input-events/v1/index.html#x5-1-2-attributes + * Input Events Level 2: + * https://w3c.github.io/input-events/#interface-InputEvent-Attributes + */ +inline bool IsCancelableBeforeInputEvent(EditorInputType aInputType) { + switch (aInputType) { + case EditorInputType::eInsertText: + return true; // In Level 1, undefined. + case EditorInputType::eInsertReplacementText: + return true; // In Level 1, undefined. + case EditorInputType::eInsertLineBreak: + return true; // In Level 1, undefined. + case EditorInputType::eInsertParagraph: + return true; // In Level 1, undefined. + case EditorInputType::eInsertOrderedList: + return true; + case EditorInputType::eInsertUnorderedList: + return true; + case EditorInputType::eInsertHorizontalRule: + return true; + case EditorInputType::eInsertFromYank: + return true; + case EditorInputType::eInsertFromDrop: + return true; + case EditorInputType::eInsertFromPaste: + return true; + case EditorInputType::eInsertFromPasteAsQuotation: + return true; + case EditorInputType::eInsertTranspose: + return true; + case EditorInputType::eInsertCompositionText: + return false; + case EditorInputType::eInsertFromComposition: + MOZ_ASSERT(!StaticPrefs::dom_input_events_conform_to_level_1()); + return true; + case EditorInputType::eInsertLink: + return true; + case EditorInputType::eDeleteByComposition: + MOZ_ASSERT(!StaticPrefs::dom_input_events_conform_to_level_1()); + return true; + case EditorInputType::eDeleteCompositionText: + MOZ_ASSERT(!StaticPrefs::dom_input_events_conform_to_level_1()); + return false; + case EditorInputType::eDeleteWordBackward: + return true; // In Level 1, undefined. + case EditorInputType::eDeleteWordForward: + return true; // In Level 1, undefined. + case EditorInputType::eDeleteSoftLineBackward: + return true; // In Level 1, undefined. + case EditorInputType::eDeleteSoftLineForward: + return true; // In Level 1, undefined. + case EditorInputType::eDeleteEntireSoftLine: + return true; // In Level 1, undefined. + case EditorInputType::eDeleteHardLineBackward: + return true; // In Level 1, undefined. + case EditorInputType::eDeleteHardLineForward: + return true; // In Level 1, undefined. + case EditorInputType::eDeleteByDrag: + return true; + case EditorInputType::eDeleteByCut: + return true; + case EditorInputType::eDeleteContent: + return true; // In Level 1, undefined. + case EditorInputType::eDeleteContentBackward: + return true; // In Level 1, undefined. + case EditorInputType::eDeleteContentForward: + return true; // In Level 1, undefined. + case EditorInputType::eHistoryUndo: + return true; + case EditorInputType::eHistoryRedo: + return true; + case EditorInputType::eFormatBold: + return true; + case EditorInputType::eFormatItalic: + return true; + case EditorInputType::eFormatUnderline: + return true; + case EditorInputType::eFormatStrikeThrough: + return true; + case EditorInputType::eFormatSuperscript: + return true; + case EditorInputType::eFormatSubscript: + return true; + case EditorInputType::eFormatJustifyFull: + return true; + case EditorInputType::eFormatJustifyCenter: + return true; + case EditorInputType::eFormatJustifyRight: + return true; + case EditorInputType::eFormatJustifyLeft: + return true; + case EditorInputType::eFormatIndent: + return true; + case EditorInputType::eFormatOutdent: + return true; + case EditorInputType::eFormatRemove: + return true; + case EditorInputType::eFormatSetBlockTextDirection: + return true; + case EditorInputType::eFormatSetInlineTextDirection: + return true; + case EditorInputType::eFormatBackColor: + return true; + case EditorInputType::eFormatFontColor: + return true; + case EditorInputType::eFormatFontName: + return true; + case EditorInputType::eUnknown: + // This is not declared by Input Events, but it does not make sense to + // allow web apps to cancel default action without inputType value check. + // If some our specific edit actions should be cancelable, new inputType + // value for them should be declared by the spec. + return false; + default: + MOZ_ASSERT_UNREACHABLE("The new input type is not handled"); + return false; + } +} + +#define NS_DEFINE_COMMAND(aName, aCommandStr) , aName +#define NS_DEFINE_COMMAND_WITH_PARAM(aName, aCommandStr, aParam) , aName +#define NS_DEFINE_COMMAND_NO_EXEC_COMMAND(aName) , aName + +typedef uint8_t CommandInt; +enum class Command : CommandInt { + DoNothing + +#include "mozilla/CommandList.h" +}; +#undef NS_DEFINE_COMMAND +#undef NS_DEFINE_COMMAND_WITH_PARAM +#undef NS_DEFINE_COMMAND_NO_EXEC_COMMAND + +const char* ToChar(Command aCommand); + +/** + * Return a command value for aCommandName. + * XXX: Is there a better place to put `Command` related methods instead of + * global scope in `mozilla` namespace? + * + * @param aCommandName Should be a XUL command name like "cmd_bold" + * (case sensitive). + * @param aCommandparams Additional parameter value of aCommandName. + * Can be nullptr, but if aCommandName requires + * additional parameter and sets this to nullptr, + * will return Command::DoNothing with warning. + */ +Command GetInternalCommand(const char* aCommandName, + const nsCommandParams* aCommandParams = nullptr); + +} // namespace mozilla + +/** + * All header files should include this header instead of *Events.h. + */ + +namespace mozilla { + +template <class T> +class OwningNonNull; + +namespace dom { +class StaticRange; +} + +#define NS_EVENT_CLASS(aPrefix, aName) class aPrefix##aName; +#define NS_ROOT_EVENT_CLASS(aPrefix, aName) NS_EVENT_CLASS(aPrefix, aName) + +#include "mozilla/EventClassList.h" + +#undef NS_EVENT_CLASS +#undef NS_ROOT_EVENT_CLASS + +// BasicEvents.h +struct BaseEventFlags; +struct EventFlags; + +class WidgetEventTime; + +// TextEvents.h +enum class AccessKeyType; + +struct AlternativeCharCode; +struct ShortcutKeyCandidate; + +typedef nsTArray<ShortcutKeyCandidate> ShortcutKeyCandidateArray; +typedef AutoTArray<ShortcutKeyCandidate, 10> AutoShortcutKeyCandidateArray; + +// TextRange.h +typedef uint8_t RawTextRangeType; +enum class TextRangeType : RawTextRangeType; + +struct TextRangeStyle; +struct TextRange; + +class EditCommands; +class TextRangeArray; + +typedef nsTArray<OwningNonNull<dom::StaticRange>> OwningNonNullStaticRangeArray; + +// FontRange.h +struct FontRange; + +enum MouseButton : int16_t { + eNotPressed = -1, + ePrimary = 0, + eMiddle = 1, + eSecondary = 2, + eX1 = 3, // Typically, "back" button + eX2 = 4, // Typically, "forward" button + eEraser = 5 +}; + +enum MouseButtonsFlag { + eNoButtons = 0x00, + ePrimaryFlag = 0x01, + eSecondaryFlag = 0x02, + eMiddleFlag = 0x04, + // typicall, "back" button being left side of 5-button + // mice, see "buttons" attribute document of DOM3 Events. + e4thFlag = 0x08, + // typicall, "forward" button being right side of 5-button + // mice, see "buttons" attribute document of DOM3 Events. + e5thFlag = 0x10, + eEraserFlag = 0x20 +}; + +/** + * Returns a MouseButtonsFlag value which is changed by a button state change + * event whose mButton is aMouseButton. + */ +inline MouseButtonsFlag MouseButtonsFlagToChange(MouseButton aMouseButton) { + switch (aMouseButton) { + case MouseButton::ePrimary: + return MouseButtonsFlag::ePrimaryFlag; + case MouseButton::eMiddle: + return MouseButtonsFlag::eMiddleFlag; + case MouseButton::eSecondary: + return MouseButtonsFlag::eSecondaryFlag; + case MouseButton::eX1: + return MouseButtonsFlag::e4thFlag; + case MouseButton::eX2: + return MouseButtonsFlag::e5thFlag; + case MouseButton::eEraser: + return MouseButtonsFlag::eEraserFlag; + default: + return MouseButtonsFlag::eNoButtons; + } +} + +enum class TextRangeType : RawTextRangeType; + +// IMEData.h + +template <typename IntType> +class StartAndEndOffsets; +template <typename IntType> +class OffsetAndData; + +} // namespace mozilla + +#endif // mozilla_EventForwards_h__ |