HTMLSelectAccessible.h 6.3 KB

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