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

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: Address nits. 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
« no previous file with comments | « no previous file | chrome/browser/resources/chromeos/chromevox/common/chromevox_json.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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"
11 #include "chrome/common/extensions/chrome_extension_messages.h" 11 #include "chrome/common/extensions/chrome_extension_messages.h"
12 #include "components/exo/wm_helper.h" 12 #include "components/exo/wm_helper.h"
13 #include "ui/accessibility/platform/ax_android_constants.h" 13 #include "ui/accessibility/platform/ax_android_constants.h"
14 #include "ui/aura/window.h" 14 #include "ui/aura/window.h"
15 15
16 namespace { 16 namespace {
17 17
18 ui::AXEvent ToAXEvent(arc::mojom::AccessibilityEventType arc_event_type) { 18 ui::AXEvent ToAXEvent(arc::mojom::AccessibilityEventType arc_event_type) {
19 switch (arc_event_type) { 19 switch (arc_event_type) {
20 case arc::mojom::AccessibilityEventType::VIEW_FOCUSED: 20 case arc::mojom::AccessibilityEventType::VIEW_FOCUSED:
21 case arc::mojom::AccessibilityEventType::VIEW_ACCESSIBILITY_FOCUSED: 21 case arc::mojom::AccessibilityEventType::VIEW_ACCESSIBILITY_FOCUSED:
22 return ui::AX_EVENT_FOCUS; 22 return ui::AX_EVENT_FOCUS;
23 case arc::mojom::AccessibilityEventType::VIEW_ACCESSIBILITY_FOCUS_CLEARED:
24 return ui::AX_EVENT_BLUR;
25 case arc::mojom::AccessibilityEventType::VIEW_CLICKED: 23 case arc::mojom::AccessibilityEventType::VIEW_CLICKED:
26 case arc::mojom::AccessibilityEventType::VIEW_LONG_CLICKED: 24 case arc::mojom::AccessibilityEventType::VIEW_LONG_CLICKED:
27 return ui::AX_EVENT_CLICKED; 25 return ui::AX_EVENT_CLICKED;
28 case arc::mojom::AccessibilityEventType::VIEW_TEXT_CHANGED: 26 case arc::mojom::AccessibilityEventType::VIEW_TEXT_CHANGED:
29 return ui::AX_EVENT_TEXT_CHANGED; 27 return ui::AX_EVENT_TEXT_CHANGED;
30 case arc::mojom::AccessibilityEventType::VIEW_TEXT_SELECTION_CHANGED: 28 case arc::mojom::AccessibilityEventType::VIEW_TEXT_SELECTION_CHANGED:
31 return ui::AX_EVENT_TEXT_SELECTION_CHANGED; 29 return ui::AX_EVENT_TEXT_SELECTION_CHANGED;
32 case arc::mojom::AccessibilityEventType::WINDOW_STATE_CHANGED: 30 case arc::mojom::AccessibilityEventType::WINDOW_STATE_CHANGED:
33 case arc::mojom::AccessibilityEventType::NOTIFICATION_STATE_CHANGED: 31 case arc::mojom::AccessibilityEventType::NOTIFICATION_STATE_CHANGED:
34 case arc::mojom::AccessibilityEventType::WINDOW_CONTENT_CHANGED: 32 case arc::mojom::AccessibilityEventType::WINDOW_CONTENT_CHANGED:
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 if (!node->booleanProperties) 74 if (!node->booleanProperties)
77 return false; 75 return false;
78 76
79 auto it = node->booleanProperties->find(prop); 77 auto it = node->booleanProperties->find(prop);
80 if (it == node->booleanProperties->end()) 78 if (it == node->booleanProperties->end())
81 return false; 79 return false;
82 80
83 return it->second; 81 return it->second;
84 } 82 }
85 83
84 bool GetIntProperty(arc::mojom::AccessibilityNodeInfoData* node,
85 arc::mojom::AccessibilityIntProperty prop,
86 int32_t* out_value) {
87 if (!node->intProperties)
88 return false;
89
90 auto it = node->intProperties->find(prop);
91 if (it == node->intProperties->end())
92 return false;
93
94 *out_value = it->second;
95 return true;
96 }
97
86 bool GetStringProperty(arc::mojom::AccessibilityNodeInfoData* node, 98 bool GetStringProperty(arc::mojom::AccessibilityNodeInfoData* node,
87 arc::mojom::AccessibilityStringProperty prop, 99 arc::mojom::AccessibilityStringProperty prop,
88 std::string* out_value) { 100 std::string* out_value) {
89 if (!node->stringProperties) 101 if (!node->stringProperties)
90 return false; 102 return false;
91 103
92 auto it = node->stringProperties->find(prop); 104 auto it = node->stringProperties->find(prop);
93 if (it == node->stringProperties->end()) 105 if (it == node->stringProperties->end())
94 return false; 106 return false;
95 107
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 int32_t id = event_data->nodeData[i]->id; 224 int32_t id = event_data->nodeData[i]->id;
213 tree_map_[id] = event_data->nodeData[i].get(); 225 tree_map_[id] = event_data->nodeData[i].get();
214 if (parent_map_.find(id) == parent_map_.end()) { 226 if (parent_map_.find(id) == parent_map_.end()) {
215 CHECK_EQ(-1, root_id_) << "Duplicated root"; 227 CHECK_EQ(-1, root_id_) << "Duplicated root";
216 root_id_ = id; 228 root_id_ = id;
217 } 229 }
218 } 230 }
219 231
220 ExtensionMsg_AccessibilityEventParams params; 232 ExtensionMsg_AccessibilityEventParams params;
221 params.event_type = ToAXEvent(event_data->eventType); 233 params.event_type = ToAXEvent(event_data->eventType);
234
222 if (params.event_type == ui::AX_EVENT_FOCUS) 235 if (params.event_type == ui::AX_EVENT_FOCUS)
223 focused_node_id_ = params.id; 236 focused_node_id_ = event_data->sourceId;
224 else if (params.event_type == ui::AX_EVENT_BLUR) 237
225 focused_node_id_ = -1;
226 params.tree_id = tree_id_; 238 params.tree_id = tree_id_;
227 params.id = event_data->sourceId; 239 params.id = event_data->sourceId;
228 240
229 current_tree_serializer_->SerializeChanges(GetFromId(event_data->sourceId), 241 current_tree_serializer_->SerializeChanges(GetFromId(event_data->sourceId),
230 &params.update); 242 &params.update);
231 243
232 extensions::AutomationEventRouter* router = 244 extensions::AutomationEventRouter* router =
233 extensions::AutomationEventRouter::GetInstance(); 245 extensions::AutomationEventRouter::GetInstance();
234 router->DispatchAccessibilityEvent(params); 246 router->DispatchAccessibilityEvent(params);
235 } 247 }
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 mojom::AccessibilityNodeInfoData* AXTreeSourceArc::GetNull() const { 311 mojom::AccessibilityNodeInfoData* AXTreeSourceArc::GetNull() const {
300 return nullptr; 312 return nullptr;
301 } 313 }
302 314
303 void AXTreeSourceArc::SerializeNode(mojom::AccessibilityNodeInfoData* node, 315 void AXTreeSourceArc::SerializeNode(mojom::AccessibilityNodeInfoData* node,
304 ui::AXNodeData* out_data) const { 316 ui::AXNodeData* out_data) const {
305 if (!node) 317 if (!node)
306 return; 318 return;
307 out_data->id = node->id; 319 out_data->id = node->id;
308 320
321 using AXIntProperty = arc::mojom::AccessibilityIntProperty;
309 using AXStringProperty = arc::mojom::AccessibilityStringProperty; 322 using AXStringProperty = arc::mojom::AccessibilityStringProperty;
310 std::string text; 323 std::string text;
311 if (GetStringProperty(node, AXStringProperty::TEXT, &text)) 324 if (GetStringProperty(node, AXStringProperty::TEXT, &text))
312 out_data->SetName(text); 325 out_data->SetName(text);
313 else if (GetStringProperty(node, AXStringProperty::CONTENT_DESCRIPTION, 326 else if (GetStringProperty(node, AXStringProperty::CONTENT_DESCRIPTION,
314 &text)) 327 &text))
315 out_data->SetName(text); 328 out_data->SetName(text);
316 329
317 int32_t id = node->id; 330 int32_t id = node->id;
318 if (id == root_id_) 331 if (id == root_id_)
319 out_data->role = ui::AX_ROLE_ROOT_WEB_AREA; 332 out_data->role = ui::AX_ROLE_ROOT_WEB_AREA;
320 else 333 else
321 PopulateAXRole(node, out_data); 334 PopulateAXRole(node, out_data);
322 335
323 PopulateAXState(node, out_data); 336 PopulateAXState(node, out_data);
324 337
325 const gfx::Rect bounds_in_screen = GetBounds(node); 338 const gfx::Rect bounds_in_screen = GetBounds(node);
326 out_data->location.SetRect(bounds_in_screen.x(), bounds_in_screen.y(), 339 out_data->location.SetRect(bounds_in_screen.x(), bounds_in_screen.y(),
327 bounds_in_screen.width(), 340 bounds_in_screen.width(),
328 bounds_in_screen.height()); 341 bounds_in_screen.height());
329 342
330 if (out_data->role == ui::AX_ROLE_TEXT_FIELD && !text.empty()) 343 if (out_data->role == ui::AX_ROLE_TEXT_FIELD && !text.empty())
331 out_data->AddStringAttribute(ui::AX_ATTR_VALUE, text); 344 out_data->AddStringAttribute(ui::AX_ATTR_VALUE, text);
345
346 // Integer properties.
347 int32_t val;
348 if (GetIntProperty(node, AXIntProperty::TEXT_SELECTION_START, &val) &&
349 val >= 0)
350 out_data->AddIntAttribute(ui::AX_ATTR_TEXT_SEL_START, val);
351
352 if (GetIntProperty(node, AXIntProperty::TEXT_SELECTION_END, &val) && val >= 0)
353 out_data->AddIntAttribute(ui::AX_ATTR_TEXT_SEL_END, val);
332 } 354 }
333 355
334 void AXTreeSourceArc::Reset() { 356 void AXTreeSourceArc::Reset() {
335 tree_map_.clear(); 357 tree_map_.clear();
336 parent_map_.clear(); 358 parent_map_.clear();
337 current_tree_serializer_.reset(new AXTreeArcSerializer(this)); 359 current_tree_serializer_.reset(new AXTreeArcSerializer(this));
338 root_id_ = -1; 360 root_id_ = -1;
339 focused_node_id_ = -1; 361 focused_node_id_ = -1;
340 extensions::AutomationEventRouter* router = 362 extensions::AutomationEventRouter* router =
341 extensions::AutomationEventRouter::GetInstance(); 363 extensions::AutomationEventRouter::GetInstance();
342 router->DispatchTreeDestroyedEvent(tree_id_, nullptr); 364 router->DispatchTreeDestroyedEvent(tree_id_, nullptr);
343 } 365 }
344 366
345 } // namespace arc 367 } // namespace arc
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/resources/chromeos/chromevox/common/chromevox_json.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698