Bug 881092 - Allow decoding files we know we can't play, in the context of WebAudio...
[gecko.git] / accessible / src / base / AccIterator.h
blob85d8016d79227e0c22dcc482ae5da3dc06941c2b
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #ifndef mozilla_a11y_AccIterator_h__
8 #define mozilla_a11y_AccIterator_h__
10 #include "DocAccessible.h"
11 #include "Filters.h"
12 #include "nsAccessibilityService.h"
14 namespace mozilla {
15 namespace a11y {
17 /**
18 * AccIterable is a basic interface for iterators over accessibles.
20 class AccIterable
22 public:
23 virtual ~AccIterable() { }
24 virtual Accessible* Next() = 0;
26 private:
27 friend class Relation;
28 nsAutoPtr<AccIterable> mNextIter;
31 /**
32 * Allows to iterate through accessible children or subtree complying with
33 * filter function.
35 class AccIterator : public AccIterable
37 public:
38 AccIterator(Accessible* aRoot, filters::FilterFuncPtr aFilterFunc);
39 virtual ~AccIterator();
41 /**
42 * Return next accessible complying with filter function. Return the first
43 * accessible for the first time.
45 virtual Accessible* Next();
47 private:
48 AccIterator();
49 AccIterator(const AccIterator&);
50 AccIterator& operator =(const AccIterator&);
52 struct IteratorState
54 IteratorState(Accessible* aParent, IteratorState* mParentState = nullptr);
56 Accessible* mParent;
57 int32_t mIndex;
58 IteratorState* mParentState;
61 filters::FilterFuncPtr mFilterFunc;
62 IteratorState* mState;
66 /**
67 * Allows to traverse through related accessibles that are pointing to the given
68 * dependent accessible by relation attribute.
70 class RelatedAccIterator : public AccIterable
72 public:
73 /**
74 * Constructor.
76 * @param aDocument [in] the document accessible the related
77 * & accessibles belong to.
78 * @param aDependentContent [in] the content of dependent accessible that
79 * relations were requested for
80 * @param aRelAttr [in] relation attribute that relations are
81 * pointed by
83 RelatedAccIterator(DocAccessible* aDocument, nsIContent* aDependentContent,
84 nsIAtom* aRelAttr);
86 virtual ~RelatedAccIterator() { }
88 /**
89 * Return next related accessible for the given dependent accessible.
91 virtual Accessible* Next();
93 private:
94 RelatedAccIterator();
95 RelatedAccIterator(const RelatedAccIterator&);
96 RelatedAccIterator& operator = (const RelatedAccIterator&);
98 DocAccessible* mDocument;
99 nsIAtom* mRelAttr;
100 DocAccessible::AttrRelProviderArray* mProviders;
101 nsIContent* mBindingParent;
102 uint32_t mIndex;
107 * Used to iterate through HTML labels associated with the given accessible.
109 class HTMLLabelIterator : public AccIterable
111 public:
112 enum LabelFilter {
113 eAllLabels,
114 eSkipAncestorLabel
117 HTMLLabelIterator(DocAccessible* aDocument, const Accessible* aAccessible,
118 LabelFilter aFilter = eAllLabels);
120 virtual ~HTMLLabelIterator() { }
123 * Return next label accessible associated with the given element.
125 virtual Accessible* Next();
127 private:
128 HTMLLabelIterator();
129 HTMLLabelIterator(const HTMLLabelIterator&);
130 HTMLLabelIterator& operator = (const HTMLLabelIterator&);
132 RelatedAccIterator mRelIter;
133 // XXX: replace it on weak reference (bug 678429), it's safe to use raw
134 // pointer now because iterators life cycle is short.
135 const Accessible* mAcc;
136 LabelFilter mLabelFilter;
141 * Used to iterate through HTML outputs associated with the given element.
143 class HTMLOutputIterator : public AccIterable
145 public:
146 HTMLOutputIterator(DocAccessible* aDocument, nsIContent* aElement);
147 virtual ~HTMLOutputIterator() { }
150 * Return next output accessible associated with the given element.
152 virtual Accessible* Next();
154 private:
155 HTMLOutputIterator();
156 HTMLOutputIterator(const HTMLOutputIterator&);
157 HTMLOutputIterator& operator = (const HTMLOutputIterator&);
159 RelatedAccIterator mRelIter;
164 * Used to iterate through XUL labels associated with the given element.
166 class XULLabelIterator : public AccIterable
168 public:
169 XULLabelIterator(DocAccessible* aDocument, nsIContent* aElement);
170 virtual ~XULLabelIterator() { }
173 * Return next label accessible associated with the given element.
175 virtual Accessible* Next();
177 private:
178 XULLabelIterator();
179 XULLabelIterator(const XULLabelIterator&);
180 XULLabelIterator& operator = (const XULLabelIterator&);
182 RelatedAccIterator mRelIter;
187 * Used to iterate through XUL descriptions associated with the given element.
189 class XULDescriptionIterator : public AccIterable
191 public:
192 XULDescriptionIterator(DocAccessible* aDocument, nsIContent* aElement);
193 virtual ~XULDescriptionIterator() { }
196 * Return next description accessible associated with the given element.
198 virtual Accessible* Next();
200 private:
201 XULDescriptionIterator();
202 XULDescriptionIterator(const XULDescriptionIterator&);
203 XULDescriptionIterator& operator = (const XULDescriptionIterator&);
205 RelatedAccIterator mRelIter;
209 * Used to iterate through IDs, elements or accessibles pointed by IDRefs
210 * attribute. Note, any method used to iterate through IDs, elements, or
211 * accessibles moves iterator to next position.
213 class IDRefsIterator : public AccIterable
215 public:
216 IDRefsIterator(DocAccessible* aDoc, nsIContent* aContent,
217 nsIAtom* aIDRefsAttr);
218 virtual ~IDRefsIterator() { }
221 * Return next ID.
223 const nsDependentSubstring NextID();
226 * Return next element.
228 nsIContent* NextElem();
231 * Return the element with the given ID.
233 nsIContent* GetElem(const nsDependentSubstring& aID);
235 // AccIterable
236 virtual Accessible* Next();
238 private:
239 IDRefsIterator();
240 IDRefsIterator(const IDRefsIterator&);
241 IDRefsIterator operator = (const IDRefsIterator&);
243 nsString mIDs;
244 nsIContent* mContent;
245 DocAccessible* mDoc;
246 nsAString::index_type mCurrIdx;
250 * Iterator that points to a single accessible returning it on the first call
251 * to Next().
253 class SingleAccIterator : public AccIterable
255 public:
256 SingleAccIterator(Accessible* aTarget): mAcc(aTarget) { }
257 virtual ~SingleAccIterator() { }
259 virtual Accessible* Next();
261 private:
262 SingleAccIterator();
263 SingleAccIterator(const SingleAccIterator&);
264 SingleAccIterator& operator = (const SingleAccIterator&);
266 nsRefPtr<Accessible> mAcc;
271 * Used to iterate items of the given item container.
273 class ItemIterator : public AccIterable
275 public:
276 ItemIterator(Accessible* aItemContainer) :
277 mContainer(aItemContainer), mAnchor(nullptr) { }
278 virtual ~ItemIterator() { }
280 virtual Accessible* Next();
282 private:
283 ItemIterator() MOZ_DELETE;
284 ItemIterator(const ItemIterator&) MOZ_DELETE;
285 ItemIterator& operator = (const ItemIterator&) MOZ_DELETE;
287 Accessible* mContainer;
288 Accessible* mAnchor;
293 * Used to iterate through XUL tree items of the same level.
295 class XULTreeItemIterator : public AccIterable
297 public:
298 XULTreeItemIterator(XULTreeAccessible* aXULTree, nsITreeView* aTreeView,
299 int32_t aRowIdx);
300 virtual ~XULTreeItemIterator() { }
302 virtual Accessible* Next();
304 private:
305 XULTreeItemIterator() MOZ_DELETE;
306 XULTreeItemIterator(const XULTreeItemIterator&) MOZ_DELETE;
307 XULTreeItemIterator& operator = (const XULTreeItemIterator&) MOZ_DELETE;
309 XULTreeAccessible* mXULTree;
310 nsITreeView* mTreeView;
311 int32_t mRowCount;
312 int32_t mContainerLevel;
313 int32_t mCurrRowIdx;
316 } // namespace a11y
317 } // namespace mozilla
319 #endif