forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathax_table_info.h
130 lines (99 loc) · 3.84 KB
/
ax_table_info.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_ACCESSIBILITY_AX_TABLE_INFO_H_
#define UI_ACCESSIBILITY_AX_TABLE_INFO_H_
#include <map>
#include <set>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "build/build_config.h"
#include "ui/accessibility/ax_export.h"
#include "ui/accessibility/ax_node_data.h"
namespace ui {
class AXTree;
class AXNode;
#if defined(OS_MAC)
#define AX_EXTRA_MAC_NODES 1
#endif
// This helper class computes info about tables and grids in AXTrees.
class AX_EXPORT AXTableInfo {
public:
struct CellData {
AXNode* cell;
AXNodeID cell_id;
size_t col_index;
size_t row_index;
size_t col_span;
size_t row_span;
size_t aria_col_index;
size_t aria_row_index;
};
// Returns nullptr if the node is not a valid table or grid node.
static AXTableInfo* Create(AXTree* tree, AXNode* table_node);
~AXTableInfo();
// Called automatically on Create(), but must be called again any time
// the table is invalidated. Returns true if this is still a table.
bool Update();
// Whether the data is valid. Whenever the tree is updated in any way,
// every AXTableInfo is invalidated and needs to be recomputed, just
// to be safe.
bool valid() const { return valid_; }
void Invalidate();
// The real row count, guaranteed to be at least as large as the
// maximum row index of any cell.
size_t row_count = 0;
// The real column count, guaranteed to be at least as large as the
// maximum column index of any cell.
size_t col_count = 0;
// List of column header nodes IDs for each column index.
std::vector<std::vector<AXNodeID>> col_headers;
// List of row header node IDs for each row index.
std::vector<std::vector<AXNodeID>> row_headers;
// All header cells.
std::vector<AXNodeID> all_headers;
// The id of the element with the caption tag or ARIA role.
AXNodeID caption_id;
// 2-D array of [row][column] -> cell node ID.
// This may contain duplicates if there is a rowspan or
// colspan. The entry is empty (zero) only if the cell
// really is missing from the table.
std::vector<std::vector<AXNodeID>> cell_ids;
// Array of cell data for every unique cell in the table.
std::vector<CellData> cell_data_vector;
// Set of all unique cell node IDs in the table.
std::vector<AXNodeID> unique_cell_ids;
// Extra computed nodes for the accessibility tree for macOS:
// one column node for each table column, followed by one
// table header container node.
std::vector<AXNode*> extra_mac_nodes;
// Map from each cell's node ID to its index in unique_cell_ids.
std::map<AXNodeID, size_t> cell_id_to_index;
// Map from each row's node ID to its row index.
std::map<AXNodeID, size_t> row_id_to_index;
// List of ax nodes that represent the rows of the table.
std::vector<AXNode*> row_nodes;
// The ARIA row count and column count, if any ARIA table or grid
// attributes are used in the table at all.
int aria_row_count = 0;
int aria_col_count = 0;
std::string ToString() const;
private:
AXTableInfo(AXTree* tree, AXNode* table_node);
void ClearVectors();
void BuildCellDataVectorFromRowAndCellNodes(
const std::vector<AXNode*>& row_node_list,
const std::vector<std::vector<AXNode*>>& cell_nodes_per_row);
void BuildCellAndHeaderVectorsFromCellData();
void UpdateExtraMacNodes();
void ClearExtraMacNodes();
AXNode* CreateExtraMacColumnNode(size_t col_index);
AXNode* CreateExtraMacTableHeaderNode();
void UpdateExtraMacColumnNodeAttributes(size_t col_index);
raw_ptr<AXTree> tree_ = nullptr;
raw_ptr<AXNode> table_node_ = nullptr;
bool valid_ = false;
std::map<int, std::map<int, CellData>> incremental_row_col_map_;
};
} // namespace ui
#endif // UI_ACCESSIBILITY_AX_TABLE_INFO_H_