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

Side by Side Diff: chrome/browser/ui/views/accessibility_event_router_views.cc

Issue 8850004: Add a context field to the accessibility extension API. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 9 years 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/ui/views/accessibility_event_router_views.h" 5 #include "chrome/browser/ui/views/accessibility_event_router_views.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "base/utf_string_conversions.h" 10 #include "base/utf_string_conversions.h"
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 // caught so we can add accessibility extension API support. 168 // caught so we can add accessibility extension API support.
169 NOTREACHED(); 169 NOTREACHED();
170 } 170 }
171 } 171 }
172 172
173 void AccessibilityEventRouterViews::SendButtonNotification( 173 void AccessibilityEventRouterViews::SendButtonNotification(
174 views::View* view, 174 views::View* view,
175 int type, 175 int type,
176 Profile* profile) { 176 Profile* profile) {
177 AccessibilityButtonInfo info(profile, GetViewName(view)); 177 AccessibilityButtonInfo info(profile, GetViewName(view));
178 AddContextInfo(view, &info);
178 SendAccessibilityNotification(type, &info); 179 SendAccessibilityNotification(type, &info);
179 } 180 }
180 181
181 void AccessibilityEventRouterViews::SendLinkNotification( 182 void AccessibilityEventRouterViews::SendLinkNotification(
182 views::View* view, 183 views::View* view,
183 int type, 184 int type,
184 Profile* profile) { 185 Profile* profile) {
185 AccessibilityLinkInfo info(profile, GetViewName(view)); 186 AccessibilityLinkInfo info(profile, GetViewName(view));
187 AddContextInfo(view, &info);
186 SendAccessibilityNotification(type, &info); 188 SendAccessibilityNotification(type, &info);
187 } 189 }
188 190
189 void AccessibilityEventRouterViews::SendMenuNotification( 191 void AccessibilityEventRouterViews::SendMenuNotification(
190 views::View* view, 192 views::View* view,
191 int type, 193 int type,
192 Profile* profile) { 194 Profile* profile) {
193 AccessibilityMenuInfo info(profile, GetViewName(view)); 195 AccessibilityMenuInfo info(profile, GetViewName(view));
196 AddContextInfo(view, &info);
194 SendAccessibilityNotification(type, &info); 197 SendAccessibilityNotification(type, &info);
195 } 198 }
196 199
197 void AccessibilityEventRouterViews::SendMenuItemNotification( 200 void AccessibilityEventRouterViews::SendMenuItemNotification(
198 views::View* view, 201 views::View* view,
199 int type, 202 int type,
200 Profile* profile) { 203 Profile* profile) {
201 std::string name = GetViewName(view); 204 std::string name = GetViewName(view);
202 205
203 bool has_submenu = false; 206 bool has_submenu = false;
204 int index = -1; 207 int index = -1;
205 int count = -1; 208 int count = -1;
206 209
207 if (view->GetClassName() == views::MenuItemView::kViewClassName) 210 if (view->GetClassName() == views::MenuItemView::kViewClassName)
208 has_submenu = static_cast<views::MenuItemView*>(view)->HasSubmenu(); 211 has_submenu = static_cast<views::MenuItemView*>(view)->HasSubmenu();
209 212
210 views::View* parent_menu = view->parent(); 213 views::View* parent_menu = view->parent();
211 while (parent_menu != NULL && parent_menu->GetClassName() != 214 while (parent_menu != NULL && parent_menu->GetClassName() !=
212 views::SubmenuView::kViewClassName) { 215 views::SubmenuView::kViewClassName) {
213 parent_menu = parent_menu->parent(); 216 parent_menu = parent_menu->parent();
214 } 217 }
215 if (parent_menu) { 218 if (parent_menu) {
216 count = 0; 219 count = 0;
217 RecursiveGetMenuItemIndexAndCount(parent_menu, view, &index, &count); 220 RecursiveGetMenuItemIndexAndCount(parent_menu, view, &index, &count);
218 } 221 }
219 222
220 AccessibilityMenuItemInfo info(profile, name, has_submenu, index, count); 223 AccessibilityMenuItemInfo info(profile, name, has_submenu, index, count);
224 AddContextInfo(view, &info);
221 SendAccessibilityNotification(type, &info); 225 SendAccessibilityNotification(type, &info);
222 } 226 }
223 227
224 void AccessibilityEventRouterViews::SendTextfieldNotification( 228 void AccessibilityEventRouterViews::SendTextfieldNotification(
225 views::View* view, 229 views::View* view,
226 int type, 230 int type,
227 Profile* profile) { 231 Profile* profile) {
228 ui::AccessibleViewState state; 232 ui::AccessibleViewState state;
229 view->GetAccessibleState(&state); 233 view->GetAccessibleState(&state);
230 std::string name = UTF16ToUTF8(state.name); 234 std::string name = UTF16ToUTF8(state.name);
231 bool password = 235 bool password =
232 (state.state & ui::AccessibilityTypes::STATE_PROTECTED) != 0; 236 (state.state & ui::AccessibilityTypes::STATE_PROTECTED) != 0;
233 AccessibilityTextBoxInfo info(profile, name, password); 237 AccessibilityTextBoxInfo info(profile, name, password);
234 std::string value = UTF16ToUTF8(state.value); 238 std::string value = UTF16ToUTF8(state.value);
235 info.SetValue(value, state.selection_start, state.selection_end); 239 info.SetValue(value, state.selection_start, state.selection_end);
240 AddContextInfo(view, &info);
236 SendAccessibilityNotification(type, &info); 241 SendAccessibilityNotification(type, &info);
237 } 242 }
238 243
239 void AccessibilityEventRouterViews::SendComboboxNotification( 244 void AccessibilityEventRouterViews::SendComboboxNotification(
240 views::View* view, 245 views::View* view,
241 int type, 246 int type,
242 Profile* profile) { 247 Profile* profile) {
243 ui::AccessibleViewState state; 248 ui::AccessibleViewState state;
244 view->GetAccessibleState(&state); 249 view->GetAccessibleState(&state);
245 std::string name = UTF16ToUTF8(state.name); 250 std::string name = UTF16ToUTF8(state.name);
246 std::string value = UTF16ToUTF8(state.value); 251 std::string value = UTF16ToUTF8(state.value);
247 AccessibilityComboBoxInfo info( 252 AccessibilityComboBoxInfo info(
248 profile, name, value, state.index, state.count); 253 profile, name, value, state.index, state.count);
254 AddContextInfo(view, &info);
249 SendAccessibilityNotification(type, &info); 255 SendAccessibilityNotification(type, &info);
250 } 256 }
251 257
252 void AccessibilityEventRouterViews::SendCheckboxNotification( 258 void AccessibilityEventRouterViews::SendCheckboxNotification(
253 views::View* view, 259 views::View* view,
254 int type, 260 int type,
255 Profile* profile) { 261 Profile* profile) {
256 ui::AccessibleViewState state; 262 ui::AccessibleViewState state;
257 view->GetAccessibleState(&state); 263 view->GetAccessibleState(&state);
258 std::string name = UTF16ToUTF8(state.name); 264 std::string name = UTF16ToUTF8(state.name);
259 std::string value = UTF16ToUTF8(state.value); 265 std::string value = UTF16ToUTF8(state.value);
260 AccessibilityCheckboxInfo info( 266 AccessibilityCheckboxInfo info(
261 profile, name, state.state == ui::AccessibilityTypes::STATE_CHECKED); 267 profile, name, state.state == ui::AccessibilityTypes::STATE_CHECKED);
268 AddContextInfo(view, &info);
262 SendAccessibilityNotification(type, &info); 269 SendAccessibilityNotification(type, &info);
263 } 270 }
264 271
265 void AccessibilityEventRouterViews::SendWindowNotification( 272 void AccessibilityEventRouterViews::SendWindowNotification(
266 views::View* view, 273 views::View* view,
267 int type, 274 int type,
268 Profile* profile) { 275 Profile* profile) {
269 ui::AccessibleViewState state; 276 ui::AccessibleViewState state;
270 view->GetAccessibleState(&state); 277 view->GetAccessibleState(&state);
271 std::string window_text; 278 std::string window_text;
(...skipping 10 matching lines...) Expand all
282 AccessibilityWindowInfo info(profile, window_text); 289 AccessibilityWindowInfo info(profile, window_text);
283 SendAccessibilityNotification(type, &info); 290 SendAccessibilityNotification(type, &info);
284 } 291 }
285 292
286 std::string AccessibilityEventRouterViews::GetViewName(views::View* view) { 293 std::string AccessibilityEventRouterViews::GetViewName(views::View* view) {
287 ui::AccessibleViewState state; 294 ui::AccessibleViewState state;
288 view->GetAccessibleState(&state); 295 view->GetAccessibleState(&state);
289 return UTF16ToUTF8(state.name); 296 return UTF16ToUTF8(state.name);
290 } 297 }
291 298
299 void AccessibilityEventRouterViews::AddContextInfo(
sky 2011/12/07 22:01:55 Order should match header.
dmazzoni 2011/12/07 23:13:49 Done.
300 views::View* view, AccessibilityControlInfo* info) {
301 for (views::View* parent = view->parent();
302 parent;
303 parent = parent->parent()) {
304 ui::AccessibleViewState state;
305 parent->GetAccessibleState(&state);
306
307 // Two cases are handled right now. More could be added in the future
308 // depending on how the UI evolves.
309
310 // A control in a toolbar should use the toolbar's accessible name
311 // as the context.
312 if (state.role == ui::AccessibilityTypes::ROLE_TOOLBAR &&
313 !state.name.empty()) {
314 info->set_context(UTF16ToUTF8(state.name));
315 return;
316 }
317
318 // A control inside of an alert (like an infobar) should grab the
319 // first static text descendant as the context; that's the prompt.
320 if (state.role == ui::AccessibilityTypes::ROLE_ALERT) {
321 views::View* static_text_child = FindDescendantWithAccessibleRole(
322 parent, ui::AccessibilityTypes::ROLE_STATICTEXT);
323 if (static_text_child) {
sky 2011/12/07 22:01:55 I don't know this code well enough, so this might
dmazzoni 2011/12/07 23:13:49 That should never happen (multiple ALERTs in the p
324 ui::AccessibleViewState state;
325 static_text_child->GetAccessibleState(&state);
326 if (!state.name.empty()) {
327 info->set_context(UTF16ToUTF8(state.name));
328 return;
329 }
330 }
331 }
332 }
333 }
334
335 views::View* AccessibilityEventRouterViews::FindDescendantWithAccessibleRole(
sky 2011/12/07 22:01:55 Neither of these methods look like they need any s
dmazzoni 2011/12/07 23:13:49 Done - made a few more methods static too.
336 views::View* view, ui::AccessibilityTypes::Role role) {
337 ui::AccessibleViewState state;
338 view->GetAccessibleState(&state);
339 if (state.role == role)
340 return view;
341
342 for (int i = 0; i < view->child_count(); i++) {
343 views::View* child = view->child_at(i);
344 views::View* result = FindDescendantWithAccessibleRole(child, role);
345 if (result)
346 return result;
347 }
348
349 return NULL;
350 }
351
292 bool AccessibilityEventRouterViews::IsMenuEvent( 352 bool AccessibilityEventRouterViews::IsMenuEvent(
293 views::View* view, 353 views::View* view,
294 int type) { 354 int type) {
295 if (type == chrome::NOTIFICATION_ACCESSIBILITY_MENU_OPENED || 355 if (type == chrome::NOTIFICATION_ACCESSIBILITY_MENU_OPENED ||
296 type == chrome::NOTIFICATION_ACCESSIBILITY_MENU_CLOSED) 356 type == chrome::NOTIFICATION_ACCESSIBILITY_MENU_CLOSED)
297 return true; 357 return true;
298 358
299 while (view) { 359 while (view) {
300 ui::AccessibleViewState state; 360 ui::AccessibleViewState state;
301 view->GetAccessibleState(&state); 361 view->GetAccessibleState(&state);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 return UTF16ToUTF8(state.name); 400 return UTF16ToUTF8(state.name);
341 401
342 for (int i = 0; i < view->child_count(); ++i) { 402 for (int i = 0; i < view->child_count(); ++i) {
343 views::View* child = view->child_at(i); 403 views::View* child = view->child_at(i);
344 std::string result = RecursiveGetStaticText(child); 404 std::string result = RecursiveGetStaticText(child);
345 if (!result.empty()) 405 if (!result.empty())
346 return result; 406 return result;
347 } 407 }
348 return std::string(); 408 return std::string();
349 } 409 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698