Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/accessible/xpcom/xpcAccessibleTable.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 file,
5
 * You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#include "xpcAccessibleTable.h"
8
9
#include "Accessible.h"
10
#include "TableAccessible.h"
11
#include "xpcAccessibleDocument.h"
12
13
#include "nsIMutableArray.h"
14
#include "nsComponentManagerUtils.h"
15
16
using namespace mozilla::a11y;
17
18
static const uint32_t XPC_TABLE_DEFAULT_SIZE = 40;
19
20
////////////////////////////////////////////////////////////////////////////////
21
// nsISupports
22
23
NS_IMPL_ISUPPORTS_INHERITED(xpcAccessibleTable,
24
                            xpcAccessibleGeneric,
25
                            nsIAccessibleTable)
26
27
////////////////////////////////////////////////////////////////////////////////
28
// nsIAccessibleTable
29
30
NS_IMETHODIMP
31
xpcAccessibleTable::GetCaption(nsIAccessible** aCaption)
32
0
{
33
0
  NS_ENSURE_ARG_POINTER(aCaption);
34
0
  *aCaption = nullptr;
35
0
  if (!Intl())
36
0
    return NS_ERROR_FAILURE;
37
0
38
0
  NS_IF_ADDREF(*aCaption = ToXPC(Intl()->Caption()));
39
0
  return NS_OK;
40
0
}
41
42
NS_IMETHODIMP
43
xpcAccessibleTable::GetColumnCount(int32_t* aColumnCount)
44
0
{
45
0
  NS_ENSURE_ARG_POINTER(aColumnCount);
46
0
  *aColumnCount = 0;
47
0
48
0
  if (!Intl())
49
0
    return NS_ERROR_FAILURE;
50
0
51
0
  *aColumnCount = Intl()->ColCount();
52
0
  return NS_OK;
53
0
}
54
55
NS_IMETHODIMP
56
xpcAccessibleTable::GetRowCount(int32_t* aRowCount)
57
0
{
58
0
  NS_ENSURE_ARG_POINTER(aRowCount);
59
0
  *aRowCount = 0;
60
0
61
0
  if (!Intl())
62
0
    return NS_ERROR_FAILURE;
63
0
64
0
  *aRowCount = Intl()->RowCount();
65
0
  return NS_OK;
66
0
}
67
68
NS_IMETHODIMP
69
xpcAccessibleTable::GetCellAt(int32_t aRowIdx, int32_t aColIdx,
70
                              nsIAccessible** aCell)
71
0
{
72
0
  NS_ENSURE_ARG_POINTER(aCell);
73
0
  *aCell = nullptr;
74
0
75
0
  if (!Intl())
76
0
    return NS_ERROR_FAILURE;
77
0
78
0
  if (aRowIdx < 0 || static_cast<uint32_t>(aRowIdx) >= Intl()->RowCount() ||
79
0
      aColIdx < 0 || static_cast<uint32_t>(aColIdx) >= Intl()->ColCount())
80
0
    return NS_ERROR_INVALID_ARG;
81
0
82
0
  NS_IF_ADDREF(*aCell = ToXPC(Intl()->CellAt(aRowIdx, aColIdx)));
83
0
  return NS_OK;
84
0
}
85
86
NS_IMETHODIMP
87
xpcAccessibleTable::GetCellIndexAt(int32_t aRowIdx, int32_t aColIdx,
88
                                   int32_t* aCellIdx)
89
0
{
90
0
  NS_ENSURE_ARG_POINTER(aCellIdx);
91
0
  *aCellIdx = -1;
92
0
93
0
  if (!Intl())
94
0
    return NS_ERROR_FAILURE;
95
0
96
0
  if (aRowIdx < 0 || static_cast<uint32_t>(aRowIdx) >= Intl()->RowCount() ||
97
0
      aColIdx < 0 || static_cast<uint32_t>(aColIdx) >= Intl()->ColCount())
98
0
    return NS_ERROR_INVALID_ARG;
99
0
100
0
  *aCellIdx = Intl()->CellIndexAt(aRowIdx, aColIdx);
101
0
  return NS_OK;
102
0
}
103
104
NS_IMETHODIMP
105
xpcAccessibleTable::GetColumnExtentAt(int32_t aRowIdx, int32_t aColIdx,
106
                                      int32_t* aColumnExtent)
