Bug 1671049 - Invalidate cached ARIA role and role in mozAccessible when role changes. r=morgan

Besides the ARIA role invalidation, this fixes an issue where the mozAccessible's role is also incorrect when the aria role changes on a body tag.

Depends on D93439

Differential Revision: https://phabricator.services.mozilla.com/D93440
This commit is contained in:
Eitan Isaacson 2020-10-14 00:04:49 +00:00
Родитель c548ecd683
Коммит 2e476d423a
6 изменённых файлов: 46 добавлений и 0 удалений

Просмотреть файл

@ -15,6 +15,10 @@
# include "nsRect.h" # include "nsRect.h"
#endif #endif
#ifdef MOZ_WIDGET_COCOA
# include "mozilla/a11y/Role.h"
#endif
namespace mozilla { namespace mozilla {
namespace a11y { namespace a11y {
@ -142,6 +146,8 @@ bool LocalizeString(
class TextRangeData; class TextRangeData;
void ProxyTextSelectionChangeEvent(ProxyAccessible* aTarget, void ProxyTextSelectionChangeEvent(ProxyAccessible* aTarget,
const nsTArray<TextRangeData>& aSelection); const nsTArray<TextRangeData>& aSelection);
void ProxyRoleChangedEvent(ProxyAccessible* aTarget, const a11y::role& aRole);
#endif #endif
} // namespace a11y } // namespace a11y

Просмотреть файл

@ -530,6 +530,11 @@ mozilla::ipc::IPCResult DocAccessibleParent::RecvRoleChangedEvent(
} }
mRole = aRole; mRole = aRole;
#ifdef MOZ_WIDGET_COCOA
ProxyRoleChangedEvent(this, aRole);
#endif
return IPC_OK(); return IPC_OK();
} }

Просмотреть файл

@ -161,6 +161,12 @@ void ProxyTextSelectionChangeEvent(ProxyAccessible* aTarget,
} }
} }
void ProxyRoleChangedEvent(ProxyAccessible* aTarget, const a11y::role& aRole) {
if (mozAccessible* wrapper = GetNativeFromGeckoAccessible(aTarget)) {
[wrapper handleRoleChanged:aRole];
}
}
} // namespace a11y } // namespace a11y
} // namespace mozilla } // namespace mozilla

Просмотреть файл

@ -106,6 +106,9 @@ inline mozAccessible* GetNativeFromGeckoAccessible(
// Get top level (tab) web area. // Get top level (tab) web area.
- (mozAccessible*)topWebArea; - (mozAccessible*)topWebArea;
// Handle a role change
- (void)handleRoleChanged:(mozilla::a11y::role)newRole;
#pragma mark - mozAccessible protocol / widget #pragma mark - mozAccessible protocol / widget
// override // override

Просмотреть файл

@ -779,6 +779,14 @@ struct RoleDescrComparator {
return nil; return nil;
} }
- (void)handleRoleChanged:(mozilla::a11y::role)newRole {
mRole = newRole;
mARIARole = nullptr;
// For testing purposes
[self moxPostNotification:@"AXMozRoleChanged"];
}
- (id)moxEditableAncestor { - (id)moxEditableAncestor {
for (id element = self; [element conformsToProtocol:@protocol(MOXAccessible)]; for (id element = self; [element conformsToProtocol:@protocol(MOXAccessible)];
element = [element moxUnignoredParent]) { element = [element moxUnignoredParent]) {

Просмотреть файл

@ -202,3 +202,21 @@ addAccessibleTask(
); );
} }
); );
addAccessibleTask(`<button>hello world</button>`, async (browser, accDoc) => {
const webArea = accDoc.nativeInterface.QueryInterface(
Ci.nsIAccessibleMacInterface
);
is(webArea.getAttributeValue("AXRole"), "AXWebArea");
is(webArea.getAttributeValue("AXSubrole"), "AXUnknown");
let roleChanged = waitForMacEvent("AXMozRoleChanged");
await SpecialPowers.spawn(browser, [], () => {
content.document.body.setAttribute("role", "application");
});
await roleChanged;
is(webArea.getAttributeValue("AXRole"), "AXGroup");
is(webArea.getAttributeValue("AXSubrole"), "AXLandmarkApplication");
});