From 078b1b73dc77baa2d48e9fa2421fec97485a81d0 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Thu, 23 Mar 2023 22:35:03 +0100 Subject: [PATCH] Issue #2161 - Ctrl + Enter should cause keypress event even though the key combination doesn't input any character Currently, we dispatch keypress event when Enter is pressed without modifiers or only with the Shift key (line break). However, other browsers dispatch keypress events for Ctrl + Enter also even if it doesn't cause any text input. So, we should fire keypress events for Ctrl + Enter, even in strict keypress dispatching mode. Note that with other modifiers, it depends on the browser and/or platform and we can't dispatch the event for consistent behavior. This means web developers shouldn't rely one keypress events to catch Alt + Enter, Meta + Enter and two or more modifiers + Enter. Based on BZ 1438133 Resolves #2161 --- dom/events/test/test_dom_keyboard_event.html | 156 +++++++++++++++++++ widget/TextEventDispatcher.cpp | 3 +- widget/TextEvents.h | 30 ++++ 3 files changed, 187 insertions(+), 2 deletions(-) diff --git a/dom/events/test/test_dom_keyboard_event.html b/dom/events/test/test_dom_keyboard_event.html index e850659042..9fc858ccf9 100644 --- a/dom/events/test/test_dom_keyboard_event.html +++ b/dom/events/test/test_dom_keyboard_event.html @@ -8,6 +8,9 @@

+

+

+

@@ -293,10 +296,163 @@ function testSynthesizedKeyLocation() window.removeEventListener("keyup", handler, true); } +// We're using TextEventDispatcher to decide if we should keypress event +// on content in the default event group. So, we can test if keypress +// event is NOT fired unexpectedly with synthesizeKey(). +function testEnterKeyPressEvent() +{ + let keydownFired, keypressFired, beforeinputFired; + function onEvent(aEvent) { + switch (aEvent.type) { + case "keydown": + keydownFired = true; + return; + case "keypress": + keypressFired = true; + return; + case "beforeinput": + beforeinputFired = true; + return; + } + } + + for (let targetId of ["input", "textarea", "input_readonly"]) { + let target = document.getElementById(targetId); + + function reset() { + keydownFired = keypressFired = beforeinputFired = false; + target.value = ""; + } + + target.addEventListener("keydown", onEvent); + target.addEventListener("keypress", onEvent); + target.addEventListener("beforeinput", onEvent); + + const kDescription = "<" + targetId.replace("_", " ") + ">: "; + let isEditable = kDescription.includes("readonly"); + let isTextarea = kDescription.includes("textarea"); + + target.focus(); + + reset(); + synthesizeKey("KEY_Enter", {}); + is(keydownFired, true, + kDescription + "keydown event should be fired when Enter key is pressed"); + is(keypressFired, true, + kDescription + "keypress event should be fired when Enter key is pressed"); + if (isEditable) { + todo_is(beforeinputFired, true, + kDescription + "beforeinput event should be fired when Enter key is pressed"); + } else { + is(beforeinputFired, false, + kDescription + "beforeinput event shouldn't be fired when Enter key is pressed"); + } + if (isTextarea) { + is(target.value, "\n", + kDescription + "Enter key should cause inputting a line break in