1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/accessible/src/generic/BaseAccessibles.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,281 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "BaseAccessibles.h" 1.10 + 1.11 +#include "Accessible-inl.h" 1.12 +#include "HyperTextAccessibleWrap.h" 1.13 +#include "nsAccessibilityService.h" 1.14 +#include "nsAccUtils.h" 1.15 +#include "nsCoreUtils.h" 1.16 +#include "Role.h" 1.17 +#include "States.h" 1.18 +#include "nsIURI.h" 1.19 + 1.20 +using namespace mozilla::a11y; 1.21 + 1.22 +//////////////////////////////////////////////////////////////////////////////// 1.23 +// LeafAccessible 1.24 +//////////////////////////////////////////////////////////////////////////////// 1.25 + 1.26 +LeafAccessible:: 1.27 + LeafAccessible(nsIContent* aContent, DocAccessible* aDoc) : 1.28 + AccessibleWrap(aContent, aDoc) 1.29 +{ 1.30 +} 1.31 + 1.32 +NS_IMPL_ISUPPORTS_INHERITED0(LeafAccessible, Accessible) 1.33 + 1.34 +//////////////////////////////////////////////////////////////////////////////// 1.35 +// LeafAccessible: Accessible public 1.36 + 1.37 +Accessible* 1.38 +LeafAccessible::ChildAtPoint(int32_t aX, int32_t aY, 1.39 + EWhichChildAtPoint aWhichChild) 1.40 +{ 1.41 + // Don't walk into leaf accessibles. 1.42 + return this; 1.43 +} 1.44 + 1.45 +bool 1.46 +LeafAccessible::InsertChildAt(uint32_t aIndex, Accessible* aChild) 1.47 +{ 1.48 + NS_NOTREACHED("InsertChildAt called on leaf accessible!"); 1.49 + return false; 1.50 +} 1.51 + 1.52 +bool 1.53 +LeafAccessible::RemoveChild(Accessible* aChild) 1.54 +{ 1.55 + NS_NOTREACHED("RemoveChild called on leaf accessible!"); 1.56 + return false; 1.57 +} 1.58 + 1.59 +//////////////////////////////////////////////////////////////////////////////// 1.60 +// LeafAccessible: Accessible private 1.61 + 1.62 +void 1.63 +LeafAccessible::CacheChildren() 1.64 +{ 1.65 + // No children for leaf accessible. 1.66 +} 1.67 + 1.68 + 1.69 +//////////////////////////////////////////////////////////////////////////////// 1.70 +// LinkableAccessible 1.71 +//////////////////////////////////////////////////////////////////////////////// 1.72 + 1.73 +LinkableAccessible:: 1.74 + LinkableAccessible(nsIContent* aContent, DocAccessible* aDoc) : 1.75 + AccessibleWrap(aContent, aDoc), 1.76 + mActionAcc(nullptr), 1.77 + mIsLink(false), 1.78 + mIsOnclick(false) 1.79 +{ 1.80 +} 1.81 + 1.82 +NS_IMPL_ISUPPORTS_INHERITED0(LinkableAccessible, AccessibleWrap) 1.83 + 1.84 +//////////////////////////////////////////////////////////////////////////////// 1.85 +// LinkableAccessible. nsIAccessible 1.86 + 1.87 +NS_IMETHODIMP 1.88 +LinkableAccessible::TakeFocus() 1.89 +{ 1.90 + return mActionAcc ? mActionAcc->TakeFocus() : AccessibleWrap::TakeFocus(); 1.91 +} 1.92 + 1.93 +uint64_t 1.94 +LinkableAccessible::NativeLinkState() const 1.95 +{ 1.96 + if (mIsLink) 1.97 + return states::LINKED | (mActionAcc->LinkState() & states::TRAVERSED); 1.98 + 1.99 + return 0; 1.100 +} 1.101 + 1.102 +void 1.103 +LinkableAccessible::Value(nsString& aValue) 1.104 +{ 1.105 + aValue.Truncate(); 1.106 + 1.107 + Accessible::Value(aValue); 1.108 + if (!aValue.IsEmpty()) 1.109 + return; 1.110 + 1.111 + if (aValue.IsEmpty() && mIsLink) 1.112 + mActionAcc->Value(aValue); 1.113 +} 1.114 + 1.115 + 1.116 +uint8_t 1.117 +LinkableAccessible::ActionCount() 1.118 +{ 1.119 + return (mIsOnclick || mIsLink) ? 1 : 0; 1.120 +} 1.121 + 1.122 +NS_IMETHODIMP 1.123 +LinkableAccessible::GetActionName(uint8_t aIndex, nsAString& aName) 1.124 +{ 1.125 + aName.Truncate(); 1.126 + 1.127 + // Action 0 (default action): Jump to link 1.128 + if (aIndex == eAction_Jump) { 1.129 + if (mIsLink) { 1.130 + aName.AssignLiteral("jump"); 1.131 + return NS_OK; 1.132 + } 1.133 + else if (mIsOnclick) { 1.134 + aName.AssignLiteral("click"); 1.135 + return NS_OK; 1.136 + } 1.137 + return NS_ERROR_NOT_IMPLEMENTED; 1.138 + } 1.139 + return NS_ERROR_INVALID_ARG; 1.140 +} 1.141 + 1.142 +NS_IMETHODIMP 1.143 +LinkableAccessible::DoAction(uint8_t aIndex) 1.144 +{ 1.145 + if (aIndex != eAction_Jump) 1.146 + return NS_ERROR_INVALID_ARG; 1.147 + 1.148 + return mActionAcc ? mActionAcc->DoAction(aIndex) : 1.149 + AccessibleWrap::DoAction(aIndex); 1.150 +} 1.151 + 1.152 +KeyBinding 1.153 +LinkableAccessible::AccessKey() const 1.154 +{ 1.155 + return mActionAcc ? 1.156 + mActionAcc->AccessKey() : Accessible::AccessKey(); 1.157 +} 1.158 + 1.159 +//////////////////////////////////////////////////////////////////////////////// 1.160 +// LinkableAccessible. Accessible 1.161 + 1.162 +void 1.163 +LinkableAccessible::Shutdown() 1.164 +{ 1.165 + mIsLink = false; 1.166 + mIsOnclick = false; 1.167 + mActionAcc = nullptr; 1.168 + AccessibleWrap::Shutdown(); 1.169 +} 1.170 + 1.171 +//////////////////////////////////////////////////////////////////////////////// 1.172 +// LinkableAccessible: HyperLinkAccessible 1.173 + 1.174 +already_AddRefed<nsIURI> 1.175 +LinkableAccessible::AnchorURIAt(uint32_t aAnchorIndex) 1.176 +{ 1.177 + if (mIsLink) { 1.178 + NS_ASSERTION(mActionAcc->IsLink(), 1.179 + "nsIAccessibleHyperLink isn't implemented."); 1.180 + 1.181 + if (mActionAcc->IsLink()) 1.182 + return mActionAcc->AnchorURIAt(aAnchorIndex); 1.183 + } 1.184 + 1.185 + return nullptr; 1.186 +} 1.187 + 1.188 +//////////////////////////////////////////////////////////////////////////////// 1.189 +// LinkableAccessible: Accessible protected 1.190 + 1.191 +void 1.192 +LinkableAccessible::BindToParent(Accessible* aParent, 1.193 + uint32_t aIndexInParent) 1.194 +{ 1.195 + AccessibleWrap::BindToParent(aParent, aIndexInParent); 1.196 + 1.197 + // Cache action content. 1.198 + mActionAcc = nullptr; 1.199 + mIsLink = false; 1.200 + mIsOnclick = false; 1.201 + 1.202 + if (nsCoreUtils::HasClickListener(mContent)) { 1.203 + mIsOnclick = true; 1.204 + return; 1.205 + } 1.206 + 1.207 + // XXX: The logic looks broken since the click listener may be registered 1.208 + // on non accessible node in parent chain but this node is skipped when tree 1.209 + // is traversed. 1.210 + Accessible* walkUpAcc = this; 1.211 + while ((walkUpAcc = walkUpAcc->Parent()) && !walkUpAcc->IsDoc()) { 1.212 + if (walkUpAcc->LinkState() & states::LINKED) { 1.213 + mIsLink = true; 1.214 + mActionAcc = walkUpAcc; 1.215 + return; 1.216 + } 1.217 + 1.218 + if (nsCoreUtils::HasClickListener(walkUpAcc->GetContent())) { 1.219 + mActionAcc = walkUpAcc; 1.220 + mIsOnclick = true; 1.221 + return; 1.222 + } 1.223 + } 1.224 +} 1.225 + 1.226 +void 1.227 +LinkableAccessible::UnbindFromParent() 1.228 +{ 1.229 + mActionAcc = nullptr; 1.230 + mIsLink = false; 1.231 + mIsOnclick = false; 1.232 + 1.233 + AccessibleWrap::UnbindFromParent(); 1.234 +} 1.235 + 1.236 +//////////////////////////////////////////////////////////////////////////////// 1.237 +// EnumRoleAccessible 1.238 +//////////////////////////////////////////////////////////////////////////////// 1.239 + 1.240 +EnumRoleAccessible:: 1.241 + EnumRoleAccessible(nsIContent* aNode, DocAccessible* aDoc, roles::Role aRole) : 1.242 + AccessibleWrap(aNode, aDoc), mRole(aRole) 1.243 +{ 1.244 +} 1.245 + 1.246 +NS_IMPL_ISUPPORTS_INHERITED0(EnumRoleAccessible, Accessible) 1.247 + 1.248 +role 1.249 +EnumRoleAccessible::NativeRole() 1.250 +{ 1.251 + return mRole; 1.252 +} 1.253 + 1.254 +//////////////////////////////////////////////////////////////////////////////// 1.255 +// DummyAccessible 1.256 +//////////////////////////////////////////////////////////////////////////////// 1.257 + 1.258 +uint64_t 1.259 +DummyAccessible::NativeState() 1.260 +{ 1.261 + return 0; 1.262 +} 1.263 +uint64_t 1.264 +DummyAccessible::NativeInteractiveState() const 1.265 +{ 1.266 + return 0; 1.267 +} 1.268 + 1.269 +uint64_t 1.270 +DummyAccessible::NativeLinkState() const 1.271 +{ 1.272 + return 0; 1.273 +} 1.274 + 1.275 +bool 1.276 +DummyAccessible::NativelyUnavailable() const 1.277 +{ 1.278 + return false; 1.279 +} 1.280 + 1.281 +void 1.282 +DummyAccessible::ApplyARIAState(uint64_t* aState) const 1.283 +{ 1.284 +}