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

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 trybot error 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 "base/callback.h"
xiyuan 2017/04/03 19:01:08 remove since it is already included in header ?
Muyuan 2017/04/03 20:25:35 Done.
8 #include "base/logging.h"
xiyuan 2017/04/03 19:01:08 not used?
Muyuan 2017/04/03 20:25:35 Done.
9 #include "content/browser/accessibility/browser_accessibility_manager.h"
xiyuan 2017/04/03 19:01:08 Should this be browser_accessibility.h instead? I
Muyuan 2017/04/03 20:25:35 Done.
10 #include "content/browser/web_contents/web_contents_impl.h"
11 #include "content/public/browser/web_contents.h"
12 #include "ui/accessibility/platform/ax_android_constants.h"
13
14 namespace content {
15
16 namespace {
17
18 std::string GetClassName(BrowserAccessibility* node) {
19 const char* class_name = NULL;
xiyuan 2017/04/03 19:01:08 nit: NULL -> nullptr
Muyuan 2017/04/03 20:25:35 Done.
20
21 switch (node->GetRole()) {
22 case ui::AX_ROLE_SEARCH_BOX:
23 case ui::AX_ROLE_SPIN_BUTTON:
24 case ui::AX_ROLE_TEXT_FIELD:
25 class_name = ui::kAXEditTextClassname;
26 break;
27 case ui::AX_ROLE_SLIDER:
28 class_name = ui::kAXSeekBarClassname;
29 break;
30 case ui::AX_ROLE_COLOR_WELL:
31 case ui::AX_ROLE_COMBO_BOX:
32 case ui::AX_ROLE_DATE:
33 case ui::AX_ROLE_POP_UP_BUTTON:
34 case ui::AX_ROLE_INPUT_TIME:
35 class_name = ui::kAXSpinnerClassname;
36 break;
37 case ui::AX_ROLE_BUTTON:
38 case ui::AX_ROLE_MENU_BUTTON:
39 class_name = ui::kAXButtonClassname;
40 break;
41 case ui::AX_ROLE_CHECK_BOX:
42 case ui::AX_ROLE_SWITCH:
43 class_name = ui::kAXCheckBoxClassname;
44 break;
45 case ui::AX_ROLE_RADIO_BUTTON:
46 class_name = ui::kAXRadioButtonClassname;
47 break;
48 case ui::AX_ROLE_TOGGLE_BUTTON:
49 class_name = ui::kAXToggleButtonClassname;
50 break;
51 case ui::AX_ROLE_CANVAS:
52 case ui::AX_ROLE_IMAGE:
53 case ui::AX_ROLE_SVG_ROOT:
54 class_name = ui::kAXImageClassname;
55 break;
56 case ui::AX_ROLE_METER:
57 case ui::AX_ROLE_PROGRESS_INDICATOR:
58 class_name = ui::kAXProgressBarClassname;
59 break;
60 case ui::AX_ROLE_TAB_LIST:
61 class_name = ui::kAXTabWidgetClassname;
62 break;
63 case ui::AX_ROLE_GRID:
64 case ui::AX_ROLE_TABLE:
65 class_name = ui::kAXGridViewClassname;
66 break;
67 case ui::AX_ROLE_LIST:
68 case ui::AX_ROLE_LIST_BOX:
69 case ui::AX_ROLE_DESCRIPTION_LIST:
70 class_name = ui::kAXListViewClassname;
71 break;
72 case ui::AX_ROLE_DIALOG:
73 class_name = ui::kAXDialogClassname;
74 break;
75 case ui::AX_ROLE_ROOT_WEB_AREA:
76 if (node->PlatformGetParent() == nullptr) {
77 class_name = ui::kAXWebViewClassname;
78 } else {
79 class_name = ui::kAXViewClassname;
80 }
81 break;
82 case ui::AX_ROLE_MENU_ITEM:
83 case ui::AX_ROLE_MENU_ITEM_CHECK_BOX:
84 case ui::AX_ROLE_MENU_ITEM_RADIO:
85 class_name = ui::kAXMenuItemClassname;
86 break;
87 default:
88 class_name = ui::kAXViewClassname;
89 break;
90 }
91
92 return std::string(class_name);
93 }
94
95 // TODO(muyuanli): refactor code in web_contents_android
96 // to use this function as well.
97 std::unique_ptr<AXViewStructure> WalkAXTreeDepthFirst(
98 BrowserAccessibility* node,
99 gfx::Rect rect,
100 const ui::AXTreeUpdate& update) {
101 auto result = base::MakeUnique<AXViewStructure>();
102 result->text = node->GetText();
103 result->class_name = GetClassName(node);
104
105 int text_style = node->GetIntAttribute(ui::AX_ATTR_TEXT_STYLE);
xiyuan 2017/04/03 19:01:08 nit: const int
Muyuan 2017/04/03 20:25:35 Done.
106 result->bold = (text_style & ui::AX_TEXT_STYLE_BOLD) != 0;
107 result->italic = (text_style & ui::AX_TEXT_STYLE_ITALIC) != 0;
108 result->line_through = (text_style & ui::AX_TEXT_STYLE_LINE_THROUGH) != 0;
109 result->underline = (text_style & ui::AX_TEXT_STYLE_ITALIC) != 0;
110
111 result->text_size = node->GetFloatAttribute(ui::AX_ATTR_FONT_SIZE);
112 result->bgcolor = node->GetIntAttribute(ui::AX_ATTR_BACKGROUND_COLOR);
113
114 const gfx::Rect& absolute_rect = node->GetPageBoundsRect();
115 gfx::Rect parent_relative_rect = absolute_rect;
116 bool is_root = node->GetParent() == nullptr;
117 if (!is_root) {
118 parent_relative_rect.Offset(-rect.OffsetFromOrigin());
119 }
120 result->rect = gfx::Rect(parent_relative_rect.x(), parent_relative_rect.y(),
121 absolute_rect.width(), absolute_rect.height());
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 }
xiyuan 2017/04/03 19:01:08 Should we fill in |has_selection| etc member in an
Muyuan 2017/04/03 20:25:35 Done.
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 AXViewStructure*)>& callback,
150 const ui::AXTreeUpdate& ax_tree_update) {
151 auto manager = std::unique_ptr<content::BrowserAccessibilityManager>(
152 content::BrowserAccessibilityManager::Create(ax_tree_update, nullptr));
153 auto structure =
154 WalkAXTreeDepthFirst(manager->GetRoot(), gfx::Rect(), ax_tree_update);
155 callback.Run(structure.get());
156 }
157
158 } // namespace
159
160 AXViewStructure::AXViewStructure() {}
161
162 AXViewStructure::~AXViewStructure() {}
163
164 void GetAXViewStructure(
165 WebContents* web_contents,
166 const base::Callback<void(const AXViewStructure*)>& callback) {
167 WebContentsImpl* web_contents_impl =
168 static_cast<WebContentsImpl*>(web_contents);
169 web_contents_impl->RequestAXTreeSnapshot(
170 base::Bind(&AXSnapshotCallback, callback));
171 }
172
173 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698