Line data Source code
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 file,
5 : * You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #ifndef mozilla_a11y_Accessible_inl_h_
8 : #define mozilla_a11y_Accessible_inl_h_
9 :
10 : #include "DocAccessible.h"
11 : #include "ARIAMap.h"
12 : #include "nsCoreUtils.h"
13 :
14 : #ifdef A11Y_LOG
15 : #include "Logging.h"
16 : #endif
17 :
18 : namespace mozilla {
19 : namespace a11y {
20 :
21 : inline mozilla::a11y::role
22 0 : Accessible::Role()
23 : {
24 0 : const nsRoleMapEntry* roleMapEntry = ARIARoleMap();
25 0 : if (!roleMapEntry || roleMapEntry->roleRule != kUseMapRole)
26 0 : return ARIATransformRole(NativeRole());
27 :
28 0 : return ARIATransformRole(roleMapEntry->role);
29 : }
30 :
31 : inline bool
32 0 : Accessible::HasARIARole() const
33 : {
34 0 : return mRoleMapEntryIndex != aria::NO_ROLE_MAP_ENTRY_INDEX;
35 : }
36 :
37 : inline bool
38 0 : Accessible::IsARIARole(nsIAtom* aARIARole) const
39 : {
40 0 : const nsRoleMapEntry* roleMapEntry = ARIARoleMap();
41 0 : return roleMapEntry && roleMapEntry->Is(aARIARole);
42 : }
43 :
44 : inline bool
45 0 : Accessible::HasStrongARIARole() const
46 : {
47 0 : const nsRoleMapEntry* roleMapEntry = ARIARoleMap();
48 0 : return roleMapEntry && roleMapEntry->roleRule == kUseMapRole;
49 : }
50 :
51 : inline const nsRoleMapEntry*
52 0 : Accessible::ARIARoleMap() const
53 : {
54 0 : return aria::GetRoleMapFromIndex(mRoleMapEntryIndex);
55 : }
56 :
57 : inline mozilla::a11y::role
58 0 : Accessible::ARIARole()
59 : {
60 0 : const nsRoleMapEntry* roleMapEntry = ARIARoleMap();
61 0 : if (!roleMapEntry || roleMapEntry->roleRule != kUseMapRole)
62 0 : return mozilla::a11y::roles::NOTHING;
63 :
64 0 : return ARIATransformRole(roleMapEntry->role);
65 : }
66 :
67 : inline void
68 0 : Accessible::SetRoleMapEntry(const nsRoleMapEntry* aRoleMapEntry)
69 : {
70 0 : mRoleMapEntryIndex = aria::GetIndexFromRoleMap(aRoleMapEntry);
71 0 : }
72 :
73 : inline bool
74 0 : Accessible::IsSearchbox() const
75 : {
76 0 : const nsRoleMapEntry* roleMapEntry = ARIARoleMap();
77 0 : return (roleMapEntry && roleMapEntry->Is(nsGkAtoms::searchbox)) ||
78 0 : (mContent->IsHTMLElement(nsGkAtoms::input) &&
79 0 : mContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::type,
80 0 : nsGkAtoms::textInputType, eCaseMatters));
81 : }
82 :
83 : inline bool
84 0 : Accessible::HasGenericType(AccGenericType aType) const
85 : {
86 0 : const nsRoleMapEntry* roleMapEntry = ARIARoleMap();
87 0 : return (mGenericTypes & aType) ||
88 0 : (roleMapEntry && roleMapEntry->IsOfType(aType));
89 : }
90 :
91 : inline bool
92 0 : Accessible::HasNumericValue() const
93 : {
94 0 : if (mStateFlags & eHasNumericValue)
95 0 : return true;
96 :
97 0 : const nsRoleMapEntry* roleMapEntry = ARIARoleMap();
98 0 : if (!roleMapEntry || roleMapEntry->valueRule == eNoValue)
99 0 : return false;
100 :
101 0 : if (roleMapEntry->valueRule == eHasValueMinMaxIfFocusable)
102 0 : return InteractiveState() & states::FOCUSABLE;
103 :
104 0 : return true;
105 : }
106 :
107 : inline void
108 0 : Accessible::ScrollTo(uint32_t aHow) const
109 : {
110 0 : if (mContent)
111 0 : nsCoreUtils::ScrollTo(mDoc->PresShell(), mContent, aHow);
112 0 : }
113 :
114 : inline bool
115 0 : Accessible::InsertAfter(Accessible* aNewChild, Accessible* aRefChild)
116 : {
117 0 : MOZ_ASSERT(aNewChild, "No new child to insert");
118 :
119 0 : if (aRefChild && aRefChild->Parent() != this) {
120 : #ifdef A11Y_LOG
121 0 : logging::TreeInfo("broken accessible tree", 0,
122 : "parent", this, "prev sibling parent",
123 0 : aRefChild->Parent(), "child", aNewChild, nullptr);
124 0 : if (logging::IsEnabled(logging::eVerbose)) {
125 0 : logging::Tree("TREE", "Document tree", mDoc);
126 0 : logging::DOMTree("TREE", "DOM document tree", mDoc);
127 : }
128 : #endif
129 0 : MOZ_ASSERT_UNREACHABLE("Broken accessible tree");
130 : mDoc->UnbindFromDocument(aNewChild);
131 : return false;
132 : }
133 :
134 0 : return InsertChildAt(aRefChild ? aRefChild->IndexInParent() + 1 : 0,
135 0 : aNewChild);
136 : }
137 :
138 : } // namespace a11y
139 : } // namespace mozilla
140 :
141 : #endif
|