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