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

Side by Side Diff: content/browser/accessibility/browser_accessibility_win.cc

Issue 726843003: Textarea, Input elements do not expose READONLY state in acc layer. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years 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
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698