Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/accessible/html/HTMLSelectAccessible.h
Line
Count
Source (jump to first uncovered line)
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
{
34
public:
35
36
  HTMLSelectListAccessible(nsIContent* aContent, DocAccessible* aDoc);
37
0
  virtual ~HTMLSelectListAccessible() {}
38
39
  // Accessible
40
  virtual a11y::role NativeRole() const override;
41
  virtual uint64_t NativeState() const override;
42
  virtual bool IsAcceptableChild(nsIContent* aEl) const override;
43
44
  // SelectAccessible
45
  virtual bool SelectAll() override;
46
  virtual bool UnselectAll() override;
47
48
  // Widgets
49
  virtual bool IsWidget() const override;
50
  virtual bool IsActiveWidget() const override;
51
  virtual bool AreItemsOperable() const override;
52
  virtual Accessible* CurrentItem() const override;
53
  virtual void SetCurrentItem(const Accessible* aItem) override;
54
};
55
56
/*
57
 * Options inside the select, contained within the list
58
 */
59
class HTMLSelectOptionAccessible : public HyperTextAccessibleWrap
60
{
61
public:
62
  enum { eAction_Select = 0 };
63
64
  HTMLSelectOptionAccessible(nsIContent* aContent, DocAccessible* aDoc);
65
0
  virtual ~HTMLSelectOptionAccessible() {}
66
67
  // Accessible
68
  virtual a11y::role NativeRole() const override;
69
  virtual uint64_t NativeState() const override;
70
  virtual uint64_t NativeInteractiveState() const override;
71
72
  virtual int32_t GetLevelInternal() override;
73
  virtual nsRect RelativeBounds(nsIFrame** aBoundingFrame) const override;
74
  virtual void SetSelected(bool aSelect) override;
75
76
  // ActionAccessible
77
  virtual uint8_t ActionCount() const override;
78
  virtual void ActionNameAt(uint8_t aIndex, nsAString& aName) override;
79
  virtual bool DoAction(uint8_t aIndex) const override;
80
81
  // Widgets
82
  virtual Accessible* ContainerWidget() const override;
83
84
protected:
85
  // Accessible
86
  virtual ENameValueFlag NativeName(nsString& aName) const override;
87
88
private:
89
90
  /**
91
   * Return a select accessible the option belongs to if any.
92
   */
93
  Accessible* GetSelect() const
94
0
  {
95
0
    Accessible* parent = mParent;
96
0
    if (parent && parent->IsHTMLOptGroup())
97
0
      parent = parent->Parent();
98
0
99
0
    if (parent && parent->IsListControl()) {
100
0
      Accessible* combobox = parent->Parent();
101
0
      return combobox && combobox->IsCombobox() ? combobox : mParent;
102
0
    }
103
0
104
0
    return nullptr;
105
0
  }
106
107
  /**
108
   * Return a combobox accessible the option belongs to if any.
109
   */
110
  Accessible* GetCombobox() const
111
0
  {
112
0
    Accessible* parent = mParent;
113
0
    if (parent && parent->IsHTMLOptGroup())
114
0
      parent = parent->Parent();
115
0
116
0
    if (parent && parent->IsListControl()) {
117
0
      Accessible* combobox = parent->Parent();
118
0
      return combobox && combobox->IsCombobox() ? combobox : nullptr;
119
0
    }
120
0
121
0
    return nullptr;
122
0
  }
123
};
124
125
/*
126
 * Opt Groups inside the select, contained within the list
127
 */
128
class HTMLSelectOptGroupAccessible : public HTMLSelectOptionAccessible
129
{
130
public:
131
132
  HTMLSelectOptGroupAccessible(nsIContent* aContent, DocAccessible* aDoc) :
133
    HTMLSelectOptionAccessible(aContent, aDoc)
134
0
    { mType = eHTMLOptGroupType; }
135
0
  virtual ~HTMLSelectOptGroupAccessible() {}
136
137
  // Accessible
138
  virtual a11y::role NativeRole() const override;
139
  virtual uint64_t NativeInteractiveState() const override;
140
  virtual bool IsAcceptableChild(nsIContent* aEl) const override;
141
142
  // ActionAccessible
143
  virtual uint8_t ActionCount() const override;
144
  virtual void ActionNameAt(uint8_t aIndex, nsAString& aName) override;
145
  virtual bool DoAction(uint8_t aIndex) const override;
146
};
147
148
/** ------------------------------------------------------ */
149
/**  Finally, the Combobox widgets                         */
150
/** ------------------------------------------------------ */
151
152
class HTMLComboboxListAccessible;
153
154
/*
155
 * A class the represents the HTML Combobox widget.
156
 */
157
class HTMLComboboxAccessible final : public AccessibleWrap
158
{
159
public:
160
  enum { eAction_Click = 0 };
161
162
  HTMLComboboxAccessible(nsIContent* aContent, DocAccessible* aDoc);
163
0
  virtual ~HTMLComboboxAccessible() {}
164
165
  // Accessible
166
  virtual void Shutdown() override;
167
  virtual void Description(nsString& aDescription) override;
168
  virtual void Value(nsString& aValue) const override;
169
  virtual a11y::role NativeRole() const override;
170
  virtual uint64_t NativeState() const override;
171
  virtual bool RemoveChild(Accessible* aChild) override;
172
  virtual bool IsAcceptableChild(nsIContent* aEl) const override;
173
174
  // ActionAccessible
175
  virtual uint8_t ActionCount() const override;
176
  virtual void ActionNameAt(uint8_t aIndex, nsAString& aName) override;
177
  virtual bool DoAction(uint8_t aIndex) const override;
178
179
  // Widgets
180
  virtual bool IsWidget() const override;
181
  virtual bool IsActiveWidget() const override;
182
  virtual bool AreItemsOperable() const override;
183
  virtual Accessible* CurrentItem() const override;
184
  virtual void SetCurrentItem(const Accessible* aItem) override;
185
186
protected:
187
  /**
188
   * Return selected option.
189
   */
190
  Accessible* SelectedOption() const;
191
192
private:
193
  RefPtr<HTMLComboboxListAccessible> mListAccessible;
194
};
195
196
/*
197
 * A class that represents the window that lives to the right
198
 * of the drop down button inside the Select. This is the window
199
 * that is made visible when the button is pressed.
200
 */
201
class HTMLComboboxListAccessible : public HTMLSelectListAccessible
202
{
203
public:
204
205
  HTMLComboboxListAccessible(Accessible* aParent, nsIContent* aContent,
206
                             DocAccessible* aDoc);
207
0
  virtual ~HTMLComboboxListAccessible() {}
208
209
  // Accessible
210
  virtual nsIFrame* GetFrame() const override;
211
  virtual a11y::role NativeRole() const override;
212
  virtual uint64_t NativeState() const override;
213
  virtual nsRect RelativeBounds(nsIFrame** aBoundingFrame) const override;
214
  virtual bool IsAcceptableChild(nsIContent* aEl) const override;
215
216
  // Widgets
217
  virtual bool IsActiveWidget() const override;
218
  virtual bool AreItemsOperable() const override;
219
};
220
221
} // namespace a11y
222
} // namespace mozilla
223
224
#endif