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/. */
5 
6 #ifndef MOZILLA_A11Y_HTMLFormControlAccessible_H_
7 #define MOZILLA_A11Y_HTMLFormControlAccessible_H_
8 
9 #include "FormControlAccessible.h"
10 #include "HyperTextAccessibleWrap.h"
11 
12 namespace mozilla {
13 class TextEditor;
14 namespace a11y {
15 
16 /**
17  * Accessible for HTML progress element.
18  */
19 typedef ProgressMeterAccessible<1> HTMLProgressMeterAccessible;
20 
21 /**
22  * Accessible for HTML input@type="checkbox".
23  */
24 class HTMLCheckboxAccessible : public LeafAccessible {
25  public:
26   enum { eAction_Click = 0 };
27 
HTMLCheckboxAccessible(nsIContent * aContent,DocAccessible * aDoc)28   HTMLCheckboxAccessible(nsIContent* aContent, DocAccessible* aDoc)
29       : LeafAccessible(aContent, aDoc) {
30     // Ignore "CheckboxStateChange" DOM event in lieu of document observer
31     // state change notification.
32     mStateFlags |= eIgnoreDOMUIEvent;
33   }
34 
35   // Accessible
36   virtual mozilla::a11y::role NativeRole() override;
37   virtual uint64_t NativeState() override;
38 
39   // ActionAccessible
40   virtual uint8_t ActionCount() override;
41   virtual void ActionNameAt(uint8_t aIndex, nsAString& aName) override;
42   virtual bool DoAction(uint8_t aIndex) override;
43 
44   // Widgets
45   virtual bool IsWidget() const override;
46 };
47 
48 /**
49  * Accessible for HTML input@type="radio" element.
50  */
51 class HTMLRadioButtonAccessible : public RadioButtonAccessible {
52  public:
HTMLRadioButtonAccessible(nsIContent * aContent,DocAccessible * aDoc)53   HTMLRadioButtonAccessible(nsIContent* aContent, DocAccessible* aDoc)
54       : RadioButtonAccessible(aContent, aDoc) {
55     // Ignore "RadioStateChange" DOM event in lieu of document observer
56     // state change notification.
57     mStateFlags |= eIgnoreDOMUIEvent;
58   }
59 
60   // Accessible
61   virtual uint64_t NativeState() override;
62   virtual void GetPositionAndSizeInternal(int32_t* aPosInSet,
63                                           int32_t* aSetSize) override;
64 };
65 
66 /**
67  * Accessible for HTML input@type="button", @type="submit", @type="image"
68  * and HTML button elements.
69  */
70 class HTMLButtonAccessible : public HyperTextAccessibleWrap {
71  public:
72   enum { eAction_Click = 0 };
73 
74   HTMLButtonAccessible(nsIContent* aContent, DocAccessible* aDoc);
75 
76   // Accessible
77   virtual mozilla::a11y::role NativeRole() override;
78   virtual uint64_t State() override;
79   virtual uint64_t NativeState() override;
80 
81   // ActionAccessible
82   virtual uint8_t ActionCount() override;
83   virtual void ActionNameAt(uint8_t aIndex, nsAString& aName) override;
84   virtual bool DoAction(uint8_t aIndex) override;
85 
86   // Widgets
87   virtual bool IsWidget() const override;
88 
89  protected:
90   // Accessible
91   virtual ENameValueFlag NativeName(nsString& aName) override;
92 };
93 
94 /**
95  * Accessible for HTML input@type="text", input@type="password", textarea and
96  * other HTML text controls.
97  */
98 class HTMLTextFieldAccessible final : public HyperTextAccessibleWrap {
99  public:
100   enum { eAction_Click = 0 };
101 
102   HTMLTextFieldAccessible(nsIContent* aContent, DocAccessible* aDoc);
103 
104   NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLTextFieldAccessible,
105                                        HyperTextAccessibleWrap)
106 
107   // HyperTextAccessible
108   virtual already_AddRefed<TextEditor> GetEditor() const override;
109 
110   // Accessible
111   virtual void Value(nsString& aValue) override;
112   virtual void ApplyARIAState(uint64_t* aState) const override;
113   virtual mozilla::a11y::role NativeRole() override;
114   virtual uint64_t NativeState() override;
115   virtual already_AddRefed<nsIPersistentProperties> NativeAttributes() override;
116 
117   // ActionAccessible
118   virtual uint8_t ActionCount() override;
119   virtual void ActionNameAt(uint8_t aIndex, nsAString& aName) override;
120   virtual bool DoAction(uint8_t aIndex) override;
121 
122   // Widgets
123   virtual bool IsWidget() const override;
124   virtual Accessible* ContainerWidget() const override;
125 
126  protected:
~HTMLTextFieldAccessible()127   virtual ~HTMLTextFieldAccessible() {}
128 
129   // Accessible
130   virtual ENameValueFlag NativeName(nsString& aName) override;
131 
132   /**
133    * Return a XUL widget element this input is part of.
134    */
XULWidgetElm()135   nsIContent* XULWidgetElm() const { return mContent->GetBindingParent(); }
136 };
137 
138 /**
139  * Accessible for input@type="file" element.
140  */
141 class HTMLFileInputAccessible : public HyperTextAccessibleWrap {
142  public:
143   HTMLFileInputAccessible(nsIContent* aContent, DocAccessible* aDoc);
144 
145   // Accessible
146   virtual mozilla::a11y::role NativeRole() override;
147   virtual nsresult HandleAccEvent(AccEvent* aAccEvent) override;
148 };
149 
150 /**
151  * Used for HTML input@type="number".
152  */
153 class HTMLSpinnerAccessible : public AccessibleWrap {
154  public:
HTMLSpinnerAccessible(nsIContent * aContent,DocAccessible * aDoc)155   HTMLSpinnerAccessible(nsIContent* aContent, DocAccessible* aDoc)
156       : AccessibleWrap(aContent, aDoc) {
157     mStateFlags |= eHasNumericValue;
158   }
159 
160   // Accessible
161   virtual mozilla::a11y::role NativeRole() override;
162   virtual void Value(nsString& aValue) override;
163 
164   virtual double MaxValue() const override;
165   virtual double MinValue() const override;
166   virtual double CurValue() const override;
167   virtual double Step() const override;
168   virtual bool SetCurValue(double aValue) override;
169 };
170 
171 /**
172  * Used for input@type="range" element.
173  */
174 class HTMLRangeAccessible : public LeafAccessible {
175  public:
HTMLRangeAccessible(nsIContent * aContent,DocAccessible * aDoc)176   HTMLRangeAccessible(nsIContent* aContent, DocAccessible* aDoc)
177       : LeafAccessible(aContent, aDoc) {
178     mStateFlags |= eHasNumericValue;
179   }
180 
181   // Accessible
182   virtual void Value(nsString& aValue) override;
183   virtual mozilla::a11y::role NativeRole() override;
184 
185   // Value
186   virtual double MaxValue() const override;
187   virtual double MinValue() const override;
188   virtual double CurValue() const override;
189   virtual double Step() const override;
190   virtual bool SetCurValue(double aValue) override;
191 
192   // Widgets
193   virtual bool IsWidget() const override;
194 };
195 
196 /**
197  * Accessible for HTML fieldset element.
198  */
199 class HTMLGroupboxAccessible : public HyperTextAccessibleWrap {
200  public:
201   HTMLGroupboxAccessible(nsIContent* aContent, DocAccessible* aDoc);
202 
203   // Accessible
204   virtual mozilla::a11y::role NativeRole() override;
205   virtual Relation RelationByType(RelationType aType) override;
206 
207  protected:
208   // Accessible
209   virtual ENameValueFlag NativeName(nsString& aName) override;
210 
211   // HTMLGroupboxAccessible
212   nsIContent* GetLegend() const;
213 };
214 
215 /**
216  * Accessible for HTML legend element.
217  */
218 class HTMLLegendAccessible : public HyperTextAccessibleWrap {
219  public:
220   HTMLLegendAccessible(nsIContent* aContent, DocAccessible* aDoc);
221 
222   // Accessible
223   virtual Relation RelationByType(RelationType aType) override;
224 };
225 
226 /**
227  * Accessible for HTML5 figure element.
228  */
229 class HTMLFigureAccessible : public HyperTextAccessibleWrap {
230  public:
231   HTMLFigureAccessible(nsIContent* aContent, DocAccessible* aDoc);
232 
233   // Accessible
234   virtual Relation RelationByType(RelationType aType) override;
235 
236  protected:
237   // Accessible
238   virtual ENameValueFlag NativeName(nsString& aName) override;
239 
240   // HTMLLegendAccessible
241   nsIContent* Caption() const;
242 };
243 
244 /**
245  * Accessible for HTML5 figcaption element.
246  */
247 class HTMLFigcaptionAccessible : public HyperTextAccessibleWrap {
248  public:
249   HTMLFigcaptionAccessible(nsIContent* aContent, DocAccessible* aDoc);
250 
251   // Accessible
252   virtual Relation RelationByType(RelationType aType) override;
253 };
254 
255 }  // namespace a11y
256 }  // namespace mozilla
257 
258 #endif
259