mirror of
https://github.com/lexmount/moli.git
synced 2026-09-30 00:01:36 +00:00
fix(wpt): apply text edits for testdriver send keys
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user