107
0
{
108
0
  NS_ENSURE_ARG_POINTER(aColumnExtent);
109
0
  *aColumnExtent = -1;
110
0
111
0
  if (!Intl())
112
0
    return NS_ERROR_FAILURE;
113
0
114
0
  if (aRowIdx < 0 || static_cast<uint32_t>(aRowIdx) >= Intl()->RowCount() ||
115
0
      aColIdx < 0 || static_cast<uint32_t>(aColIdx) >= Intl()->ColCount())
116
0
    return NS_ERROR_INVALID_ARG;
117
0
118
0
  *aColumnExtent = Intl()->ColExtentAt(aRowIdx, aColIdx);
119
0
  return NS_OK;
120
0
}
121
122
NS_IMETHODIMP
123
xpcAccessibleTable::GetRowExtentAt(int32_t aRowIdx, int32_t aColIdx,
124
                                   int32_t* aRowExtent)
125
0
{
126
0
  NS_ENSURE_ARG_POINTER(aRowExtent);
127
0
  *aRowExtent = -1;
128
0
129
0
  if (!Intl())
130
0
    return NS_ERROR_FAILURE;
131
0
132
0
  if (aRowIdx < 0 || static_cast<uint32_t>(aRowIdx) >= Intl()->RowCount() ||
133
0
      aColIdx < 0 || static_cast<uint32_t>(aColIdx) >= Intl()->ColCount())
134
0
    return NS_ERROR_INVALID_ARG;
135
0
136
0
  *aRowExtent = Intl()->RowExtentAt(aRowIdx, aColIdx);
137
0
  return NS_OK;
138
0
}
139
140
NS_IMETHODIMP
141
xpcAccessibleTable::GetColumnDescription(int32_t aColIdx,
142
                                         nsAString& aDescription)
143
0
{
144
0
  if (!Intl())
145
0
    return NS_ERROR_FAILURE;
146
0
147
0
  if (aColIdx < 0 || static_cast<uint32_t>(aColIdx) >= Intl()->ColCount())
148
0
    return NS_ERROR_INVALID_ARG;
149
0
150
0
  nsAutoString description;
151
0
  Intl()->ColDescription(aColIdx, description);
152
0
  aDescription.Assign(description);
153
0
154
0
  return NS_OK;
155
0
}
156
157
NS_IMETHODIMP
158
xpcAccessibleTable::GetRowDescription(int32_t aRowIdx, nsAString& aDescription)
159
0
{
160
0
  if (!Intl())
161
0
    return NS_ERROR_FAILURE;
162
0
163
0
  if (aRowIdx < 0 || static_cast<uint32_t>(aRowIdx) >= Intl()->ColCount())
164
0
    return NS_ERROR_INVALID_ARG;
165
0
166
0
  nsAutoString description;
167
0
  Intl()->RowDescription(aRowIdx, description);
168
0
  aDescription.Assign(description);
169
0
170
0
  return NS_OK;
171
0
}
172
173
NS_IMETHODIMP
174
xpcAccessibleTable::IsColumnSelected(int32_t aColIdx, bool* aIsSelected)
175
0
{
176
0
  NS_ENSURE_ARG_POINTER(aIsSelected);
177
0
  *aIsSelected = false;
178
0
179
0
  if (!Intl())
180
0
    return NS_ERROR_FAILURE;
181
0
182
0
  if (aColIdx < 0 || static_cast<uint32_t>(aColIdx) >= Intl()->ColCount())
183
0
    return NS_ERROR_INVALID_ARG;
184
0
185
0
  *aIsSelected = Intl()->IsColSelected(aColIdx);
186
0
  return NS_OK;
187
0
}
188
189
NS_IMETHODIMP
190
xpcAccessibleTable::IsRowSelected(int32_t aRowIdx, bool* aIsSelected)
191
0
{
192
0
  NS_ENSURE_ARG_POINTER(aIsSelected);
193
0
  *aIsSelected = false;
194
0
195
0
  if (!Intl())
196
0
    return NS_ERROR_FAILURE;
197
0
198
0
  if (aRowIdx < 0 || static_cast<uint32_t>(aRowIdx) >= Intl()->RowCount())
199
0
    return NS_ERROR_INVALID_ARG;
200
0
201
0
  *aIsSelected = Intl()->IsRowSelected(aRowIdx);
202
0
  return NS_OK;
203
0
}
204
205
NS_IMETHODIMP
206
xpcAccessibleTable::IsCellSelected(int32_t aRowIdx, int32_t aColIdx,
207
                                   bool* aIsSelected)
