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

Side by Side Diff: chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.cc

Issue 2757623003: Initial support for accessible text fields and focus tracking in ARC++ (Closed)
Patch Set: Created 3 years, 9 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 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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 "chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.h" 5 #include "chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "chrome/browser/extensions/api/automation_internal/automation_event_rou ter.h" 9 #include "chrome/browser/extensions/api/automation_internal/automation_event_rou ter.h"
10 #include "chrome/browser/ui/aura/accessibility/automation_manager_aura.h" 10 #include "chrome/browser/ui/aura/accessibility/automation_manager_aura.h"
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 if (!node->booleanProperties) 76 if (!node->booleanProperties)
77 return false; 77 return false;
78 78
79 auto it = node->booleanProperties->find(prop); 79 auto it = node->booleanProperties->find(prop);
80 if (it == node->booleanProperties->end()) 80 if (it == node->booleanProperties->end())
81 return false; 81 return false;
82 82
83 return it->second; 83 return it->second;
84 } 84 }
85 85
86 bool GetIntProperty(arc::mojom::AccessibilityNodeInfoData* node,
87 arc::mojom::AccessibilityIntProperty prop,
dmazzoni 2017/03/17 03:22:37 nit: indentation
David Tseng 2017/03/17 15:38:32 Done.
88 int32_t* out_value) {
89 if (!node->intProperties)
90 return false;
91
92 auto it = node->intProperties->find(prop);
93 if (it == node->intProperties->end())
94 return false;
95
96 *out_value = it->second;
97 return true;
98 }
99
86 bool GetStringProperty(arc::mojom::AccessibilityNodeInfoData* node, 100 bool GetStringProperty(arc::mojom::AccessibilityNodeInfoData* node,
87 arc::mojom::AccessibilityStringProperty prop, 101 arc::mojom::AccessibilityStringProperty prop,
88 std::string* out_value) { 102 std::string* out_value) {
89 if (!node->stringProperties) 103 if (!node->stringProperties)
90 return false; 104 return false;
91 105
92 auto it = node->stringProperties->find(prop); 106 auto it = node->stringProperties->find(prop);
93 if (it == node->stringProperties->end()) 107 if (it == node->stringProperties->end())
94 return false; 108 return false;
95 109
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 mojom::AccessibilityNodeInfoData* AXTreeSourceArc::GetNull() const { 313 mojom::AccessibilityNodeInfoData* AXTreeSourceArc::GetNull() const {
300 return nullptr; 314 return nullptr;
301 } 315 }
302 316
303 void AXTreeSourceArc::SerializeNode(mojom::AccessibilityNodeInfoData* node, 317 void AXTreeSourceArc::SerializeNode(mojom::AccessibilityNodeInfoData* node,
304 ui::AXNodeData* out_data) const { 318 ui::AXNodeData* out_data) const {
305 if (!node) 319 if (!node)
306 return; 320 return;
307 out_data->id = node->id; 321 out_data->id = node->id;
308 322
323 using AXIntProperty = arc::mojom::AccessibilityIntProperty;
309 using AXStringProperty = arc::mojom::AccessibilityStringProperty; 324 using AXStringProperty = arc::mojom::AccessibilityStringProperty;
310 std::string text; 325 std::string text;
311 if (GetStringProperty(node, AXStringProperty::TEXT, &text)) 326 if (GetStringProperty(node, AXStringProperty::TEXT, &text))
312 out_data->SetName(text); 327 out_data->SetName(text);
313 else if (GetStringProperty(node, AXStringProperty::CONTENT_DESCRIPTION, 328 else if (GetStringProperty(node, AXStringProperty::CONTENT_DESCRIPTION,
314 &text)) 329 &text))
315 out_data->SetName(text); 330 out_data->SetName(text);
316 331
317 int32_t id = node->id; 332 int32_t id = node->id;
318 if (id == root_id_) 333 if (id == root_id_)
319 out_data->role = ui::AX_ROLE_ROOT_WEB_AREA; 334 out_data->role = ui::AX_ROLE_ROOT_WEB_AREA;
320 else 335 else
321 PopulateAXRole(node, out_data); 336 PopulateAXRole(node, out_data);
322 337
323 PopulateAXState(node, out_data); 338 PopulateAXState(node, out_data);
324 339
325 const gfx::Rect bounds_in_screen = GetBounds(node); 340 const gfx::Rect bounds_in_screen = GetBounds(node);
326 out_data->location.SetRect(bounds_in_screen.x(), bounds_in_screen.y(), 341 out_data->location.SetRect(bounds_in_screen.x(), bounds_in_screen.y(),
327 bounds_in_screen.width(), 342 bounds_in_screen.width(),
328 bounds_in_screen.height()); 343 bounds_in_screen.height());
329 344
330 if (out_data->role == ui::AX_ROLE_TEXT_FIELD && !text.empty()) 345 if (out_data->role == ui::AX_ROLE_TEXT_FIELD && !text.empty())
331 out_data->AddStringAttribute(ui::AX_ATTR_VALUE, text); 346 out_data->AddStringAttribute(ui::AX_ATTR_VALUE, text);
347
348 // Integer properties.
349 int32_t val;
350 if (GetIntProperty(node, AXIntProperty::TEXT_SELECTION_START,
yawano 2017/03/17 08:38:23 Node can have both TEXT_SELECTION_START and TEXT_S
David Tseng 2017/03/17 15:38:32 Done.
351 &val) && val >= 0) {
352 out_data->AddIntAttribute(ui::AX_ATTR_TEXT_SEL_START, val);
353 out_data->AddIntAttribute(ui::AX_ATTR_TEXT_SEL_END, val);
yawano 2017/03/17 08:38:23 This line of setting AX_ATTR_TEXT_SEL_END would be
David Tseng 2017/03/17 15:38:32 Yeah totally; was wip while I was trying to figure
354 } else if (GetIntProperty(node, AXIntProperty::TEXT_SELECTION_END,
355 &val) && val >= 0) {
356 out_data->AddIntAttribute(ui::AX_ATTR_TEXT_SEL_END, val);
357 }
332 } 358 }
333 359
334 void AXTreeSourceArc::Reset() { 360 void AXTreeSourceArc::Reset() {
335 tree_map_.clear(); 361 tree_map_.clear();
336 parent_map_.clear(); 362 parent_map_.clear();
337 current_tree_serializer_.reset(new AXTreeArcSerializer(this)); 363 current_tree_serializer_.reset(new AXTreeArcSerializer(this));
338 root_id_ = -1; 364 root_id_ = -1;
339 focused_node_id_ = -1; 365 focused_node_id_ = -1;
340 extensions::AutomationEventRouter* router = 366 extensions::AutomationEventRouter* router =
341 extensions::AutomationEventRouter::GetInstance(); 367 extensions::AutomationEventRouter::GetInstance();
342 router->DispatchTreeDestroyedEvent(tree_id_, nullptr); 368 router->DispatchTreeDestroyedEvent(tree_id_, nullptr);
343 } 369 }
344 370
345 } // namespace arc 371 } // namespace arc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698