BaseAccessibles.cpp (3881B)
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/. */ 5 6 #include "BaseAccessibles.h" 7 8 #include "States.h" 9 10 using namespace mozilla::a11y; 11 12 //////////////////////////////////////////////////////////////////////////////// 13 // LeafAccessible 14 //////////////////////////////////////////////////////////////////////////////// 15 16 LeafAccessible::LeafAccessible(nsIContent* aContent, DocAccessible* aDoc) 17 : AccessibleWrap(aContent, aDoc) { 18 mStateFlags |= eNoKidsFromDOM; 19 } 20 21 //////////////////////////////////////////////////////////////////////////////// 22 // LeafAccessible: LocalAccessible public 23 24 LocalAccessible* LeafAccessible::LocalChildAtPoint( 25 int32_t aX, int32_t aY, EWhichChildAtPoint aWhichChild) { 26 // Don't walk into leaf accessibles. 27 return this; 28 } 29 30 bool LeafAccessible::InsertChildAt(uint32_t aIndex, LocalAccessible* aChild) { 31 MOZ_ASSERT_UNREACHABLE("InsertChildAt called on leaf accessible!"); 32 return false; 33 } 34 35 bool LeafAccessible::RemoveChild(LocalAccessible* aChild) { 36 MOZ_ASSERT_UNREACHABLE("RemoveChild called on leaf accessible!"); 37 return false; 38 } 39 40 bool LeafAccessible::IsAcceptableChild(nsIContent* aEl) const { 41 // No children for leaf accessible. 42 return false; 43 } 44 45 //////////////////////////////////////////////////////////////////////////////// 46 // LinkableAccessible 47 //////////////////////////////////////////////////////////////////////////////// 48 49 //////////////////////////////////////////////////////////////////////////////// 50 // LinkableAccessible. nsIAccessible 51 52 void LinkableAccessible::TakeFocus() const { 53 if (const LocalAccessible* actionAcc = ActionWalk()) { 54 actionAcc->TakeFocus(); 55 } else { 56 AccessibleWrap::TakeFocus(); 57 } 58 } 59 60 uint64_t LinkableAccessible::NativeLinkState() const { 61 bool isLink; 62 const LocalAccessible* actionAcc = ActionWalk(&isLink); 63 if (isLink) { 64 return states::LINKED | (actionAcc->LinkState() & states::TRAVERSED); 65 } 66 67 return 0; 68 } 69 70 void LinkableAccessible::Value(nsString& aValue) const { 71 aValue.Truncate(); 72 73 LocalAccessible::Value(aValue); 74 if (!aValue.IsEmpty()) { 75 return; 76 } 77 78 bool isLink; 79 const LocalAccessible* actionAcc = ActionWalk(&isLink); 80 if (isLink) { 81 actionAcc->Value(aValue); 82 } 83 } 84 85 const LocalAccessible* LinkableAccessible::ActionWalk(bool* aIsLink, 86 bool* aIsOnclick) const { 87 if (aIsOnclick) { 88 *aIsOnclick = false; 89 } 90 if (aIsLink) { 91 *aIsLink = false; 92 } 93 94 if (HasPrimaryAction()) { 95 if (aIsOnclick) { 96 *aIsOnclick = true; 97 } 98 99 return nullptr; 100 } 101 102 const Accessible* actionAcc = ActionAncestor(); 103 104 const LocalAccessible* localAction = 105 actionAcc ? const_cast<Accessible*>(actionAcc)->AsLocal() : nullptr; 106 107 if (!localAction) { 108 return nullptr; 109 } 110 111 if (localAction->LinkState() & states::LINKED) { 112 if (aIsLink) { 113 *aIsLink = true; 114 } 115 } else if (aIsOnclick) { 116 *aIsOnclick = true; 117 } 118 119 return localAction; 120 } 121 122 KeyBinding LinkableAccessible::AccessKey() const { 123 if (const LocalAccessible* actionAcc = ActionWalk()) { 124 return actionAcc->AccessKey(); 125 } 126 127 return LocalAccessible::AccessKey(); 128 } 129 130 //////////////////////////////////////////////////////////////////////////////// 131 // DummyAccessible 132 //////////////////////////////////////////////////////////////////////////////// 133 134 uint64_t DummyAccessible::NativeState() const { return 0; } 135 uint64_t DummyAccessible::NativeInteractiveState() const { return 0; } 136 137 uint64_t DummyAccessible::NativeLinkState() const { return 0; } 138 139 bool DummyAccessible::NativelyUnavailable() const { return false; } 140 141 void DummyAccessible::ApplyARIAState(uint64_t* aState) const {}