1 /* -*- Mode: C++; tab-width: 4; 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 #ifndef mozilla_a11y_HTMLSelectAccessible_h__
7 #define mozilla_a11y_HTMLSelectAccessible_h__
9 #include "HTMLFormControlAccessible.h"
15 * Selects, Listboxes and Comboboxes, are made up of a number of different
16 * widgets, some of which are shared between the two. This file contains
17 * all of the widgets for both of the Selects, for HTML only.
20 * - HTMLSelectListAccessible
21 * - HTMLSelectOptionAccessible
24 * - HTMLComboboxAccessible
25 * - HTMLComboboxListAccessible [ inserted in accessible tree ]
26 * - HTMLSelectOptionAccessible(s)
30 * The list that contains all the options in the select.
32 class HTMLSelectListAccessible
: public AccessibleWrap
{
34 HTMLSelectListAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
);
35 virtual ~HTMLSelectListAccessible() {}
38 virtual a11y::role
NativeRole() const override
;
39 virtual uint64_t NativeState() const override
;
40 virtual bool IsAcceptableChild(nsIContent
* aEl
) const override
;
41 virtual bool AttributeChangesState(nsAtom
* aAttribute
) override
;
44 virtual bool SelectAll() override
;
45 virtual bool UnselectAll() override
;
48 virtual bool IsWidget() const override
;
49 virtual bool IsActiveWidget() const override
;
50 virtual bool AreItemsOperable() const override
;
51 virtual LocalAccessible
* CurrentItem() const override
;
52 virtual void SetCurrentItem(const LocalAccessible
* aItem
) override
;
56 * Options inside the select, contained within the list
58 class HTMLSelectOptionAccessible
: public HyperTextAccessible
{
60 enum { eAction_Select
= 0 };
62 HTMLSelectOptionAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
);
63 virtual ~HTMLSelectOptionAccessible() {}
66 virtual a11y::role
NativeRole() const override
;
67 virtual uint64_t NativeState() const override
;
68 virtual uint64_t NativeInteractiveState() const override
;
70 virtual nsRect
RelativeBounds(nsIFrame
** aBoundingFrame
) const override
;
71 virtual void SetSelected(bool aSelect
) override
;
74 virtual bool HasPrimaryAction() const override
;
75 virtual void ActionNameAt(uint8_t aIndex
, nsAString
& aName
) override
;
78 virtual LocalAccessible
* ContainerWidget() const override
;
82 virtual ENameValueFlag
NativeName(nsString
& aName
) const override
;
83 virtual void DOMAttributeChanged(int32_t aNameSpaceID
, nsAtom
* aAttribute
,
85 const nsAttrValue
* aOldValue
,
86 uint64_t aOldState
) override
;
90 * Return a select accessible the option belongs to if any.
92 LocalAccessible
* GetSelect() const {
93 LocalAccessible
* parent
= mParent
;
94 if (parent
&& parent
->IsHTMLOptGroup()) {
95 parent
= parent
->LocalParent();
98 if (parent
&& parent
->IsListControl()) {
99 LocalAccessible
* combobox
= parent
->LocalParent();
100 return combobox
&& combobox
->IsCombobox() ? combobox
: mParent
;
107 * Return a combobox accessible the option belongs to if any.
109 LocalAccessible
* GetCombobox() const {
110 LocalAccessible
* parent
= mParent
;
111 if (parent
&& parent
->IsHTMLOptGroup()) {
112 parent
= parent
->LocalParent();
115 if (parent
&& parent
->IsListControl()) {
116 LocalAccessible
* combobox
= parent
->LocalParent();
117 return combobox
&& combobox
->IsCombobox() ? combobox
: nullptr;
125 * Opt Groups inside the select, contained within the list
127 class HTMLSelectOptGroupAccessible
: public HTMLSelectOptionAccessible
{
129 HTMLSelectOptGroupAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
)
130 : HTMLSelectOptionAccessible(aContent
, aDoc
) {
131 mType
= eHTMLOptGroupType
;
133 virtual ~HTMLSelectOptGroupAccessible() {}
136 virtual a11y::role
NativeRole() const override
;
137 virtual uint64_t NativeInteractiveState() const override
;
138 virtual bool IsAcceptableChild(nsIContent
* aEl
) const override
;
141 virtual bool HasPrimaryAction() const override
;
144 /** ------------------------------------------------------ */
145 /** Finally, the Combobox widgets */
146 /** ------------------------------------------------------ */
148 class HTMLComboboxListAccessible
;
151 * A class the represents the HTML Combobox widget.
153 class HTMLComboboxAccessible final
: public AccessibleWrap
{
155 enum { eAction_Click
= 0 };
157 HTMLComboboxAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
);
158 virtual ~HTMLComboboxAccessible() {}
161 virtual void Shutdown() override
;
162 virtual void Description(nsString
& aDescription
) const override
;
163 virtual void Value(nsString
& aValue
) const override
;
164 virtual a11y::role
NativeRole() const override
;
165 virtual uint64_t NativeState() const override
;
166 virtual bool RemoveChild(LocalAccessible
* aChild
) override
;
167 virtual bool IsAcceptableChild(nsIContent
* aEl
) const override
;
170 virtual bool HasPrimaryAction() const override
;
171 virtual void ActionNameAt(uint8_t aIndex
, nsAString
& aName
) override
;
174 virtual bool IsWidget() const override
;
175 virtual bool IsActiveWidget() const override
;
176 virtual bool AreItemsOperable() const override
;
177 virtual LocalAccessible
* CurrentItem() const override
;
178 virtual void SetCurrentItem(const LocalAccessible
* aItem
) override
;
180 HTMLComboboxListAccessible
* List() const { return mListAccessible
; }
183 * Return selected option.
185 LocalAccessible
* SelectedOption() const;
188 RefPtr
<HTMLComboboxListAccessible
> mListAccessible
;
192 * A class that represents the window that lives to the right
193 * of the drop down button inside the Select. This is the window
194 * that is made visible when the button is pressed.
196 class HTMLComboboxListAccessible
: public HTMLSelectListAccessible
{
198 HTMLComboboxListAccessible(LocalAccessible
* aParent
, nsIContent
* aContent
,
199 DocAccessible
* aDoc
);
200 virtual ~HTMLComboboxListAccessible() {}
203 virtual a11y::role
NativeRole() const override
;
204 virtual uint64_t NativeState() const override
;
205 virtual nsRect
RelativeBounds(nsIFrame
** aBoundingFrame
) const override
;
206 virtual bool IsAcceptableChild(nsIContent
* aEl
) const override
;
209 virtual bool IsActiveWidget() const override
;
210 virtual bool AreItemsOperable() const override
;
214 } // namespace mozilla