Bumping manifests a=b2g-bump
[gecko.git] / accessible / xul / XULTabAccessible.cpp
blob531fd6a2d8b015c47b4861635544ae54b0cf288b
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/. */
6 #include "XULTabAccessible.h"
8 #include "nsAccUtils.h"
9 #include "Relation.h"
10 #include "Role.h"
11 #include "States.h"
13 // NOTE: alphabetically ordered
14 #include "nsIAccessibleRelation.h"
15 #include "nsIDocument.h"
16 #include "nsIDOMXULSelectCntrlEl.h"
17 #include "nsIDOMXULSelectCntrlItemEl.h"
18 #include "nsIDOMXULRelatedElement.h"
20 using namespace mozilla::a11y;
22 ////////////////////////////////////////////////////////////////////////////////
23 // XULTabAccessible
24 ////////////////////////////////////////////////////////////////////////////////
26 XULTabAccessible::
27 XULTabAccessible(nsIContent* aContent, DocAccessible* aDoc) :
28 AccessibleWrap(aContent, aDoc)
32 ////////////////////////////////////////////////////////////////////////////////
33 // XULTabAccessible: nsIAccessible
35 uint8_t
36 XULTabAccessible::ActionCount()
38 return 1;
41 /** Return the name of our only action */
42 NS_IMETHODIMP
43 XULTabAccessible::GetActionName(uint8_t aIndex, nsAString& aName)
45 if (aIndex == eAction_Switch) {
46 aName.AssignLiteral("switch");
47 return NS_OK;
49 return NS_ERROR_INVALID_ARG;
52 /** Tell the tab to do its action */
53 NS_IMETHODIMP
54 XULTabAccessible::DoAction(uint8_t index)
56 if (index == eAction_Switch) {
57 nsCOMPtr<nsIDOMXULElement> tab(do_QueryInterface(mContent));
58 if ( tab )
60 tab->Click();
61 return NS_OK;
63 return NS_ERROR_FAILURE;
65 return NS_ERROR_INVALID_ARG;
68 ////////////////////////////////////////////////////////////////////////////////
69 // XULTabAccessible: Accessible
71 role
72 XULTabAccessible::NativeRole()
74 return roles::PAGETAB;
77 uint64_t
78 XULTabAccessible::NativeState()
80 // Possible states: focused, focusable, unavailable(disabled), offscreen.
82 // get focus and disable status from base class
83 uint64_t state = AccessibleWrap::NativeState();
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;
92 if (mContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::pinned,
93 nsGkAtoms::_true, eCaseMatters))
94 state |= states::PINNED;
98 return state;
101 uint64_t
102 XULTabAccessible::NativeInteractiveState() const
104 uint64_t state = Accessible::NativeInteractiveState();
105 return (state & states::UNAVAILABLE) ? state : state | states::SELECTABLE;
108 // nsIAccessible
109 Relation
110 XULTabAccessible::RelationByType(RelationType aType)
112 Relation rel = AccessibleWrap::RelationByType(aType);
113 if (aType != RelationType::LABEL_FOR)
114 return rel;
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;
122 nsCOMPtr<nsIDOMNode> domNode(DOMNode());
123 nsCOMPtr<nsIDOMNode> tabpanelNode;
124 tabsElm->GetRelatedElement(domNode, getter_AddRefs(tabpanelNode));
125 if (!tabpanelNode)
126 return rel;
128 nsCOMPtr<nsIContent> tabpanelContent(do_QueryInterface(tabpanelNode));
129 rel.AppendTarget(mDoc, tabpanelContent);
130 return rel;
134 ////////////////////////////////////////////////////////////////////////////////
135 // XULTabsAccessible
136 ////////////////////////////////////////////////////////////////////////////////
138 XULTabsAccessible::
139 XULTabsAccessible(nsIContent* aContent, DocAccessible* aDoc) :
140 XULSelectControlAccessible(aContent, aDoc)
144 role
145 XULTabsAccessible::NativeRole()
147 return roles::PAGETABLIST;
150 uint8_t
151 XULTabsAccessible::ActionCount()
153 return 0;
156 void
157 XULTabsAccessible::Value(nsString& aValue)
159 aValue.Truncate();
162 ENameValueFlag
163 XULTabsAccessible::NativeName(nsString& aName)
165 // no name
166 return eNameOK;
170 ////////////////////////////////////////////////////////////////////////////////
171 // XULTabpanelsAccessible
172 ////////////////////////////////////////////////////////////////////////////////
174 role
175 XULTabpanelsAccessible::NativeRole()
177 return roles::PANE;
180 ////////////////////////////////////////////////////////////////////////////////
181 // XULTabpanelAccessible
182 ////////////////////////////////////////////////////////////////////////////////
184 XULTabpanelAccessible::
185 XULTabpanelAccessible(nsIContent* aContent, DocAccessible* aDoc) :
186 AccessibleWrap(aContent, aDoc)
190 role
191 XULTabpanelAccessible::NativeRole()
193 return roles::PROPERTYPAGE;
196 Relation
197 XULTabpanelAccessible::RelationByType(RelationType aType)
199 Relation rel = AccessibleWrap::RelationByType(aType);
200 if (aType != RelationType::LABELLED_BY)
201 return rel;
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;
209 nsCOMPtr<nsIDOMNode> domNode(DOMNode());
210 nsCOMPtr<nsIDOMNode> tabNode;
211 tabpanelsElm->GetRelatedElement(domNode, getter_AddRefs(tabNode));
212 if (!tabNode)
213 return rel;
215 nsCOMPtr<nsIContent> tabContent(do_QueryInterface(tabNode));
216 rel.AppendTarget(mDoc, tabContent);
217 return rel;