| OLD | NEW |
| 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/views/accessibility/view_accessibility.h" | 5 #include "chrome/views/accessibility/view_accessibility.h" |
| 6 | 6 |
| 7 #include "chrome/views/accessibility/view_accessibility_wrapper.h" | 7 #include "chrome/views/accessibility/view_accessibility_wrapper.h" |
| 8 #include "chrome/views/widget/widget.h" | 8 #include "chrome/views/widget/widget.h" |
| 9 | 9 |
| 10 HRESULT ViewAccessibility::Initialize(views::View* view) { | 10 HRESULT ViewAccessibility::Initialize(views::View* view) { |
| (...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 491 } else { | 491 } else { |
| 492 return E_NOINTERFACE; | 492 return E_NOINTERFACE; |
| 493 } | 493 } |
| 494 } | 494 } |
| 495 | 495 |
| 496 STDMETHODIMP ViewAccessibility::get_accRole(VARIANT var_id, VARIANT* role) { | 496 STDMETHODIMP ViewAccessibility::get_accRole(VARIANT var_id, VARIANT* role) { |
| 497 if (var_id.vt != VT_I4 || !role) { | 497 if (var_id.vt != VT_I4 || !role) { |
| 498 return E_INVALIDARG; | 498 return E_INVALIDARG; |
| 499 } | 499 } |
| 500 | 500 |
| 501 AccessibilityTypes::Role acc_role; |
| 502 |
| 501 if (var_id.lVal == CHILDID_SELF) { | 503 if (var_id.lVal == CHILDID_SELF) { |
| 502 // Retrieve parent role. | 504 // Retrieve parent role. |
| 503 if (!view_->GetAccessibleRole(role)) { | 505 if (!view_->GetAccessibleRole(&acc_role)) { |
| 504 return E_FAIL; | 506 return E_FAIL; |
| 505 } | 507 } |
| 506 } else { | 508 } else { |
| 507 if (!IsValidChild((var_id.lVal - 1), view_)) { | 509 if (!IsValidChild((var_id.lVal - 1), view_)) { |
| 508 return E_INVALIDARG; | 510 return E_INVALIDARG; |
| 509 } | 511 } |
| 510 // Retrieve child role. | 512 // Retrieve child role. |
| 511 if (!view_->GetChildViewAt(var_id.lVal - 1)->GetAccessibleRole(role)) { | 513 if (!view_->GetChildViewAt(var_id.lVal - 1)->GetAccessibleRole(&acc_role)) { |
| 514 role->vt = VT_EMPTY; |
| 512 return E_FAIL; | 515 return E_FAIL; |
| 513 } | 516 } |
| 514 } | 517 } |
| 515 | 518 |
| 516 // Make sure that role is not empty, and has the proper type. | 519 role->vt = VT_I4; |
| 517 if (role->vt == VT_EMPTY) | 520 role->lVal = MSAARole(acc_role); |
| 518 return E_FAIL; | |
| 519 | |
| 520 return S_OK; | 521 return S_OK; |
| 521 } | 522 } |
| 522 | 523 |
| 523 STDMETHODIMP ViewAccessibility::get_accState(VARIANT var_id, VARIANT* state) { | 524 STDMETHODIMP ViewAccessibility::get_accState(VARIANT var_id, VARIANT* state) { |
| 524 if (var_id.vt != VT_I4 || !state) { | 525 if (var_id.vt != VT_I4 || !state) { |
| 525 return E_INVALIDARG; | 526 return E_INVALIDARG; |
| 526 } | 527 } |
| 527 | 528 |
| 528 state->vt = VT_I4; | 529 state->vt = VT_I4; |
| 529 | 530 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 570 return false; | 571 return false; |
| 571 } | 572 } |
| 572 } else { | 573 } else { |
| 573 if ((start_id - 1) <= lower_bound) { | 574 if ((start_id - 1) <= lower_bound) { |
| 574 return false; | 575 return false; |
| 575 } | 576 } |
| 576 } | 577 } |
| 577 return true; | 578 return true; |
| 578 } | 579 } |
| 579 | 580 |
| 580 void ViewAccessibility::SetState(VARIANT* state, views::View* view) { | 581 void ViewAccessibility::SetState(VARIANT* msaa_state, views::View* view) { |
| 581 // Default state; all views can have accessibility focus. | 582 // Default state; all views can have accessibility focus. |
| 582 state->lVal |= STATE_SYSTEM_FOCUSABLE; | 583 msaa_state->lVal |= STATE_SYSTEM_FOCUSABLE; |
| 583 | 584 |
| 584 if (!view) | 585 if (!view) |
| 585 return; | 586 return; |
| 586 | 587 |
| 587 if (!view->IsEnabled()) { | 588 if (!view->IsEnabled()) { |
| 588 state->lVal |= STATE_SYSTEM_UNAVAILABLE; | 589 msaa_state->lVal |= STATE_SYSTEM_UNAVAILABLE; |
| 589 } | 590 } |
| 590 if (!view->IsVisible()) { | 591 if (!view->IsVisible()) { |
| 591 state->lVal |= STATE_SYSTEM_INVISIBLE; | 592 msaa_state->lVal |= STATE_SYSTEM_INVISIBLE; |
| 592 } | 593 } |
| 593 if (view->IsHotTracked()) { | 594 if (view->IsHotTracked()) { |
| 594 state->lVal |= STATE_SYSTEM_HOTTRACKED; | 595 msaa_state->lVal |= STATE_SYSTEM_HOTTRACKED; |
| 595 } | 596 } |
| 596 if (view->IsPushed()) { | 597 if (view->IsPushed()) { |
| 597 state->lVal |= STATE_SYSTEM_PRESSED; | 598 msaa_state->lVal |= STATE_SYSTEM_PRESSED; |
| 598 } | 599 } |
| 599 // Check both for actual View focus, as well as accessibility focus. | 600 // Check both for actual View focus, as well as accessibility focus. |
| 600 views::View* parent = view->GetParent(); | 601 views::View* parent = view->GetParent(); |
| 601 | 602 |
| 602 if (view->HasFocus() || | 603 if (view->HasFocus() || |
| 603 (parent && parent->GetAccFocusedChildView() == view)) { | 604 (parent && parent->GetAccFocusedChildView() == view)) { |
| 604 state->lVal |= STATE_SYSTEM_FOCUSED; | 605 msaa_state->lVal |= STATE_SYSTEM_FOCUSED; |
| 605 } | 606 } |
| 606 | 607 |
| 607 // Add on any view-specific states. | 608 // Add on any view-specific states. |
| 608 view->GetAccessibleState(state); | 609 AccessibilityTypes::State state; |
| 610 view->GetAccessibleState(&state); |
| 611 |
| 612 msaa_state->lVal |= MSAAState(state); |
| 613 } |
| 614 |
| 615 long ViewAccessibility::MSAARole(AccessibilityTypes::Role role) { |
| 616 switch (role) { |
| 617 case AccessibilityTypes::ROLE_APPLICATION : |
| 618 return ROLE_SYSTEM_APPLICATION; |
| 619 case AccessibilityTypes::ROLE_BUTTONDROPDOWN : |
| 620 return ROLE_SYSTEM_BUTTONDROPDOWN; |
| 621 case AccessibilityTypes::ROLE_GROUPING : |
| 622 return ROLE_SYSTEM_GROUPING; |
| 623 case AccessibilityTypes::ROLE_PAGETAB : |
| 624 return ROLE_SYSTEM_PAGETAB; |
| 625 case AccessibilityTypes::ROLE_PUSHBUTTON : |
| 626 return ROLE_SYSTEM_PUSHBUTTON; |
| 627 case AccessibilityTypes::ROLE_TEXT : |
| 628 return ROLE_SYSTEM_TEXT; |
| 629 case AccessibilityTypes::ROLE_TOOLBAR : |
| 630 return ROLE_SYSTEM_TOOLBAR; |
| 631 case AccessibilityTypes::ROLE_CLIENT : |
| 632 default: |
| 633 // This is the default role for MSAA. |
| 634 return ROLE_SYSTEM_CLIENT; |
| 635 } |
| 636 } |
| 637 |
| 638 long ViewAccessibility::MSAAState(AccessibilityTypes::State state) { |
| 639 switch (state) { |
| 640 case AccessibilityTypes::STATE_HASPOPUP : |
| 641 return STATE_SYSTEM_HASPOPUP; |
| 642 case AccessibilityTypes::STATE_READONLY : |
| 643 return STATE_SYSTEM_READONLY; |
| 644 default : |
| 645 // No default state in MSAA. |
| 646 return 0; |
| 647 } |
| 609 } | 648 } |
| 610 | 649 |
| 611 // IAccessible functions not supported. | 650 // IAccessible functions not supported. |
| 612 | 651 |
| 613 HRESULT ViewAccessibility::accDoDefaultAction(VARIANT var_id) { | 652 HRESULT ViewAccessibility::accDoDefaultAction(VARIANT var_id) { |
| 614 return E_NOTIMPL; | 653 return E_NOTIMPL; |
| 615 } | 654 } |
| 616 | 655 |
| 617 STDMETHODIMP ViewAccessibility::get_accValue(VARIANT var_id, BSTR* value) { | 656 STDMETHODIMP ViewAccessibility::get_accValue(VARIANT var_id, BSTR* value) { |
| 618 if (value) | 657 if (value) |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 650 | 689 |
| 651 STDMETHODIMP ViewAccessibility::put_accName(VARIANT var_id, BSTR put_name) { | 690 STDMETHODIMP ViewAccessibility::put_accName(VARIANT var_id, BSTR put_name) { |
| 652 // Deprecated. | 691 // Deprecated. |
| 653 return E_NOTIMPL; | 692 return E_NOTIMPL; |
| 654 } | 693 } |
| 655 | 694 |
| 656 STDMETHODIMP ViewAccessibility::put_accValue(VARIANT var_id, BSTR put_val) { | 695 STDMETHODIMP ViewAccessibility::put_accValue(VARIANT var_id, BSTR put_val) { |
| 657 // Deprecated. | 696 // Deprecated. |
| 658 return E_NOTIMPL; | 697 return E_NOTIMPL; |
| 659 } | 698 } |
| OLD | NEW |