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

Side by Side Diff: content/public/browser/voice_interaction_helper.cc

Issue 2768093005: Send voice interaction structure from cros to Arc. (Closed)
Patch Set: address review commet Created 3 years, 8 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "content/public/browser/voice_interaction_helper.h"
6
7 #include "content/browser/accessibility/browser_accessibility.h"
8 #include "content/browser/web_contents/web_contents_impl.h"
9 #include "content/public/browser/web_contents.h"
10 #include "ui/accessibility/platform/ax_android_constants.h"
11
12 namespace content {
13
14 namespace {
15
16 std::string GetClassName(BrowserAccessibility* node) {
17 const char* class_name = nullptr;
18
19 switch (node->GetRole()) {
20 case ui::AX_ROLE_SEARCH_BOX:
21 case ui::AX_ROLE_SPIN_BUTTON:
22 case ui::AX_ROLE_TEXT_FIELD:
23 class_name = ui::kAXEditTextClassname;
24 break;
25 case ui::AX_ROLE_SLIDER:
26 class_name = ui::kAXSeekBarClassname;
27 break;
28 case ui::AX_ROLE_COLOR_WELL:
29 case ui::AX_ROLE_COMBO_BOX:
30 case ui::AX_ROLE_DATE:
31 case ui::AX_ROLE_POP_UP_BUTTON:
32 case ui::AX_ROLE_INPUT_TIME:
33 class_name = ui::kAXSpinnerClassname;
34 break;
35 case ui::AX_ROLE_BUTTON:
36 case ui::AX_ROLE_MENU_BUTTON:
37 class_name = ui::kAXButtonClassname;
38 break;
39 case ui::AX_ROLE_CHECK_BOX:
40 case ui::AX_ROLE_SWITCH:
41 class_name = ui::kAXCheckBoxClassname;
42 break;
43 case ui::AX_ROLE_RADIO_BUTTON:
44 class_name = ui::kAXRadioButtonClassname;
45 break;
46 case ui::AX_ROLE_TOGGLE_BUTTON:
47 class_name = ui::kAXToggleButtonClassname;
48 break;
49 case ui::AX_ROLE_CANVAS:
50 case ui::AX_ROLE_IMAGE:
51 case ui::AX_ROLE_SVG_ROOT:
52 class_name = ui::kAXImageClassname;
53 break;
54 case ui::AX_ROLE_METER:
55 case ui::AX_ROLE_PROGRESS_INDICATOR:
56 class_name = ui::kAXProgressBarClassname;
57 break;
58 case ui::AX_ROLE_TAB_LIST:
59 class_name = ui::kAXTabWidgetClassname;
60 break;
61 case ui::AX_ROLE_GRID:
62 case ui::AX_ROLE_TABLE:
63 class_name = ui::kAXGridViewClassname;
64 break;
65 case ui::AX_ROLE_LIST:
66 case ui::AX_ROLE_LIST_BOX:
67 case ui::AX_ROLE_DESCRIPTION_LIST:
68 class_name = ui::kAXListViewClassname;
69 break;
70 case ui::AX_ROLE_DIALOG:
71 class_name = ui::kAXDialogClassname;
72 break;
73 case ui::AX_ROLE_ROOT_WEB_AREA:
74 if (node->PlatformGetParent() == nullptr) {
75 class_name = ui::kAXWebViewClassname;
76 } else {
77 class_name = ui::kAXViewClassname;
78 }
79 break;
80 case ui::AX_ROLE_MENU_ITEM:
81 case ui::AX_ROLE_MENU_ITEM_CHECK_BOX:
82 case ui::AX_ROLE_MENU_ITEM_RADIO:
83 class_name = ui::kAXMenuItemClassname;
84 break;
85 default:
86 class_name = ui::kAXViewClassname;
87 break;
88 }
89
90 return std::string(class_name);
91 }
92
93 // TODO(muyuanli): refactor code in web_contents_android
94 // to use this function as well.
95 std::unique_ptr<AXViewStructure> WalkAXTreeDepthFirst(
96 BrowserAccessibility* node,
97 gfx::Rect rect,
98 const ui::AXTreeUpdate& update) {
99 auto result = base::MakeUnique<AXViewStructure>();
100 result->text = node->GetText();
101 result->class_name = GetClassName(node);
102
103 const int text_style = node->GetIntAttribute(ui::AX_ATTR_TEXT_STYLE);
104 result->bold = (text_style & ui::AX_TEXT_STYLE_BOLD) != 0;
105 result->italic = (text_style & ui::AX_TEXT_STYLE_ITALIC) != 0;
106 result->line_through = (text_style & ui::AX_TEXT_STYLE_LINE_THROUGH) != 0;
107 result->underline = (text_style & ui::AX_TEXT_STYLE_ITALIC) != 0;
108
109 result->text_size = node->GetFloatAttribute(ui::AX_ATTR_FONT_SIZE);
110 result->bgcolor = node->GetIntAttribute(ui::AX_ATTR_BACKGROUND_COLOR);
111
112 const gfx::Rect& absolute_rect = node->GetPageBoundsRect();
113 gfx::Rect parent_relative_rect = absolute_rect;
114 bool is_root = node->GetParent() == nullptr;
115 if (!is_root) {
116 parent_relative_rect.Offset(-rect.OffsetFromOrigin());
117 }
118 result->rect = gfx::Rect(parent_relative_rect.x(), parent_relative_rect.y(),
119 absolute_rect.width(), absolute_rect.height());
120 result->has_selection = false;
121
122 if (node->PlatformIsLeaf()) {
123 int start_selection = 0;
124 int end_selection = 0;
125 if (update.tree_data.sel_anchor_object_id == node->GetId()) {
126 start_selection = update.tree_data.sel_anchor_offset;
127 end_selection = node->GetText().length();
128 }
129 if (update.tree_data.sel_focus_object_id == node->GetId()) {
130 end_selection = update.tree_data.sel_focus_offset;
131 }
132 if (end_selection > 0) {
133 result->has_selection = true;
134 result->start_selection = start_selection;
135 result->end_selection = end_selection;
136 }
137 }
138
139 for (unsigned int i = 0; i < node->PlatformChildCount(); i++) {
140 auto child =
141 WalkAXTreeDepthFirst(node->PlatformGetChild(i), absolute_rect, update);
142 result->children.push_back(std::move(child));
143 }
144
145 return result;
146 }
147
148 void AXSnapshotCallback(
149 const base::Callback<void(const std::unique_ptr<AXViewStructure>)>&
xiyuan 2017/04/03 21:32:11 "const std::unique_ptr<>" means the callback canno
Muyuan 2017/04/03 23:00:33 Done.
150 callback,
151 const ui::AXTreeUpdate& ax_tree_update) {
152 auto manager = std::unique_ptr<content::BrowserAccessibilityManager>(
153 content::BrowserAccessibilityManager::Create(ax_tree_update, nullptr));
154 auto structure =
xiyuan 2017/04/03 21:32:11 nit: get rid of |structure| and inline the call
Muyuan 2017/04/03 23:00:33 Done.
155 WalkAXTreeDepthFirst(manager->GetRoot(), gfx::Rect(), ax_tree_update);
156 callback.Run(std::move(structure));
157 }
158
159 } // namespace
160
161 AXViewStructure::AXViewStructure() {}
162
163 AXViewStructure::~AXViewStructure() {}
164
165 void GetAXViewStructure(
166 WebContents* web_contents,
167 const base::Callback<void(const std::unique_ptr<AXViewStructure>)>&
168 callback) {
169 WebContentsImpl* web_contents_impl =
170 static_cast<WebContentsImpl*>(web_contents);
171 web_contents_impl->RequestAXTreeSnapshot(
172 base::Bind(&AXSnapshotCallback, callback));
173 }
174
175 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698