From 20349d46cbf26a156db3c822e4e1f34daee63b6e Mon Sep 17 00:00:00 2001 From: ldm0 Date: Wed, 2 Sep 2026 11:07:18 +0800 Subject: [PATCH] fix(wpt): apply text edits for testdriver send keys --- .../moli_benchmark/wpt_cross/server.py | 37 ++++++++++++++++++- moli-benchmark/tests/test_wpt_cross.py | 11 ++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/moli-benchmark/moli_benchmark/wpt_cross/server.py b/moli-benchmark/moli_benchmark/wpt_cross/server.py index cbf4aebe06..ac5acec53a 100644 --- a/moli-benchmark/moli_benchmark/wpt_cross/server.py +++ b/moli-benchmark/moli_benchmark/wpt_cross/server.py @@ -514,7 +514,7 @@ BENCH_TESTDRIVER_VENDOR_BRIDGE = b"""\ } function dispatchKey(target, type, key, modifiers) { - target.dispatchEvent(new KeyboardEvent(type, { + return target.dispatchEvent(new KeyboardEvent(type, { key: key, altKey: !!modifiers.Alt, ctrlKey: !!modifiers.Control, @@ -525,6 +525,29 @@ BENCH_TESTDRIVER_VENDOR_BRIDGE = b"""\ })); } + function insertSendKeyText(target, key, modifiers) { + if (!target || key.length !== 1 || modifiers.Alt || modifiers.Control) { + return; + } + var codePoint = key.codePointAt(0); + if (codePoint >= 0xE000 && codePoint <= 0xF8FF) { + return; + } + var localName = String(target.localName || '').toLowerCase(); + var type = localName === 'input' ? String(target.type || '').toLowerCase() : ''; + var isTextControl = + localName === 'textarea' || + (localName === 'input' && + ['text', 'search', 'tel', 'url', 'email', 'password'].includes(type)); + if (!isTextControl && !target.isContentEditable) { + return; + } + var doc = target.ownerDocument || document; + try { + doc.execCommand('insertText', false, key); + } catch (e) {} + } + async function action_sequence(actions, context) { var pointer = { x: 0, y: 0, target: null, button: 0 }; var modifiers = { Alt: false, Control: false, Shift: false }; @@ -583,6 +606,7 @@ BENCH_TESTDRIVER_VENDOR_BRIDGE = b"""\ } async function sendKeys(element, keys) { + var wasFocused = document.activeElement === element; if ( element && typeof element.focus === 'function' && @@ -590,6 +614,12 @@ BENCH_TESTDRIVER_VENDOR_BRIDGE = b"""\ ) { element.focus(); } + if (!wasFocused && element && typeof element.setSelectionRange === 'function') { + try { + var end = String(element.value || '').length; + element.setSelectionRange(end, end); + } catch (e) {} + } var modifiers = { Alt: false, Control: false, Shift: false }; for (var keyValue of String(keys || '')) { var key = keyName(keyValue); @@ -599,7 +629,10 @@ BENCH_TESTDRIVER_VENDOR_BRIDGE = b"""\ dispatchKey(target, 'keydown', key, modifiers); continue; } - dispatchKey(target, 'keydown', key, modifiers); + var keyAllowed = dispatchKey(target, 'keydown', key, modifiers); + if (keyAllowed) { + insertSendKeyText(document.activeElement || target, key, modifiers); + } dispatchKey(document.activeElement || target, 'keyup', key, modifiers); } for (var modifier in modifiers) { diff --git a/moli-benchmark/tests/test_wpt_cross.py b/moli-benchmark/tests/test_wpt_cross.py index e9c83ccd18..27503e5de8 100644 --- a/moli-benchmark/tests/test_wpt_cross.py +++ b/moli-benchmark/tests/test_wpt_cross.py @@ -4032,6 +4032,17 @@ test(() => {}, "ok"); self.assertIn(b"ctrlKey: !!modifiers.Control", BENCH_TESTDRIVER_VENDOR_BRIDGE) self.assertIn(b"shiftKey: !!modifiers.Shift", BENCH_TESTDRIVER_VENDOR_BRIDGE) + def test_testdriver_vendor_bridge_send_keys_runs_text_edit_default_action( + self, + ) -> None: + self.assertIn(b"insertSendKeyText", BENCH_TESTDRIVER_VENDOR_BRIDGE) + self.assertIn( + b"doc.execCommand('insertText', false, key)", + BENCH_TESTDRIVER_VENDOR_BRIDGE, + ) + self.assertIn(b"codePoint >= 0xE000", BENCH_TESTDRIVER_VENDOR_BRIDGE) + self.assertIn(b"if (keyAllowed)", BENCH_TESTDRIVER_VENDOR_BRIDGE) + def test_testdriver_vendor_bridge_focuses_user_activation_target(self) -> None: self.assertIn(b"focusForUserActivation", BENCH_TESTDRIVER_VENDOR_BRIDGE) self.assertIn(b"document.activeElement === before", BENCH_TESTDRIVER_VENDOR_BRIDGE)