OLD | NEW |
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 "content/browser/accessibility/browser_accessibility_win.h" | 5 #include "content/browser/accessibility/browser_accessibility_win.h" |
6 | 6 |
7 #include <UIAutomationClient.h> | 7 #include <UIAutomationClient.h> |
8 #include <UIAutomationCoreApi.h> | 8 #include <UIAutomationCoreApi.h> |
9 | 9 |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
(...skipping 3348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3359 if (!HasState(ui::AX_STATE_ENABLED)) | 3359 if (!HasState(ui::AX_STATE_ENABLED)) |
3360 ia_state_ |= STATE_SYSTEM_UNAVAILABLE; | 3360 ia_state_ |= STATE_SYSTEM_UNAVAILABLE; |
3361 if (HasState(ui::AX_STATE_VERTICAL)) { | 3361 if (HasState(ui::AX_STATE_VERTICAL)) { |
3362 ia2_state_ |= IA2_STATE_VERTICAL; | 3362 ia2_state_ |= IA2_STATE_VERTICAL; |
3363 } else { | 3363 } else { |
3364 ia2_state_ |= IA2_STATE_HORIZONTAL; | 3364 ia2_state_ |= IA2_STATE_HORIZONTAL; |
3365 } | 3365 } |
3366 if (HasState(ui::AX_STATE_VISITED)) | 3366 if (HasState(ui::AX_STATE_VISITED)) |
3367 ia_state_ |= STATE_SYSTEM_TRAVERSED; | 3367 ia_state_ |= STATE_SYSTEM_TRAVERSED; |
3368 | 3368 |
3369 // WebKit marks everything as readonly unless it's editable text, so if it's | 3369 if (HasState(ui::AX_STATE_READ_ONLY) |
3370 // not readonly, mark it as editable now. The final computation of the | 3370 || GetBoolAttribute(ui::AX_ATTR_ARIA_READONLY)) |
3371 // READONLY state for MSAA is below, after the switch. | 3371 ia_state_ = STATE_SYSTEM_READONLY; |
3372 if (!HasState(ui::AX_STATE_READ_ONLY)) | |
3373 ia2_state_ |= IA2_STATE_EDITABLE; | |
3374 | 3372 |
3375 base::string16 invalid; | 3373 base::string16 invalid; |
3376 if (GetHtmlAttribute("aria-invalid", &invalid)) | 3374 if (GetHtmlAttribute("aria-invalid", &invalid)) |
3377 ia2_state_ |= IA2_STATE_INVALID_ENTRY; | 3375 ia2_state_ |= IA2_STATE_INVALID_ENTRY; |
3378 | 3376 |
3379 if (GetBoolAttribute(ui::AX_ATTR_BUTTON_MIXED)) | 3377 if (GetBoolAttribute(ui::AX_ATTR_BUTTON_MIXED)) |
3380 ia_state_ |= STATE_SYSTEM_MIXED; | 3378 ia_state_ |= STATE_SYSTEM_MIXED; |
3381 | 3379 |
3382 if (GetBoolAttribute(ui::AX_ATTR_CAN_SET_VALUE)) | 3380 if (GetBoolAttribute(ui::AX_ATTR_CAN_SET_VALUE)) |
3383 ia2_state_ |= IA2_STATE_EDITABLE; | 3381 ia2_state_ |= IA2_STATE_EDITABLE; |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3498 case ui::AX_ROLE_DISCLOSURE_TRIANGLE: | 3496 case ui::AX_ROLE_DISCLOSURE_TRIANGLE: |
3499 ia_role_ = ROLE_SYSTEM_PUSHBUTTON; | 3497 ia_role_ = ROLE_SYSTEM_PUSHBUTTON; |
3500 break; | 3498 break; |
3501 case ui::AX_ROLE_DOCUMENT: | 3499 case ui::AX_ROLE_DOCUMENT: |
3502 case ui::AX_ROLE_ROOT_WEB_AREA: | 3500 case ui::AX_ROLE_ROOT_WEB_AREA: |
3503 case ui::AX_ROLE_WEB_AREA: | 3501 case ui::AX_ROLE_WEB_AREA: |
3504 ia_role_ = ROLE_SYSTEM_DOCUMENT; | 3502 ia_role_ = ROLE_SYSTEM_DOCUMENT; |
3505 ia_state_ |= STATE_SYSTEM_READONLY; | 3503 ia_state_ |= STATE_SYSTEM_READONLY; |
3506 ia_state_ |= STATE_SYSTEM_FOCUSABLE; | 3504 ia_state_ |= STATE_SYSTEM_FOCUSABLE; |
3507 break; | 3505 break; |
3508 case ui::AX_ROLE_EDITABLE_TEXT: | |
3509 ia_role_ = ROLE_SYSTEM_TEXT; | |
3510 ia2_state_ |= IA2_STATE_SINGLE_LINE; | |
3511 ia2_state_ |= IA2_STATE_EDITABLE; | |
3512 break; | |
3513 case ui::AX_ROLE_FIGCAPTION: | 3506 case ui::AX_ROLE_FIGCAPTION: |
3514 role_name_ = html_tag; | 3507 role_name_ = html_tag; |
3515 ia2_role_ = IA2_ROLE_CAPTION; | 3508 ia2_role_ = IA2_ROLE_CAPTION; |
3516 break; | 3509 break; |
3517 case ui::AX_ROLE_FIGURE: | 3510 case ui::AX_ROLE_FIGURE: |
3518 ia_role_ = ROLE_SYSTEM_GROUPING; | 3511 ia_role_ = ROLE_SYSTEM_GROUPING; |
3519 break; | 3512 break; |
3520 case ui::AX_ROLE_FORM: | 3513 case ui::AX_ROLE_FORM: |
3521 role_name_ = L"form"; | 3514 role_name_ = L"form"; |
3522 ia2_role_ = IA2_ROLE_FORM; | 3515 ia2_role_ = IA2_ROLE_FORM; |
3523 break; | 3516 break; |
3524 case ui::AX_ROLE_FOOTER: | 3517 case ui::AX_ROLE_FOOTER: |
3525 ia_role_ = ROLE_SYSTEM_GROUPING; | 3518 ia_role_ = ROLE_SYSTEM_GROUPING; |
3526 ia2_role_ = IA2_ROLE_FOOTER; | 3519 ia2_role_ = IA2_ROLE_FOOTER; |
3527 break; | 3520 break; |
3528 case ui::AX_ROLE_GRID: | 3521 case ui::AX_ROLE_GRID: |
3529 ia_role_ = ROLE_SYSTEM_TABLE; | 3522 ia_role_ = ROLE_SYSTEM_TABLE; |
3530 ia_state_ |= STATE_SYSTEM_READONLY; | |
3531 break; | 3523 break; |
3532 case ui::AX_ROLE_GROUP: { | 3524 case ui::AX_ROLE_GROUP: { |
3533 base::string16 aria_role = GetString16Attribute( | 3525 base::string16 aria_role = GetString16Attribute( |
3534 ui::AX_ATTR_ROLE); | 3526 ui::AX_ATTR_ROLE); |
3535 if (aria_role == L"group" || html_tag == L"fieldset") { | 3527 if (aria_role == L"group" || html_tag == L"fieldset") { |
3536 ia_role_ = ROLE_SYSTEM_GROUPING; | 3528 ia_role_ = ROLE_SYSTEM_GROUPING; |
3537 } else if (html_tag == L"li") { | 3529 } else if (html_tag == L"li") { |
3538 ia_role_ = ROLE_SYSTEM_LISTITEM; | 3530 ia_role_ = ROLE_SYSTEM_LISTITEM; |
3539 ia_state_ |= STATE_SYSTEM_READONLY; | 3531 ia_state_ |= STATE_SYSTEM_READONLY; |
3540 } else { | 3532 } else { |
3541 if (html_tag.empty()) | 3533 if (html_tag.empty()) |
3542 role_name_ = L"div"; | 3534 role_name_ = L"div"; |
3543 else | 3535 else |
3544 role_name_ = html_tag; | 3536 role_name_ = html_tag; |
3545 ia2_role_ = IA2_ROLE_SECTION; | 3537 ia2_role_ = IA2_ROLE_SECTION; |
3546 } | 3538 } |
3547 break; | 3539 break; |
3548 } | 3540 } |
3549 case ui::AX_ROLE_GROW_AREA: | |
3550 ia_role_ = ROLE_SYSTEM_GRIP; | |
3551 ia_state_ |= STATE_SYSTEM_READONLY; | |
3552 break; | |
3553 case ui::AX_ROLE_HEADING: | 3541 case ui::AX_ROLE_HEADING: |
3554 role_name_ = html_tag; | 3542 role_name_ = html_tag; |
3555 ia2_role_ = IA2_ROLE_HEADING; | 3543 ia2_role_ = IA2_ROLE_HEADING; |
3556 break; | 3544 break; |
3557 case ui::AX_ROLE_IFRAME: | 3545 case ui::AX_ROLE_IFRAME: |
3558 ia_role_ = ROLE_SYSTEM_DOCUMENT; | 3546 ia_role_ = ROLE_SYSTEM_DOCUMENT; |
3559 ia2_role_ = IA2_ROLE_INTERNAL_FRAME; | 3547 ia2_role_ = IA2_ROLE_INTERNAL_FRAME; |
3560 ia_state_ = STATE_SYSTEM_READONLY; | 3548 ia_state_ = STATE_SYSTEM_READONLY; |
3561 break; | 3549 break; |
3562 case ui::AX_ROLE_IMAGE: | 3550 case ui::AX_ROLE_IMAGE: |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3720 break; | 3708 break; |
3721 case ui::AX_ROLE_SLIDER: | 3709 case ui::AX_ROLE_SLIDER: |
3722 ia_role_ = ROLE_SYSTEM_SLIDER; | 3710 ia_role_ = ROLE_SYSTEM_SLIDER; |
3723 break; | 3711 break; |
3724 case ui::AX_ROLE_SPIN_BUTTON: | 3712 case ui::AX_ROLE_SPIN_BUTTON: |
3725 ia_role_ = ROLE_SYSTEM_SPINBUTTON; | 3713 ia_role_ = ROLE_SYSTEM_SPINBUTTON; |
3726 break; | 3714 break; |
3727 case ui::AX_ROLE_SPIN_BUTTON_PART: | 3715 case ui::AX_ROLE_SPIN_BUTTON_PART: |
3728 ia_role_ = ROLE_SYSTEM_PUSHBUTTON; | 3716 ia_role_ = ROLE_SYSTEM_PUSHBUTTON; |
3729 break; | 3717 break; |
3730 case ui::AX_ROLE_SPLIT_GROUP: | |
3731 ia_role_ = ROLE_SYSTEM_CLIENT; | |
3732 ia2_role_ = IA2_ROLE_SPLIT_PANE; | |
3733 ia_state_ |= STATE_SYSTEM_READONLY; | |
3734 break; | |
3735 case ui::AX_ROLE_ANNOTATION: | 3718 case ui::AX_ROLE_ANNOTATION: |
3736 case ui::AX_ROLE_LIST_MARKER: | 3719 case ui::AX_ROLE_LIST_MARKER: |
3737 case ui::AX_ROLE_STATIC_TEXT: | 3720 case ui::AX_ROLE_STATIC_TEXT: |
3738 ia_role_ = ROLE_SYSTEM_STATICTEXT; | 3721 ia_role_ = ROLE_SYSTEM_STATICTEXT; |
3739 break; | 3722 break; |
3740 case ui::AX_ROLE_STATUS: | 3723 case ui::AX_ROLE_STATUS: |
3741 ia_role_ = ROLE_SYSTEM_STATUSBAR; | 3724 ia_role_ = ROLE_SYSTEM_STATUSBAR; |
3742 ia_state_ |= STATE_SYSTEM_READONLY; | 3725 ia_state_ |= STATE_SYSTEM_READONLY; |
3743 break; | 3726 break; |
3744 case ui::AX_ROLE_SPLITTER: | 3727 case ui::AX_ROLE_SPLITTER: |
(...skipping 26 matching lines...) Expand all Loading... |
3771 case ui::AX_ROLE_TAB_PANEL: | 3754 case ui::AX_ROLE_TAB_PANEL: |
3772 ia_role_ = ROLE_SYSTEM_PROPERTYPAGE; | 3755 ia_role_ = ROLE_SYSTEM_PROPERTYPAGE; |
3773 break; | 3756 break; |
3774 case ui::AX_ROLE_TOGGLE_BUTTON: | 3757 case ui::AX_ROLE_TOGGLE_BUTTON: |
3775 ia_role_ = ROLE_SYSTEM_PUSHBUTTON; | 3758 ia_role_ = ROLE_SYSTEM_PUSHBUTTON; |
3776 ia2_role_ = IA2_ROLE_TOGGLE_BUTTON; | 3759 ia2_role_ = IA2_ROLE_TOGGLE_BUTTON; |
3777 break; | 3760 break; |
3778 case ui::AX_ROLE_TEXT_AREA: | 3761 case ui::AX_ROLE_TEXT_AREA: |
3779 ia_role_ = ROLE_SYSTEM_TEXT; | 3762 ia_role_ = ROLE_SYSTEM_TEXT; |
3780 ia2_state_ |= IA2_STATE_MULTI_LINE; | 3763 ia2_state_ |= IA2_STATE_MULTI_LINE; |
3781 ia2_state_ |= IA2_STATE_EDITABLE; | |
3782 ia2_state_ |= IA2_STATE_SELECTABLE_TEXT; | 3764 ia2_state_ |= IA2_STATE_SELECTABLE_TEXT; |
3783 break; | 3765 break; |
3784 case ui::AX_ROLE_TEXT_FIELD: | 3766 case ui::AX_ROLE_TEXT_FIELD: |
3785 ia_role_ = ROLE_SYSTEM_TEXT; | 3767 ia_role_ = ROLE_SYSTEM_TEXT; |
3786 ia2_state_ |= IA2_STATE_SINGLE_LINE; | 3768 ia2_state_ |= IA2_STATE_SINGLE_LINE; |
3787 ia2_state_ |= IA2_STATE_EDITABLE; | |
3788 ia2_state_ |= IA2_STATE_SELECTABLE_TEXT; | 3769 ia2_state_ |= IA2_STATE_SELECTABLE_TEXT; |
3789 break; | 3770 break; |
3790 case ui::AX_ROLE_TIME: | 3771 case ui::AX_ROLE_TIME: |
3791 ia_role_ = ROLE_SYSTEM_SPINBUTTON; | 3772 ia_role_ = ROLE_SYSTEM_SPINBUTTON; |
3792 break; | 3773 break; |
3793 case ui::AX_ROLE_TIMER: | 3774 case ui::AX_ROLE_TIMER: |
3794 ia_role_ = ROLE_SYSTEM_CLOCK; | 3775 ia_role_ = ROLE_SYSTEM_CLOCK; |
3795 ia_state_ |= STATE_SYSTEM_READONLY; | 3776 ia_state_ |= STATE_SYSTEM_READONLY; |
3796 break; | 3777 break; |
3797 case ui::AX_ROLE_TOOLBAR: | 3778 case ui::AX_ROLE_TOOLBAR: |
(...skipping 30 matching lines...) Expand all Loading... |
3828 case ui::AX_ROLE_RULER_MARKER: | 3809 case ui::AX_ROLE_RULER_MARKER: |
3829 case ui::AX_ROLE_SHEET: | 3810 case ui::AX_ROLE_SHEET: |
3830 case ui::AX_ROLE_SLIDER_THUMB: | 3811 case ui::AX_ROLE_SLIDER_THUMB: |
3831 case ui::AX_ROLE_SYSTEM_WIDE: | 3812 case ui::AX_ROLE_SYSTEM_WIDE: |
3832 case ui::AX_ROLE_VALUE_INDICATOR: | 3813 case ui::AX_ROLE_VALUE_INDICATOR: |
3833 default: | 3814 default: |
3834 ia_role_ = ROLE_SYSTEM_CLIENT; | 3815 ia_role_ = ROLE_SYSTEM_CLIENT; |
3835 break; | 3816 break; |
3836 } | 3817 } |
3837 | 3818 |
3838 // Compute the final value of READONLY for MSAA. | |
3839 // | |
3840 // We always set the READONLY state for elements that have the | |
3841 // aria-readonly attribute and for a few roles (in the switch above). | |
3842 // We clear the READONLY state on focusable controls and on a document. | |
3843 // Everything else, the majority of objects, do not have this state set. | |
3844 if (HasState(ui::AX_STATE_FOCUSABLE) && | |
3845 ia_role_ != ROLE_SYSTEM_DOCUMENT) { | |
3846 ia_state_ &= ~(STATE_SYSTEM_READONLY); | |
3847 } | |
3848 if (!HasState(ui::AX_STATE_READ_ONLY)) | |
3849 ia_state_ &= ~(STATE_SYSTEM_READONLY); | |
3850 if (GetBoolAttribute(ui::AX_ATTR_ARIA_READONLY)) | |
3851 ia_state_ |= STATE_SYSTEM_READONLY; | |
3852 | |
3853 // The role should always be set. | 3819 // The role should always be set. |
3854 DCHECK(!role_name_.empty() || ia_role_); | 3820 DCHECK(!role_name_.empty() || ia_role_); |
3855 | 3821 |
3856 // If we didn't explicitly set the IAccessible2 role, make it the same | 3822 // If we didn't explicitly set the IAccessible2 role, make it the same |
3857 // as the MSAA role. | 3823 // as the MSAA role. |
3858 if (!ia2_role_) | 3824 if (!ia2_role_) |
3859 ia2_role_ = ia_role_; | 3825 ia2_role_ = ia_role_; |
3860 } | 3826 } |
3861 | 3827 |
3862 } // namespace content | 3828 } // namespace content |
OLD | NEW |