From 728e27ae6c03a19a43733e4609bf0d026e69b02f Mon Sep 17 00:00:00 2001 From: Masayuki Nakano Date: Thu, 22 May 2014 13:06:05 +0900 Subject: [PATCH] Bug 1009388 part.1 Support getModifierState("Accel") r=smaug --- dom/events/UIEvent.cpp | 3 + dom/events/test/mochitest.ini | 1 + .../test/test_accel_virtual_modifier.html | 90 +++++++++++++++++++ widget/BasicEvents.h | 14 +++ widget/shared/WidgetEventImpl.cpp | 36 ++++++++ 5 files changed, 144 insertions(+) create mode 100644 dom/events/test/test_accel_virtual_modifier.html diff --git a/dom/events/UIEvent.cpp b/dom/events/UIEvent.cpp index 7dd418fe17e..163353e4f17 100644 --- a/dom/events/UIEvent.cpp +++ b/dom/events/UIEvent.cpp @@ -456,6 +456,9 @@ UIEvent::GetModifierStateInternal(const nsAString& aKey) { WidgetInputEvent* inputEvent = mEvent->AsInputEvent(); MOZ_ASSERT(inputEvent, "mEvent must be WidgetInputEvent or derived class"); + if (aKey.EqualsLiteral("Accel")) { + return inputEvent->IsAccel(); + } if (aKey.EqualsLiteral(NS_DOM_KEYNAME_SHIFT)) { return inputEvent->IsShift(); } diff --git a/dom/events/test/mochitest.ini b/dom/events/test/mochitest.ini index 7129113b43e..e89c10fa835 100644 --- a/dom/events/test/mochitest.ini +++ b/dom/events/test/mochitest.ini @@ -13,6 +13,7 @@ support-files = window_bug659071.html window_wheel_default_action.html +[test_accel_virtual_modifier.html] [test_addEventListenerExtraArg.html] [test_all_synthetic_events.html] [test_bug226361.xhtml] diff --git a/dom/events/test/test_accel_virtual_modifier.html b/dom/events/test/test_accel_virtual_modifier.html new file mode 100644 index 00000000000..5e320b61f9e --- /dev/null +++ b/dom/events/test/test_accel_virtual_modifier.html @@ -0,0 +1,90 @@ + + + + Test for DOM "Accel" virtual modifier + + + + +

+ +
+
+
+ + diff --git a/widget/BasicEvents.h b/widget/BasicEvents.h index 0f4ec9102f8..d4010ee0f08 100644 --- a/widget/BasicEvents.h +++ b/widget/BasicEvents.h @@ -890,6 +890,7 @@ public: enum Modifier { + MODIFIER_NONE = 0x0000, MODIFIER_ALT = 0x0001, MODIFIER_ALTGRAPH = 0x0002, MODIFIER_CAPSLOCK = 0x0004, @@ -963,6 +964,19 @@ public: return result; } + + /** + * Returns a modifier of "Accel" virtual modifier which is used for shortcut + * key. + */ + static Modifier AccelModifier(); + + // true indicates the accel key on the environment is down + bool IsAccel() const + { + return ((modifiers & AccelModifier()) != 0); + } + // true indicates the shift key is down bool IsShift() const { diff --git a/widget/shared/WidgetEventImpl.cpp b/widget/shared/WidgetEventImpl.cpp index ab8293dbca6..0c142534008 100644 --- a/widget/shared/WidgetEventImpl.cpp +++ b/widget/shared/WidgetEventImpl.cpp @@ -8,6 +8,7 @@ #include "mozilla/InternalMutationEvent.h" #include "mozilla/MiscEvents.h" #include "mozilla/MouseEvents.h" +#include "mozilla/Preferences.h" #include "mozilla/TextEvents.h" #include "mozilla/TouchEvents.h" @@ -244,6 +245,41 @@ WidgetEvent::IsAllowedToDispatchDOMEvent() const } } +/****************************************************************************** + * mozilla::WidgetInputEvent + ******************************************************************************/ + +/* static */ +Modifier +WidgetInputEvent::AccelModifier() +{ + static Modifier sAccelModifier = MODIFIER_NONE; + if (sAccelModifier == MODIFIER_NONE) { + switch (Preferences::GetInt("ui.key.accelKey", 0)) { + case nsIDOMKeyEvent::DOM_VK_META: + sAccelModifier = MODIFIER_META; + break; + case nsIDOMKeyEvent::DOM_VK_WIN: + sAccelModifier = MODIFIER_OS; + break; + case nsIDOMKeyEvent::DOM_VK_ALT: + sAccelModifier = MODIFIER_ALT; + break; + case nsIDOMKeyEvent::DOM_VK_CONTROL: + sAccelModifier = MODIFIER_CONTROL; + break; + default: +#ifdef XP_MACOSX + sAccelModifier = MODIFIER_META; +#else + sAccelModifier = MODIFIER_CONTROL; +#endif + break; + } + } + return sAccelModifier; +} + /****************************************************************************** * mozilla::WidgetKeyboardEvent (TextEvents.h) ******************************************************************************/