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

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

Issue 2903583006: Collect metrics on running Accessibility services on Android (Closed)
Patch Set: Rebase Created 3 years, 6 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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_android.h" 5 #include "content/browser/accessibility/browser_accessibility_manager_android.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <cmath> 9 #include <cmath>
10 10
11 #include "base/android/jni_android.h" 11 #include "base/android/jni_android.h"
12 #include "base/android/jni_string.h" 12 #include "base/android/jni_string.h"
13 #include "base/feature_list.h" 13 #include "base/feature_list.h"
14 #include "base/i18n/char_iterator.h" 14 #include "base/i18n/char_iterator.h"
15 #include "base/macros.h"
16 #include "base/metrics/histogram_macros.h"
15 #include "base/strings/string_number_conversions.h" 17 #include "base/strings/string_number_conversions.h"
16 #include "base/strings/utf_string_conversions.h" 18 #include "base/strings/utf_string_conversions.h"
17 #include "base/values.h" 19 #include "base/values.h"
18 #include "content/app/strings/grit/content_strings.h" 20 #include "content/app/strings/grit/content_strings.h"
19 #include "content/browser/accessibility/browser_accessibility_android.h" 21 #include "content/browser/accessibility/browser_accessibility_android.h"
20 #include "content/browser/accessibility/one_shot_accessibility_tree_search.h" 22 #include "content/browser/accessibility/one_shot_accessibility_tree_search.h"
21 #include "content/common/accessibility_messages.h" 23 #include "content/common/accessibility_messages.h"
22 #include "content/public/common/content_features.h" 24 #include "content/public/common/content_features.h"
23 #include "jni/BrowserAccessibilityManager_jni.h" 25 #include "jni/BrowserAccessibilityManager_jni.h"
24 #include "ui/accessibility/ax_text_utils.h" 26 #include "ui/accessibility/ax_text_utils.h"
25 27
26 using base::android::AttachCurrentThread; 28 using base::android::AttachCurrentThread;
27 using base::android::JavaParamRef; 29 using base::android::JavaParamRef;
28 using base::android::ScopedJavaLocalRef; 30 using base::android::ScopedJavaLocalRef;
29 31
30 namespace content { 32 namespace content {
31 33
32 namespace { 34 namespace {
33 35
36 // IMPORTANT!
37 // These values are written to logs. Do not renumber or delete
38 // existing items; add new entries to the end of the list.
39 //
40 // Note: The string names for these enums must correspond with the names of
41 // constants from AccessibilityEvent and AccessibilityServiceInfo, defined
42 // below. For example, UMA_EVENT_ANNOUNCEMENT corresponds to
43 // ACCESSIBILITYEVENT_TYPE_ANNOUNCEMENT via the macro
44 // EVENT_TYPE_HISTOGRAM(event_type_mask, ANNOUNCEMENT).
45 enum {
46 UMA_CAPABILITY_CAN_CONTROL_MAGNIFICATION = 0,
47 UMA_CAPABILITY_CAN_PERFORM_GESTURES = 1,
48 UMA_CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 2,
49 UMA_CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS = 3,
50 UMA_CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 4,
51 UMA_CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 5,
52 UMA_EVENT_ANNOUNCEMENT = 6,
53 UMA_EVENT_ASSIST_READING_CONTEXT = 7,
54 UMA_EVENT_GESTURE_DETECTION_END = 8,
55 UMA_EVENT_GESTURE_DETECTION_START = 9,
56 UMA_EVENT_NOTIFICATION_STATE_CHANGED = 10,
57 UMA_EVENT_TOUCH_EXPLORATION_GESTURE_END = 11,
58 UMA_EVENT_TOUCH_EXPLORATION_GESTURE_START = 12,
59 UMA_EVENT_TOUCH_INTERACTION_END = 13,
60 UMA_EVENT_TOUCH_INTERACTION_START = 14,
61 UMA_EVENT_VIEW_ACCESSIBILITY_FOCUSED = 15,
62 UMA_EVENT_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 16,
63 UMA_EVENT_VIEW_CLICKED = 17,
64 UMA_EVENT_VIEW_CONTEXT_CLICKED = 18,
65 UMA_EVENT_VIEW_FOCUSED = 19,
66 UMA_EVENT_VIEW_HOVER_ENTER = 20,
67 UMA_EVENT_VIEW_HOVER_EXIT = 21,
68 UMA_EVENT_VIEW_LONG_CLICKED = 22,
69 UMA_EVENT_VIEW_SCROLLED = 23,
70 UMA_EVENT_VIEW_SELECTED = 24,
71 UMA_EVENT_VIEW_TEXT_CHANGED = 25,
72 UMA_EVENT_VIEW_TEXT_SELECTION_CHANGED = 26,
73 UMA_EVENT_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 27,
74 UMA_EVENT_WINDOWS_CHANGED = 28,
75 UMA_EVENT_WINDOW_CONTENT_CHANGED = 29,
76 UMA_EVENT_WINDOW_STATE_CHANGED = 30,
77 UMA_FEEDBACK_AUDIBLE = 31,
78 UMA_FEEDBACK_BRAILLE = 32,
79 UMA_FEEDBACK_GENERIC = 33,
80 UMA_FEEDBACK_HAPTIC = 34,
81 UMA_FEEDBACK_SPOKEN = 35,
82 UMA_FEEDBACK_VISUAL = 36,
83 UMA_FLAG_FORCE_DIRECT_BOOT_AWARE = 37,
84 UMA_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 38,
85 UMA_FLAG_REPORT_VIEW_IDS = 39,
86 UMA_FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 40,
87 UMA_FLAG_REQUEST_FILTER_KEY_EVENTS = 41,
88 UMA_FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 42,
89 UMA_FLAG_RETRIEVE_INTERACTIVE_WINDOWS = 43,
90
91 // This must always be the last enum. It's okay for its value to
92 // increase, but none of the other enum values may change.
93 UMA_ACCESSIBILITYSERVICEINFO_MAX
94 };
95
96 // These are constants from
97 // android.view.accessibility.AccessibilityEvent in Java.
98 //
99 // If you add a new constant, add a new UMA enum above and add a line
100 // to CollectStats(), below.
101 enum {
102 ACCESSIBILITYEVENT_TYPE_VIEW_CLICKED = 0x00000001,
103 ACCESSIBILITYEVENT_TYPE_VIEW_LONG_CLICKED = 0x00000002,
104 ACCESSIBILITYEVENT_TYPE_VIEW_SELECTED = 0x00000004,
105 ACCESSIBILITYEVENT_TYPE_VIEW_FOCUSED = 0x00000008,
106 ACCESSIBILITYEVENT_TYPE_VIEW_TEXT_CHANGED = 0x00000010,
107 ACCESSIBILITYEVENT_TYPE_WINDOW_STATE_CHANGED = 0x00000020,
108 ACCESSIBILITYEVENT_TYPE_NOTIFICATION_STATE_CHANGED = 0x00000040,
109 ACCESSIBILITYEVENT_TYPE_VIEW_HOVER_ENTER = 0x00000080,
110 ACCESSIBILITYEVENT_TYPE_VIEW_HOVER_EXIT = 0x00000100,
111 ACCESSIBILITYEVENT_TYPE_TOUCH_EXPLORATION_GESTURE_START = 0x00000200,
112 ACCESSIBILITYEVENT_TYPE_TOUCH_EXPLORATION_GESTURE_END = 0x00000400,
113 ACCESSIBILITYEVENT_TYPE_WINDOW_CONTENT_CHANGED = 0x00000800,
114 ACCESSIBILITYEVENT_TYPE_VIEW_SCROLLED = 0x00001000,
115 ACCESSIBILITYEVENT_TYPE_VIEW_TEXT_SELECTION_CHANGED = 0x00002000,
116 ACCESSIBILITYEVENT_TYPE_ANNOUNCEMENT = 0x00004000,
117 ACCESSIBILITYEVENT_TYPE_VIEW_ACCESSIBILITY_FOCUSED = 0x00008000,
118 ACCESSIBILITYEVENT_TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 0x00010000,
119 ACCESSIBILITYEVENT_TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY =
120 0x00020000,
121 ACCESSIBILITYEVENT_TYPE_GESTURE_DETECTION_START = 0x00040000,
122 ACCESSIBILITYEVENT_TYPE_GESTURE_DETECTION_END = 0x00080000,
123 ACCESSIBILITYEVENT_TYPE_TOUCH_INTERACTION_START = 0x00100000,
124 ACCESSIBILITYEVENT_TYPE_TOUCH_INTERACTION_END = 0x00200000,
125 ACCESSIBILITYEVENT_TYPE_WINDOWS_CHANGED = 0x00400000,
126 ACCESSIBILITYEVENT_TYPE_VIEW_CONTEXT_CLICKED = 0x00800000,
127 ACCESSIBILITYEVENT_TYPE_ASSIST_READING_CONTEXT = 0x01000000,
128 };
129
130 // These are constants from
131 // android.accessibilityservice.AccessibilityServiceInfo in Java:
132 //
133 // If you add a new constant, add a new UMA enum above and add a line
134 // to CollectStats(), below.
135 enum {
136 ACCESSIBILITYSERVICEINFO_CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 0x00000001,
137 ACCESSIBILITYSERVICEINFO_CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION =
138 0x00000002,
139 ACCESSIBILITYSERVICEINFO_CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY =
140 0x00000004,
141 ACCESSIBILITYSERVICEINFO_CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS =
142 0x00000008,
143 ACCESSIBILITYSERVICEINFO_CAPABILITY_CAN_CONTROL_MAGNIFICATION = 0x00000010,
144 ACCESSIBILITYSERVICEINFO_CAPABILITY_CAN_PERFORM_GESTURES = 0x00000020,
145 ACCESSIBILITYSERVICEINFO_FEEDBACK_SPOKEN = 0x0000001,
146 ACCESSIBILITYSERVICEINFO_FEEDBACK_HAPTIC = 0x0000002,
147 ACCESSIBILITYSERVICEINFO_FEEDBACK_AUDIBLE = 0x0000004,
148 ACCESSIBILITYSERVICEINFO_FEEDBACK_VISUAL = 0x0000008,
149 ACCESSIBILITYSERVICEINFO_FEEDBACK_GENERIC = 0x0000010,
150 ACCESSIBILITYSERVICEINFO_FEEDBACK_BRAILLE = 0x0000020,
151 ACCESSIBILITYSERVICEINFO_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 0x0000002,
152 ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 0x0000004,
153 ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 0x00000008,
154 ACCESSIBILITYSERVICEINFO_FLAG_REPORT_VIEW_IDS = 0x00000010,
155 ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_FILTER_KEY_EVENTS = 0x00000020,
156 ACCESSIBILITYSERVICEINFO_FLAG_RETRIEVE_INTERACTIVE_WINDOWS = 0x00000040,
157 ACCESSIBILITYSERVICEINFO_FLAG_FORCE_DIRECT_BOOT_AWARE = 0x00010000,
158 };
159
160 // These macros simplify recording a histogram based on information we get
161 // from an AccessibilityService. There are four bitmasks of information
162 // we get from each AccessibilityService, and for each possible bit mask
163 // corresponding to one flag, we want to check if that flag is set, and if
164 // so, record the corresponding histogram.
165 //
166 // Doing this with macros reduces the chance for human error by
167 // recording the wrong histogram for the wrong flag.
168 //
169 // These macros are used by CollectStats(), below.
170 #define EVENT_TYPE_HISTOGRAM(event_type_mask, event_type) \
171 if (event_type_mask & ACCESSIBILITYEVENT_TYPE_##event_type) \
172 UMA_HISTOGRAM_ENUMERATION("Accessibility.AndroidServiceInfo", \
173 UMA_EVENT_##event_type, \
174 UMA_ACCESSIBILITYSERVICEINFO_MAX)
175 #define FLAGS_HISTOGRAM(flags_mask, flag) \
176 if (flags_mask & ACCESSIBILITYSERVICEINFO_FLAG_##flag) \
177 UMA_HISTOGRAM_ENUMERATION("Accessibility.AndroidServiceInfo", \
178 UMA_FLAG_##flag, UMA_ACCESSIBILITYSERVICEINFO_MAX)
179 #define FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, feedback_type) \
180 if (feedback_type_mask & ACCESSIBILITYSERVICEINFO_FEEDBACK_##feedback_type) \
181 UMA_HISTOGRAM_ENUMERATION("Accessibility.AndroidServiceInfo", \
182 UMA_FEEDBACK_##feedback_type, \
183 UMA_ACCESSIBILITYSERVICEINFO_MAX)
184 #define CAPABILITY_TYPE_HISTOGRAM(capability_type_mask, capability_type) \
185 if (capability_type_mask & \
186 ACCESSIBILITYSERVICEINFO_CAPABILITY_##capability_type) \
187 UMA_HISTOGRAM_ENUMERATION("Accessibility.AndroidServiceInfo", \
188 UMA_CAPABILITY_##capability_type, \
189 UMA_ACCESSIBILITYSERVICEINFO_MAX)
190
34 using SearchKeyToPredicateMap = 191 using SearchKeyToPredicateMap =
35 base::hash_map<base::string16, AccessibilityMatchPredicate>; 192 base::hash_map<base::string16, AccessibilityMatchPredicate>;
36 base::LazyInstance<SearchKeyToPredicateMap>::DestructorAtExit 193 base::LazyInstance<SearchKeyToPredicateMap>::DestructorAtExit
37 g_search_key_to_predicate_map = LAZY_INSTANCE_INITIALIZER; 194 g_search_key_to_predicate_map = LAZY_INSTANCE_INITIALIZER;
38 base::LazyInstance<base::string16>::DestructorAtExit g_all_search_keys = 195 base::LazyInstance<base::string16>::DestructorAtExit g_all_search_keys =
39 LAZY_INSTANCE_INITIALIZER; 196 LAZY_INSTANCE_INITIALIZER;
40 197
41 bool SectionPredicate( 198 bool SectionPredicate(
42 BrowserAccessibility* start, BrowserAccessibility* node) { 199 BrowserAccessibility* start, BrowserAccessibility* node) {
43 switch (node->GetRole()) { 200 switch (node->GetRole()) {
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 320
164 BrowserAccessibilityManagerAndroid::BrowserAccessibilityManagerAndroid( 321 BrowserAccessibilityManagerAndroid::BrowserAccessibilityManagerAndroid(
165 ScopedJavaLocalRef<jobject> content_view_core, 322 ScopedJavaLocalRef<jobject> content_view_core,
166 const ui::AXTreeUpdate& initial_tree, 323 const ui::AXTreeUpdate& initial_tree,
167 BrowserAccessibilityDelegate* delegate, 324 BrowserAccessibilityDelegate* delegate,
168 BrowserAccessibilityFactory* factory) 325 BrowserAccessibilityFactory* factory)
169 : BrowserAccessibilityManager(delegate, factory), 326 : BrowserAccessibilityManager(delegate, factory),
170 prune_tree_for_screen_reader_(true) { 327 prune_tree_for_screen_reader_(true) {
171 Initialize(initial_tree); 328 Initialize(initial_tree);
172 SetContentViewCore(content_view_core); 329 SetContentViewCore(content_view_core);
330
331 // TODO(dmazzoni): get rid of the use of this class by
332 // AXTreeSnapshotCallback so that content_view_core is always valid.
333 if (!content_view_core.is_null())
334 CollectStats();
173 } 335 }
174 336
175 BrowserAccessibilityManagerAndroid::~BrowserAccessibilityManagerAndroid() { 337 BrowserAccessibilityManagerAndroid::~BrowserAccessibilityManagerAndroid() {
176 JNIEnv* env = AttachCurrentThread(); 338 JNIEnv* env = AttachCurrentThread();
177 ScopedJavaLocalRef<jobject> obj = GetJavaRefFromRootManager(); 339 ScopedJavaLocalRef<jobject> obj = GetJavaRefFromRootManager();
178 if (obj.is_null()) 340 if (obj.is_null())
179 return; 341 return;
180 342
181 // Clean up autofill popup proxy node in case the popup was not dismissed. 343 // Clean up autofill popup proxy node in case the popup was not dismissed.
182 DeleteAutofillPopupProxy(); 344 DeleteAutofillPopupProxy();
(...skipping 917 matching lines...) Expand 10 before | Expand all | Expand 10 after
1100 BrowserAccessibilityManagerAndroid* root_manager = 1262 BrowserAccessibilityManagerAndroid* root_manager =
1101 static_cast<BrowserAccessibilityManagerAndroid*>( 1263 static_cast<BrowserAccessibilityManagerAndroid*>(
1102 GetRootManager()); 1264 GetRootManager());
1103 if (!root_manager) 1265 if (!root_manager)
1104 return ScopedJavaLocalRef<jobject>(); 1266 return ScopedJavaLocalRef<jobject>();
1105 1267
1106 JNIEnv* env = AttachCurrentThread(); 1268 JNIEnv* env = AttachCurrentThread();
1107 return root_manager->java_ref().get(env); 1269 return root_manager->java_ref().get(env);
1108 } 1270 }
1109 1271
1272 void BrowserAccessibilityManagerAndroid::CollectStats() {
1273 JNIEnv* env = AttachCurrentThread();
1274 ScopedJavaLocalRef<jobject> obj = GetJavaRefFromRootManager();
1275 if (obj.is_null())
1276 return;
1277
1278 int event_type_mask =
1279 Java_BrowserAccessibilityManager_getAccessibilityServiceEventTypeMask(
1280 env, obj);
1281 EVENT_TYPE_HISTOGRAM(event_type_mask, ANNOUNCEMENT);
1282 EVENT_TYPE_HISTOGRAM(event_type_mask, ASSIST_READING_CONTEXT);
1283 EVENT_TYPE_HISTOGRAM(event_type_mask, GESTURE_DETECTION_END);
1284 EVENT_TYPE_HISTOGRAM(event_type_mask, GESTURE_DETECTION_START);
1285 EVENT_TYPE_HISTOGRAM(event_type_mask, NOTIFICATION_STATE_CHANGED);
1286 EVENT_TYPE_HISTOGRAM(event_type_mask, TOUCH_EXPLORATION_GESTURE_END);
1287 EVENT_TYPE_HISTOGRAM(event_type_mask, TOUCH_EXPLORATION_GESTURE_START);
1288 EVENT_TYPE_HISTOGRAM(event_type_mask, TOUCH_INTERACTION_END);
1289 EVENT_TYPE_HISTOGRAM(event_type_mask, TOUCH_INTERACTION_START);
1290 EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_ACCESSIBILITY_FOCUSED);
1291 EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_ACCESSIBILITY_FOCUS_CLEARED);
1292 EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_CLICKED);
1293 EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_CONTEXT_CLICKED);
1294 EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_FOCUSED);
1295 EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_HOVER_ENTER);
1296 EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_HOVER_EXIT);
1297 EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_LONG_CLICKED);
1298 EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_SCROLLED);
1299 EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_SELECTED);
1300 EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_TEXT_CHANGED);
1301 EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_TEXT_SELECTION_CHANGED);
1302 EVENT_TYPE_HISTOGRAM(event_type_mask,
1303 VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY);
1304 EVENT_TYPE_HISTOGRAM(event_type_mask, WINDOWS_CHANGED);
1305 EVENT_TYPE_HISTOGRAM(event_type_mask, WINDOW_CONTENT_CHANGED);
1306 EVENT_TYPE_HISTOGRAM(event_type_mask, WINDOW_STATE_CHANGED);
1307
1308 int feedback_type_mask =
1309 Java_BrowserAccessibilityManager_getAccessibilityServiceFeedbackTypeMask(
1310 env, obj);
1311 FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, SPOKEN);
1312 FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, HAPTIC);
1313 FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, AUDIBLE);
1314 FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, VISUAL);
1315 FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, GENERIC);
1316 FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, BRAILLE);
1317
1318 int flags_mask =
1319 Java_BrowserAccessibilityManager_getAccessibilityServiceFlagsMask(env,
1320 obj);
1321 FLAGS_HISTOGRAM(flags_mask, INCLUDE_NOT_IMPORTANT_VIEWS);
1322 FLAGS_HISTOGRAM(flags_mask, REQUEST_TOUCH_EXPLORATION_MODE);
1323 FLAGS_HISTOGRAM(flags_mask, REQUEST_ENHANCED_WEB_ACCESSIBILITY);
1324 FLAGS_HISTOGRAM(flags_mask, REPORT_VIEW_IDS);
1325 FLAGS_HISTOGRAM(flags_mask, REQUEST_FILTER_KEY_EVENTS);
1326 FLAGS_HISTOGRAM(flags_mask, RETRIEVE_INTERACTIVE_WINDOWS);
1327 FLAGS_HISTOGRAM(flags_mask, FORCE_DIRECT_BOOT_AWARE);
1328
1329 int capabilities_mask =
1330 Java_BrowserAccessibilityManager_getAccessibilityServiceCapabilitiesMask(
1331 env, obj);
1332 CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_RETRIEVE_WINDOW_CONTENT);
1333 CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_REQUEST_TOUCH_EXPLORATION);
1334 CAPABILITY_TYPE_HISTOGRAM(capabilities_mask,
1335 CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY);
1336 CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_REQUEST_FILTER_KEY_EVENTS);
1337 CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_CONTROL_MAGNIFICATION);
1338 CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_PERFORM_GESTURES);
1339 }
1340
1110 bool RegisterBrowserAccessibilityManager(JNIEnv* env) { 1341 bool RegisterBrowserAccessibilityManager(JNIEnv* env) {
1111 return RegisterNativesImpl(env); 1342 return RegisterNativesImpl(env);
1112 } 1343 }
1113 1344
1114 } // namespace content 1345 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698