From a10f3ccf71334b8b63cf4b8cffc4e6b21d320d02 Mon Sep 17 00:00:00 2001 From: "trop[bot]" <37223003+trop[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 09:29:13 +0000 Subject: [PATCH] fix: sendInputEvent keyCodes being incorrectly converted Co-authored-by: Shelley Vohr --- shell/common/gin_converters/blink_converter.cc | 12 ++++++++++-- spec/api-web-contents-spec.ts | 14 ++++++++++++++ spec/fixtures/pages/key-events.html | 10 ++++++++-- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/shell/common/gin_converters/blink_converter.cc b/shell/common/gin_converters/blink_converter.cc index 75054b1b55866..3227db01163db 100644 --- a/shell/common/gin_converters/blink_converter.cc +++ b/shell/common/gin_converters/blink_converter.cc @@ -10,6 +10,7 @@ #include "base/containers/fixed_flat_map.h" #include "base/strings/string_util.h" +#include "base/strings/utf_string_conversion_utils.h" #include "base/strings/utf_string_conversions.h" #include "gin/converter.h" #include "gin/data_object_builder.h" @@ -275,11 +276,18 @@ bool Converter::FromV8(v8::Isolate* isolate, if ((out->GetType() == blink::WebInputEvent::Type::kChar || out->GetType() == blink::WebInputEvent::Type::kRawKeyDown)) { + // If the keyCode is e.g. Space or Plus we want to use the character + // instead of the keyCode: ' ' instead of 'Space', '+' instead of 'Plus'. + std::string character_str; + if (str.size() > 1 && domKey.IsCharacter()) + base::WriteUnicodeCharacter(domKey.ToCharacter(), &character_str); + // Make sure to not read beyond the buffer in case some bad code doesn't // NULL-terminate it (this is called from plugins). size_t text_length_cap = blink::WebKeyboardEvent::kTextLengthCap; - std::u16string text16 = base::UTF8ToUTF16(str); - + std::u16string text16 = character_str.empty() + ? base::UTF8ToUTF16(str) + : base::UTF8ToUTF16(character_str); std::fill_n(out->text, text_length_cap, 0); std::fill_n(out->unmodified_text, text_length_cap, 0); for (size_t i = 0; i < std::min(text_length_cap - 1, text16.size()); ++i) { diff --git a/spec/api-web-contents-spec.ts b/spec/api-web-contents-spec.ts index 8889cfb403647..d14563dc456d6 100644 --- a/spec/api-web-contents-spec.ts +++ b/spec/api-web-contents-spec.ts @@ -818,6 +818,20 @@ describe('webContents module', () => { expect(altKey).to.be.false(); }); + it('can correctly convert accelerators to key codes', async () => { + const keyup = once(ipcMain, 'keyup'); + w.webContents.sendInputEvent({ keyCode: 'Plus', type: 'char' }); + w.webContents.sendInputEvent({ keyCode: 'Space', type: 'char' }); + w.webContents.sendInputEvent({ keyCode: 'Plus', type: 'char' }); + w.webContents.sendInputEvent({ keyCode: 'Space', type: 'char' }); + w.webContents.sendInputEvent({ keyCode: 'Plus', type: 'char' }); + w.webContents.sendInputEvent({ keyCode: 'Plus', type: 'keyUp' }); + + await keyup; + const inputText = await w.webContents.executeJavaScript('document.getElementById("input").value'); + expect(inputText).to.equal('+ + +'); + }); + it('can send char events with modifiers', async () => { const keypress = once(ipcMain, 'keypress'); w.webContents.sendInputEvent({ type: 'keyDown', keyCode: 'Z' }); diff --git a/spec/fixtures/pages/key-events.html b/spec/fixtures/pages/key-events.html index 7402daf5e999f..c16c98bac2ed1 100644 --- a/spec/fixtures/pages/key-events.html +++ b/spec/fixtures/pages/key-events.html @@ -1,11 +1,17 @@ +