Bug 1850713: remove duplicated setting of early hint preloader id in `ScriptLoader...
[gecko.git] / accessible / html / HTMLFormControlAccessible.h
blobfc7c70507ad47c9ab353fa160f647124b17710d6
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"
15 #include "Relation.h"
17 namespace mozilla {
18 class EditorBase;
19 namespace a11y {
21 /**
22 * Accessible for HTML input@type="radio" element.
24 class HTMLRadioButtonAccessible : public RadioButtonAccessible {
25 public:
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;
34 // LocalAccessible
35 virtual uint64_t NativeState() const override;
36 virtual Relation RelationByType(RelationType aType) const override;
38 protected:
39 virtual void GetPositionAndSetSize(int32_t* aPosInSet,
40 int32_t* aSetSize) override;
42 virtual void DOMAttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute,
43 int32_t aModType,
44 const nsAttrValue* aOldValue,
45 uint64_t aOldState) override;
47 private:
48 Relation ComputeGroupAttributes(int32_t* aPosInSet, int32_t* aSetSize) const;
51 /**
52 * Accessible for HTML input@type="button", @type="submit", @type="image"
53 * and HTML button elements.
55 class HTMLButtonAccessible : public HyperTextAccessible {
56 public:
57 enum { eAction_Click = 0 };
59 HTMLButtonAccessible(nsIContent* aContent, DocAccessible* aDoc);
61 // LocalAccessible
62 virtual mozilla::a11y::role NativeRole() const override;
63 virtual uint64_t State() override;
64 virtual uint64_t NativeState() const override;
66 // ActionAccessible
67 virtual bool HasPrimaryAction() const override;
68 virtual void ActionNameAt(uint8_t aIndex, nsAString& aName) override;
70 // Widgets
71 virtual bool IsWidget() const override;
73 protected:
74 // LocalAccessible
75 virtual ENameValueFlag NativeName(nsString& aName) const override;
77 virtual void DOMAttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute,
78 int32_t aModType,
79 const nsAttrValue* aOldValue,
80 uint64_t aOldState) override;
83 /**
84 * Accessible for HTML input@type="text", input@type="password", textarea
85 * and other HTML text controls.
87 class HTMLTextFieldAccessible : public HyperTextAccessible {
88 public:
89 enum { eAction_Click = 0 };
91 HTMLTextFieldAccessible(nsIContent* aContent, DocAccessible* aDoc);
93 NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLTextFieldAccessible,
94 HyperTextAccessible)
96 // HyperTextAccessible
97 MOZ_CAN_RUN_SCRIPT_BOUNDARY virtual already_AddRefed<EditorBase> GetEditor()
98 const override;
100 // LocalAccessible
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;
108 // ActionAccessible
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;
113 // Widgets
114 virtual bool IsWidget() const override;
115 virtual LocalAccessible* ContainerWidget() const override;
117 protected:
118 virtual ~HTMLTextFieldAccessible() {}
120 // LocalAccessible
121 virtual ENameValueFlag NativeName(nsString& aName) const override;
123 virtual void DOMAttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute,
124 int32_t aModType,
125 const nsAttrValue* aOldValue,
126 uint64_t aOldState) override;
130 * Accessible for input@type="file" element.
132 class HTMLFileInputAccessible : public HyperTextAccessible {
133 public:
134 HTMLFileInputAccessible(nsIContent* aContent, DocAccessible* aDoc);
136 // LocalAccessible
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 {
146 public:
147 HTMLSpinnerAccessible(nsIContent* aContent, DocAccessible* aDoc)
148 : HTMLTextFieldAccessible(aContent, aDoc) {
149 mGenericTypes |= eNumericValue;
152 // LocalAccessible
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 {
167 public:
168 HTMLRangeAccessible(nsIContent* aContent, DocAccessible* aDoc)
169 : LeafAccessible(aContent, aDoc) {
170 mGenericTypes |= eNumericValue;
173 // LocalAccessible
174 virtual void Value(nsString& aValue) const override;
175 virtual mozilla::a11y::role NativeRole() const override;
177 // Value
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;
184 // Widgets
185 virtual bool IsWidget() const override;
189 * Accessible for HTML fieldset element.
191 class HTMLGroupboxAccessible : public HyperTextAccessible {
192 public:
193 HTMLGroupboxAccessible(nsIContent* aContent, DocAccessible* aDoc);
195 // LocalAccessible
196 virtual mozilla::a11y::role NativeRole() const override;
197 virtual Relation RelationByType(RelationType aType) const override;
199 protected:
200 // LocalAccessible
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 {
211 public:
212 HTMLLegendAccessible(nsIContent* aContent, DocAccessible* aDoc);
214 // LocalAccessible
215 virtual Relation RelationByType(RelationType aType) const override;
219 * Accessible for HTML5 figure element.
221 class HTMLFigureAccessible : public HyperTextAccessible {
222 public:
223 HTMLFigureAccessible(nsIContent* aContent, DocAccessible* aDoc);
225 // LocalAccessible
226 virtual Relation RelationByType(RelationType aType) const override;
228 protected:
229 // LocalAccessible
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 {
240 public:
241 HTMLFigcaptionAccessible(nsIContent* aContent, DocAccessible* aDoc);
243 // LocalAccessible
244 virtual Relation RelationByType(RelationType aType) const override;
248 * Used for HTML form element.
250 class HTMLFormAccessible : public HyperTextAccessible {
251 public:
252 HTMLFormAccessible(nsIContent* aContent, DocAccessible* aDoc)
253 : HyperTextAccessible(aContent, aDoc) {}
255 NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLFormAccessible, HyperTextAccessible)
257 // LocalAccessible
258 virtual a11y::role NativeRole() const override;
260 protected:
261 virtual void DOMAttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute,
262 int32_t aModType,
263 const nsAttrValue* aOldValue,
264 uint64_t aOldState) override;
266 virtual ~HTMLFormAccessible() = default;
270 * Accessible for HTML progress element.
273 class HTMLProgressAccessible : public LeafAccessible {
274 public:
275 HTMLProgressAccessible(nsIContent* aContent, DocAccessible* aDoc)
276 : LeafAccessible(aContent, aDoc) {
277 // Ignore 'ValueChange' DOM event in lieu of @value attribute change
278 // notifications.
279 mStateFlags |= eIgnoreDOMUIEvent;
280 mGenericTypes |= eNumericValue;
281 mType = eProgressType;
284 // LocalAccessible
285 virtual void Value(nsString& aValue) const override;
286 virtual mozilla::a11y::role NativeRole() const override;
287 virtual uint64_t NativeState() const override;
289 // Value
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;
296 // Widgets
297 virtual bool IsWidget() const override;
299 protected:
300 virtual ~HTMLProgressAccessible() {}
302 virtual void DOMAttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute,
303 int32_t aModType,
304 const nsAttrValue* aOldValue,
305 uint64_t aOldState) override;
309 * Accessible for HTML meter element.
312 class HTMLMeterAccessible : public LeafAccessible {
313 public:
314 HTMLMeterAccessible(nsIContent* aContent, DocAccessible* aDoc)
315 : LeafAccessible(aContent, aDoc) {
316 // Ignore 'ValueChange' DOM event in lieu of @value attribute change
317 // notifications.
318 mStateFlags |= eIgnoreDOMUIEvent;
319 mGenericTypes |= eNumericValue;
320 mType = eProgressType;
323 // LocalAccessible
324 virtual void Value(nsString& aValue) const override;
325 virtual mozilla::a11y::role NativeRole() const override;
327 // Value
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;
333 // Widgets
334 virtual bool IsWidget() const override;
336 protected:
337 virtual ~HTMLMeterAccessible() {}
339 virtual void DOMAttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute,
340 int32_t aModType,
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 {
350 public:
351 HTMLDateTimeAccessible(nsIContent* aContent, DocAccessible* aDoc)
352 : HyperTextAccessible(aContent, aDoc) {
353 mType = eHTMLDateTimeFieldType;
356 NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLDateTimeAccessible,
357 HyperTextAccessible)
359 // LocalAccessible
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();
368 if (inputType) {
369 attributes->SetAttribute(nsGkAtoms::textInputType, inputType);
372 return attributes.forget();
375 // Widgets
376 virtual bool IsWidget() const override { return true; }
378 protected:
379 virtual ~HTMLDateTimeAccessible() {}
382 } // namespace a11y
383 } // namespace mozilla
385 #endif