Bumping manifests a=b2g-bump
[gecko.git] / accessible / base / AccCollector.cpp
blobda97d918345b58ccf31ecc3f7da2017ee38ee411
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #include "AccCollector.h"
7 #include "Accessible.h"
9 using namespace mozilla::a11y;
11 ////////////////////////////////////////////////////////////////////////////////
12 // nsAccCollector
13 ////////////////////////////////////////////////////////////////////////////////
15 AccCollector::
16 AccCollector(Accessible* aRoot, filters::FilterFuncPtr aFilterFunc) :
17 mFilterFunc(aFilterFunc), mRoot(aRoot), mRootChildIdx(0)
21 AccCollector::~AccCollector()
25 uint32_t
26 AccCollector::Count()
28 EnsureNGetIndex(nullptr);
29 return mObjects.Length();
32 Accessible*
33 AccCollector::GetAccessibleAt(uint32_t aIndex)
35 Accessible* accessible = mObjects.SafeElementAt(aIndex, nullptr);
36 if (accessible)
37 return accessible;
39 return EnsureNGetObject(aIndex);
42 int32_t
43 AccCollector::GetIndexAt(Accessible* aAccessible)
45 int32_t index = mObjects.IndexOf(aAccessible);
46 if (index != -1)
47 return index;
49 return EnsureNGetIndex(aAccessible);
52 ////////////////////////////////////////////////////////////////////////////////
53 // nsAccCollector protected
55 Accessible*
56 AccCollector::EnsureNGetObject(uint32_t aIndex)
58 uint32_t childCount = mRoot->ChildCount();
59 while (mRootChildIdx < childCount) {
60 Accessible* child = mRoot->GetChildAt(mRootChildIdx++);
61 if (!(mFilterFunc(child) & filters::eMatch))
62 continue;
64 AppendObject(child);
65 if (mObjects.Length() - 1 == aIndex)
66 return mObjects[aIndex];
69 return nullptr;
72 int32_t
73 AccCollector::EnsureNGetIndex(Accessible* aAccessible)
75 uint32_t childCount = mRoot->ChildCount();
76 while (mRootChildIdx < childCount) {
77 Accessible* child = mRoot->GetChildAt(mRootChildIdx++);
78 if (!(mFilterFunc(child) & filters::eMatch))
79 continue;
81 AppendObject(child);
82 if (child == aAccessible)
83 return mObjects.Length() - 1;
86 return -1;
89 void
90 AccCollector::AppendObject(Accessible* aAccessible)
92 mObjects.AppendElement(aAccessible);
95 ////////////////////////////////////////////////////////////////////////////////
96 // EmbeddedObjCollector
97 ////////////////////////////////////////////////////////////////////////////////
99 int32_t
100 EmbeddedObjCollector::GetIndexAt(Accessible* aAccessible)
102 if (aAccessible->mParent != mRoot)
103 return -1;
105 if (aAccessible->mIndexOfEmbeddedChild != -1)
106 return aAccessible->mIndexOfEmbeddedChild;
108 return mFilterFunc(aAccessible) & filters::eMatch ?
109 EnsureNGetIndex(aAccessible) : -1;
112 void
113 EmbeddedObjCollector::AppendObject(Accessible* aAccessible)
115 aAccessible->mIndexOfEmbeddedChild = mObjects.Length();
116 mObjects.AppendElement(aAccessible);