no bug - Bumping Firefox l10n changesets r=release a=l10n-bump DONTBUILD CLOSED TREE
[gecko.git] / accessible / html / HTMLFormControlAccessible.h
blob1e00bd4e4098fffeb933b096f2441933c7adf58a
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 NativeState() const override;
65 // ActionAccessible
66 virtual bool HasPrimaryAction() const override;
67 virtual void ActionNameAt(uint8_t aIndex, nsAString& aName) override;
69 // Widgets
70 virtual bool IsWidget() const override;
72 protected:
73 // LocalAccessible
74 virtual ENameValueFlag NativeName(nsString& aName) const override;
76 virtual void DOMAttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute,
77 int32_t aModType,
78 const nsAttrValue* aOldValue,
79 uint64_t aOldState) override;
82 /**
83 * Accessible for HTML input@type="text", input@type="password", textarea
84 * and other HTML text controls.
86 class HTMLTextFieldAccessible : public HyperTextAccessible {
87 public:
88 enum { eAction_Click = 0 };
90 HTMLTextFieldAccessible(nsIContent* aContent, DocAccessible* aDoc);
92 NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLTextFieldAccessible,
93 HyperTextAccessible)
95 // HyperTextAccessible
96 MOZ_CAN_RUN_SCRIPT_BOUNDARY virtual already_AddRefed<EditorBase> GetEditor()
97 const override;
99 // LocalAccessible
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;
107 // ActionAccessible
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;
112 // Widgets
113 virtual bool IsWidget() const override;
114 virtual LocalAccessible* ContainerWidget() const override;
116 protected:
117 virtual ~HTMLTextFieldAccessible() {}
119 // LocalAccessible
120 virtual ENameValueFlag Name(nsString& aName) const override;
122 virtual void DOMAttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute,
123 int32_t aModType,
124 const nsAttrValue* aOldValue,
125 uint64_t aOldState) override;
129 * Accessible for input@type="file" element.
131 class HTMLFileInputAccessible : public HyperTextAccessible {
132 public:
133 HTMLFileInputAccessible(nsIContent* aContent, DocAccessible* aDoc);
135 // LocalAccessible
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 {
148 public:
149 HTMLSpinnerAccessible(nsIContent* aContent, DocAccessible* aDoc)
150 : HTMLTextFieldAccessible(aContent, aDoc) {
151 mGenericTypes |= eNumericValue;
154 // LocalAccessible
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 {
169 public:
170 HTMLRangeAccessible(nsIContent* aContent, DocAccessible* aDoc)
171 : LeafAccessible(aContent, aDoc) {
172 mGenericTypes |= eNumericValue;
175 // LocalAccessible
176 virtual void Value(nsString& aValue) const override;
177 virtual mozilla::a11y::role NativeRole() const override;
179 // Value
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;
186 // Widgets
187 virtual bool IsWidget() const override;
191 * Accessible for HTML fieldset element.
193 class HTMLGroupboxAccessible : public HyperTextAccessible {
194 public:
195 HTMLGroupboxAccessible(nsIContent* aContent, DocAccessible* aDoc);
197 // LocalAccessible
198 virtual mozilla::a11y::role NativeRole() const override;
199 virtual Relation RelationByType(RelationType aType) const override;
201 protected:
202 // LocalAccessible
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 {
213 public:
214 HTMLLegendAccessible(nsIContent* aContent, DocAccessible* aDoc);
216 // LocalAccessible
217 virtual Relation RelationByType(RelationType aType) const override;
221 * Accessible for HTML5 figure element.
223 class HTMLFigureAccessible : public HyperTextAccessible {
224 public:
225 HTMLFigureAccessible(nsIContent* aContent, DocAccessible* aDoc);
227 // LocalAccessible
228 virtual Relation RelationByType(RelationType aType) const override;
230 protected:
231 // LocalAccessible
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 {
242 public:
243 HTMLFigcaptionAccessible(nsIContent* aContent, DocAccessible* aDoc);
245 // LocalAccessible
246 virtual Relation RelationByType(RelationType aType) const override;
250 * Used for HTML form element.
252 class HTMLFormAccessible : public HyperTextAccessible {
253 public:
254 HTMLFormAccessible(nsIContent* aContent, DocAccessible* aDoc)
255 : HyperTextAccessible(aContent, aDoc) {}
257 NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLFormAccessible, HyperTextAccessible)
259 // LocalAccessible
260 virtual a11y::role NativeRole() const override;
262 protected:
263 virtual void DOMAttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute,
264 int32_t aModType,
265 const nsAttrValue* aOldValue,
266 uint64_t aOldState) override;
268 virtual ~HTMLFormAccessible() = default;
272 * Accessible for HTML progress element.
275 class HTMLProgressAccessible : public LeafAccessible {
276 public:
277 HTMLProgressAccessible(nsIContent* aContent, DocAccessible* aDoc)
278 : LeafAccessible(aContent, aDoc) {
279 // Ignore 'ValueChange' DOM event in lieu of @value attribute change
280 // notifications.
281 mStateFlags |= eIgnoreDOMUIEvent;
282 mGenericTypes |= eNumericValue;
283 mType = eProgressType;
286 // LocalAccessible
287 virtual void Value(nsString& aValue) const override;
288 virtual mozilla::a11y::role NativeRole() const override;
289 virtual uint64_t NativeState() const override;
291 // Value
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;
298 // Widgets
299 virtual bool IsWidget() const override;
301 protected:
302 virtual ~HTMLProgressAccessible() {}
304 virtual void DOMAttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute,
305 int32_t aModType,
306 const nsAttrValue* aOldValue,
307 uint64_t aOldState) override;
311 * Accessible for HTML meter element.
314 class HTMLMeterAccessible : public LeafAccessible {
315 public:
316 HTMLMeterAccessible(nsIContent* aContent, DocAccessible* aDoc)
317 : LeafAccessible(aContent, aDoc) {
318 // Ignore 'ValueChange' DOM event in lieu of @value attribute change
319 // notifications.
320 mStateFlags |= eIgnoreDOMUIEvent;
321 mGenericTypes |= eNumericValue;
322 mType = eProgressType;
325 // LocalAccessible
326 virtual void Value(nsString& aValue) const override;
327 virtual mozilla::a11y::role NativeRole() const override;
329 // Value
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;
335 // Widgets
336 virtual bool IsWidget() const override;
338 protected:
339 virtual ~HTMLMeterAccessible() {}
341 virtual void DOMAttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute,
342 int32_t aModType,
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 {
352 public:
353 HTMLDateTimeAccessible(nsIContent* aContent, DocAccessible* aDoc)
354 : HyperTextAccessible(aContent, aDoc) {
355 mType = eHTMLDateTimeFieldType;
358 NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLDateTimeAccessible,
359 HyperTextAccessible)
361 // LocalAccessible
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();
370 if (inputType) {
371 attributes->SetAttribute(nsGkAtoms::textInputType, inputType);
374 return attributes.forget();
377 // Widgets
378 virtual bool IsWidget() const override { return true; }
380 protected:
381 virtual ~HTMLDateTimeAccessible() {}
384 } // namespace a11y
385 } // namespace mozilla
387 #endif