Bug 1734067 [wpt PR 31108] - Update wpt metadata, a=testonly
[gecko.git] / accessible / android / RootAccessibleWrap.cpp
blobaf3a9d7c9d165b7b38d7a28e87eda372be5b68d5
1 /* -*- Mode: c++; c-basic-offset: 2; tab-width: 20; indent-tabs-mode: nil; -*-
2 * This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "RootAccessibleWrap.h"
8 #include "LocalAccessible-inl.h"
10 #include "DocAccessibleParent.h"
11 #include "DocAccessible-inl.h"
12 #include "RemoteAccessibleWrap.h"
13 #include "SessionAccessibility.h"
14 #include "mozilla/PresShell.h"
16 using namespace mozilla;
17 using namespace mozilla::a11y;
19 RootAccessibleWrap::RootAccessibleWrap(dom::Document* aDoc,
20 PresShell* aPresShell)
21 : RootAccessible(aDoc, aPresShell) {}
23 RootAccessibleWrap::~RootAccessibleWrap() {}
25 AccessibleWrap* RootAccessibleWrap::GetContentAccessible() {
26 if (RemoteAccessible* proxy = GetPrimaryRemoteTopLevelContentDoc()) {
27 return WrapperFor(proxy);
30 // Find first document that is not defunct or hidden.
31 // This is exclusively for Fennec which has a deck of browser elements.
32 // Otherwise, standard GeckoView will only have one browser element.
33 for (size_t i = 0; i < ChildDocumentCount(); i++) {
34 DocAccessible* childDoc = GetChildDocumentAt(i);
35 if (childDoc && !childDoc->IsDefunct() && !childDoc->IsHidden()) {
36 return childDoc;
40 return nullptr;
43 AccessibleWrap* RootAccessibleWrap::FindAccessibleById(int32_t aID) {
44 AccessibleWrap* contentAcc = GetContentAccessible();
46 if (!contentAcc) {
47 return nullptr;
50 if (aID == AccessibleWrap::kNoID) {
51 return contentAcc;
54 if (contentAcc->IsProxy()) {
55 return FindAccessibleById(static_cast<DocRemoteAccessibleWrap*>(contentAcc),
56 aID);
59 return FindAccessibleById(
60 static_cast<DocAccessibleWrap*>(contentAcc->AsDoc()), aID);
63 AccessibleWrap* RootAccessibleWrap::FindAccessibleById(
64 DocRemoteAccessibleWrap* aDoc, int32_t aID) {
65 AccessibleWrap* acc = aDoc->GetAccessibleByID(aID);
66 uint32_t index = 0;
67 while (!acc) {
68 auto child = static_cast<DocRemoteAccessibleWrap*>(
69 aDoc->GetChildDocumentAt(index++));
70 if (!child) {
71 break;
73 // A child document's id is not in its parent document's hash table.
74 if (child->VirtualViewID() == aID) {
75 acc = child;
76 } else {
77 acc = FindAccessibleById(child, aID);
81 return acc;
84 AccessibleWrap* RootAccessibleWrap::FindAccessibleById(DocAccessibleWrap* aDoc,
85 int32_t aID) {
86 AccessibleWrap* acc = aDoc->GetAccessibleByID(aID);
87 uint32_t index = 0;
88 while (!acc) {
89 auto child =
90 static_cast<DocAccessibleWrap*>(aDoc->GetChildDocumentAt(index++));
91 if (!child) {
92 break;
94 acc = FindAccessibleById(child, aID);
97 return acc;