208
0
{
209
0
  NS_ENSURE_ARG_POINTER(aIsSelected);
210
0
  *aIsSelected = false;
211
0
212
0
  if (!Intl())
213
0
    return NS_ERROR_FAILURE;
214
0
215
0
  if (aRowIdx < 0 || static_cast<uint32_t>(aRowIdx) >= Intl()->RowCount() ||
216
0
      aColIdx < 0 || static_cast<uint32_t>(aColIdx) >= Intl()->ColCount())
217
0
    return NS_ERROR_INVALID_ARG;
218
0
219
0
  *aIsSelected = Intl()->IsCellSelected(aRowIdx, aColIdx);
220
0
  return NS_OK;
221
0
}
222
223
NS_IMETHODIMP
224
xpcAccessibleTable::GetSelectedCellCount(uint32_t* aSelectedCellCount)
225
0
{
226
0
  NS_ENSURE_ARG_POINTER(aSelectedCellCount);
227
0
  *aSelectedCellCount = 0;
228
0
229
0
  if (!Intl())
230
0
    return NS_ERROR_FAILURE;
231
0
232
0
  *aSelectedCellCount = Intl()->SelectedCellCount();
233
0
  return NS_OK;
234
0
}
235
236
NS_IMETHODIMP
237
xpcAccessibleTable::GetSelectedColumnCount(uint32_t* aSelectedColumnCount)
238
0
{
239
0
  NS_ENSURE_ARG_POINTER(aSelectedColumnCount);
240
0
  *aSelectedColumnCount = 0;
241
0
242
0
  if (!Intl())
243
0
    return NS_ERROR_FAILURE;
244
0
245
0
  *aSelectedColumnCount = Intl()->SelectedColCount();
246
0
  return NS_OK;
247
0
}
248
249
NS_IMETHODIMP
250
xpcAccessibleTable::GetSelectedRowCount(uint32_t* aSelectedRowCount)
251
0
{
252
0
  NS_ENSURE_ARG_POINTER(aSelectedRowCount);
253
0
  *aSelectedRowCount = 0;
254
0
255
0
  if (!Intl())
256
0
    return NS_ERROR_FAILURE;
257
0
258
0
  *aSelectedRowCount = Intl()->SelectedRowCount();
259
0
  return NS_OK;
260
0
}
261
262
NS_IMETHODIMP
263
xpcAccessibleTable::GetSelectedCells(nsIArray** aSelectedCells)
264
0
{
265
0
  NS_ENSURE_ARG_POINTER(aSelectedCells);
266
0
  *aSelectedCells = nullptr;
267
0
268
0
  if (!Intl())
269
0
    return NS_ERROR_FAILURE;
270
0
271
0
  nsresult rv = NS_OK;
272
0
  nsCOMPtr<nsIMutableArray> selCells =
273
0
    do_CreateInstance(NS_ARRAY_CONTRACTID, &rv);
274
0
  NS_ENSURE_SUCCESS(rv, rv);
275
0
276
0
  AutoTArray<Accessible*, XPC_TABLE_DEFAULT_SIZE> cellsArray;
277
0
  Intl()->SelectedCells(&cellsArray);
278
0
279
0
  uint32_t totalCount = cellsArray.Length();
280
0
  for (uint32_t idx = 0; idx < totalCount; idx++) {
281
0
    Accessible* cell = cellsArray.ElementAt(idx);
282
0
    selCells->AppendElement(static_cast<nsIAccessible*>(ToXPC(cell)));
283
0
  }
284
0
285
0
  NS_ADDREF(*aSelectedCells = selCells);
286
0
  return NS_OK;
287
0
}
288
289
NS_IMETHODIMP
290
xpcAccessibleTable::GetSelectedCellIndices(uint32_t* aCellsArraySize,
291
                                           int32_t** aCellsArray)
