tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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