HTMLFormControlAccessible.h (12428B)
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 "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" 16 17 namespace mozilla { 18 class EditorBase; 19 namespace a11y { 20 21 /** 22 * Accessible for HTML input@type="radio" element. 23 */ 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; 32 } 33 34 // LocalAccessible 35 virtual uint64_t NativeState() const override; 36 virtual Relation RelationByType(RelationType aType) const override; 37 38 protected: 39 virtual void GetPositionAndSetSize(int32_t* aPosInSet, 40 int32_t* aSetSize) override; 41 42 virtual void DOMAttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute, 43 AttrModType aModType, 44 const nsAttrValue* aOldValue, 45 uint64_t aOldState) override; 46 47 private: 48 Relation ComputeGroupAttributes(int32_t* aPosInSet, int32_t* aSetSize) const; 49 }; 50 51 /** 52 * Accessible for HTML input@type="button", @type="submit", @type="image" 53 * and HTML button elements. 54 */ 55 class HTMLButtonAccessible : public HyperTextAccessible { 56 public: 57 enum { eAction_Click = 0 }; 58 59 HTMLButtonAccessible(nsIContent* aContent, DocAccessible* aDoc); 60 61 // LocalAccessible 62 virtual void Value(nsString& aValue) const override; 63 virtual mozilla::a11y::role NativeRole() const override; 64 virtual uint64_t NativeState() const override; 65 66 // ActionAccessible 67 virtual bool HasPrimaryAction() const override; 68 virtual void ActionNameAt(uint8_t aIndex, nsAString& aName) override; 69 70 // Widgets 71 virtual bool IsWidget() const override; 72 73 protected: 74 // LocalAccessible 75 virtual ENameValueFlag NativeName(nsString& aName) const override; 76 77 virtual void DOMAttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute, 78 AttrModType aModType, 79 const nsAttrValue* aOldValue, 80 uint64_t aOldState) override; 81 }; 82 83 /** 84 * Accessible for HTML input@type="text", input@type="password", textarea 85 * and other HTML text controls. 86 */ 87 class HTMLTextFieldAccessible : public HyperTextAccessible { 88 public: 89 enum { eAction_Click = 0 }; 90 91 HTMLTextFieldAccessible(nsIContent* aContent, DocAccessible* aDoc); 92 93 NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLTextFieldAccessible, 94 HyperTextAccessible) 95 96 // HyperTextAccessible 97 MOZ_CAN_RUN_SCRIPT_BOUNDARY virtual already_AddRefed<EditorBase> GetEditor() 98 const override; 99 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; 107 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; 112 113 // Widgets 114 virtual bool IsWidget() const override; 115 virtual LocalAccessible* ContainerWidget() const override; 116 117 protected: 118 virtual ~HTMLTextFieldAccessible() {} 119 120 // LocalAccessible 121 virtual ENameValueFlag DirectName(nsString& aName) const override; 122 123 virtual void DOMAttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute, 124 AttrModType aModType, 125 const nsAttrValue* aOldValue, 126 uint64_t aOldState) override; 127 }; 128 129 /** 130 * Accessible for input@type="file" element. 131 */ 132 class HTMLFileInputAccessible : public HyperTextAccessible { 133 public: 134 HTMLFileInputAccessible(nsIContent* aContent, DocAccessible* aDoc); 135 136 // LocalAccessible 137 virtual mozilla::a11y::role NativeRole() const override; 138 virtual bool IsAcceptableChild(nsIContent* aEl) const override; 139 virtual ENameValueFlag DirectName(nsString& aName) const override; 140 virtual bool HasPrimaryAction() const override; 141 virtual void ActionNameAt(uint8_t aIndex, nsAString& aName) override; 142 virtual bool IsWidget() const override; 143 }; 144 145 /** 146 * Used for HTML input@type="number". 147 */ 148 class HTMLSpinnerAccessible final : public HTMLTextFieldAccessible { 149 public: 150 HTMLSpinnerAccessible(nsIContent* aContent, DocAccessible* aDoc) 151 : HTMLTextFieldAccessible(aContent, aDoc) { 152 mGenericTypes |= eNumericValue; 153 } 154 155 // LocalAccessible 156 virtual mozilla::a11y::role NativeRole() const override; 157 virtual void Value(nsString& aValue) const override; 158 159 virtual double MaxValue() const override; 160 virtual double MinValue() const override; 161 virtual double CurValue() const override; 162 virtual double Step() const override; 163 virtual bool SetCurValue(double aValue) override; 164 }; 165 166 /** 167 * Used for input@type="range" element. 168 */ 169 class HTMLRangeAccessible : public LeafAccessible { 170 public: 171 HTMLRangeAccessible(nsIContent* aContent, DocAccessible* aDoc) 172 : LeafAccessible(aContent, aDoc) { 173 mGenericTypes |= eNumericValue; 174 } 175 176 // LocalAccessible 177 virtual void Value(nsString& aValue) const override; 178 virtual mozilla::a11y::role NativeRole() const override; 179 180 // Value 181 virtual double MaxValue() const override; 182 virtual double MinValue() const override; 183 virtual double CurValue() const override; 184 virtual double Step() const override; 185 virtual bool SetCurValue(double aValue) override; 186 187 // Widgets 188 virtual bool IsWidget() const override; 189 }; 190 191 /** 192 * Accessible for HTML fieldset element. 193 */ 194 class HTMLGroupboxAccessible : public HyperTextAccessible { 195 public: 196 HTMLGroupboxAccessible(nsIContent* aContent, DocAccessible* aDoc); 197 198 // LocalAccessible 199 virtual mozilla::a11y::role NativeRole() const override; 200 virtual Relation RelationByType(RelationType aType) const override; 201 202 protected: 203 // LocalAccessible 204 virtual ENameValueFlag NativeName(nsString& aName) const override; 205 206 // HTMLGroupboxAccessible 207 nsIContent* GetLegend() const; 208 }; 209 210 /** 211 * Accessible for HTML legend element. 212 */ 213 class HTMLLegendAccessible : public HyperTextAccessible { 214 public: 215 HTMLLegendAccessible(nsIContent* aContent, DocAccessible* aDoc); 216 217 // LocalAccessible 218 virtual Relation RelationByType(RelationType aType) const override; 219 }; 220 221 /** 222 * Accessible for HTML5 figure element. 223 */ 224 class HTMLFigureAccessible : public HyperTextAccessible { 225 public: 226 HTMLFigureAccessible(nsIContent* aContent, DocAccessible* aDoc); 227 228 // LocalAccessible 229 virtual Relation RelationByType(RelationType aType) const override; 230 231 protected: 232 // LocalAccessible 233 virtual ENameValueFlag NativeName(nsString& aName) const override; 234 235 // HTMLLegendAccessible 236 nsIContent* Caption() const; 237 }; 238 239 /** 240 * Accessible for HTML5 figcaption element. 241 */ 242 class HTMLFigcaptionAccessible : public HyperTextAccessible { 243 public: 244 HTMLFigcaptionAccessible(nsIContent* aContent, DocAccessible* aDoc); 245 246 // LocalAccessible 247 virtual Relation RelationByType(RelationType aType) const override; 248 }; 249 250 /** 251 * Used for HTML form element. 252 */ 253 class HTMLFormAccessible : public HyperTextAccessible { 254 public: 255 HTMLFormAccessible(nsIContent* aContent, DocAccessible* aDoc) 256 : HyperTextAccessible(aContent, aDoc) {} 257 258 NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLFormAccessible, HyperTextAccessible) 259 260 // LocalAccessible 261 virtual a11y::role NativeRole() const override; 262 263 protected: 264 virtual void DOMAttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute, 265 AttrModType aModType, 266 const nsAttrValue* aOldValue, 267 uint64_t aOldState) override; 268 269 virtual ~HTMLFormAccessible() = default; 270 }; 271 272 /** 273 * Accessible for HTML progress element. 274 */ 275 276 class HTMLProgressAccessible : public LeafAccessible { 277 public: 278 HTMLProgressAccessible(nsIContent* aContent, DocAccessible* aDoc) 279 : LeafAccessible(aContent, aDoc) { 280 // Ignore 'ValueChange' DOM event in lieu of @value attribute change 281 // notifications. 282 mStateFlags |= eIgnoreDOMUIEvent; 283 mGenericTypes |= eNumericValue; 284 mType = eProgressType; 285 } 286 287 // LocalAccessible 288 virtual void Value(nsString& aValue) const override; 289 virtual mozilla::a11y::role NativeRole() const override; 290 virtual uint64_t NativeState() const override; 291 292 // Value 293 virtual double MaxValue() const override; 294 virtual double MinValue() const override; 295 virtual double CurValue() const override; 296 virtual double Step() const override; 297 virtual bool SetCurValue(double aValue) override; 298 299 // Widgets 300 virtual bool IsWidget() const override; 301 302 protected: 303 virtual ~HTMLProgressAccessible() {} 304 305 virtual void DOMAttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute, 306 AttrModType aModType, 307 const nsAttrValue* aOldValue, 308 uint64_t aOldState) override; 309 }; 310 311 /** 312 * Accessible for HTML meter element. 313 */ 314 315 class HTMLMeterAccessible : public LeafAccessible { 316 public: 317 HTMLMeterAccessible(nsIContent* aContent, DocAccessible* aDoc) 318 : LeafAccessible(aContent, aDoc) { 319 // Ignore 'ValueChange' DOM event in lieu of @value attribute change 320 // notifications. 321 mStateFlags |= eIgnoreDOMUIEvent; 322 mGenericTypes |= eNumericValue; 323 mType = eProgressType; 324 } 325 326 // LocalAccessible 327 virtual void Value(nsString& aValue) const override; 328 virtual mozilla::a11y::role NativeRole() const override; 329 330 // Value 331 virtual double MaxValue() const override; 332 virtual double MinValue() const override; 333 virtual double CurValue() const override; 334 virtual bool SetCurValue(double aValue) override; 335 336 // Widgets 337 virtual bool IsWidget() const override; 338 339 // HTMLMeterAccessible 340 341 /** 342 * Given the low, high, and optimum attrs from DOM, return an int 343 * that indicates which region the current value falls in: 344 * - Optimal (1) 345 * - Suboptimal (0) 346 * - Critical, or "even less good" by the spec (-1) 347 */ 348 int32_t ValueRegion() const; 349 350 protected: 351 virtual ~HTMLMeterAccessible() {} 352 353 virtual void DOMAttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute, 354 AttrModType aModType, 355 const nsAttrValue* aOldValue, 356 uint64_t aOldState) override; 357 }; 358 359 /** 360 * Accessible for HTML date/time inputs. 361 */ 362 template <a11y::role R> 363 class HTMLDateTimeAccessible : public HyperTextAccessible { 364 public: 365 HTMLDateTimeAccessible(nsIContent* aContent, DocAccessible* aDoc) 366 : HyperTextAccessible(aContent, aDoc) { 367 mType = eHTMLDateTimeFieldType; 368 } 369 370 NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLDateTimeAccessible, 371 HyperTextAccessible) 372 373 // LocalAccessible 374 virtual mozilla::a11y::role NativeRole() const override { return R; } 375 virtual already_AddRefed<AccAttributes> NativeAttributes() override { 376 RefPtr<AccAttributes> attributes = HyperTextAccessible::NativeAttributes(); 377 // Unfortunately, an nsStaticAtom can't be passed as a 378 // template argument, so fetch the type from the DOM. 379 if (const nsAttrValue* attr = 380 mContent->AsElement()->GetParsedAttr(nsGkAtoms::type)) { 381 RefPtr<nsAtom> inputType = attr->GetAsAtom(); 382 if (inputType) { 383 attributes->SetAttribute(nsGkAtoms::textInputType, inputType); 384 } 385 } 386 return attributes.forget(); 387 } 388 389 // Widgets 390 virtual bool IsWidget() const override { return true; } 391 392 protected: 393 virtual ~HTMLDateTimeAccessible() {} 394 }; 395 396 } // namespace a11y 397 } // namespace mozilla 398 399 #endif