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_relation_h_
8 #define mozilla_a11y_relation_h_
10 #include "AccIterator.h"
18 * A collection of relation targets of a certain type. Targets are computed
19 * lazily while enumerating.
23 Relation() : mFirstIter(nullptr), mLastIter(nullptr) {}
25 explicit Relation(AccIterable
* aIter
) : mFirstIter(aIter
), mLastIter(aIter
) {}
27 explicit Relation(Accessible
* aAcc
)
28 : mFirstIter(nullptr), mLastIter(nullptr) {
32 Relation(DocAccessible
* aDocument
, nsIContent
* aContent
)
33 : mFirstIter(nullptr), mLastIter(nullptr) {
34 AppendTarget(aDocument
, aContent
);
37 Relation(Relation
&& aOther
)
38 : mFirstIter(std::move(aOther
.mFirstIter
)), mLastIter(aOther
.mLastIter
) {
39 aOther
.mLastIter
= nullptr;
42 Relation
& operator=(Relation
&& aRH
) {
43 mFirstIter
= std::move(aRH
.mFirstIter
);
44 mLastIter
= aRH
.mLastIter
;
45 aRH
.mLastIter
= nullptr;
49 inline void AppendIter(AccIterable
* aIter
) {
51 mLastIter
->mNextIter
.reset(aIter
);
53 mFirstIter
.reset(aIter
);
60 * Append the given accessible to the set of related accessibles.
62 inline void AppendTarget(Accessible
* aAcc
) {
63 if (aAcc
) AppendIter(new SingleAccIterator(aAcc
));
67 * Append the one accessible for this content node to the set of related
70 void AppendTarget(DocAccessible
* aDocument
, nsIContent
* aContent
) {
71 if (aContent
) AppendTarget(aDocument
->GetAccessible(aContent
));
75 * compute and return the next related accessible.
77 inline Accessible
* Next() {
78 Accessible
* target
= nullptr;
80 while (mFirstIter
&& !(target
= mFirstIter
->Next())) {
81 mFirstIter
= std::move(mFirstIter
->mNextIter
);
84 if (!mFirstIter
) mLastIter
= nullptr;
89 inline LocalAccessible
* LocalNext() {
90 Accessible
* next
= Next();
91 return next
? next
->AsLocal() : nullptr;
95 Relation
& operator=(const Relation
&) = delete;
96 Relation(const Relation
&) = delete;
98 std::unique_ptr
<AccIterable
> mFirstIter
;
99 AccIterable
* mLastIter
;
103 } // namespace mozilla