292
0
{
293
0
  NS_ENSURE_ARG_POINTER(aCellsArraySize);
294
0
  *aCellsArraySize = 0;
295
0
296
0
  NS_ENSURE_ARG_POINTER(aCellsArray);
297
0
  *aCellsArray = 0;
298
0
299
0
  if (!Intl())
300
0
    return NS_ERROR_FAILURE;
301
0
302
0
  AutoTArray<uint32_t, XPC_TABLE_DEFAULT_SIZE> cellsArray;
303
0
  Intl()->SelectedCellIndices(&cellsArray);
304
0
305
0
  *aCellsArraySize = cellsArray.Length();
306
0
  *aCellsArray = static_cast<int32_t*>
307
0
    (moz_xmalloc(*aCellsArraySize * sizeof(int32_t)));
308
0
  memcpy(*aCellsArray, cellsArray.Elements(),
309
0
    *aCellsArraySize * sizeof(int32_t));
310
0
311
0
  return NS_OK;
312
0
}
313
314
NS_IMETHODIMP
315
xpcAccessibleTable::GetSelectedColumnIndices(uint32_t* aColsArraySize,
316
                                             int32_t** aColsArray)
317
0
{
318
0
  NS_ENSURE_ARG_POINTER(aColsArraySize);
319
0
  *aColsArraySize = 0;
320
0
321
0
  NS_ENSURE_ARG_POINTER(aColsArray);
322
0
  *aColsArray = 0;
323
0
324
0
  if (!Intl())
325
0
    return NS_ERROR_FAILURE;
326
0
327
0
  AutoTArray<uint32_t, XPC_TABLE_DEFAULT_SIZE> colsArray;
328
0
  Intl()->SelectedColIndices(&colsArray);
329
0
330
0
  *aColsArraySize = colsArray.Length();
331
0
  *aColsArray = static_cast<int32_t*>
332
0
    (moz_xmalloc(*aColsArraySize * sizeof(int32_t)));
333
0
  memcpy(*aColsArray, colsArray.Elements(),
334
0
    *aColsArraySize * sizeof(int32_t));
335
0
336
0
  return NS_OK;
337
0
}
338
339
NS_IMETHODIMP
340
xpcAccessibleTable::GetSelectedRowIndices(uint32_t* aRowsArraySize,
341
                                          int32_t** aRowsArray)
342
0
{
343
0
  NS_ENSURE_ARG_POINTER(aRowsArraySize);
344
0
  *aRowsArraySize = 0;
345
0
346
0
  NS_ENSURE_ARG_POINTER(aRowsArray);
347
0
  *aRowsArray = 0;
348
0
349
0
  if (!Intl())
350
0
    return NS_ERROR_FAILURE;
351
0
352
0
  AutoTArray<uint32_t, XPC_TABLE_DEFAULT_SIZE> rowsArray;
353
0
  Intl()->SelectedRowIndices(&rowsArray);
354
0
355
0
  *aRowsArraySize = rowsArray.Length();
356
0
  *aRowsArray = static_cast<int32_t*>
357
0
    (moz_xmalloc(*aRowsArraySize * sizeof(int32_t)));
358
0
  memcpy(*aRowsArray, rowsArray.Elements(),
359
0
    *aRowsArraySize * sizeof(int32_t));
360
0
361
0
  return NS_OK;
362
0
}
363
364
NS_IMETHODIMP
365
xpcAccessibleTable::GetColumnIndexAt(int32_t aCellIdx, int32_t* aColIdx)
366
0
{
367
0
  NS_ENSURE_ARG_POINTER(aColIdx);
368
0
  *aColIdx = -1;
369
0
370
0
  if (!Intl())
371
0
    return NS_ERROR_FAILURE;
372
0
373
0
  if (aCellIdx < 0 ||
374
0
      static_cast<uint32_t>(aCellIdx) >= Intl()->RowCount() * Intl()->ColCount())
375
0
    return NS_ERROR_INVALID_ARG;
376
0
377
0
  *aColIdx = Intl()->ColIndexAt(aCellIdx);
378
0
  return NS_OK;
379
0
}
380
381
NS_IMETHODIMP
382
xpcAccessibleTable::GetRowIndexAt(int32_t aCellIdx, int32_t* aRowIdx)
383
0
{
384
0
  NS_ENSURE_ARG_POINTER(aRowIdx);
385
0
  *aRowIdx = -1;
386
0
387
0
  if (!Intl())
388
0
    return NS_ERROR_FAILURE;
389
0
390
0
  if (aCellIdx < 0 ||
391
0
      static_cast<uint32_t>(aCellIdx) >= Intl()->RowCount() * Intl()->ColCount())
392
0
    return NS_ERROR_INVALID_ARG;
393
0
394
0
  *aRowIdx = Intl()->RowIndexAt(aCellIdx);
395
0
  return NS_OK;
396
0
}
397
398
NS_IMETHODIMP
399
xpcAccessibleTable::GetRowAndColumnIndicesAt(int32_t aCellIdx, int32_t* aRowIdx,
400
                                             int32_t* aColIdx)
