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 ////////////////////////////////////////////////////////////////////////////////
13 ////////////////////////////////////////////////////////////////////////////////
16 AccCollector(Accessible
* aRoot
, filters::FilterFuncPtr aFilterFunc
) :
17 mFilterFunc(aFilterFunc
), mRoot(aRoot
), mRootChildIdx(0)
21 AccCollector::~AccCollector()
28 EnsureNGetIndex(nullptr);
29 return mObjects
.Length();
33 AccCollector::GetAccessibleAt(uint32_t aIndex
)
35 Accessible
* accessible
= mObjects
.SafeElementAt(aIndex
, nullptr);
39 return EnsureNGetObject(aIndex
);
43 AccCollector::GetIndexAt(Accessible
* aAccessible
)
45 int32_t index
= mObjects
.IndexOf(aAccessible
);
49 return EnsureNGetIndex(aAccessible
);
52 ////////////////////////////////////////////////////////////////////////////////
53 // nsAccCollector protected
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
))
65 if (mObjects
.Length() - 1 == aIndex
)
66 return mObjects
[aIndex
];
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
))
82 if (child
== aAccessible
)
83 return mObjects
.Length() - 1;
90 AccCollector::AppendObject(Accessible
* aAccessible
)
92 mObjects
.AppendElement(aAccessible
);
95 ////////////////////////////////////////////////////////////////////////////////
96 // EmbeddedObjCollector
97 ////////////////////////////////////////////////////////////////////////////////
100 EmbeddedObjCollector::GetIndexAt(Accessible
* aAccessible
)
102 if (aAccessible
->mParent
!= mRoot
)
105 if (aAccessible
->mIndexOfEmbeddedChild
!= -1)
106 return aAccessible
->mIndexOfEmbeddedChild
;
108 return mFilterFunc(aAccessible
) & filters::eMatch
?
109 EnsureNGetIndex(aAccessible
) : -1;
113 EmbeddedObjCollector::AppendObject(Accessible
* aAccessible
)
115 aAccessible
->mIndexOfEmbeddedChild
= mObjects
.Length();
116 mObjects
.AppendElement(aAccessible
);