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 #ifndef MOZILLA_A11Y_HTMLFormControlAccessible_H_
7 #define MOZILLA_A11Y_HTMLFormControlAccessible_H_
9 #include "FormControlAccessible.h"
10 #include "HyperTextAccessible.h"
11 #include "mozilla/a11y/AccTypes.h"
12 #include "mozilla/dom/Element.h"
13 #include "AccAttributes.h"
14 #include "nsAccUtils.h"
22 * Accessible for HTML input@type="radio" element.
24 class HTMLRadioButtonAccessible
: public RadioButtonAccessible
{
26 HTMLRadioButtonAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
)
27 : RadioButtonAccessible(aContent
, aDoc
) {
28 // Ignore "RadioStateChange" DOM event in lieu of document observer
29 // state change notification.
30 mStateFlags
|= eIgnoreDOMUIEvent
;
31 mType
= eHTMLRadioButtonType
;
35 virtual uint64_t NativeState() const override
;
36 virtual Relation
RelationByType(RelationType aType
) const override
;
39 virtual void GetPositionAndSetSize(int32_t* aPosInSet
,
40 int32_t* aSetSize
) override
;
42 virtual void DOMAttributeChanged(int32_t aNameSpaceID
, nsAtom
* aAttribute
,
44 const nsAttrValue
* aOldValue
,
45 uint64_t aOldState
) override
;
48 Relation
ComputeGroupAttributes(int32_t* aPosInSet
, int32_t* aSetSize
) const;
52 * Accessible for HTML input@type="button", @type="submit", @type="image"
53 * and HTML button elements.
55 class HTMLButtonAccessible
: public HyperTextAccessible
{
57 enum { eAction_Click
= 0 };
59 HTMLButtonAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
);
62 virtual mozilla::a11y::role
NativeRole() const override
;
63 virtual uint64_t State() override
;
64 virtual uint64_t NativeState() const override
;
67 virtual bool HasPrimaryAction() const override
;
68 virtual void ActionNameAt(uint8_t aIndex
, nsAString
& aName
) override
;
71 virtual bool IsWidget() const override
;
75 virtual ENameValueFlag
NativeName(nsString
& aName
) const override
;
77 virtual void DOMAttributeChanged(int32_t aNameSpaceID
, nsAtom
* aAttribute
,
79 const nsAttrValue
* aOldValue
,
80 uint64_t aOldState
) override
;
84 * Accessible for HTML input@type="text", input@type="password", textarea
85 * and other HTML text controls.
87 class HTMLTextFieldAccessible
: public HyperTextAccessible
{
89 enum { eAction_Click
= 0 };
91 HTMLTextFieldAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
);
93 NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLTextFieldAccessible
,
96 // HyperTextAccessible
97 MOZ_CAN_RUN_SCRIPT_BOUNDARY
virtual already_AddRefed
<EditorBase
> GetEditor()
101 virtual void Value(nsString
& aValue
) const override
;
102 virtual void ApplyARIAState(uint64_t* aState
) const override
;
103 virtual mozilla::a11y::role
NativeRole() const override
;
104 virtual uint64_t NativeState() const override
;
105 virtual already_AddRefed
<AccAttributes
> NativeAttributes() override
;
106 virtual bool AttributeChangesState(nsAtom
* aAttribute
) override
;
109 virtual bool HasPrimaryAction() const override
;
110 virtual void ActionNameAt(uint8_t aIndex
, nsAString
& aName
) override
;
111 virtual bool DoAction(uint8_t aIndex
) const override
;
114 virtual bool IsWidget() const override
;
115 virtual LocalAccessible
* ContainerWidget() const override
;
118 virtual ~HTMLTextFieldAccessible() {}
121 virtual ENameValueFlag
NativeName(nsString
& aName
) const override
;
123 virtual void DOMAttributeChanged(int32_t aNameSpaceID
, nsAtom
* aAttribute
,
125 const nsAttrValue
* aOldValue
,
126 uint64_t aOldState
) override
;
130 * Accessible for input@type="file" element.
132 class HTMLFileInputAccessible
: public HyperTextAccessible
{
134 HTMLFileInputAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
);
137 virtual mozilla::a11y::role
NativeRole() const override
;
138 virtual nsresult
HandleAccEvent(AccEvent
* aAccEvent
) override
;
139 virtual LocalAccessible
* CurrentItem() const override
;
143 * Used for HTML input@type="number".
145 class HTMLSpinnerAccessible final
: public HTMLTextFieldAccessible
{
147 HTMLSpinnerAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
)
148 : HTMLTextFieldAccessible(aContent
, aDoc
) {
149 mGenericTypes
|= eNumericValue
;
153 virtual mozilla::a11y::role
NativeRole() const override
;
154 virtual void Value(nsString
& aValue
) const override
;
156 virtual double MaxValue() const override
;
157 virtual double MinValue() const override
;
158 virtual double CurValue() const override
;
159 virtual double Step() const override
;
160 virtual bool SetCurValue(double aValue
) override
;
164 * Used for input@type="range" element.
166 class HTMLRangeAccessible
: public LeafAccessible
{
168 HTMLRangeAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
)
169 : LeafAccessible(aContent
, aDoc
) {
170 mGenericTypes
|= eNumericValue
;
174 virtual void Value(nsString
& aValue
) const override
;
175 virtual mozilla::a11y::role
NativeRole() const override
;
178 virtual double MaxValue() const override
;
179 virtual double MinValue() const override
;
180 virtual double CurValue() const override
;
181 virtual double Step() const override
;
182 virtual bool SetCurValue(double aValue
) override
;
185 virtual bool IsWidget() const override
;
189 * Accessible for HTML fieldset element.
191 class HTMLGroupboxAccessible
: public HyperTextAccessible
{
193 HTMLGroupboxAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
);
196 virtual mozilla::a11y::role
NativeRole() const override
;
197 virtual Relation
RelationByType(RelationType aType
) const override
;
201 virtual ENameValueFlag
NativeName(nsString
& aName
) const override
;
203 // HTMLGroupboxAccessible
204 nsIContent
* GetLegend() const;
208 * Accessible for HTML legend element.
210 class HTMLLegendAccessible
: public HyperTextAccessible
{
212 HTMLLegendAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
);
215 virtual Relation
RelationByType(RelationType aType
) const override
;
219 * Accessible for HTML5 figure element.
221 class HTMLFigureAccessible
: public HyperTextAccessible
{
223 HTMLFigureAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
);
226 virtual Relation
RelationByType(RelationType aType
) const override
;
230 virtual ENameValueFlag
NativeName(nsString
& aName
) const override
;
232 // HTMLLegendAccessible
233 nsIContent
* Caption() const;
237 * Accessible for HTML5 figcaption element.
239 class HTMLFigcaptionAccessible
: public HyperTextAccessible
{
241 HTMLFigcaptionAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
);
244 virtual Relation
RelationByType(RelationType aType
) const override
;
248 * Used for HTML form element.
250 class HTMLFormAccessible
: public HyperTextAccessible
{
252 HTMLFormAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
)
253 : HyperTextAccessible(aContent
, aDoc
) {}
255 NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLFormAccessible
, HyperTextAccessible
)
258 virtual a11y::role
NativeRole() const override
;
261 virtual void DOMAttributeChanged(int32_t aNameSpaceID
, nsAtom
* aAttribute
,
263 const nsAttrValue
* aOldValue
,
264 uint64_t aOldState
) override
;
266 virtual ~HTMLFormAccessible() = default;
270 * Accessible for HTML progress element.
273 class HTMLProgressAccessible
: public LeafAccessible
{
275 HTMLProgressAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
)
276 : LeafAccessible(aContent
, aDoc
) {
277 // Ignore 'ValueChange' DOM event in lieu of @value attribute change
279 mStateFlags
|= eIgnoreDOMUIEvent
;
280 mGenericTypes
|= eNumericValue
;
281 mType
= eProgressType
;
285 virtual void Value(nsString
& aValue
) const override
;
286 virtual mozilla::a11y::role
NativeRole() const override
;
287 virtual uint64_t NativeState() const override
;
290 virtual double MaxValue() const override
;
291 virtual double MinValue() const override
;
292 virtual double CurValue() const override
;
293 virtual double Step() const override
;
294 virtual bool SetCurValue(double aValue
) override
;
297 virtual bool IsWidget() const override
;
300 virtual ~HTMLProgressAccessible() {}
302 virtual void DOMAttributeChanged(int32_t aNameSpaceID
, nsAtom
* aAttribute
,
304 const nsAttrValue
* aOldValue
,
305 uint64_t aOldState
) override
;
309 * Accessible for HTML meter element.
312 class HTMLMeterAccessible
: public LeafAccessible
{
314 HTMLMeterAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
)
315 : LeafAccessible(aContent
, aDoc
) {
316 // Ignore 'ValueChange' DOM event in lieu of @value attribute change
318 mStateFlags
|= eIgnoreDOMUIEvent
;
319 mGenericTypes
|= eNumericValue
;
320 mType
= eProgressType
;
324 virtual void Value(nsString
& aValue
) const override
;
325 virtual mozilla::a11y::role
NativeRole() const override
;
328 virtual double MaxValue() const override
;
329 virtual double MinValue() const override
;
330 virtual double CurValue() const override
;
331 virtual bool SetCurValue(double aValue
) override
;
334 virtual bool IsWidget() const override
;
337 virtual ~HTMLMeterAccessible() {}
339 virtual void DOMAttributeChanged(int32_t aNameSpaceID
, nsAtom
* aAttribute
,
341 const nsAttrValue
* aOldValue
,
342 uint64_t aOldState
) override
;
346 * Accessible for HTML date/time inputs.
348 template <a11y::role R
>
349 class HTMLDateTimeAccessible
: public HyperTextAccessible
{
351 HTMLDateTimeAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
)
352 : HyperTextAccessible(aContent
, aDoc
) {
353 mType
= eHTMLDateTimeFieldType
;
356 NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLDateTimeAccessible
,
360 virtual mozilla::a11y::role
NativeRole() const override
{ return R
; }
361 virtual already_AddRefed
<AccAttributes
> NativeAttributes() override
{
362 RefPtr
<AccAttributes
> attributes
= HyperTextAccessible::NativeAttributes();
363 // Unfortunately, an nsStaticAtom can't be passed as a
364 // template argument, so fetch the type from the DOM.
365 if (const nsAttrValue
* attr
=
366 mContent
->AsElement()->GetParsedAttr(nsGkAtoms::type
)) {
367 RefPtr
<nsAtom
> inputType
= attr
->GetAsAtom();
369 attributes
->SetAttribute(nsGkAtoms::textInputType
, inputType
);
372 return attributes
.forget();
376 virtual bool IsWidget() const override
{ return true; }
379 virtual ~HTMLDateTimeAccessible() {}
383 } // namespace mozilla