401
0
{
402
0
  NS_ENSURE_ARG_POINTER(aRowIdx);
403
0
  *aRowIdx = -1;
404
0
  NS_ENSURE_ARG_POINTER(aColIdx);
405
0
  *aColIdx = -1;
406
0
407
0
  if (!Intl())
408
0
    return NS_ERROR_FAILURE;
409
0
410
0
  if (aCellIdx < 0 ||
411
0
      static_cast<uint32_t>(aCellIdx) >= Intl()->RowCount() * Intl()->ColCount())
412
0
    return NS_ERROR_INVALID_ARG;
413
0
414
0
  Intl()->RowAndColIndicesAt(aCellIdx, aRowIdx, aColIdx);
415
0
  return NS_OK;
416
0
}
417
418
NS_IMETHODIMP
419
xpcAccessibleTable::GetSummary(nsAString& aSummary)
420
0
{
421
0
  if (!Intl())
422
0
    return NS_ERROR_FAILURE;
423
0
424
0
  nsAutoString summary;
425
0
  Intl()->Summary(summary);
426
0
  aSummary.Assign(summary);
427
0
428
0
  return NS_OK;
429
0
}
430
431
NS_IMETHODIMP
432
xpcAccessibleTable::IsProbablyForLayout(bool* aResult)
433
0
{
434
0
  NS_ENSURE_ARG_POINTER(aResult);
435
0
  *aResult = false;
436
0
  if (!Intl())
437
0
    return NS_ERROR_FAILURE;
438
0
439
0
  *aResult = Intl()->IsProbablyLayoutTable();
440
0
  return NS_OK;
441
0
}
442
443
NS_IMETHODIMP
444
xpcAccessibleTable::SelectColumn(int32_t aColIdx)
445
0
{
446
0
  if (!Intl())
447
0
    return NS_ERROR_FAILURE;
448
0
449
0
  if (aColIdx < 0 || static_cast<uint32_t>(aColIdx) >= Intl()->ColCount())
450
0
    return NS_ERROR_INVALID_ARG;
451
0
452
0
  Intl()->SelectCol(aColIdx);
453
0
  return NS_OK;
454
0
}
455
456
NS_IMETHODIMP
457
xpcAccessibleTable::SelectRow(int32_t aRowIdx)
458
0
{
459
0
  if (!Intl())
460
0
    return NS_ERROR_FAILURE;
461
0
462
0
  if (aRowIdx < 0 || static_cast<uint32_t>(aRowIdx) >= Intl()->RowCount())
463
0
    return NS_ERROR_INVALID_ARG;
464
0
465
0
  Intl()->SelectRow(aRowIdx);
466
0
  return NS_OK;
467
0
}
468
469
NS_IMETHODIMP
470
xpcAccessibleTable::UnselectColumn(int32_t aColIdx)
471
0
{
472
0
  if (!Intl())
473
0
    return NS_ERROR_FAILURE;
474
0
475
0
  if (aColIdx < 0 || static_cast<uint32_t>(aColIdx) >= Intl()->ColCount())
476
0
    return NS_ERROR_INVALID_ARG;
477
0
478
0
  Intl()->UnselectCol(aColIdx);
479
0
  return NS_OK;
480
0
}
481
482
NS_IMETHODIMP
483
xpcAccessibleTable::UnselectRow(int32_t aRowIdx)
484
0
{
485
0
  if (!Intl())
486
0
    return NS_ERROR_FAILURE;
487
0
488
0
  if (aRowIdx < 0 || static_cast<uint32_t>(aRowIdx) >= Intl()->RowCount())
489
0
    return NS_ERROR_INVALID_ARG;
490
0
491
0
  Intl()->UnselectRow(aRowIdx);
492
0
  return NS_OK;
493
0
}