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 NativeState() const override
;
66 virtual bool HasPrimaryAction() const override
;
67 virtual void ActionNameAt(uint8_t aIndex
, nsAString
& aName
) override
;
70 virtual bool IsWidget() const override
;
74 virtual ENameValueFlag
NativeName(nsString
& aName
) const override
;
76 virtual void DOMAttributeChanged(int32_t aNameSpaceID
, nsAtom
* aAttribute
,
78 const nsAttrValue
* aOldValue
,
79 uint64_t aOldState
) override
;
83 * Accessible for HTML input@type="text", input@type="password", textarea
84 * and other HTML text controls.
86 class HTMLTextFieldAccessible
: public HyperTextAccessible
{
88 enum { eAction_Click
= 0 };
90 HTMLTextFieldAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
);
92 NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLTextFieldAccessible
,
95 // HyperTextAccessible
96 MOZ_CAN_RUN_SCRIPT_BOUNDARY
virtual already_AddRefed
<EditorBase
> GetEditor()
100 virtual void Value(nsString
& aValue
) const override
;
101 virtual void ApplyARIAState(uint64_t* aState
) const override
;
102 virtual mozilla::a11y::role
NativeRole() const override
;
103 virtual uint64_t NativeState() const override
;
104 virtual already_AddRefed
<AccAttributes
> NativeAttributes() override
;
105 virtual bool AttributeChangesState(nsAtom
* aAttribute
) override
;
108 virtual bool HasPrimaryAction() const override
;
109 virtual void ActionNameAt(uint8_t aIndex
, nsAString
& aName
) override
;
110 virtual bool DoAction(uint8_t aIndex
) const override
;
113 virtual bool IsWidget() const override
;
114 virtual LocalAccessible
* ContainerWidget() const override
;
117 virtual ~HTMLTextFieldAccessible() {}
120 virtual ENameValueFlag
NativeName(nsString
& aName
) const override
;
122 virtual void DOMAttributeChanged(int32_t aNameSpaceID
, nsAtom
* aAttribute
,
124 const nsAttrValue
* aOldValue
,
125 uint64_t aOldState
) override
;
129 * Accessible for input@type="file" element.
131 class HTMLFileInputAccessible
: public HyperTextAccessible
{
133 HTMLFileInputAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
);
136 virtual mozilla::a11y::role
NativeRole() const override
;
137 virtual bool IsAcceptableChild(nsIContent
* aEl
) const override
;
138 virtual ENameValueFlag
Name(nsString
& aName
) const override
;
139 virtual bool HasPrimaryAction() const override
;
140 virtual void ActionNameAt(uint8_t aIndex
, nsAString
& aName
) override
;
141 virtual bool IsWidget() const override
;
145 * Used for HTML input@type="number".
147 class HTMLSpinnerAccessible final
: public HTMLTextFieldAccessible
{
149 HTMLSpinnerAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
)
150 : HTMLTextFieldAccessible(aContent
, aDoc
) {
151 mGenericTypes
|= eNumericValue
;
155 virtual mozilla::a11y::role
NativeRole() const override
;
156 virtual void Value(nsString
& aValue
) const override
;
158 virtual double MaxValue() const override
;
159 virtual double MinValue() const override
;
160 virtual double CurValue() const override
;
161 virtual double Step() const override
;
162 virtual bool SetCurValue(double aValue
) override
;
166 * Used for input@type="range" element.
168 class HTMLRangeAccessible
: public LeafAccessible
{
170 HTMLRangeAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
)
171 : LeafAccessible(aContent
, aDoc
) {
172 mGenericTypes
|= eNumericValue
;
176 virtual void Value(nsString
& aValue
) const override
;
177 virtual mozilla::a11y::role
NativeRole() const override
;
180 virtual double MaxValue() const override
;
181 virtual double MinValue() const override
;
182 virtual double CurValue() const override
;
183 virtual double Step() const override
;
184 virtual bool SetCurValue(double aValue
) override
;
187 virtual bool IsWidget() const override
;
191 * Accessible for HTML fieldset element.
193 class HTMLGroupboxAccessible
: public HyperTextAccessible
{
195 HTMLGroupboxAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
);
198 virtual mozilla::a11y::role
NativeRole() const override
;
199 virtual Relation
RelationByType(RelationType aType
) const override
;
203 virtual ENameValueFlag
NativeName(nsString
& aName
) const override
;
205 // HTMLGroupboxAccessible
206 nsIContent
* GetLegend() const;
210 * Accessible for HTML legend element.
212 class HTMLLegendAccessible
: public HyperTextAccessible
{
214 HTMLLegendAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
);
217 virtual Relation
RelationByType(RelationType aType
) const override
;
221 * Accessible for HTML5 figure element.
223 class HTMLFigureAccessible
: public HyperTextAccessible
{
225 HTMLFigureAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
);
228 virtual Relation
RelationByType(RelationType aType
) const override
;
232 virtual ENameValueFlag
NativeName(nsString
& aName
) const override
;
234 // HTMLLegendAccessible
235 nsIContent
* Caption() const;
239 * Accessible for HTML5 figcaption element.
241 class HTMLFigcaptionAccessible
: public HyperTextAccessible
{
243 HTMLFigcaptionAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
);
246 virtual Relation
RelationByType(RelationType aType
) const override
;
250 * Used for HTML form element.
252 class HTMLFormAccessible
: public HyperTextAccessible
{
254 HTMLFormAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
)
255 : HyperTextAccessible(aContent
, aDoc
) {}
257 NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLFormAccessible
, HyperTextAccessible
)
260 virtual a11y::role
NativeRole() const override
;
263 virtual void DOMAttributeChanged(int32_t aNameSpaceID
, nsAtom
* aAttribute
,
265 const nsAttrValue
* aOldValue
,
266 uint64_t aOldState
) override
;
268 virtual ~HTMLFormAccessible() = default;
272 * Accessible for HTML progress element.
275 class HTMLProgressAccessible
: public LeafAccessible
{
277 HTMLProgressAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
)
278 : LeafAccessible(aContent
, aDoc
) {
279 // Ignore 'ValueChange' DOM event in lieu of @value attribute change
281 mStateFlags
|= eIgnoreDOMUIEvent
;
282 mGenericTypes
|= eNumericValue
;
283 mType
= eProgressType
;
287 virtual void Value(nsString
& aValue
) const override
;
288 virtual mozilla::a11y::role
NativeRole() const override
;
289 virtual uint64_t NativeState() const override
;
292 virtual double MaxValue() const override
;
293 virtual double MinValue() const override
;
294 virtual double CurValue() const override
;
295 virtual double Step() const override
;
296 virtual bool SetCurValue(double aValue
) override
;
299 virtual bool IsWidget() const override
;
302 virtual ~HTMLProgressAccessible() {}
304 virtual void DOMAttributeChanged(int32_t aNameSpaceID
, nsAtom
* aAttribute
,
306 const nsAttrValue
* aOldValue
,
307 uint64_t aOldState
) override
;
311 * Accessible for HTML meter element.
314 class HTMLMeterAccessible
: public LeafAccessible
{
316 HTMLMeterAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
)
317 : LeafAccessible(aContent
, aDoc
) {
318 // Ignore 'ValueChange' DOM event in lieu of @value attribute change
320 mStateFlags
|= eIgnoreDOMUIEvent
;
321 mGenericTypes
|= eNumericValue
;
322 mType
= eProgressType
;
326 virtual void Value(nsString
& aValue
) const override
;
327 virtual mozilla::a11y::role
NativeRole() const override
;
330 virtual double MaxValue() const override
;
331 virtual double MinValue() const override
;
332 virtual double CurValue() const override
;
333 virtual bool SetCurValue(double aValue
) override
;
336 virtual bool IsWidget() const override
;
339 virtual ~HTMLMeterAccessible() {}
341 virtual void DOMAttributeChanged(int32_t aNameSpaceID
, nsAtom
* aAttribute
,
343 const nsAttrValue
* aOldValue
,
344 uint64_t aOldState
) override
;
348 * Accessible for HTML date/time inputs.
350 template <a11y::role R
>
351 class HTMLDateTimeAccessible
: public HyperTextAccessible
{
353 HTMLDateTimeAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
)
354 : HyperTextAccessible(aContent
, aDoc
) {
355 mType
= eHTMLDateTimeFieldType
;
358 NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLDateTimeAccessible
,
362 virtual mozilla::a11y::role
NativeRole() const override
{ return R
; }
363 virtual already_AddRefed
<AccAttributes
> NativeAttributes() override
{
364 RefPtr
<AccAttributes
> attributes
= HyperTextAccessible::NativeAttributes();
365 // Unfortunately, an nsStaticAtom can't be passed as a
366 // template argument, so fetch the type from the DOM.
367 if (const nsAttrValue
* attr
=
368 mContent
->AsElement()->GetParsedAttr(nsGkAtoms::type
)) {
369 RefPtr
<nsAtom
> inputType
= attr
->GetAsAtom();
371 attributes
->SetAttribute(nsGkAtoms::textInputType
, inputType
);
374 return attributes
.forget();
378 virtual bool IsWidget() const override
{ return true; }
381 virtual ~HTMLDateTimeAccessible() {}
385 } // namespace mozilla