Bug 1802040: Track the focused DocAccessibleParent on Android. r=eeejay

Differential Revision: https://phabricator.services.mozilla.com/D163707
This commit is contained in:
James Teh 2022-12-07 13:42:30 +00:00
parent ec36412f03
commit ca834233da
3 changed files with 26 additions and 1 deletions

View file

@ -68,11 +68,11 @@ Accessible* FocusManager::FocusedAccessible() const {
} else {
nsAccessibilityService::GetAndroidMonitor().AssertCurrentThreadOwns();
}
return mFocusedRemoteDoc ? mFocusedRemoteDoc->GetFocusedAcc() : nullptr;
#else
if (Accessible* focusedAcc = FocusedLocalAccessible()) {
return focusedAcc;
}
#endif // defined(ANDROID)
if (!XRE_IsParentProcess()) {
// DocAccessibleParent's don't exist in the content
@ -96,6 +96,7 @@ Accessible* FocusManager::FocusedAccessible() const {
DocAccessibleParent* focusedDoc =
DocAccessibleParent::GetFrom(focusedContext);
return focusedDoc ? focusedDoc->GetFocusedAcc() : nullptr;
#endif // defined(ANDROID)
}
bool FocusManager::IsFocusWithin(const Accessible* aContainer) const {

View file

@ -21,6 +21,7 @@ class Accessible;
class AccEvent;
class LocalAccessible;
class DocAccessible;
class DocAccessibleParent;
/**
* Manage the accessible focus. Used to fire and process accessible events.
@ -132,6 +133,15 @@ class FocusManager {
*/
void ProcessFocusEvent(AccEvent* aEvent);
#ifdef ANDROID
void SetFocusedRemoteDoc(DocAccessibleParent* aDoc) {
mFocusedRemoteDoc = aDoc;
}
bool IsFocusedRemoteDoc(DocAccessibleParent* aDoc) {
return mFocusedRemoteDoc == aDoc;
}
#endif
protected:
FocusManager();
@ -148,6 +158,9 @@ class FocusManager {
RefPtr<LocalAccessible> mActiveItem;
RefPtr<LocalAccessible> mLastFocus;
RefPtr<LocalAccessible> mActiveARIAMenubar;
#ifdef ANDROID
DocAccessibleParent* mFocusedRemoteDoc = nullptr;
#endif
};
} // namespace a11y

View file

@ -344,6 +344,11 @@ mozilla::ipc::IPCResult DocAccessibleParent::RecvEvent(
void DocAccessibleParent::FireEvent(RemoteAccessible* aAcc,
const uint32_t& aEventType) {
if (aEventType == nsIAccessibleEvent::EVENT_FOCUS) {
#ifdef ANDROID
if (FocusMgr()) {
FocusMgr()->SetFocusedRemoteDoc(this);
}
#endif
mFocus = aAcc->ID();
}
@ -1000,6 +1005,12 @@ void DocAccessibleParent::Destroy() {
mShutdown = true;
mBrowsingContext = nullptr;
#ifdef ANDROID
if (FocusMgr() && FocusMgr()->IsFocusedRemoteDoc(this)) {
FocusMgr()->SetFocusedRemoteDoc(nullptr);
}
#endif
MOZ_DIAGNOSTIC_ASSERT(LiveDocs().Contains(mActorID));
uint32_t childDocCount = mChildDocs.Length();
for (uint32_t i = 0; i < childDocCount; i++) {