|
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 "XULTabAccessible.h" |
|
7 |
|
8 #include "nsAccUtils.h" |
|
9 #include "Relation.h" |
|
10 #include "Role.h" |
|
11 #include "States.h" |
|
12 |
|
13 // NOTE: alphabetically ordered |
|
14 #include "nsIAccessibleRelation.h" |
|
15 #include "nsIDocument.h" |
|
16 #include "nsIDOMXULSelectCntrlEl.h" |
|
17 #include "nsIDOMXULSelectCntrlItemEl.h" |
|
18 #include "nsIDOMXULRelatedElement.h" |
|
19 |
|
20 using namespace mozilla::a11y; |
|
21 |
|
22 //////////////////////////////////////////////////////////////////////////////// |
|
23 // XULTabAccessible |
|
24 //////////////////////////////////////////////////////////////////////////////// |
|
25 |
|
26 XULTabAccessible:: |
|
27 XULTabAccessible(nsIContent* aContent, DocAccessible* aDoc) : |
|
28 AccessibleWrap(aContent, aDoc) |
|
29 { |
|
30 } |
|
31 |
|
32 //////////////////////////////////////////////////////////////////////////////// |
|
33 // XULTabAccessible: nsIAccessible |
|
34 |
|
35 uint8_t |
|
36 XULTabAccessible::ActionCount() |
|
37 { |
|
38 return 1; |
|
39 } |
|
40 |
|
41 /** Return the name of our only action */ |
|
42 NS_IMETHODIMP |
|
43 XULTabAccessible::GetActionName(uint8_t aIndex, nsAString& aName) |
|
44 { |
|
45 if (aIndex == eAction_Switch) { |
|
46 aName.AssignLiteral("switch"); |
|
47 return NS_OK; |
|
48 } |
|
49 return NS_ERROR_INVALID_ARG; |
|
50 } |
|
51 |
|
52 /** Tell the tab to do its action */ |
|
53 NS_IMETHODIMP |
|
54 XULTabAccessible::DoAction(uint8_t index) |
|
55 { |
|
56 if (index == eAction_Switch) { |
|
57 nsCOMPtr<nsIDOMXULElement> tab(do_QueryInterface(mContent)); |
|
58 if ( tab ) |
|
59 { |
|
60 tab->Click(); |
|
61 return NS_OK; |
|
62 } |
|
63 return NS_ERROR_FAILURE; |
|
64 } |
|
65 return NS_ERROR_INVALID_ARG; |
|
66 } |
|
67 |
|
68 //////////////////////////////////////////////////////////////////////////////// |
|
69 // XULTabAccessible: Accessible |
|
70 |
|
71 role |
|
72 XULTabAccessible::NativeRole() |
|
73 { |
|
74 return roles::PAGETAB; |
|
75 } |
|
76 |
|
77 uint64_t |
|
78 XULTabAccessible::NativeState() |
|
79 { |
|
80 // Possible states: focused, focusable, unavailable(disabled), offscreen. |
|
81 |
|
82 // get focus and disable status from base class |
|
83 uint64_t state = AccessibleWrap::NativeState(); |
|
84 |
|
85 // Check whether the tab is selected and/or pinned |
|
86 nsCOMPtr<nsIDOMXULSelectControlItemElement> tab(do_QueryInterface(mContent)); |
|
87 if (tab) { |
|
88 bool selected = false; |
|
89 if (NS_SUCCEEDED(tab->GetSelected(&selected)) && selected) |
|
90 state |= states::SELECTED; |
|
91 |
|
92 if (mContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::pinned, |
|
93 nsGkAtoms::_true, eCaseMatters)) |
|
94 state |= states::PINNED; |
|
95 |
|
96 } |
|
97 |
|
98 return state; |
|
99 } |
|
100 |
|
101 uint64_t |
|
102 XULTabAccessible::NativeInteractiveState() const |
|
103 { |
|
104 uint64_t state = Accessible::NativeInteractiveState(); |
|
105 return (state & states::UNAVAILABLE) ? state : state | states::SELECTABLE; |
|
106 } |
|
107 |
|
108 // nsIAccessible |
|
109 Relation |
|
110 XULTabAccessible::RelationByType(RelationType aType) |
|
111 { |
|
112 Relation rel = AccessibleWrap::RelationByType(aType); |
|
113 if (aType != RelationType::LABEL_FOR) |
|
114 return rel; |
|
115 |
|
116 // Expose 'LABEL_FOR' relation on tab accessible for tabpanel accessible. |
|
117 nsCOMPtr<nsIDOMXULRelatedElement> tabsElm = |
|
118 do_QueryInterface(mContent->GetParent()); |
|
119 if (!tabsElm) |
|
120 return rel; |
|
121 |
|
122 nsCOMPtr<nsIDOMNode> domNode(DOMNode()); |
|
123 nsCOMPtr<nsIDOMNode> tabpanelNode; |
|
124 tabsElm->GetRelatedElement(domNode, getter_AddRefs(tabpanelNode)); |
|
125 if (!tabpanelNode) |
|
126 return rel; |
|
127 |
|
128 nsCOMPtr<nsIContent> tabpanelContent(do_QueryInterface(tabpanelNode)); |
|
129 rel.AppendTarget(mDoc, tabpanelContent); |
|
130 return rel; |
|
131 } |
|
132 |
|
133 |
|
134 //////////////////////////////////////////////////////////////////////////////// |
|
135 // XULTabsAccessible |
|
136 //////////////////////////////////////////////////////////////////////////////// |
|
137 |
|
138 XULTabsAccessible:: |
|
139 XULTabsAccessible(nsIContent* aContent, DocAccessible* aDoc) : |
|
140 XULSelectControlAccessible(aContent, aDoc) |
|
141 { |
|
142 } |
|
143 |
|
144 role |
|
145 XULTabsAccessible::NativeRole() |
|
146 { |
|
147 return roles::PAGETABLIST; |
|
148 } |
|
149 |
|
150 uint8_t |
|
151 XULTabsAccessible::ActionCount() |
|
152 { |
|
153 return 0; |
|
154 } |
|
155 |
|
156 void |
|
157 XULTabsAccessible::Value(nsString& aValue) |
|
158 { |
|
159 aValue.Truncate(); |
|
160 } |
|
161 |
|
162 ENameValueFlag |
|
163 XULTabsAccessible::NativeName(nsString& aName) |
|
164 { |
|
165 // no name |
|
166 return eNameOK; |
|
167 } |
|
168 |
|
169 |
|
170 //////////////////////////////////////////////////////////////////////////////// |
|
171 // XULTabpanelsAccessible |
|
172 //////////////////////////////////////////////////////////////////////////////// |
|
173 |
|
174 role |
|
175 XULTabpanelsAccessible::NativeRole() |
|
176 { |
|
177 return roles::PANE; |
|
178 } |
|
179 |
|
180 //////////////////////////////////////////////////////////////////////////////// |
|
181 // XULTabpanelAccessible |
|
182 //////////////////////////////////////////////////////////////////////////////// |
|
183 |
|
184 XULTabpanelAccessible:: |
|
185 XULTabpanelAccessible(nsIContent* aContent, DocAccessible* aDoc) : |
|
186 AccessibleWrap(aContent, aDoc) |
|
187 { |
|
188 } |
|
189 |
|
190 role |
|
191 XULTabpanelAccessible::NativeRole() |
|
192 { |
|
193 return roles::PROPERTYPAGE; |
|
194 } |
|
195 |
|
196 Relation |
|
197 XULTabpanelAccessible::RelationByType(RelationType aType) |
|
198 { |
|
199 Relation rel = AccessibleWrap::RelationByType(aType); |
|
200 if (aType != RelationType::LABELLED_BY) |
|
201 return rel; |
|
202 |
|
203 // Expose 'LABELLED_BY' relation on tabpanel accessible for tab accessible. |
|
204 nsCOMPtr<nsIDOMXULRelatedElement> tabpanelsElm = |
|
205 do_QueryInterface(mContent->GetParent()); |
|
206 if (!tabpanelsElm) |
|
207 return rel; |
|
208 |
|
209 nsCOMPtr<nsIDOMNode> domNode(DOMNode()); |
|
210 nsCOMPtr<nsIDOMNode> tabNode; |
|
211 tabpanelsElm->GetRelatedElement(domNode, getter_AddRefs(tabNode)); |
|
212 if (!tabNode) |
|
213 return rel; |
|
214 |
|
215 nsCOMPtr<nsIContent> tabContent(do_QueryInterface(tabNode)); |
|
216 rel.AppendTarget(mDoc, tabContent); |
|
217 return rel; |
|
218 } |