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 |