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"
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 ////////////////////////////////////////////////////////////////////////////////
24 ////////////////////////////////////////////////////////////////////////////////
27 XULTabAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
) :
28 AccessibleWrap(aContent
, aDoc
)
32 ////////////////////////////////////////////////////////////////////////////////
33 // XULTabAccessible: nsIAccessible
36 XULTabAccessible::ActionCount()
41 /** Return the name of our only action */
43 XULTabAccessible::GetActionName(uint8_t aIndex
, nsAString
& aName
)
45 if (aIndex
== eAction_Switch
) {
46 aName
.AssignLiteral("switch");
49 return NS_ERROR_INVALID_ARG
;
52 /** Tell the tab to do its action */
54 XULTabAccessible::DoAction(uint8_t index
)
56 if (index
== eAction_Switch
) {
57 nsCOMPtr
<nsIDOMXULElement
> tab(do_QueryInterface(mContent
));
63 return NS_ERROR_FAILURE
;
65 return NS_ERROR_INVALID_ARG
;
68 ////////////////////////////////////////////////////////////////////////////////
69 // XULTabAccessible: Accessible
72 XULTabAccessible::NativeRole()
74 return roles::PAGETAB
;
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
));
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
;
102 XULTabAccessible::NativeInteractiveState() const
104 uint64_t state
= Accessible::NativeInteractiveState();
105 return (state
& states::UNAVAILABLE
) ? state
: state
| states::SELECTABLE
;
110 XULTabAccessible::RelationByType(RelationType aType
)
112 Relation rel
= AccessibleWrap::RelationByType(aType
);
113 if (aType
!= RelationType::LABEL_FOR
)
116 // Expose 'LABEL_FOR' relation on tab accessible for tabpanel accessible.
117 nsCOMPtr
<nsIDOMXULRelatedElement
> tabsElm
=
118 do_QueryInterface(mContent
->GetParent());
122 nsCOMPtr
<nsIDOMNode
> domNode(DOMNode());
123 nsCOMPtr
<nsIDOMNode
> tabpanelNode
;
124 tabsElm
->GetRelatedElement(domNode
, getter_AddRefs(tabpanelNode
));
128 nsCOMPtr
<nsIContent
> tabpanelContent(do_QueryInterface(tabpanelNode
));
129 rel
.AppendTarget(mDoc
, tabpanelContent
);
134 ////////////////////////////////////////////////////////////////////////////////
136 ////////////////////////////////////////////////////////////////////////////////
139 XULTabsAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
) :
140 XULSelectControlAccessible(aContent
, aDoc
)
145 XULTabsAccessible::NativeRole()
147 return roles::PAGETABLIST
;
151 XULTabsAccessible::ActionCount()
157 XULTabsAccessible::Value(nsString
& aValue
)
163 XULTabsAccessible::NativeName(nsString
& aName
)
170 ////////////////////////////////////////////////////////////////////////////////
171 // XULTabpanelsAccessible
172 ////////////////////////////////////////////////////////////////////////////////
175 XULTabpanelsAccessible::NativeRole()
180 ////////////////////////////////////////////////////////////////////////////////
181 // XULTabpanelAccessible
182 ////////////////////////////////////////////////////////////////////////////////
184 XULTabpanelAccessible::
185 XULTabpanelAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
) :
186 AccessibleWrap(aContent
, aDoc
)
191 XULTabpanelAccessible::NativeRole()
193 return roles::PROPERTYPAGE
;
197 XULTabpanelAccessible::RelationByType(RelationType aType
)
199 Relation rel
= AccessibleWrap::RelationByType(aType
);
200 if (aType
!= RelationType::LABELLED_BY
)
203 // Expose 'LABELLED_BY' relation on tabpanel accessible for tab accessible.
204 nsCOMPtr
<nsIDOMXULRelatedElement
> tabpanelsElm
=
205 do_QueryInterface(mContent
->GetParent());
209 nsCOMPtr
<nsIDOMNode
> domNode(DOMNode());
210 nsCOMPtr
<nsIDOMNode
> tabNode
;
211 tabpanelsElm
->GetRelatedElement(domNode
, getter_AddRefs(tabNode
));
215 nsCOMPtr
<nsIContent
> tabContent(do_QueryInterface(tabNode
));
216 rel
.AppendTarget(mDoc
, tabContent
);