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