| 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 |