Bug 1672694 - P2: Don't fire AXSelectedTextChanged if target is not selectable. r=morgan

This causes VoiceOver to mess with `AXFocused` and as a result redirect the VO cursor.

Differential Revision: https://phabricator.services.mozilla.com/D95784
This commit is contained in:
Eitan Isaacson 2020-11-04 00:26:27 +00:00
parent 8a078f1f55
commit f80fe575c5
2 changed files with 63 additions and 1 deletions

View File

@ -941,6 +941,9 @@ struct RoleDescrComparator {
NSAccessibilitySelectedChildrenChangedNotification];
break;
case nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED: {
if (![self stateWithMask:states::SELECTABLE_TEXT]) {
break;
}
// We consider any caret move event to be a selected text change event.
// So dispatching an event for EVENT_TEXT_SELECTION_CHANGED would be
// reduntant.

View File

@ -5,7 +5,7 @@
"use strict";
/**
* Test rotor with heading
* Test simple text selection
*/
addAccessibleTask(`<p id="p">Hello World</p>`, async (browser, accDoc) => {
let macDoc = accDoc.nativeInterface.QueryInterface(
@ -47,3 +47,62 @@ addAccessibleTask(`<p id="p">Hello World</p>`, async (browser, accDoc) => {
range = macDoc.getAttributeValue("AXSelectedTextMarkerRange");
is(stringForRange(macDoc, range), "Hello");
});
/**
* Test text selection events caused by focus change
*/
addAccessibleTask(`<p>
Hello <a href="#" id="link">World</a>,
I <a href="#" style="user-select: none;" id="unselectable_link">love</a>
<button id="button">you</button></p>`,
async (browser, accDoc) => {
// Set up an AXSelectedTextChanged listener here. It will get resolved
// on the first non-root event it encounters, so if we test its data at the end
// of this test it will show us the first text-selectable object that was focused,
// which is "link".
let selTextChanged = waitForMacEvent(
"AXSelectedTextChanged",
e => e.getAttributeValue("AXDOMIdentifier") != "body"
);
let focusChanged = waitForMacEvent("AXFocusedUIElementChanged");
await SpecialPowers.spawn(browser, [], () => {
content.document.getElementById("unselectable_link").focus();
});
let focusChangedTarget = await focusChanged;
is(
focusChangedTarget.getAttributeValue("AXDOMIdentifier"),
"unselectable_link",
"Correct event target"
);
focusChanged = waitForMacEvent("AXFocusedUIElementChanged");
await SpecialPowers.spawn(browser, [], () => {
content.document.getElementById("button").focus();
});
focusChangedTarget = await focusChanged;
is(
focusChangedTarget.getAttributeValue("AXDOMIdentifier"),
"button",
"Correct event target"
);
focusChanged = waitForMacEvent("AXFocusedUIElementChanged");
await SpecialPowers.spawn(browser, [], () => {
content.document.getElementById("link").focus();
});
focusChangedTarget = await focusChanged;
is(
focusChangedTarget.getAttributeValue("AXDOMIdentifier"),
"link",
"Correct event target"
);
let selTextChangedTarget = await selTextChanged;
is(
selTextChangedTarget.getAttributeValue("AXDOMIdentifier"),
"link",
"Correct event target"
);
}
);