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

Side by Side Diff: chrome/browser/browser_accessibility.cc

Issue 115374: Adds propagation and handling of render-side focus events, for the benefit of... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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/browser_accessibility.h" 5 #include "chrome/browser/browser_accessibility.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "chrome/browser/browser_accessibility_manager.h" 8 #include "chrome/browser/browser_accessibility_manager.h"
9 9
10 using webkit_glue::WebAccessibility; 10 using webkit_glue::WebAccessibility;
11 11
12 BrowserAccessibility::BrowserAccessibility() 12 HRESULT BrowserAccessibility::Initialize(int iaccessible_id, int routing_id,
13 : iaccessible_id_(-1), 13 int process_id, HWND parent_hwnd) {
14 instance_active_(true) { 14 if (!parent_hwnd || iaccessible_id < 0)
15 return E_INVALIDARG;
16
17 iaccessible_id_ = iaccessible_id;
18 routing_id_ = routing_id;
19 process_id_ = process_id;
20 parent_hwnd_ = parent_hwnd;
21
22 // Mark instance as active.
23 instance_active_ = true;
24
25 // Treat child ids intitially as referring to direct children of the object.
26 direct_descendant_ = true;
27
28 return S_OK;
15 } 29 }
16 30
17 HRESULT BrowserAccessibility::accDoDefaultAction(VARIANT var_id) { 31 HRESULT BrowserAccessibility::accDoDefaultAction(VARIANT var_id) {
18 if (!instance_active()) { 32 if (!instance_active()) {
19 // Instance no longer active, fail gracefully. 33 // Instance no longer active, fail gracefully.
20 // TODO(klink): Once we have MSAA events, change these fails for having 34 // TODO(klink): Once we have MSAA events, change these fails to having
21 // BrowserAccessibilityManager firing the right event. 35 // BrowserAccessibilityManager firing the right event.
22 return E_FAIL; 36 return E_FAIL;
23 } 37 }
24 38
25 if (var_id.vt != VT_I4) 39 if (var_id.vt != VT_I4)
26 return E_INVALIDARG; 40 return E_INVALIDARG;
27 41
28 if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_DODEFAULTACTION, 42 if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_DODEFAULTACTION,
29 var_id, NULL, NULL)) { 43 var_id, NULL, NULL)) {
30 return E_FAIL; 44 return E_FAIL;
31 } 45 }
32 46
33 if (!response().return_code) 47 if (!response().return_code)
34 return S_FALSE; 48 return S_FALSE;
35 49
36 return S_OK; 50 return S_OK;
37 } 51 }
38 52
39 STDMETHODIMP BrowserAccessibility::accHitTest(LONG x_left, LONG y_top, 53 STDMETHODIMP BrowserAccessibility::accHitTest(LONG x_left, LONG y_top,
40 VARIANT* child) { 54 VARIANT* child) {
41 if (!instance_active()) { 55 if (!instance_active()) {
42 // Instance no longer active, fail gracefully. 56 // Instance no longer active, fail gracefully.
43 return E_FAIL; 57 return E_FAIL;
44 } 58 }
45 59
46 if (!child) 60 if (!child)
47 return E_INVALIDARG; 61 return E_INVALIDARG;
48 62
49 if (!parent_hwnd()) { 63 if (!parent_hwnd_) {
50 // Parent HWND needed for coordinate conversion. 64 // Parent HWND needed for coordinate conversion.
51 return E_FAIL; 65 return E_FAIL;
52 } 66 }
53 67
54 // Convert coordinates to test from screen into client window coordinates, to 68 // Convert coordinates to test from screen into client window coordinates, to
55 // maintain sandbox functionality on renderer side. 69 // maintain sandbox functionality on renderer side.
56 POINT p = {x_left, y_top}; 70 POINT p = {x_left, y_top};
57 ::ScreenToClient(parent_hwnd(), &p); 71 ::ScreenToClient(parent_hwnd_, &p);
58 72
59 if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_HITTEST, 73 if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_HITTEST,
60 EmptyVariant(), p.x, p.y)) { 74 EmptyVariant(), p.x, p.y)) {
61 return E_FAIL; 75 return E_FAIL;
62 } 76 }
63 77
64 if (!response().return_code) { 78 if (!response().return_code) {
65 // The point is outside of the object's boundaries. 79 // The point is outside of the object's boundaries.
66 child->vt = VT_EMPTY; 80 child->vt = VT_EMPTY;
67 return S_FALSE; 81 return S_FALSE;
(...skipping 18 matching lines...) Expand all
86 100
87 STDMETHODIMP BrowserAccessibility::accLocation(LONG* x_left, LONG* y_top, 101 STDMETHODIMP BrowserAccessibility::accLocation(LONG* x_left, LONG* y_top,
88 LONG* width, LONG* height, 102 LONG* width, LONG* height,
89 VARIANT var_id) { 103 VARIANT var_id) {
90 if (!instance_active()) { 104 if (!instance_active()) {
91 // Instance no longer active, fail gracefully. 105 // Instance no longer active, fail gracefully.
92 return E_FAIL; 106 return E_FAIL;
93 } 107 }
94 108
95 if (var_id.vt != VT_I4 || !x_left || !y_top || !width || !height || 109 if (var_id.vt != VT_I4 || !x_left || !y_top || !width || !height ||
96 !parent_hwnd()) { 110 !parent_hwnd_) {
97 return E_INVALIDARG; 111 return E_INVALIDARG;
98 } 112 }
99 113
100 if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_LOCATION, var_id, 114 if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_LOCATION, var_id,
101 NULL, NULL)) { 115 NULL, NULL)) {
102 return E_FAIL; 116 return E_FAIL;
103 } 117 }
104 118
105 POINT top_left = {0, 0}; 119 POINT top_left = {0, 0};
106 120
107 // Find the top left corner of the containing window in screen coords, and 121 // Find the top left corner of the containing window in screen coords, and
108 // adjust the output position by this amount. 122 // adjust the output position by this amount.
109 ::ClientToScreen(parent_hwnd(), &top_left); 123 ::ClientToScreen(parent_hwnd_, &top_left);
110 124
111 *x_left = response().output_long1 + top_left.x; 125 *x_left = response().output_long1 + top_left.x;
112 *y_top = response().output_long2 + top_left.y; 126 *y_top = response().output_long2 + top_left.y;
113 127
114 *width = response().output_long3; 128 *width = response().output_long3;
115 *height = response().output_long4; 129 *height = response().output_long4;
116 130
117 return S_OK; 131 return S_OK;
118 } 132 }
119 133
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
386 DCHECK(*name); 400 DCHECK(*name);
387 return S_OK; 401 return S_OK;
388 } 402 }
389 403
390 STDMETHODIMP BrowserAccessibility::get_accParent(IDispatch** disp_parent) { 404 STDMETHODIMP BrowserAccessibility::get_accParent(IDispatch** disp_parent) {
391 if (!instance_active()) { 405 if (!instance_active()) {
392 // Instance no longer active, fail gracefully. 406 // Instance no longer active, fail gracefully.
393 return E_FAIL; 407 return E_FAIL;
394 } 408 }
395 409
396 if (!disp_parent || !parent_hwnd()) 410 if (!disp_parent || !parent_hwnd_)
397 return E_INVALIDARG; 411 return E_INVALIDARG;
398 412
399 // Root node's parent is the containing HWND's IAccessible. 413 // Root node's parent is the containing HWND's IAccessible.
400 if (iaccessible_id() == 0) { 414 if (iaccessible_id_ == 0) {
401 // For an object that has no parent (e.g. root), point the accessible parent 415 // For an object that has no parent (e.g. root), point the accessible parent
402 // to the default implementation. 416 // to the default implementation.
403 HRESULT hr = 417 HRESULT hr =
404 ::CreateStdAccessibleObject(parent_hwnd(), OBJID_WINDOW, 418 ::CreateStdAccessibleObject(parent_hwnd_, OBJID_WINDOW,
405 IID_IAccessible, 419 IID_IAccessible,
406 reinterpret_cast<void**>(disp_parent)); 420 reinterpret_cast<void**>(disp_parent));
407 421
408 if (!SUCCEEDED(hr)) { 422 if (!SUCCEEDED(hr)) {
409 *disp_parent = NULL; 423 *disp_parent = NULL;
410 return S_FALSE; 424 return S_FALSE;
411 } 425 }
412 return S_OK; 426 return S_OK;
413 } 427 }
414 428
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 // No string found. 505 // No string found.
492 return S_FALSE; 506 return S_FALSE;
493 } 507 }
494 508
495 *value = CComBSTR(response().output_string.c_str()).Detach(); 509 *value = CComBSTR(response().output_string.c_str()).Detach();
496 510
497 DCHECK(*value); 511 DCHECK(*value);
498 return S_OK; 512 return S_OK;
499 } 513 }
500 514
501 STDMETHODIMP BrowserAccessibility::accSelect(LONG flags_select,
502 VARIANT var_id) {
503 return E_NOTIMPL;
504 }
505
506 STDMETHODIMP BrowserAccessibility::get_accHelpTopic(BSTR* help_file, 515 STDMETHODIMP BrowserAccessibility::get_accHelpTopic(BSTR* help_file,
507 VARIANT var_id, 516 VARIANT var_id,
508 LONG* topic_id) { 517 LONG* topic_id) {
509 if (help_file) { 518 if (help_file)
510 *help_file = NULL; 519 *help_file = NULL;
511 } 520
512 if (topic_id) { 521 if (topic_id)
513 *topic_id = static_cast<LONG>(-1); 522 *topic_id = static_cast<LONG>(-1);
514 } 523
515 return E_NOTIMPL; 524 return E_NOTIMPL;
516 } 525 }
517 526
518 STDMETHODIMP BrowserAccessibility::get_accSelection(VARIANT* selected) { 527 STDMETHODIMP BrowserAccessibility::get_accSelection(VARIANT* selected) {
519 if (selected) 528 if (selected)
520 selected->vt = VT_EMPTY; 529 selected->vt = VT_EMPTY;
521 530
522 return E_NOTIMPL; 531 return E_NOTIMPL;
523 } 532 }
524 533
525 STDMETHODIMP BrowserAccessibility::put_accName(VARIANT var_id, BSTR put_name) {
526 return E_NOTIMPL;
527 }
528
529 STDMETHODIMP BrowserAccessibility::put_accValue(VARIANT var_id, BSTR put_val) {
530 return E_NOTIMPL;
531 }
532
533 STDMETHODIMP BrowserAccessibility::CreateInstance(REFIID iid, 534 STDMETHODIMP BrowserAccessibility::CreateInstance(REFIID iid,
534 int iaccessible_id, 535 int iaccessible_id,
535 void** interface_ptr) { 536 void** interface_ptr) {
536 return BrowserAccessibilityManager::GetInstance()-> 537 return BrowserAccessibilityManager::GetInstance()->
537 CreateAccessibilityInstance(iid, iaccessible_id, instance_id(), 538 CreateAccessibilityInstance(iid, iaccessible_id, routing_id_,
538 interface_ptr); 539 process_id_, parent_hwnd_, interface_ptr);
539 } 540 }
540 541
541 bool BrowserAccessibility::RequestAccessibilityInfo(int iaccessible_func_id, 542 bool BrowserAccessibility::RequestAccessibilityInfo(int iaccessible_func_id,
542 VARIANT var_id, LONG input1, 543 VARIANT var_id, LONG input1,
543 LONG input2) { 544 LONG input2) {
544 return BrowserAccessibilityManager::GetInstance()->RequestAccessibilityInfo( 545 // Create and populate IPC message structure, for retrieval of accessibility
545 iaccessible_id(), instance_id(), iaccessible_func_id, var_id.lVal, input1, 546 // information from the renderer.
546 input2); 547 WebAccessibility::InParams in_params;
548 in_params.object_id = iaccessible_id_;
549 in_params.function_id = iaccessible_func_id;
550 in_params.child_id = var_id.lVal;
551 in_params.direct_descendant = direct_descendant();
552 in_params.input_long1 = input1;
553 in_params.input_long2 = input2;
554
555 if (!direct_descendant())
556 set_direct_descendant(true);
557
558 return BrowserAccessibilityManager::GetInstance()->
559 RequestAccessibilityInfo(&in_params, routing_id_, process_id_);
547 } 560 }
548 561
549 const WebAccessibility::OutParams& BrowserAccessibility::response() { 562 const WebAccessibility::OutParams& BrowserAccessibility::response() {
550 return BrowserAccessibilityManager::GetInstance()->response(); 563 return BrowserAccessibilityManager::GetInstance()->response();
551 } 564 }
552 565
553 HWND BrowserAccessibility::parent_hwnd() {
554 return BrowserAccessibilityManager::GetInstance()->parent_hwnd(instance_id());
555 }
556
557 long BrowserAccessibility::MSAARole(long browser_accessibility_role) { 566 long BrowserAccessibility::MSAARole(long browser_accessibility_role) {
558 switch (browser_accessibility_role) { 567 switch (browser_accessibility_role) {
559 case WebAccessibility::ROLE_PUSHBUTTON : 568 case WebAccessibility::ROLE_PUSHBUTTON :
560 return ROLE_SYSTEM_PUSHBUTTON; 569 return ROLE_SYSTEM_PUSHBUTTON;
561 case WebAccessibility::ROLE_RADIOBUTTON : 570 case WebAccessibility::ROLE_RADIOBUTTON :
562 return ROLE_SYSTEM_RADIOBUTTON; 571 return ROLE_SYSTEM_RADIOBUTTON;
563 case WebAccessibility::ROLE_CHECKBUTTON : 572 case WebAccessibility::ROLE_CHECKBUTTON :
564 return ROLE_SYSTEM_CHECKBUTTON; 573 return ROLE_SYSTEM_CHECKBUTTON;
565 case WebAccessibility::ROLE_SLIDER : 574 case WebAccessibility::ROLE_SLIDER :
566 return ROLE_SYSTEM_SLIDER; 575 return ROLE_SYSTEM_SLIDER;
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
634 state |= STATE_SYSTEM_FOCUSED; 643 state |= STATE_SYSTEM_FOCUSED;
635 644
636 if ((browser_accessibility_state >> WebAccessibility::STATE_TRAVERSED) & 1) 645 if ((browser_accessibility_state >> WebAccessibility::STATE_TRAVERSED) & 1)
637 state |= STATE_SYSTEM_TRAVERSED; 646 state |= STATE_SYSTEM_TRAVERSED;
638 647
639 if ((browser_accessibility_state >> WebAccessibility::STATE_FOCUSABLE) & 1) 648 if ((browser_accessibility_state >> WebAccessibility::STATE_FOCUSABLE) & 1)
640 state |= STATE_SYSTEM_FOCUSABLE; 649 state |= STATE_SYSTEM_FOCUSABLE;
641 650
642 return state; 651 return state;
643 } 652 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698