tor-browser

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

HTMLSelectAccessible.h (6976B)


      1 /* -*- Mode: C++; tab-width: 4; 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_HTMLSelectAccessible_h__
      7 #define mozilla_a11y_HTMLSelectAccessible_h__
      8 
      9 #include "HTMLFormControlAccessible.h"
     10 
     11 namespace mozilla {
     12 namespace a11y {
     13 
     14 /**
     15 *  Selects, Listboxes and Comboboxes, are made up of a number of different
     16 *  widgets, some of which are shared between the two. This file contains
     17 *  all of the widgets for both of the Selects, for HTML only.
     18 *
     19 *  Listbox:
     20 *     - HTMLSelectListAccessible
     21 *        - HTMLSelectOptionAccessible
     22 *
     23 *  Comboboxes:
     24 *     - HTMLComboboxAccessible
     25 *        - HTMLComboboxListAccessible  [ inserted in accessible tree ]
     26 *           - HTMLSelectOptionAccessible(s)
     27 */
     28 
     29 /*
     30 * The list that contains all the options in the select.
     31 */
     32 class HTMLSelectListAccessible : public AccessibleWrap {
     33 public:
     34  HTMLSelectListAccessible(nsIContent* aContent, DocAccessible* aDoc);
     35  virtual ~HTMLSelectListAccessible() {}
     36 
     37  // LocalAccessible
     38  virtual a11y::role NativeRole() const override;
     39  virtual uint64_t NativeState() const override;
     40  virtual bool IsAcceptableChild(nsIContent* aEl) const override;
     41  virtual bool AttributeChangesState(nsAtom* aAttribute) override;
     42 
     43  // SelectAccessible
     44  virtual bool SelectAll() override;
     45  virtual bool UnselectAll() override;
     46 
     47  // Widgets
     48  virtual bool IsWidget() const override;
     49  virtual bool IsActiveWidget() const override;
     50  virtual bool AreItemsOperable() const override;
     51  virtual LocalAccessible* CurrentItem() const override;
     52  virtual void SetCurrentItem(const LocalAccessible* aItem) override;
     53 };
     54 
     55 /*
     56 * Options inside the select, contained within the list
     57 */
     58 class HTMLSelectOptionAccessible : public HyperTextAccessible {
     59 public:
     60  enum { eAction_Select = 0 };
     61 
     62  HTMLSelectOptionAccessible(nsIContent* aContent, DocAccessible* aDoc);
     63  virtual ~HTMLSelectOptionAccessible() {}
     64 
     65  // LocalAccessible
     66  virtual a11y::role NativeRole() const override;
     67  virtual uint64_t NativeState() const override;
     68  virtual uint64_t NativeInteractiveState() const override;
     69 
     70  virtual nsRect RelativeBounds(nsIFrame** aBoundingFrame) const override;
     71  virtual void SetSelected(bool aSelect) override;
     72 
     73  // ActionAccessible
     74  virtual bool HasPrimaryAction() const override;
     75  virtual void ActionNameAt(uint8_t aIndex, nsAString& aName) override;
     76 
     77  // Widgets
     78  virtual LocalAccessible* ContainerWidget() const override;
     79 
     80 protected:
     81  // LocalAccessible
     82  virtual ENameValueFlag NativeName(nsString& aName) const override;
     83  virtual void DOMAttributeChanged(int32_t aNameSpaceID, nsAtom* aAttribute,
     84                                   AttrModType aModType,
     85                                   const nsAttrValue* aOldValue,
     86                                   uint64_t aOldState) override;
     87 
     88 private:
     89  /**
     90   * Return a select accessible the option belongs to if any.
     91   */
     92  LocalAccessible* GetSelect() const {
     93    LocalAccessible* parent = mParent;
     94    if (parent && parent->IsHTMLOptGroup()) {
     95      parent = parent->LocalParent();
     96    }
     97 
     98    if (parent && parent->IsListControl()) {
     99      LocalAccessible* combobox = parent->LocalParent();
    100      return combobox && combobox->IsCombobox() ? combobox : mParent;
    101    }
    102 
    103    return nullptr;
    104  }
    105 
    106  /**
    107   * Return a combobox accessible the option belongs to if any.
    108   */
    109  LocalAccessible* GetCombobox() const {
    110    LocalAccessible* parent = mParent;
    111    if (parent && parent->IsHTMLOptGroup()) {
    112      parent = parent->LocalParent();
    113    }
    114 
    115    if (parent && parent->IsListControl()) {
    116      LocalAccessible* combobox = parent->LocalParent();
    117      return combobox && combobox->IsCombobox() ? combobox : nullptr;
    118    }
    119 
    120    return nullptr;
    121  }
    122 };
    123 
    124 /*
    125 * Opt Groups inside the select, contained within the list
    126 */
    127 class HTMLSelectOptGroupAccessible : public HTMLSelectOptionAccessible {
    128 public:
    129  HTMLSelectOptGroupAccessible(nsIContent* aContent, DocAccessible* aDoc)
    130      : HTMLSelectOptionAccessible(aContent, aDoc) {
    131    mType = eHTMLOptGroupType;
    132  }
    133  virtual ~HTMLSelectOptGroupAccessible() {}
    134 
    135  // LocalAccessible
    136  virtual a11y::role NativeRole() const override;
    137  virtual uint64_t NativeInteractiveState() const override;
    138  virtual bool IsAcceptableChild(nsIContent* aEl) const override;
    139 
    140  // ActionAccessible
    141  virtual bool HasPrimaryAction() const override;
    142 };
    143 
    144 /** ------------------------------------------------------ */
    145 /**  Finally, the Combobox widgets                         */
    146 /** ------------------------------------------------------ */
    147 
    148 class HTMLComboboxListAccessible;
    149 
    150 /*
    151 * A class the represents the HTML Combobox widget.
    152 */
    153 class HTMLComboboxAccessible final : public AccessibleWrap {
    154 public:
    155  enum { eAction_Click = 0 };
    156 
    157  HTMLComboboxAccessible(nsIContent* aContent, DocAccessible* aDoc);
    158  virtual ~HTMLComboboxAccessible() {}
    159 
    160  // LocalAccessible
    161  virtual void Shutdown() override;
    162  virtual EDescriptionValueFlag Description(
    163      nsString& aDescription) const override;
    164  virtual void Value(nsString& aValue) const override;
    165  virtual a11y::role NativeRole() const override;
    166  virtual uint64_t NativeState() const override;
    167  virtual bool RemoveChild(LocalAccessible* aChild) override;
    168  virtual bool IsAcceptableChild(nsIContent* aEl) const override;
    169 
    170  // ActionAccessible
    171  virtual bool HasPrimaryAction() const override;
    172  virtual void ActionNameAt(uint8_t aIndex, nsAString& aName) override;
    173 
    174  // Widgets
    175  virtual bool IsWidget() const override;
    176  virtual bool IsActiveWidget() const override;
    177  virtual bool AreItemsOperable() const override;
    178  virtual LocalAccessible* CurrentItem() const override;
    179  virtual void SetCurrentItem(const LocalAccessible* aItem) override;
    180 
    181  HTMLComboboxListAccessible* List() const { return mListAccessible; }
    182 
    183  /**
    184   * Return selected option.
    185   */
    186  LocalAccessible* SelectedOption() const;
    187 
    188 private:
    189  RefPtr<HTMLComboboxListAccessible> mListAccessible;
    190 };
    191 
    192 /*
    193 * A class that represents the window that lives to the right
    194 * of the drop down button inside the Select. This is the window
    195 * that is made visible when the button is pressed.
    196 */
    197 class HTMLComboboxListAccessible : public HTMLSelectListAccessible {
    198 public:
    199  HTMLComboboxListAccessible(LocalAccessible* aParent, nsIContent* aContent,
    200                             DocAccessible* aDoc);
    201  virtual ~HTMLComboboxListAccessible() {}
    202 
    203  // LocalAccessible
    204  virtual a11y::role NativeRole() const override;
    205  virtual uint64_t NativeState() const override;
    206  virtual nsRect RelativeBounds(nsIFrame** aBoundingFrame) const override;
    207  virtual bool IsAcceptableChild(nsIContent* aEl) const override;
    208 
    209  // Widgets
    210  virtual bool IsActiveWidget() const override;
    211  virtual bool AreItemsOperable() const override;
    212 };
    213 
    214 }  // namespace a11y
    215 }  // namespace mozilla
    216 
    217 #endif