Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(201)

Side by Side Diff: content/browser/accessibility/browser_accessibility_manager.cc

Issue 1413423003: Move some AX attrs from AXNodeData to AXTreeData. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/accessibility/browser_accessibility_manager.h" 5 #include "content/browser/accessibility/browser_accessibility_manager.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "content/browser/accessibility/browser_accessibility.h" 8 #include "content/browser/accessibility/browser_accessibility.h"
9 #include "content/common/accessibility_messages.h" 9 #include "content/common/accessibility_messages.h"
10 #include "ui/accessibility/ax_tree_serializer.h" 10 #include "ui/accessibility/ax_tree_serializer.h"
(...skipping 22 matching lines...) Expand all
33 return nullptr; 33 return nullptr;
34 } 34 }
35 35
36 } // namespace 36 } // namespace
37 37
38 // Map from AXTreeID to BrowserAccessibilityManager 38 // Map from AXTreeID to BrowserAccessibilityManager
39 using AXTreeIDMap = 39 using AXTreeIDMap =
40 base::hash_map<AXTreeIDRegistry::AXTreeID, BrowserAccessibilityManager*>; 40 base::hash_map<AXTreeIDRegistry::AXTreeID, BrowserAccessibilityManager*>;
41 base::LazyInstance<AXTreeIDMap> g_ax_tree_id_map = LAZY_INSTANCE_INITIALIZER; 41 base::LazyInstance<AXTreeIDMap> g_ax_tree_id_map = LAZY_INSTANCE_INITIALIZER;
42 42
43 SimpleAXTreeUpdate MakeAXTreeUpdate( 43 ui::AXTreeUpdate MakeAXTreeUpdate(
44 const ui::AXNodeData& node1, 44 const ui::AXNodeData& node1,
45 const ui::AXNodeData& node2 /* = ui::AXNodeData() */, 45 const ui::AXNodeData& node2 /* = ui::AXNodeData() */,
46 const ui::AXNodeData& node3 /* = ui::AXNodeData() */, 46 const ui::AXNodeData& node3 /* = ui::AXNodeData() */,
47 const ui::AXNodeData& node4 /* = ui::AXNodeData() */, 47 const ui::AXNodeData& node4 /* = ui::AXNodeData() */,
48 const ui::AXNodeData& node5 /* = ui::AXNodeData() */, 48 const ui::AXNodeData& node5 /* = ui::AXNodeData() */,
49 const ui::AXNodeData& node6 /* = ui::AXNodeData() */, 49 const ui::AXNodeData& node6 /* = ui::AXNodeData() */,
50 const ui::AXNodeData& node7 /* = ui::AXNodeData() */, 50 const ui::AXNodeData& node7 /* = ui::AXNodeData() */,
51 const ui::AXNodeData& node8 /* = ui::AXNodeData() */, 51 const ui::AXNodeData& node8 /* = ui::AXNodeData() */,
52 const ui::AXNodeData& node9 /* = ui::AXNodeData() */) { 52 const ui::AXNodeData& node9 /* = ui::AXNodeData() */) {
53 CR_DEFINE_STATIC_LOCAL(ui::AXNodeData, empty_data, ()); 53 CR_DEFINE_STATIC_LOCAL(ui::AXNodeData, empty_data, ());
54 int32 no_id = empty_data.id; 54 int32 no_id = empty_data.id;
55 55
56 SimpleAXTreeUpdate update; 56 ui::AXTreeUpdate update;
57 update.nodes.push_back(node1); 57 update.nodes.push_back(node1);
58 if (node2.id != no_id) 58 if (node2.id != no_id)
59 update.nodes.push_back(node2); 59 update.nodes.push_back(node2);
60 if (node3.id != no_id) 60 if (node3.id != no_id)
61 update.nodes.push_back(node3); 61 update.nodes.push_back(node3);
62 if (node4.id != no_id) 62 if (node4.id != no_id)
63 update.nodes.push_back(node4); 63 update.nodes.push_back(node4);
64 if (node5.id != no_id) 64 if (node5.id != no_id)
65 update.nodes.push_back(node5); 65 update.nodes.push_back(node5);
66 if (node6.id != no_id) 66 if (node6.id != no_id)
(...skipping 21 matching lines...) Expand all
88 active_request_id(-1) {} 88 active_request_id(-1) {}
89 89
90 #if !defined(OS_WIN) && \ 90 #if !defined(OS_WIN) && \
91 !defined(OS_MACOSX) && \ 91 !defined(OS_MACOSX) && \
92 !defined(OS_ANDROID) && \ 92 !defined(OS_ANDROID) && \
93 !(defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_X11)) 93 !(defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_X11))
94 // We have subclassess of BrowserAccessibility on some platforms. 94 // We have subclassess of BrowserAccessibility on some platforms.
95 // For other platforms, instantiate the base class. 95 // For other platforms, instantiate the base class.
96 // static 96 // static
97 BrowserAccessibilityManager* BrowserAccessibilityManager::Create( 97 BrowserAccessibilityManager* BrowserAccessibilityManager::Create(
98 const SimpleAXTreeUpdate& initial_tree, 98 const ui::AXTreeUpdate& initial_tree,
99 BrowserAccessibilityDelegate* delegate, 99 BrowserAccessibilityDelegate* delegate,
100 BrowserAccessibilityFactory* factory) { 100 BrowserAccessibilityFactory* factory) {
101 return new BrowserAccessibilityManager(initial_tree, delegate, factory); 101 return new BrowserAccessibilityManager(initial_tree, delegate, factory);
102 } 102 }
103 #endif 103 #endif
104 104
105 // static 105 // static
106 BrowserAccessibilityManager* BrowserAccessibilityManager::FromID( 106 BrowserAccessibilityManager* BrowserAccessibilityManager::FromID(
107 AXTreeIDRegistry::AXTreeID ax_tree_id) { 107 AXTreeIDRegistry::AXTreeID ax_tree_id) {
108 AXTreeIDMap* ax_tree_id_map = g_ax_tree_id_map.Pointer(); 108 AXTreeIDMap* ax_tree_id_map = g_ax_tree_id_map.Pointer();
109 auto iter = ax_tree_id_map->find(ax_tree_id); 109 auto iter = ax_tree_id_map->find(ax_tree_id);
110 return iter == ax_tree_id_map->end() ? nullptr : iter->second; 110 return iter == ax_tree_id_map->end() ? nullptr : iter->second;
111 } 111 }
112 112
113 BrowserAccessibilityManager::BrowserAccessibilityManager( 113 BrowserAccessibilityManager::BrowserAccessibilityManager(
114 BrowserAccessibilityDelegate* delegate, 114 BrowserAccessibilityDelegate* delegate,
115 BrowserAccessibilityFactory* factory) 115 BrowserAccessibilityFactory* factory)
116 : delegate_(delegate), 116 : delegate_(delegate),
117 factory_(factory), 117 factory_(factory),
118 tree_(new ui::AXSerializableTree()), 118 tree_(new ui::AXSerializableTree()),
119 focus_(NULL), 119 focus_(NULL),
120 user_is_navigating_away_(false), 120 user_is_navigating_away_(false),
121 osk_state_(OSK_ALLOWED), 121 osk_state_(OSK_ALLOWED),
122 ax_tree_id_(AXTreeIDRegistry::kNoAXTreeID), 122 ax_tree_id_(AXTreeIDRegistry::kNoAXTreeID),
123 parent_node_id_from_parent_tree_(0) { 123 parent_node_id_from_parent_tree_(0) {
124 tree_->SetDelegate(this); 124 tree_->SetDelegate(this);
125 } 125 }
126 126
127 BrowserAccessibilityManager::BrowserAccessibilityManager( 127 BrowserAccessibilityManager::BrowserAccessibilityManager(
128 const SimpleAXTreeUpdate& initial_tree, 128 const ui::AXTreeUpdate& initial_tree,
129 BrowserAccessibilityDelegate* delegate, 129 BrowserAccessibilityDelegate* delegate,
130 BrowserAccessibilityFactory* factory) 130 BrowserAccessibilityFactory* factory)
131 : delegate_(delegate), 131 : delegate_(delegate),
132 factory_(factory), 132 factory_(factory),
133 tree_(new ui::AXSerializableTree()), 133 tree_(new ui::AXSerializableTree()),
134 focus_(NULL), 134 focus_(NULL),
135 user_is_navigating_away_(false), 135 user_is_navigating_away_(false),
136 osk_state_(OSK_ALLOWED), 136 osk_state_(OSK_ALLOWED),
137 ax_tree_id_(AXTreeIDRegistry::kNoAXTreeID), 137 ax_tree_id_(AXTreeIDRegistry::kNoAXTreeID),
138 parent_node_id_from_parent_tree_(0) { 138 parent_node_id_from_parent_tree_(0) {
139 tree_->SetDelegate(this); 139 tree_->SetDelegate(this);
140 Initialize(initial_tree); 140 Initialize(initial_tree);
141 } 141 }
142 142
143 BrowserAccessibilityManager::~BrowserAccessibilityManager() { 143 BrowserAccessibilityManager::~BrowserAccessibilityManager() {
144 tree_.reset(NULL); 144 tree_.reset(NULL);
145 } 145 }
146 146
147 void BrowserAccessibilityManager::Initialize( 147 void BrowserAccessibilityManager::Initialize(
148 const SimpleAXTreeUpdate& initial_tree) { 148 const ui::AXTreeUpdate& initial_tree) {
149 if (!tree_->Unserialize(initial_tree)) { 149 if (!tree_->Unserialize(initial_tree)) {
150 if (delegate_) { 150 if (delegate_) {
151 LOG(ERROR) << tree_->error(); 151 LOG(ERROR) << tree_->error();
152 delegate_->AccessibilityFatalError(); 152 delegate_->AccessibilityFatalError();
153 } else { 153 } else {
154 LOG(FATAL) << tree_->error(); 154 LOG(FATAL) << tree_->error();
155 } 155 }
156 } 156 }
157 157
158 if (!focus_) 158 if (!focus_)
159 SetFocus(tree_->root(), false); 159 SetFocus(tree_->root(), false);
160 } 160 }
161 161
162 // static 162 // static
163 SimpleAXTreeUpdate 163 ui::AXTreeUpdate
164 BrowserAccessibilityManager::GetEmptyDocument() { 164 BrowserAccessibilityManager::GetEmptyDocument() {
165 ui::AXNodeData empty_document; 165 ui::AXNodeData empty_document;
166 empty_document.id = 0; 166 empty_document.id = 0;
167 empty_document.role = ui::AX_ROLE_ROOT_WEB_AREA; 167 empty_document.role = ui::AX_ROLE_ROOT_WEB_AREA;
168 SimpleAXTreeUpdate update; 168 ui::AXTreeUpdate update;
169 update.nodes.push_back(empty_document); 169 update.nodes.push_back(empty_document);
170 return update; 170 return update;
171 } 171 }
172 172
173 BrowserAccessibility* BrowserAccessibilityManager::GetRoot() { 173 BrowserAccessibility* BrowserAccessibilityManager::GetRoot() {
174 // tree_->root() can be null during AXTreeDelegate callbacks. 174 // tree_->root() can be null during AXTreeDelegate callbacks.
175 ui::AXNode* root = tree_->root(); 175 ui::AXNode* root = tree_->root();
176 return root ? GetFromAXNode(root) : nullptr; 176 return root ? GetFromAXNode(root) : nullptr;
177 } 177 }
178 178
(...skipping 10 matching lines...) Expand all
189 return iter->second; 189 return iter->second;
190 190
191 return nullptr; 191 return nullptr;
192 } 192 }
193 193
194 BrowserAccessibility* 194 BrowserAccessibility*
195 BrowserAccessibilityManager::GetParentNodeFromParentTree() { 195 BrowserAccessibilityManager::GetParentNodeFromParentTree() {
196 if (!GetRoot()) 196 if (!GetRoot())
197 return nullptr; 197 return nullptr;
198 198
199 int parent_tree_id = GetRoot()->GetIntAttribute(ui::AX_ATTR_PARENT_TREE_ID); 199 int parent_tree_id = GetTreeData().parent_tree_id;
200 BrowserAccessibilityManager* parent_manager = 200 BrowserAccessibilityManager* parent_manager =
201 BrowserAccessibilityManager::FromID(parent_tree_id); 201 BrowserAccessibilityManager::FromID(parent_tree_id);
202 if (!parent_manager) 202 if (!parent_manager)
203 return nullptr; 203 return nullptr;
204 204
205 // Try to use the cached parent node from the most recent time this 205 // Try to use the cached parent node from the most recent time this
206 // was called. 206 // was called.
207 if (parent_node_id_from_parent_tree_) { 207 if (parent_node_id_from_parent_tree_) {
208 BrowserAccessibility* parent_node = parent_manager->GetFromID( 208 BrowserAccessibility* parent_node = parent_manager->GetFromID(
209 parent_node_id_from_parent_tree_); 209 parent_node_id_from_parent_tree_);
210 if (parent_node) { 210 if (parent_node) {
211 int parent_child_tree_id = 211 int parent_child_tree_id =
212 parent_node->GetIntAttribute(ui::AX_ATTR_CHILD_TREE_ID); 212 parent_node->GetIntAttribute(ui::AX_ATTR_CHILD_TREE_ID);
213 if (parent_child_tree_id == ax_tree_id_) 213 if (parent_child_tree_id == ax_tree_id_)
214 return parent_node; 214 return parent_node;
215 } 215 }
216 } 216 }
217 217
218 // If that fails, search for it and cache it for next time. 218 // If that fails, search for it and cache it for next time.
219 BrowserAccessibility* parent_node = FindNodeWithChildTreeId( 219 BrowserAccessibility* parent_node = FindNodeWithChildTreeId(
220 parent_manager->GetRoot(), ax_tree_id_); 220 parent_manager->GetRoot(), ax_tree_id_);
221 if (parent_node) { 221 if (parent_node) {
222 parent_node_id_from_parent_tree_ = parent_node->GetId(); 222 parent_node_id_from_parent_tree_ = parent_node->GetId();
223 return parent_node; 223 return parent_node;
224 } 224 }
225 225
226 return nullptr; 226 return nullptr;
227 } 227 }
228 228
229 const ui::AXTreeData& BrowserAccessibilityManager::GetTreeData() {
230 return tree_->data();
231 }
232
229 void BrowserAccessibilityManager::OnWindowFocused() { 233 void BrowserAccessibilityManager::OnWindowFocused() {
230 if (focus_) 234 if (focus_)
231 NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, GetFromAXNode(focus_)); 235 NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, GetFromAXNode(focus_));
232 } 236 }
233 237
234 void BrowserAccessibilityManager::OnWindowBlurred() { 238 void BrowserAccessibilityManager::OnWindowBlurred() {
235 if (focus_) 239 if (focus_)
236 NotifyAccessibilityEvent(ui::AX_EVENT_BLUR, GetFromAXNode(focus_)); 240 NotifyAccessibilityEvent(ui::AX_EVENT_BLUR, GetFromAXNode(focus_));
237 } 241 }
238 242
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 524
521 BrowserAccessibility* BrowserAccessibilityManager::NextTextOnlyObject( 525 BrowserAccessibility* BrowserAccessibilityManager::NextTextOnlyObject(
522 BrowserAccessibility* node) const { 526 BrowserAccessibility* node) const {
523 BrowserAccessibility* next_node = NextInTreeOrder(node); 527 BrowserAccessibility* next_node = NextInTreeOrder(node);
524 while (next_node && !next_node->IsTextOnlyObject()) 528 while (next_node && !next_node->IsTextOnlyObject())
525 next_node = NextInTreeOrder(next_node); 529 next_node = NextInTreeOrder(next_node);
526 530
527 return next_node; 531 return next_node;
528 } 532 }
529 533
534 void BrowserAccessibilityManager::OnTreeDataChanged(ui::AXTree* tree) {
535 }
536
530 void BrowserAccessibilityManager::OnNodeWillBeDeleted(ui::AXTree* tree, 537 void BrowserAccessibilityManager::OnNodeWillBeDeleted(ui::AXTree* tree,
531 ui::AXNode* node) { 538 ui::AXNode* node) {
532 DCHECK(node); 539 DCHECK(node);
533 if (node == focus_ && tree_) { 540 if (node == focus_ && tree_) {
534 if (node != tree_->root()) 541 if (node != tree_->root())
535 SetFocus(tree_->root(), false); 542 SetFocus(tree_->root(), false);
536 else 543 else
537 focus_ = NULL; 544 focus_ = NULL;
538 } 545 }
539 if (id_wrapper_map_.find(node->id()) == id_wrapper_map_.end()) 546 if (id_wrapper_map_.find(node->id()) == id_wrapper_map_.end())
(...skipping 21 matching lines...) Expand all
561 void BrowserAccessibilityManager::OnNodeChanged(ui::AXTree* tree, 568 void BrowserAccessibilityManager::OnNodeChanged(ui::AXTree* tree,
562 ui::AXNode* node) { 569 ui::AXNode* node) {
563 DCHECK(node); 570 DCHECK(node);
564 GetFromAXNode(node)->OnDataChanged(); 571 GetFromAXNode(node)->OnDataChanged();
565 } 572 }
566 573
567 void BrowserAccessibilityManager::OnAtomicUpdateFinished( 574 void BrowserAccessibilityManager::OnAtomicUpdateFinished(
568 ui::AXTree* tree, 575 ui::AXTree* tree,
569 bool root_changed, 576 bool root_changed,
570 const std::vector<ui::AXTreeDelegate::Change>& changes) { 577 const std::vector<ui::AXTreeDelegate::Change>& changes) {
571 if (GetRoot()->HasIntAttribute(ui::AX_ATTR_TREE_ID) && 578 if (GetTreeData().tree_id != -1 && GetTreeData().tree_id != ax_tree_id_) {
572 GetRoot()->GetIntAttribute(ui::AX_ATTR_TREE_ID) != ax_tree_id_) {
573 g_ax_tree_id_map.Get().erase(ax_tree_id_); 579 g_ax_tree_id_map.Get().erase(ax_tree_id_);
574 ax_tree_id_ = GetRoot()->GetIntAttribute(ui::AX_ATTR_TREE_ID); 580 ax_tree_id_ = GetTreeData().tree_id;
575 g_ax_tree_id_map.Get().insert(std::make_pair(ax_tree_id_, this)); 581 g_ax_tree_id_map.Get().insert(std::make_pair(ax_tree_id_, this));
576 } 582 }
577 } 583 }
578 584
579 BrowserAccessibilityDelegate* 585 BrowserAccessibilityDelegate*
580 BrowserAccessibilityManager::GetDelegateFromRootManager() { 586 BrowserAccessibilityManager::GetDelegateFromRootManager() {
581 if (!GetRoot()) 587 if (!GetRoot())
582 return nullptr; 588 return nullptr;
583 int parent_tree_id = GetRoot()->GetIntAttribute(ui::AX_ATTR_PARENT_TREE_ID); 589 int parent_tree_id = GetTreeData().parent_tree_id;
584 BrowserAccessibilityManager* parent_manager = 590 BrowserAccessibilityManager* parent_manager =
585 BrowserAccessibilityManager::FromID(parent_tree_id); 591 BrowserAccessibilityManager::FromID(parent_tree_id);
586 if (parent_manager) 592 if (parent_manager)
587 return parent_manager->GetDelegateFromRootManager(); 593 return parent_manager->GetDelegateFromRootManager();
588 return delegate(); 594 return delegate();
589 } 595 }
590 596
591 SimpleAXTreeUpdate 597 ui::AXTreeUpdate
592 BrowserAccessibilityManager::SnapshotAXTreeForTesting() { 598 BrowserAccessibilityManager::SnapshotAXTreeForTesting() {
593 scoped_ptr<ui::AXTreeSource<const ui::AXNode*, ui::AXNodeData> > tree_source( 599 scoped_ptr<ui::AXTreeSource<const ui::AXNode*,
600 ui::AXNodeData,
601 ui::AXTreeData> > tree_source(
594 tree_->CreateTreeSource()); 602 tree_->CreateTreeSource());
595 ui::AXTreeSerializer<const ui::AXNode*, ui::AXNodeData> serializer( 603 ui::AXTreeSerializer<const ui::AXNode*,
596 tree_source.get()); 604 ui::AXNodeData,
597 SimpleAXTreeUpdate update; 605 ui::AXTreeData> serializer(tree_source.get());
606 ui::AXTreeUpdate update;
598 serializer.SerializeChanges(tree_->root(), &update); 607 serializer.SerializeChanges(tree_->root(), &update);
599 return update; 608 return update;
600 } 609 }
601 610
602 } // namespace content 611 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698