blob: 4034260d98b518ce2b84bb98db6704d98731e3a8 [file] [edit]
<!DOCTYPE HTML>
<html>
<head>
<script src="../../resources/accessibility-helper.js"></script>
<script src="../../resources/js-test.js"></script>
<style>
iframe {
width: 200px;
height: 100px;
border: none;
}
</style>
</head>
<body>
<div id="container">
<iframe id="iframe" title="CVV Input" onload="runTest()" src="../resources/local-frame-text-input.html"></iframe>
</div>
<script>
var output = "Ensures a caret/selection move inside a text input in an in-process (local) iframe posts AXSelectedTextChanged on the main-frame web area. Regression test for VoiceOver character navigation being silent inside a local iframe: the child frame's selection change was posted only on the child frame's own web area, never on the main web area (the document text-selection context VoiceOver tracks), so nothing was announced.\n";
window.jsTestIsAsync = true;
var mainWebArea;
var receivedSelectionChangedOnMainWebArea = false;
function notificationCallback(element, notificationName) {
if (notificationName !== "AXSelectedTextChanged")
return;
// With the fix, a selection change inside the local child frame is also posted on this (main) frame's
// web area. Without it, the notification is posted only on the child frame's own web area and never
// reaches the main web area here, so the test times out.
if (!receivedSelectionChangedOnMainWebArea && element && mainWebArea && element.isEqual(mainWebArea)) {
receivedSelectionChangedOnMainWebArea = true;
output += expect("receivedSelectionChangedOnMainWebArea", "true");
accessibilityController.removeNotificationListener();
debug(output);
finishJSTest();
}
}
function runTest() {
if (!window.accessibilityController)
return;
setTimeout(async function() {
await waitForIframeAccessibilityReady("container", "cvv");
mainWebArea = accessibilityController.rootElement.childAtIndex(0);
accessibilityController.addNotificationListener(notificationCallback);
// Put content in the iframe's input, focus it, then move the caret. The selection change happens
// inside the child frame; the fix relays AXSelectedTextChanged up to the main web area. Deferred
// so we don't dirty the selection in the middle of AX notification dispatch.
var input = document.getElementById("iframe").contentDocument.getElementById("cvv");
input.value = "123";
input.focus();
setTimeout(() => { input.setSelectionRange(1, 3); }, 0);
}, 0);
}
</script>
</body>
</html>