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

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

Issue 79273002: Fixed accessibility issues in bookmark bubble dialog. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 1 month 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/accessibility_event_router_views .h" 5 #include "chrome/browser/ui/views/accessibility/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/memory/singleton.h" 9 #include "base/memory/singleton.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
11 #include "base/strings/utf_string_conversions.h" 11 #include "base/strings/utf_string_conversions.h"
12 #include "chrome/browser/accessibility/accessibility_extension_api.h" 12 #include "chrome/browser/accessibility/accessibility_extension_api.h"
13 #include "chrome/browser/browser_process.h" 13 #include "chrome/browser/browser_process.h"
14 #include "chrome/browser/chrome_notification_types.h" 14 #include "chrome/browser/chrome_notification_types.h"
15 #include "chrome/browser/profiles/profile.h" 15 #include "chrome/browser/profiles/profile.h"
16 #include "chrome/browser/profiles/profile_manager.h" 16 #include "chrome/browser/profiles/profile_manager.h"
17 #include "content/public/browser/notification_service.h" 17 #include "content/public/browser/notification_service.h"
18 #include "ui/base/accessibility/accessible_view_state.h" 18 #include "ui/base/accessibility/accessible_view_state.h"
19 #include "ui/views/controls/menu/menu_item_view.h" 19 #include "ui/views/controls/menu/menu_item_view.h"
20 #include "ui/views/controls/menu/submenu_view.h" 20 #include "ui/views/controls/menu/submenu_view.h"
21 #include "ui/views/controls/tree/tree_view.h"
21 #include "ui/views/focus/view_storage.h" 22 #include "ui/views/focus/view_storage.h"
22 #include "ui/views/view.h" 23 #include "ui/views/view.h"
23 #include "ui/views/widget/widget.h" 24 #include "ui/views/widget/widget.h"
24 25
25 using views::FocusManager; 26 using views::FocusManager;
26 27
27 AccessibilityEventRouterViews::AccessibilityEventRouterViews() 28 AccessibilityEventRouterViews::AccessibilityEventRouterViews()
28 : most_recent_profile_(NULL) { 29 : most_recent_profile_(NULL) {
29 // Register for notification when profile is destroyed to ensure that all 30 // Register for notification when profile is destroyed to ensure that all
30 // observers are detatched at that time. 31 // observers are detatched at that time.
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 168
168 if (type == ui::AccessibilityTypes::EVENT_ALERT && 169 if (type == ui::AccessibilityTypes::EVENT_ALERT &&
169 !(state.role == ui::AccessibilityTypes::ROLE_ALERT || 170 !(state.role == ui::AccessibilityTypes::ROLE_ALERT ||
170 state.role == ui::AccessibilityTypes::ROLE_WINDOW)) { 171 state.role == ui::AccessibilityTypes::ROLE_WINDOW)) {
171 SendAlertControlNotification(view, type, profile); 172 SendAlertControlNotification(view, type, profile);
172 return; 173 return;
173 } 174 }
174 175
175 switch (state.role) { 176 switch (state.role) {
176 case ui::AccessibilityTypes::ROLE_ALERT: 177 case ui::AccessibilityTypes::ROLE_ALERT:
178 case ui::AccessibilityTypes::ROLE_DIALOG:
177 case ui::AccessibilityTypes::ROLE_WINDOW: 179 case ui::AccessibilityTypes::ROLE_WINDOW:
178 SendWindowNotification(view, type, profile); 180 SendWindowNotification(view, type, profile);
179 break; 181 break;
180 case ui::AccessibilityTypes::ROLE_BUTTONMENU: 182 case ui::AccessibilityTypes::ROLE_BUTTONMENU:
181 case ui::AccessibilityTypes::ROLE_MENUBAR: 183 case ui::AccessibilityTypes::ROLE_MENUBAR:
182 case ui::AccessibilityTypes::ROLE_MENUPOPUP: 184 case ui::AccessibilityTypes::ROLE_MENUPOPUP:
183 SendMenuNotification(view, type, profile); 185 SendMenuNotification(view, type, profile);
184 break; 186 break;
185 case ui::AccessibilityTypes::ROLE_BUTTONDROPDOWN: 187 case ui::AccessibilityTypes::ROLE_BUTTONDROPDOWN:
186 case ui::AccessibilityTypes::ROLE_PUSHBUTTON: 188 case ui::AccessibilityTypes::ROLE_PUSHBUTTON:
(...skipping 13 matching lines...) Expand all
200 SendTextfieldNotification(view, type, profile); 202 SendTextfieldNotification(view, type, profile);
201 break; 203 break;
202 case ui::AccessibilityTypes::ROLE_MENUITEM: 204 case ui::AccessibilityTypes::ROLE_MENUITEM:
203 SendMenuItemNotification(view, type, profile); 205 SendMenuItemNotification(view, type, profile);
204 break; 206 break;
205 case ui::AccessibilityTypes::ROLE_RADIOBUTTON: 207 case ui::AccessibilityTypes::ROLE_RADIOBUTTON:
206 // Not used anymore? 208 // Not used anymore?
207 case ui::AccessibilityTypes::ROLE_SLIDER: 209 case ui::AccessibilityTypes::ROLE_SLIDER:
208 SendSliderNotification(view, type, profile); 210 SendSliderNotification(view, type, profile);
209 break; 211 break;
212 case ui::AccessibilityTypes::ROLE_OUTLINE:
213 SendMenuNotification(view, type, profile);
214 break;
215 case ui::AccessibilityTypes::ROLE_OUTLINEITEM:
216 SendTreeItemNotification(view, type, profile);
217 break;
210 default: 218 default:
211 // If this is encountered, please file a bug with the role that wasn't 219 // If this is encountered, please file a bug with the role that wasn't
212 // caught so we can add accessibility extension API support. 220 // caught so we can add accessibility extension API support.
213 NOTREACHED(); 221 NOTREACHED();
214 } 222 }
215 } 223 }
216 224
217 // static 225 // static
218 void AccessibilityEventRouterViews::SendButtonNotification( 226 void AccessibilityEventRouterViews::SendButtonNotification(
219 views::View* view, 227 views::View* view,
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 count = 0; 274 count = 0;
267 RecursiveGetMenuItemIndexAndCount(parent_menu, view, &index, &count); 275 RecursiveGetMenuItemIndexAndCount(parent_menu, view, &index, &count);
268 } 276 }
269 277
270 AccessibilityMenuItemInfo info( 278 AccessibilityMenuItemInfo info(
271 profile, name, context, has_submenu, index, count); 279 profile, name, context, has_submenu, index, count);
272 SendControlAccessibilityNotification(event, &info); 280 SendControlAccessibilityNotification(event, &info);
273 } 281 }
274 282
275 // static 283 // static
284 void AccessibilityEventRouterViews::SendTreeItemNotification(
285 views::View* view,
286 ui::AccessibilityTypes::Event event,
287 Profile* profile) {
288 std::string name = GetViewName(view);
289 std::string context = GetViewContext(view);
290
291 if (strcmp(view->GetClassName(), views::TreeView::kViewClassName) != 0) {
292 NOTREACHED();
293 return;
294 }
295
296 views::TreeView* tree = static_cast<views::TreeView*>(view);
dmazzoni 2013/11/21 06:54:07 Why is the view with a role of OUTLINEITEM the one
zel 2013/11/22 02:34:01 moved to another CL, will be addresses there
297 ui::TreeModelNode* selected_node = tree->GetSelectedNode();
298 ui::TreeModel* model = tree->model();
299
300 bool has_submenu = false;
301 int index = -1;
302 int count = -1;
dmazzoni 2013/11/21 06:54:07 Can we set the count even if there isn't a selecte
zel 2013/11/22 02:34:01 moved to another CL, will be addresses there
303
304 if (selected_node) {
305 has_submenu = model->GetChildCount(selected_node);
306 ui::TreeModelNode* parent_node = model->GetParent(selected_node);
307 if (parent_node) {
308 index = model->GetIndexOf(parent_node, selected_node);
309 count = model->GetChildCount(parent_node);
310 }
311 }
312
313 AccessibilityMenuItemInfo info(
314 profile, name, context, has_submenu, index, count);
315 SendControlAccessibilityNotification(event, &info);
316 }
317
318 // static
276 void AccessibilityEventRouterViews::SendTextfieldNotification( 319 void AccessibilityEventRouterViews::SendTextfieldNotification(
277 views::View* view, 320 views::View* view,
278 ui::AccessibilityTypes::Event event, 321 ui::AccessibilityTypes::Event event,
279 Profile* profile) { 322 Profile* profile) {
280 ui::AccessibleViewState state; 323 ui::AccessibleViewState state;
281 view->GetAccessibleState(&state); 324 view->GetAccessibleState(&state);
282 std::string name = UTF16ToUTF8(state.name); 325 std::string name = UTF16ToUTF8(state.name);
283 std::string context = GetViewContext(view); 326 std::string context = GetViewContext(view);
284 bool password = 327 bool password =
285 (state.state & ui::AccessibilityTypes::STATE_PROTECTED) != 0; 328 (state.state & ui::AccessibilityTypes::STATE_PROTECTED) != 0;
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 std::string AccessibilityEventRouterViews::GetViewContext(views::View* view) { 431 std::string AccessibilityEventRouterViews::GetViewContext(views::View* view) {
389 for (views::View* parent = view->parent(); 432 for (views::View* parent = view->parent();
390 parent; 433 parent;
391 parent = parent->parent()) { 434 parent = parent->parent()) {
392 ui::AccessibleViewState state; 435 ui::AccessibleViewState state;
393 parent->GetAccessibleState(&state); 436 parent->GetAccessibleState(&state);
394 437
395 // Two cases are handled right now. More could be added in the future 438 // Two cases are handled right now. More could be added in the future
396 // depending on how the UI evolves. 439 // depending on how the UI evolves.
397 440
398 // A control in a toolbar should use the toolbar's accessible name 441 // A control inside of alert, toolbar or dialog should use that container's
399 // as the context. 442 // accessible name.
400 if (state.role == ui::AccessibilityTypes::ROLE_TOOLBAR && 443 if ((state.role == ui::AccessibilityTypes::ROLE_ALERT ||
444 state.role == ui::AccessibilityTypes::ROLE_DIALOG ||
445 state.role == ui::AccessibilityTypes::ROLE_TOOLBAR) &&
401 !state.name.empty()) { 446 !state.name.empty()) {
402 return UTF16ToUTF8(state.name); 447 return UTF16ToUTF8(state.name);
403 } 448 }
404 449
405 // A control inside of an alert or dialog (including an infobar) 450 // A control inside of an alert or dialog (including an infobar)
406 // should grab the first static text descendant as the context; 451 // should grab the first static text descendant as the context;
407 // that's the prompt. 452 // that's the prompt.
408 if (state.role == ui::AccessibilityTypes::ROLE_ALERT || 453 if (state.role == ui::AccessibilityTypes::ROLE_ALERT ||
409 state.role == ui::AccessibilityTypes::ROLE_DIALOG) { 454 state.role == ui::AccessibilityTypes::ROLE_DIALOG) {
410 views::View* static_text_child = FindDescendantWithAccessibleRole( 455 views::View* static_text_child = FindDescendantWithAccessibleRole(
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 return UTF16ToUTF8(state.name); 519 return UTF16ToUTF8(state.name);
475 520
476 for (int i = 0; i < view->child_count(); ++i) { 521 for (int i = 0; i < view->child_count(); ++i) {
477 views::View* child = view->child_at(i); 522 views::View* child = view->child_at(i);
478 std::string result = RecursiveGetStaticText(child); 523 std::string result = RecursiveGetStaticText(child);
479 if (!result.empty()) 524 if (!result.empty())
480 return result; 525 return result;
481 } 526 }
482 return std::string(); 527 return std::string();
483 } 528 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698