Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/accessible/xul/XULSelectControlAccessible.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=2 et sw=2 tw=80: */
3
/* This Source Code Form is subject to the terms of the Mozilla Public
4
 * License, v. 2.0. If a copy of the MPL was not distributed with this
5
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#include "XULSelectControlAccessible.h"
8
9
#include "nsAccessibilityService.h"
10
#include "DocAccessible.h"
11
12
#include "nsIDOMXULContainerElement.h"
13
#include "nsIDOMXULSelectCntrlItemEl.h"
14
#include "nsIDOMXULMultSelectCntrlEl.h"
15
#include "nsIMutableArray.h"
16
#include "nsIServiceManager.h"
17
18
#include "mozilla/dom/Element.h"
19
#include "mozilla/dom/KeyboardEventBinding.h"
20
21
using namespace mozilla;
22
using namespace mozilla::a11y;
23
24
////////////////////////////////////////////////////////////////////////////////
25
// XULSelectControlAccessible
26
////////////////////////////////////////////////////////////////////////////////
27
28
XULSelectControlAccessible::
29
  XULSelectControlAccessible(nsIContent* aContent, DocAccessible* aDoc) :
30
  AccessibleWrap(aContent, aDoc)
31
0
{
32
0
  mGenericTypes |= eSelect;
33
0
  mSelectControl = do_QueryInterface(aContent);
34
0
}
35
36
////////////////////////////////////////////////////////////////////////////////
37
// XULSelectControlAccessible: Accessible
38
39
void
40
XULSelectControlAccessible::Shutdown()
41
0
{
42
0
  mSelectControl = nullptr;
43
0
  AccessibleWrap::Shutdown();
44
0
}
45
46
////////////////////////////////////////////////////////////////////////////////
47
// XULSelectControlAccessible: SelectAccessible
48
49
void
50
XULSelectControlAccessible::SelectedItems(nsTArray<Accessible*>* aItems)
51
0
{
52
0
  // For XUL multi-select control
53
0
  nsCOMPtr<nsIDOMXULMultiSelectControlElement> xulMultiSelect =
54
0
    do_QueryInterface(mSelectControl);
55
0
  if (xulMultiSelect) {
56
0
    int32_t length = 0;
57
0
    xulMultiSelect->GetSelectedCount(&length);
58
0
    for (int32_t index = 0; index < length; index++) {
59
0
      nsCOMPtr<nsIDOMXULSelectControlItemElement> itemElm;
60
0
      xulMultiSelect->MultiGetSelectedItem(index, getter_AddRefs(itemElm));
61
0
      nsCOMPtr<nsINode> itemNode(do_QueryInterface(itemElm));
62
0
      Accessible* item = mDoc->GetAccessible(itemNode);
63
0
      if (item)
64
0
        aItems->AppendElement(item);
65
0
    }
66
0
  } else {  // Single select?
67
0
    nsCOMPtr<nsIDOMXULSelectControlItemElement> itemElm;
68
0
    mSelectControl->GetSelectedItem(getter_AddRefs(itemElm));
69
0
    nsCOMPtr<nsINode> itemNode(do_QueryInterface(itemElm));
70
0
    if (itemNode) {
71
0
      Accessible* item = mDoc->GetAccessible(itemNode);
72
0
      if (item)
73
0
        aItems->AppendElement(item);
74
0
    }
75
0
  }
76
0
}
77
78
Accessible*
79
XULSelectControlAccessible::GetSelectedItem(uint32_t aIndex)
80
0
{
81
0
  nsCOMPtr<nsIDOMXULMultiSelectControlElement> multiSelectControl =
82
0
    do_QueryInterface(mSelectControl);
83
0
84
0
  nsCOMPtr<nsIDOMXULSelectControlItemElement> itemElm;
85
0
  if (multiSelectControl)
86
0
    multiSelectControl->MultiGetSelectedItem(aIndex, getter_AddRefs(itemElm));
87
0
  else if (aIndex == 0)
88
0
    mSelectControl->GetSelectedItem(getter_AddRefs(itemElm));
89
0
90
0
  nsCOMPtr<nsINode> itemNode(do_QueryInterface(itemElm));
91
0
  return itemNode && mDoc ? mDoc->GetAccessible(itemNode) : nullptr;
92
0
}
93
94
uint32_t
95
XULSelectControlAccessible::SelectedItemCount()
96
0
{
97
0
  // For XUL multi-select control
98
0
  nsCOMPtr<nsIDOMXULMultiSelectControlElement> multiSelectControl =
99
0
    do_QueryInterface(mSelectControl);
100
0
  if (multiSelectControl) {
101
0
    int32_t count = 0;
102
0
    multiSelectControl->GetSelectedCount(&count);
103
0
    return count;
104
0
  }
105
0
106
0
  // For XUL single-select control/menulist
107
0
  int32_t index;
108
0
  mSelectControl->GetSelectedIndex(&index);
109
0
  return (index >= 0) ? 1 : 0;
110
0
}
111
112
bool
113
XULSelectControlAccessible::AddItemToSelection(uint32_t aIndex)
114
0
{
115
0
  Accessible* item = GetChildAt(aIndex);
116
0
  if (!item)
117
0
    return false;
118
0
119
0
  nsCOMPtr<nsIDOMXULSelectControlItemElement> itemElm =
120
0
    do_QueryInterface(item->GetContent());
121
0
  if (!itemElm)
122
0
    return false;
123
0
124
0
  bool isItemSelected = false;
125
0
  itemElm->GetSelected(&isItemSelected);
126
0
  if (isItemSelected)
127
0
    return true;
128
0
129
0
  nsCOMPtr<nsIDOMXULMultiSelectControlElement> multiSelectControl =
130
0
    do_QueryInterface(mSelectControl);
131
0
132
0
  if (multiSelectControl)
133
0
    multiSelectControl->AddItemToSelection(itemElm);
134
0
  else
135
0
    mSelectControl->SetSelectedItem(itemElm);
136
0
137
0
  return true;
138
0
}
139
140
bool
141
XULSelectControlAccessible::RemoveItemFromSelection(uint32_t aIndex)
142
0
{
143
0
  Accessible* item = GetChildAt(aIndex);
144
0
  if (!item)
145
0
    return false;
146
0
147
0
  nsCOMPtr<nsIDOMXULSelectControlItemElement> itemElm =
148
0
      do_QueryInterface(item->GetContent());
149
0
  if (!itemElm)
150
0
    return false;
151
0
152
0
  bool isItemSelected = false;
153
0
  itemElm->GetSelected(&isItemSelected);
154
0
  if (!isItemSelected)
155
0
    return true;
156
0
157
0
  nsCOMPtr<nsIDOMXULMultiSelectControlElement> multiSelectControl =
158
0
    do_QueryInterface(mSelectControl);
159
0
160
0
  if (multiSelectControl)
161
0
    multiSelectControl->RemoveItemFromSelection(itemElm);
162
0
  else
163
0
    mSelectControl->SetSelectedItem(nullptr);
164
0
165
0
  return true;
166
0
}
167
168
bool
169
XULSelectControlAccessible::IsItemSelected(uint32_t aIndex)
170
0
{
171
0
  Accessible* item = GetChildAt(aIndex);
172
0
  if (!item)
173
0
    return false;
174
0
175
0
  nsCOMPtr<nsIDOMXULSelectControlItemElement> itemElm =
176
0
    do_QueryInterface(item->GetContent());
177
0
  if (!itemElm)
178
0
    return false;
179
0
180
0
  bool isItemSelected = false;
181
0
  itemElm->GetSelected(&isItemSelected);
182
0
  return isItemSelected;
183
0
}
184
185
bool
186
XULSelectControlAccessible::UnselectAll()
187
0
{
188
0
  nsCOMPtr<nsIDOMXULMultiSelectControlElement> multiSelectControl =
189
0
    do_QueryInterface(mSelectControl);
190
0
  multiSelectControl ?
191
0
    multiSelectControl->ClearSelection() : mSelectControl->SetSelectedIndex(-1);
192
0
193
0
  return true;
194
0
}
195
196
bool
197
XULSelectControlAccessible::SelectAll()
198
0
{
199
0
  nsCOMPtr<nsIDOMXULMultiSelectControlElement> multiSelectControl =
200
0
    do_QueryInterface(mSelectControl);
201
0
  if (multiSelectControl) {
202
0
    multiSelectControl->SelectAll();
203
0
    return true;
204
0
  }
205
0
206
0
  // otherwise, don't support this method
207
0
  return false;
208
0
}
209
210
////////////////////////////////////////////////////////////////////////////////
211
// XULSelectControlAccessible: Widgets
212
213
Accessible*
214
XULSelectControlAccessible::CurrentItem() const
215
0
{
216
0
  if (!mSelectControl)
217
0
    return nullptr;
218
0
219
0
  nsCOMPtr<nsIDOMXULSelectControlItemElement> currentItemElm;
220
0
  nsCOMPtr<nsIDOMXULMultiSelectControlElement> multiSelectControl =
221
0
    do_QueryInterface(mSelectControl);
222
0
  if (multiSelectControl)
223
0
    multiSelectControl->GetCurrentItem(getter_AddRefs(currentItemElm));
224
0
  else
225
0
    mSelectControl->GetSelectedItem(getter_AddRefs(currentItemElm));
226
0
227
0
  nsCOMPtr<nsINode> DOMNode;
228
0
  if (currentItemElm)
229
0
    DOMNode = do_QueryInterface(currentItemElm);
230
0
231
0
  if (DOMNode) {
232
0
    DocAccessible* document = Document();
233
0
    if (document)
234
0
      return document->GetAccessible(DOMNode);
235
0
  }
236
0
237
0
  return nullptr;
238
0
}
239
240
void
241
XULSelectControlAccessible::SetCurrentItem(const Accessible* aItem)
242
0
{
243
0
  if (!mSelectControl)
244
0
    return;
245
0
246
0
  nsCOMPtr<nsIDOMXULSelectControlItemElement> itemElm =
247
0
    do_QueryInterface(aItem->GetContent());
248
0
  nsCOMPtr<nsIDOMXULMultiSelectControlElement> multiSelectControl =
249
0
    do_QueryInterface(mSelectControl);
250
0
  if (multiSelectControl)
251
0
    multiSelectControl->SetCurrentItem(itemElm);
252
0
  else
253
0
    mSelectControl->SetSelectedItem(itemElm);
254
0
}