1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
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 "BaseAccessibles.h"
8 #include "Accessible-inl.h"
9 #include "HyperTextAccessibleWrap.h"
10 #include "nsAccessibilityService.h"
11 #include "nsAccUtils.h"
12 #include "nsCoreUtils.h"
17 using namespace mozilla::a11y
;
19 ////////////////////////////////////////////////////////////////////////////////
21 ////////////////////////////////////////////////////////////////////////////////
24 LeafAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
) :
25 AccessibleWrap(aContent
, aDoc
)
29 NS_IMPL_ISUPPORTS_INHERITED0(LeafAccessible
, Accessible
)
31 ////////////////////////////////////////////////////////////////////////////////
32 // LeafAccessible: Accessible public
35 LeafAccessible::ChildAtPoint(int32_t aX
, int32_t aY
,
36 EWhichChildAtPoint aWhichChild
)
38 // Don't walk into leaf accessibles.
43 LeafAccessible::InsertChildAt(uint32_t aIndex
, Accessible
* aChild
)
45 NS_NOTREACHED("InsertChildAt called on leaf accessible!");
50 LeafAccessible::RemoveChild(Accessible
* aChild
)
52 NS_NOTREACHED("RemoveChild called on leaf accessible!");
56 ////////////////////////////////////////////////////////////////////////////////
57 // LeafAccessible: Accessible private
60 LeafAccessible::CacheChildren()
62 // No children for leaf accessible.
66 ////////////////////////////////////////////////////////////////////////////////
68 ////////////////////////////////////////////////////////////////////////////////
71 LinkableAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
) :
72 AccessibleWrap(aContent
, aDoc
),
79 NS_IMPL_ISUPPORTS_INHERITED0(LinkableAccessible
, AccessibleWrap
)
81 ////////////////////////////////////////////////////////////////////////////////
82 // LinkableAccessible. nsIAccessible
85 LinkableAccessible::TakeFocus()
87 return mActionAcc
? mActionAcc
->TakeFocus() : AccessibleWrap::TakeFocus();
91 LinkableAccessible::NativeLinkState() const
94 return states::LINKED
| (mActionAcc
->LinkState() & states::TRAVERSED
);
100 LinkableAccessible::Value(nsString
& aValue
)
104 Accessible::Value(aValue
);
105 if (!aValue
.IsEmpty())
108 if (aValue
.IsEmpty() && mIsLink
)
109 mActionAcc
->Value(aValue
);
114 LinkableAccessible::ActionCount()
116 return (mIsOnclick
|| mIsLink
) ? 1 : 0;
120 LinkableAccessible::GetActionName(uint8_t aIndex
, nsAString
& aName
)
124 // Action 0 (default action): Jump to link
125 if (aIndex
== eAction_Jump
) {
127 aName
.AssignLiteral("jump");
130 else if (mIsOnclick
) {
131 aName
.AssignLiteral("click");
134 return NS_ERROR_NOT_IMPLEMENTED
;
136 return NS_ERROR_INVALID_ARG
;
140 LinkableAccessible::DoAction(uint8_t aIndex
)
142 if (aIndex
!= eAction_Jump
)
143 return NS_ERROR_INVALID_ARG
;
145 return mActionAcc
? mActionAcc
->DoAction(aIndex
) :
146 AccessibleWrap::DoAction(aIndex
);
150 LinkableAccessible::AccessKey() const
153 mActionAcc
->AccessKey() : Accessible::AccessKey();
156 ////////////////////////////////////////////////////////////////////////////////
157 // LinkableAccessible. Accessible
160 LinkableAccessible::Shutdown()
164 mActionAcc
= nullptr;
165 AccessibleWrap::Shutdown();
168 ////////////////////////////////////////////////////////////////////////////////
169 // LinkableAccessible: HyperLinkAccessible
171 already_AddRefed
<nsIURI
>
172 LinkableAccessible::AnchorURIAt(uint32_t aAnchorIndex
)
175 NS_ASSERTION(mActionAcc
->IsLink(),
176 "nsIAccessibleHyperLink isn't implemented.");
178 if (mActionAcc
->IsLink())
179 return mActionAcc
->AnchorURIAt(aAnchorIndex
);
185 ////////////////////////////////////////////////////////////////////////////////
186 // LinkableAccessible: Accessible protected
189 LinkableAccessible::BindToParent(Accessible
* aParent
,
190 uint32_t aIndexInParent
)
192 AccessibleWrap::BindToParent(aParent
, aIndexInParent
);
194 // Cache action content.
195 mActionAcc
= nullptr;
199 if (nsCoreUtils::HasClickListener(mContent
)) {
204 // XXX: The logic looks broken since the click listener may be registered
205 // on non accessible node in parent chain but this node is skipped when tree
207 Accessible
* walkUpAcc
= this;
208 while ((walkUpAcc
= walkUpAcc
->Parent()) && !walkUpAcc
->IsDoc()) {
209 if (walkUpAcc
->LinkState() & states::LINKED
) {
211 mActionAcc
= walkUpAcc
;
215 if (nsCoreUtils::HasClickListener(walkUpAcc
->GetContent())) {
216 mActionAcc
= walkUpAcc
;
224 LinkableAccessible::UnbindFromParent()
226 mActionAcc
= nullptr;
230 AccessibleWrap::UnbindFromParent();
233 ////////////////////////////////////////////////////////////////////////////////
234 // EnumRoleAccessible
235 ////////////////////////////////////////////////////////////////////////////////
238 EnumRoleAccessible(nsIContent
* aNode
, DocAccessible
* aDoc
, roles::Role aRole
) :
239 AccessibleWrap(aNode
, aDoc
), mRole(aRole
)
243 NS_IMPL_ISUPPORTS_INHERITED0(EnumRoleAccessible
, Accessible
)
246 EnumRoleAccessible::NativeRole()
251 ////////////////////////////////////////////////////////////////////////////////
253 ////////////////////////////////////////////////////////////////////////////////
256 DummyAccessible::NativeState()
261 DummyAccessible::NativeInteractiveState() const
267 DummyAccessible::NativeLinkState() const
273 DummyAccessible::NativelyUnavailable() const
279 DummyAccessible::ApplyARIAState(uint64_t* aState
) const