From 4d0475c9ce9d0a7695f5f5aa7901a6750fce7260 Mon Sep 17 00:00:00 2001 From: Jeremy Rose Date: Wed, 14 Jul 2021 04:50:02 -0700 Subject: [PATCH] feat: expose location and modifiers on before-input-event (#29850) * feat: expose location and modifiers on before-input-event * lint --- docs/api/web-contents.md | 2 + .../common/gin_converters/blink_converter.cc | 79 +++++++++++++++++++ shell/common/gin_converters/blink_converter.h | 2 + .../gin_converters/content_converter.cc | 20 +---- 4 files changed, 84 insertions(+), 19 deletions(-) diff --git a/docs/api/web-contents.md b/docs/api/web-contents.md index 9e0e6e00669..b61984607cc 100644 --- a/docs/api/web-contents.md +++ b/docs/api/web-contents.md @@ -449,6 +449,8 @@ Returns: * `control` Boolean - Equivalent to [KeyboardEvent.controlKey][keyboardevent]. * `alt` Boolean - Equivalent to [KeyboardEvent.altKey][keyboardevent]. * `meta` Boolean - Equivalent to [KeyboardEvent.metaKey][keyboardevent]. + * `location` Number - Equivalent to [KeyboardEvent.location][keyboardevent]. + * `modifiers` String[] - See [InputEvent.modifiers](structures/input-event.md). Emitted before dispatching the `keydown` and `keyup` events in the page. Calling `event.preventDefault` will prevent the page `keydown`/`keyup` events diff --git a/shell/common/gin_converters/blink_converter.cc b/shell/common/gin_converters/blink_converter.cc index 184ea4230c8..68ba0307dc0 100644 --- a/shell/common/gin_converters/blink_converter.cc +++ b/shell/common/gin_converters/blink_converter.cc @@ -144,10 +144,44 @@ struct Converter { *out = blink::WebInputEvent::Modifiers::kIsLeft; else if (modifier == "right") *out = blink::WebInputEvent::Modifiers::kIsRight; + // TODO(nornagon): the rest of the modifiers return true; } }; +std::vector ModifiersToArray(int modifiers) { + using Modifiers = blink::WebInputEvent::Modifiers; + std::vector modifier_strings; + if (modifiers & Modifiers::kShiftKey) + modifier_strings.push_back("shift"); + if (modifiers & Modifiers::kControlKey) + modifier_strings.push_back("control"); + if (modifiers & Modifiers::kAltKey) + modifier_strings.push_back("alt"); + if (modifiers & Modifiers::kMetaKey) + modifier_strings.push_back("meta"); + if (modifiers & Modifiers::kIsKeyPad) + modifier_strings.push_back("iskeypad"); + if (modifiers & Modifiers::kIsAutoRepeat) + modifier_strings.push_back("isautorepeat"); + if (modifiers & Modifiers::kLeftButtonDown) + modifier_strings.push_back("leftbuttondown"); + if (modifiers & Modifiers::kMiddleButtonDown) + modifier_strings.push_back("middlebuttondown"); + if (modifiers & Modifiers::kRightButtonDown) + modifier_strings.push_back("rightbuttondown"); + if (modifiers & Modifiers::kCapsLockOn) + modifier_strings.push_back("capslock"); + if (modifiers & Modifiers::kNumLockOn) + modifier_strings.push_back("numlock"); + if (modifiers & Modifiers::kIsLeft) + modifier_strings.push_back("left"); + if (modifiers & Modifiers::kIsRight) + modifier_strings.push_back("right"); + // TODO(nornagon): the rest of the modifiers + return modifier_strings; +} + blink::WebInputEvent::Type GetWebInputEventType(v8::Isolate* isolate, v8::Local val) { blink::WebInputEvent::Type type = blink::WebInputEvent::Type::kUndefined; @@ -219,6 +253,51 @@ bool Converter::FromV8(v8::Isolate* isolate, return true; } +int GetKeyLocationCode(const blink::WebInputEvent& key) { + // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/events/keyboard_event.h;l=46;drc=1ff6437e65b183e673b7b4f25060b74dc2ba5c37 + enum KeyLocationCode { + kDomKeyLocationStandard = 0x00, + kDomKeyLocationLeft = 0x01, + kDomKeyLocationRight = 0x02, + kDomKeyLocationNumpad = 0x03 + }; + using Modifiers = blink::WebInputEvent::Modifiers; + if (key.GetModifiers() & Modifiers::kIsKeyPad) + return kDomKeyLocationNumpad; + if (key.GetModifiers() & Modifiers::kIsLeft) + return kDomKeyLocationLeft; + if (key.GetModifiers() & Modifiers::kIsRight) + return kDomKeyLocationRight; + return kDomKeyLocationStandard; +} + +v8::Local Converter::ToV8( + v8::Isolate* isolate, + const blink::WebKeyboardEvent& in) { + gin_helper::Dictionary dict = gin::Dictionary::CreateEmpty(isolate); + + if (in.GetType() == blink::WebInputEvent::Type::kRawKeyDown) + dict.Set("type", "keyDown"); + else if (in.GetType() == blink::WebInputEvent::Type::kKeyUp) + dict.Set("type", "keyUp"); + dict.Set("key", ui::KeycodeConverter::DomKeyToKeyString(in.dom_key)); + dict.Set("code", ui::KeycodeConverter::DomCodeToCodeString( + static_cast(in.dom_code))); + + using Modifiers = blink::WebInputEvent::Modifiers; + dict.Set("isAutoRepeat", (in.GetModifiers() & Modifiers::kIsAutoRepeat) != 0); + dict.Set("isComposing", (in.GetModifiers() & Modifiers::kIsComposing) != 0); + dict.Set("shift", (in.GetModifiers() & Modifiers::kShiftKey) != 0); + dict.Set("control", (in.GetModifiers() & Modifiers::kControlKey) != 0); + dict.Set("alt", (in.GetModifiers() & Modifiers::kAltKey) != 0); + dict.Set("meta", (in.GetModifiers() & Modifiers::kMetaKey) != 0); + dict.Set("location", GetKeyLocationCode(in)); + dict.Set("_modifiers", in.GetModifiers()); + dict.Set("modifiers", ModifiersToArray(in.GetModifiers())); + + return dict.GetHandle(); +} + bool Converter::FromV8(v8::Isolate* isolate, v8::Local val, blink::WebMouseEvent* out) { diff --git a/shell/common/gin_converters/blink_converter.h b/shell/common/gin_converters/blink_converter.h index 1330802f0d2..952033b1472 100644 --- a/shell/common/gin_converters/blink_converter.h +++ b/shell/common/gin_converters/blink_converter.h @@ -36,6 +36,8 @@ struct Converter { static bool FromV8(v8::Isolate* isolate, v8::Local val, blink::WebKeyboardEvent* out); + static v8::Local ToV8(v8::Isolate* isolate, + const blink::WebKeyboardEvent& in); }; template <> diff --git a/shell/common/gin_converters/content_converter.cc b/shell/common/gin_converters/content_converter.cc index f95ad09b593..a9979d7f599 100644 --- a/shell/common/gin_converters/content_converter.cc +++ b/shell/common/gin_converters/content_converter.cc @@ -303,25 +303,7 @@ bool Converter::FromV8( v8::Local Converter::ToV8( v8::Isolate* isolate, const content::NativeWebKeyboardEvent& in) { - gin_helper::Dictionary dict = gin::Dictionary::CreateEmpty(isolate); - - if (in.GetType() == blink::WebInputEvent::Type::kRawKeyDown) - dict.Set("type", "keyDown"); - else if (in.GetType() == blink::WebInputEvent::Type::kKeyUp) - dict.Set("type", "keyUp"); - dict.Set("key", ui::KeycodeConverter::DomKeyToKeyString(in.dom_key)); - dict.Set("code", ui::KeycodeConverter::DomCodeToCodeString( - static_cast(in.dom_code))); - - using Modifiers = blink::WebInputEvent::Modifiers; - dict.Set("isAutoRepeat", (in.GetModifiers() & Modifiers::kIsAutoRepeat) != 0); - dict.Set("isComposing", (in.GetModifiers() & Modifiers::kIsComposing) != 0); - dict.Set("shift", (in.GetModifiers() & Modifiers::kShiftKey) != 0); - dict.Set("control", (in.GetModifiers() & Modifiers::kControlKey) != 0); - dict.Set("alt", (in.GetModifiers() & Modifiers::kAltKey) != 0); - dict.Set("meta", (in.GetModifiers() & Modifiers::kMetaKey) != 0); - - return dict.GetHandle(); + return ConvertToV8(isolate, static_cast(in)); } } // namespace gin