OLD | NEW |
1 // Copyright (c) 2017 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2017 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_com_win.h" | 5 #include "content/browser/accessibility/browser_accessibility_com_win.h" |
6 | 6 |
7 #include <UIAutomationClient.h> | 7 #include <UIAutomationClient.h> |
8 #include <UIAutomationCoreApi.h> | 8 #include <UIAutomationCoreApi.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
624 | 624 |
625 return AXPlatformNodeWin::get_accRole(var_id, role); | 625 return AXPlatformNodeWin::get_accRole(var_id, role); |
626 } | 626 } |
627 | 627 |
628 STDMETHODIMP BrowserAccessibilityComWin::get_accState(VARIANT var_id, | 628 STDMETHODIMP BrowserAccessibilityComWin::get_accState(VARIANT var_id, |
629 VARIANT* state) { | 629 VARIANT* state) { |
630 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_STATE); | 630 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_STATE); |
631 if (!owner()) | 631 if (!owner()) |
632 return E_FAIL; | 632 return E_FAIL; |
633 | 633 |
634 auto* manager = Manager(); | 634 return AXPlatformNodeWin::get_accState(var_id, state); |
635 if (!manager) | |
636 return E_FAIL; | |
637 | |
638 if (!state) | |
639 return E_INVALIDARG; | |
640 | |
641 BrowserAccessibilityComWin* target = GetTargetFromChildID(var_id); | |
642 if (!target) | |
643 return E_INVALIDARG; | |
644 | |
645 state->vt = VT_I4; | |
646 state->lVal = target->ia_state(); | |
647 if (manager->GetFocus() == owner()) | |
648 state->lVal |= STATE_SYSTEM_FOCUSED; | |
649 | |
650 return S_OK; | |
651 } | 635 } |
652 | 636 |
653 bool BrowserAccessibilityComWin::IsRangeValueSupported() { | 637 bool BrowserAccessibilityComWin::IsRangeValueSupported() { |
654 switch (ia_role()) { | 638 switch (ia_role()) { |
655 case ROLE_SYSTEM_PROGRESSBAR: | 639 case ROLE_SYSTEM_PROGRESSBAR: |
656 case ROLE_SYSTEM_SLIDER: | 640 case ROLE_SYSTEM_SLIDER: |
657 case ROLE_SYSTEM_SPINBUTTON: | 641 case ROLE_SYSTEM_SPINBUTTON: |
658 case ROLE_SYSTEM_SCROLLBAR: | 642 case ROLE_SYSTEM_SCROLLBAR: |
659 return true; | 643 return true; |
660 case ROLE_SYSTEM_SEPARATOR: | 644 case ROLE_SYSTEM_SEPARATOR: |
(...skipping 1883 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2544 AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes); | 2528 AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes); |
2545 if (!owner() || !IsHyperlink()) | 2529 if (!owner() || !IsHyperlink()) |
2546 return E_FAIL; | 2530 return E_FAIL; |
2547 | 2531 |
2548 // IA2 text links can have at most one target, that is when they represent an | 2532 // IA2 text links can have at most one target, that is when they represent an |
2549 // HTML hyperlink, i.e. an <a> element with a "href" attribute. | 2533 // HTML hyperlink, i.e. an <a> element with a "href" attribute. |
2550 if (index != 0 || !anchor_target) | 2534 if (index != 0 || !anchor_target) |
2551 return E_INVALIDARG; | 2535 return E_INVALIDARG; |
2552 | 2536 |
2553 BSTR target; | 2537 BSTR target; |
2554 if (!(ia_state() & STATE_SYSTEM_LINKED) || | 2538 if (!(MSAAState() & STATE_SYSTEM_LINKED) || |
2555 FAILED(GetStringAttributeAsBstr(ui::AX_ATTR_URL, &target))) { | 2539 FAILED(GetStringAttributeAsBstr(ui::AX_ATTR_URL, &target))) { |
2556 target = SysAllocString(L""); | 2540 target = SysAllocString(L""); |
2557 } | 2541 } |
2558 DCHECK(target); | 2542 DCHECK(target); |
2559 anchor_target->vt = VT_BSTR; | 2543 anchor_target->vt = VT_BSTR; |
2560 anchor_target->bstrVal = target; | 2544 anchor_target->bstrVal = target; |
2561 | 2545 |
2562 // Returning S_FALSE is not mentioned in the IA2 Spec, but it might have been | 2546 // Returning S_FALSE is not mentioned in the IA2 Spec, but it might have been |
2563 // an oversight. | 2547 // an oversight. |
2564 if (!SysStringLen(target)) | 2548 if (!SysStringLen(target)) |
(...skipping 1212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3777 win_attributes_->ia2_attributes.push_back(L"valuetext:" + value); | 3761 win_attributes_->ia2_attributes.push_back(L"valuetext:" + value); |
3778 } else { | 3762 } else { |
3779 // On Windows, the value of a document should be its url. | 3763 // On Windows, the value of a document should be its url. |
3780 if (owner()->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA || | 3764 if (owner()->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA || |
3781 owner()->GetRole() == ui::AX_ROLE_WEB_AREA) { | 3765 owner()->GetRole() == ui::AX_ROLE_WEB_AREA) { |
3782 value = base::UTF8ToUTF16(Manager()->GetTreeData().url); | 3766 value = base::UTF8ToUTF16(Manager()->GetTreeData().url); |
3783 } | 3767 } |
3784 // If this doesn't have a value and is linked then set its value to the url | 3768 // If this doesn't have a value and is linked then set its value to the url |
3785 // attribute. This allows screen readers to read an empty link's | 3769 // attribute. This allows screen readers to read an empty link's |
3786 // destination. | 3770 // destination. |
3787 if (value.empty() && (ia_state() & STATE_SYSTEM_LINKED)) | 3771 if (value.empty() && (MSAAState() & STATE_SYSTEM_LINKED)) |
3788 value = owner()->GetString16Attribute(ui::AX_ATTR_URL); | 3772 value = owner()->GetString16Attribute(ui::AX_ATTR_URL); |
3789 } | 3773 } |
3790 | 3774 |
3791 win_attributes_->value = value; | 3775 win_attributes_->value = value; |
3792 | 3776 |
3793 ClearOwnRelations(); | 3777 ClearOwnRelations(); |
3794 AddBidirectionalRelations(IA2_RELATION_CONTROLLER_FOR, | 3778 AddBidirectionalRelations(IA2_RELATION_CONTROLLER_FOR, |
3795 IA2_RELATION_CONTROLLED_BY, | 3779 IA2_RELATION_CONTROLLED_BY, |
3796 ui::AX_ATTR_CONTROLS_IDS); | 3780 ui::AX_ATTR_CONTROLS_IDS); |
3797 AddBidirectionalRelations(IA2_RELATION_DESCRIBED_BY, | 3781 AddBidirectionalRelations(IA2_RELATION_DESCRIBED_BY, |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3874 // The rest of the events only fire on changes, not on new objects. | 3858 // The rest of the events only fire on changes, not on new objects. |
3875 if (old_win_attributes_->ia_role != 0 || | 3859 if (old_win_attributes_->ia_role != 0 || |
3876 !old_win_attributes_->role_name.empty()) { | 3860 !old_win_attributes_->role_name.empty()) { |
3877 // Fire an event if the name, description, help, or value changes. | 3861 // Fire an event if the name, description, help, or value changes. |
3878 if (name() != old_win_attributes_->name) | 3862 if (name() != old_win_attributes_->name) |
3879 FireNativeEvent(EVENT_OBJECT_NAMECHANGE); | 3863 FireNativeEvent(EVENT_OBJECT_NAMECHANGE); |
3880 if (description() != old_win_attributes_->description) | 3864 if (description() != old_win_attributes_->description) |
3881 FireNativeEvent(EVENT_OBJECT_DESCRIPTIONCHANGE); | 3865 FireNativeEvent(EVENT_OBJECT_DESCRIPTIONCHANGE); |
3882 if (value() != old_win_attributes_->value) | 3866 if (value() != old_win_attributes_->value) |
3883 FireNativeEvent(EVENT_OBJECT_VALUECHANGE); | 3867 FireNativeEvent(EVENT_OBJECT_VALUECHANGE); |
3884 if (ia_state() != old_win_attributes_->ia_state) | 3868 |
| 3869 // Do not fire EVENT_OBJECT_STATECHANGE if the change was due to a focus |
| 3870 // change. |
| 3871 if ((MSAAState() & ~STATE_SYSTEM_FOCUSED) != |
| 3872 (old_win_attributes_->ia_state & ~STATE_SYSTEM_FOCUSED)) |
3885 FireNativeEvent(EVENT_OBJECT_STATECHANGE); | 3873 FireNativeEvent(EVENT_OBJECT_STATECHANGE); |
3886 | 3874 |
3887 // Handle selection being added or removed. | 3875 // Handle selection being added or removed. |
3888 bool is_selected_now = (ia_state() & STATE_SYSTEM_SELECTED) != 0; | 3876 bool is_selected_now = (MSAAState() & STATE_SYSTEM_SELECTED) != 0; |
3889 bool was_selected_before = | 3877 bool was_selected_before = |
3890 (old_win_attributes_->ia_state & STATE_SYSTEM_SELECTED) != 0; | 3878 (old_win_attributes_->ia_state & STATE_SYSTEM_SELECTED) != 0; |
3891 if (is_selected_now || was_selected_before) { | 3879 if (is_selected_now || was_selected_before) { |
3892 bool multiselect = false; | 3880 bool multiselect = false; |
3893 if (owner()->PlatformGetParent() && | 3881 if (owner()->PlatformGetParent() && |
3894 owner()->PlatformGetParent()->HasState(ui::AX_STATE_MULTISELECTABLE)) | 3882 owner()->PlatformGetParent()->HasState(ui::AX_STATE_MULTISELECTABLE)) |
3895 multiselect = true; | 3883 multiselect = true; |
3896 | 3884 |
3897 if (multiselect) { | 3885 if (multiselect) { |
3898 // In a multi-select box, fire SELECTIONADD and SELECTIONREMOVE events. | 3886 // In a multi-select box, fire SELECTIONADD and SELECTIONREMOVE events. |
(...skipping 1094 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4993 } | 4981 } |
4994 | 4982 |
4995 void BrowserAccessibilityComWin::FireNativeEvent(LONG win_event_type) const { | 4983 void BrowserAccessibilityComWin::FireNativeEvent(LONG win_event_type) const { |
4996 (new BrowserAccessibilityEventWin(BrowserAccessibilityEvent::FromTreeChange, | 4984 (new BrowserAccessibilityEventWin(BrowserAccessibilityEvent::FromTreeChange, |
4997 ui::AX_EVENT_NONE, win_event_type, owner())) | 4985 ui::AX_EVENT_NONE, win_event_type, owner())) |
4998 ->Fire(); | 4986 ->Fire(); |
4999 } | 4987 } |
5000 | 4988 |
5001 void BrowserAccessibilityComWin::InitRoleAndState() { | 4989 void BrowserAccessibilityComWin::InitRoleAndState() { |
5002 int32_t ia_role = 0; | 4990 int32_t ia_role = 0; |
5003 int32_t ia_state = 0; | |
5004 base::string16 role_name; | 4991 base::string16 role_name; |
5005 int32_t ia2_role = 0; | 4992 int32_t ia2_role = 0; |
5006 int32_t ia2_state = IA2_STATE_OPAQUE; | 4993 int32_t ia2_state = IA2_STATE_OPAQUE; |
5007 | 4994 |
5008 if (owner()->HasState(ui::AX_STATE_BUSY)) | |
5009 ia_state |= STATE_SYSTEM_BUSY; | |
5010 | |
5011 const auto checked_state = static_cast<ui::AXCheckedState>( | 4995 const auto checked_state = static_cast<ui::AXCheckedState>( |
5012 owner()->GetIntAttribute(ui::AX_ATTR_CHECKED_STATE)); | 4996 owner()->GetIntAttribute(ui::AX_ATTR_CHECKED_STATE)); |
5013 if (checked_state) { | 4997 if (checked_state) { |
5014 ia2_state |= IA2_STATE_CHECKABLE; | 4998 ia2_state |= IA2_STATE_CHECKABLE; |
5015 switch (checked_state) { | |
5016 case ui::AX_CHECKED_STATE_TRUE: | |
5017 ia_state |= owner()->GetRole() == ui::AX_ROLE_TOGGLE_BUTTON | |
5018 ? STATE_SYSTEM_PRESSED | |
5019 : STATE_SYSTEM_CHECKED; | |
5020 break; | |
5021 case ui::AX_CHECKED_STATE_MIXED: | |
5022 ia_state |= STATE_SYSTEM_MIXED; | |
5023 break; | |
5024 default: | |
5025 break; | |
5026 } | |
5027 } | 4999 } |
5028 | 5000 |
5029 if (owner()->HasState(ui::AX_STATE_COLLAPSED)) | |
5030 ia_state |= STATE_SYSTEM_COLLAPSED; | |
5031 if (owner()->HasState(ui::AX_STATE_EXPANDED)) | |
5032 ia_state |= STATE_SYSTEM_EXPANDED; | |
5033 if (owner()->HasState(ui::AX_STATE_FOCUSABLE)) | |
5034 ia_state |= STATE_SYSTEM_FOCUSABLE; | |
5035 if (owner()->HasState(ui::AX_STATE_HASPOPUP)) | |
5036 ia_state |= STATE_SYSTEM_HASPOPUP; | |
5037 if (owner()->HasIntAttribute(ui::AX_ATTR_INVALID_STATE) && | 5001 if (owner()->HasIntAttribute(ui::AX_ATTR_INVALID_STATE) && |
5038 owner()->GetIntAttribute(ui::AX_ATTR_INVALID_STATE) != | 5002 owner()->GetIntAttribute(ui::AX_ATTR_INVALID_STATE) != |
5039 ui::AX_INVALID_STATE_FALSE) | 5003 ui::AX_INVALID_STATE_FALSE) |
5040 ia2_state |= IA2_STATE_INVALID_ENTRY; | 5004 ia2_state |= IA2_STATE_INVALID_ENTRY; |
5041 if (owner()->HasState(ui::AX_STATE_INVISIBLE)) | |
5042 ia_state |= STATE_SYSTEM_INVISIBLE; | |
5043 if (owner()->HasState(ui::AX_STATE_LINKED)) | |
5044 ia_state |= STATE_SYSTEM_LINKED; | |
5045 if (owner()->HasState(ui::AX_STATE_MULTISELECTABLE)) { | |
5046 ia_state |= STATE_SYSTEM_EXTSELECTABLE; | |
5047 ia_state |= STATE_SYSTEM_MULTISELECTABLE; | |
5048 } | |
5049 // TODO(ctguil): Support STATE_SYSTEM_EXTSELECTABLE/accSelect. | |
5050 if (owner()->HasState(ui::AX_STATE_OFFSCREEN)) | |
5051 ia_state |= STATE_SYSTEM_OFFSCREEN; | |
5052 if (owner()->HasState(ui::AX_STATE_PROTECTED)) | |
5053 ia_state |= STATE_SYSTEM_PROTECTED; | |
5054 if (owner()->HasState(ui::AX_STATE_REQUIRED)) | 5005 if (owner()->HasState(ui::AX_STATE_REQUIRED)) |
5055 ia2_state |= IA2_STATE_REQUIRED; | 5006 ia2_state |= IA2_STATE_REQUIRED; |
5056 if (owner()->HasState(ui::AX_STATE_SELECTABLE)) | |
5057 ia_state |= STATE_SYSTEM_SELECTABLE; | |
5058 if (owner()->HasState(ui::AX_STATE_SELECTED)) | |
5059 ia_state |= STATE_SYSTEM_SELECTED; | |
5060 if (owner()->HasState(ui::AX_STATE_VISITED)) | |
5061 ia_state |= STATE_SYSTEM_TRAVERSED; | |
5062 if (owner()->HasState(ui::AX_STATE_DISABLED)) | |
5063 ia_state |= STATE_SYSTEM_UNAVAILABLE; | |
5064 if (owner()->HasState(ui::AX_STATE_VERTICAL)) | 5007 if (owner()->HasState(ui::AX_STATE_VERTICAL)) |
5065 ia2_state |= IA2_STATE_VERTICAL; | 5008 ia2_state |= IA2_STATE_VERTICAL; |
5066 if (owner()->HasState(ui::AX_STATE_HORIZONTAL)) | 5009 if (owner()->HasState(ui::AX_STATE_HORIZONTAL)) |
5067 ia2_state |= IA2_STATE_HORIZONTAL; | 5010 ia2_state |= IA2_STATE_HORIZONTAL; |
5068 if (owner()->HasState(ui::AX_STATE_VISITED)) | |
5069 ia_state |= STATE_SYSTEM_TRAVERSED; | |
5070 | |
5071 // Expose whether or not the mouse is over an element, but suppress | |
5072 // this for tests because it can make the test results flaky depending | |
5073 // on the position of the mouse. | |
5074 BrowserAccessibilityStateImpl* accessibility_state = | |
5075 BrowserAccessibilityStateImpl::GetInstance(); | |
5076 if (!accessibility_state->disable_hot_tracking_for_testing()) { | |
5077 if (owner()->HasState(ui::AX_STATE_HOVERED)) | |
5078 ia_state |= STATE_SYSTEM_HOTTRACKED; | |
5079 } | |
5080 | 5011 |
5081 if (owner()->HasState(ui::AX_STATE_EDITABLE)) | 5012 if (owner()->HasState(ui::AX_STATE_EDITABLE)) |
5082 ia2_state |= IA2_STATE_EDITABLE; | 5013 ia2_state |= IA2_STATE_EDITABLE; |
5083 | 5014 |
5084 if (!owner()->GetStringAttribute(ui::AX_ATTR_AUTO_COMPLETE).empty()) | 5015 if (!owner()->GetStringAttribute(ui::AX_ATTR_AUTO_COMPLETE).empty()) |
5085 ia2_state |= IA2_STATE_SUPPORTS_AUTOCOMPLETION; | 5016 ia2_state |= IA2_STATE_SUPPORTS_AUTOCOMPLETION; |
5086 | 5017 |
5087 if (owner()->GetBoolAttribute(ui::AX_ATTR_MODAL)) | 5018 if (owner()->GetBoolAttribute(ui::AX_ATTR_MODAL)) |
5088 ia2_state |= IA2_STATE_MODAL; | 5019 ia2_state |= IA2_STATE_MODAL; |
5089 | 5020 |
5090 base::string16 html_tag = owner()->GetString16Attribute(ui::AX_ATTR_HTML_TAG); | 5021 base::string16 html_tag = owner()->GetString16Attribute(ui::AX_ATTR_HTML_TAG); |
5091 switch (owner()->GetRole()) { | 5022 switch (owner()->GetRole()) { |
5092 case ui::AX_ROLE_ALERT: | 5023 case ui::AX_ROLE_ALERT: |
5093 ia_role = ROLE_SYSTEM_ALERT; | 5024 ia_role = ROLE_SYSTEM_ALERT; |
5094 break; | 5025 break; |
5095 case ui::AX_ROLE_ALERT_DIALOG: | 5026 case ui::AX_ROLE_ALERT_DIALOG: |
5096 ia_role = ROLE_SYSTEM_DIALOG; | 5027 ia_role = ROLE_SYSTEM_DIALOG; |
5097 break; | 5028 break; |
5098 case ui::AX_ROLE_ANCHOR: | 5029 case ui::AX_ROLE_ANCHOR: |
5099 ia_role = ROLE_SYSTEM_LINK; | 5030 ia_role = ROLE_SYSTEM_LINK; |
5100 break; | 5031 break; |
5101 case ui::AX_ROLE_APPLICATION: | 5032 case ui::AX_ROLE_APPLICATION: |
5102 ia_role = ROLE_SYSTEM_APPLICATION; | 5033 ia_role = ROLE_SYSTEM_APPLICATION; |
5103 break; | 5034 break; |
5104 case ui::AX_ROLE_ARTICLE: | 5035 case ui::AX_ROLE_ARTICLE: |
5105 ia_role = ROLE_SYSTEM_DOCUMENT; | 5036 ia_role = ROLE_SYSTEM_DOCUMENT; |
5106 ia_state |= STATE_SYSTEM_READONLY; | |
5107 break; | 5037 break; |
5108 case ui::AX_ROLE_AUDIO: | 5038 case ui::AX_ROLE_AUDIO: |
5109 ia_role = ROLE_SYSTEM_GROUPING; | 5039 ia_role = ROLE_SYSTEM_GROUPING; |
5110 break; | 5040 break; |
5111 case ui::AX_ROLE_BANNER: | 5041 case ui::AX_ROLE_BANNER: |
5112 ia_role = ROLE_SYSTEM_GROUPING; | 5042 ia_role = ROLE_SYSTEM_GROUPING; |
5113 ia2_role = IA2_ROLE_HEADER; | 5043 ia2_role = IA2_ROLE_HEADER; |
5114 break; | 5044 break; |
5115 case ui::AX_ROLE_BLOCKQUOTE: | 5045 case ui::AX_ROLE_BLOCKQUOTE: |
5116 role_name = html_tag; | 5046 role_name = html_tag; |
5117 ia2_role = IA2_ROLE_SECTION; | 5047 ia2_role = IA2_ROLE_SECTION; |
5118 break; | 5048 break; |
5119 case ui::AX_ROLE_BUSY_INDICATOR: | 5049 case ui::AX_ROLE_BUSY_INDICATOR: |
5120 ia_role = ROLE_SYSTEM_ANIMATION; | 5050 ia_role = ROLE_SYSTEM_ANIMATION; |
5121 ia_state |= STATE_SYSTEM_READONLY; | |
5122 break; | 5051 break; |
5123 case ui::AX_ROLE_BUTTON: | 5052 case ui::AX_ROLE_BUTTON: |
5124 ia_role = ROLE_SYSTEM_PUSHBUTTON; | 5053 ia_role = ROLE_SYSTEM_PUSHBUTTON; |
5125 break; | 5054 break; |
5126 case ui::AX_ROLE_CANVAS: | 5055 case ui::AX_ROLE_CANVAS: |
5127 if (owner()->GetBoolAttribute(ui::AX_ATTR_CANVAS_HAS_FALLBACK)) { | 5056 if (owner()->GetBoolAttribute(ui::AX_ATTR_CANVAS_HAS_FALLBACK)) { |
5128 role_name = L"canvas"; | 5057 role_name = L"canvas"; |
5129 ia2_role = IA2_ROLE_CANVAS; | 5058 ia2_role = IA2_ROLE_CANVAS; |
5130 } else { | 5059 } else { |
5131 ia_role = ROLE_SYSTEM_GRAPHIC; | 5060 ia_role = ROLE_SYSTEM_GRAPHIC; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5163 ia2_role = IA2_ROLE_PARAGRAPH; | 5092 ia2_role = IA2_ROLE_PARAGRAPH; |
5164 break; | 5093 break; |
5165 case ui::AX_ROLE_DATE: | 5094 case ui::AX_ROLE_DATE: |
5166 case ui::AX_ROLE_DATE_TIME: | 5095 case ui::AX_ROLE_DATE_TIME: |
5167 ia_role = ROLE_SYSTEM_DROPLIST; | 5096 ia_role = ROLE_SYSTEM_DROPLIST; |
5168 ia2_role = IA2_ROLE_DATE_EDITOR; | 5097 ia2_role = IA2_ROLE_DATE_EDITOR; |
5169 break; | 5098 break; |
5170 case ui::AX_ROLE_DEFINITION: | 5099 case ui::AX_ROLE_DEFINITION: |
5171 role_name = html_tag; | 5100 role_name = html_tag; |
5172 ia2_role = IA2_ROLE_PARAGRAPH; | 5101 ia2_role = IA2_ROLE_PARAGRAPH; |
5173 ia_state |= STATE_SYSTEM_READONLY; | |
5174 break; | 5102 break; |
5175 case ui::AX_ROLE_DESCRIPTION_LIST_DETAIL: | 5103 case ui::AX_ROLE_DESCRIPTION_LIST_DETAIL: |
5176 role_name = html_tag; | 5104 role_name = html_tag; |
5177 ia_role = ROLE_SYSTEM_TEXT; | 5105 ia_role = ROLE_SYSTEM_TEXT; |
5178 ia2_role = IA2_ROLE_PARAGRAPH; | 5106 ia2_role = IA2_ROLE_PARAGRAPH; |
5179 break; | 5107 break; |
5180 case ui::AX_ROLE_DESCRIPTION_LIST: | 5108 case ui::AX_ROLE_DESCRIPTION_LIST: |
5181 role_name = html_tag; | 5109 role_name = html_tag; |
5182 ia_role = ROLE_SYSTEM_LIST; | 5110 ia_role = ROLE_SYSTEM_LIST; |
5183 ia_state |= STATE_SYSTEM_READONLY; | |
5184 break; | 5111 break; |
5185 case ui::AX_ROLE_DESCRIPTION_LIST_TERM: | 5112 case ui::AX_ROLE_DESCRIPTION_LIST_TERM: |
5186 ia_role = ROLE_SYSTEM_LISTITEM; | 5113 ia_role = ROLE_SYSTEM_LISTITEM; |
5187 ia_state |= STATE_SYSTEM_READONLY; | |
5188 break; | 5114 break; |
5189 case ui::AX_ROLE_DETAILS: | 5115 case ui::AX_ROLE_DETAILS: |
5190 role_name = html_tag; | 5116 role_name = html_tag; |
5191 ia_role = ROLE_SYSTEM_GROUPING; | 5117 ia_role = ROLE_SYSTEM_GROUPING; |
5192 break; | 5118 break; |
5193 case ui::AX_ROLE_DIALOG: | 5119 case ui::AX_ROLE_DIALOG: |
5194 ia_role = ROLE_SYSTEM_DIALOG; | 5120 ia_role = ROLE_SYSTEM_DIALOG; |
5195 break; | 5121 break; |
5196 case ui::AX_ROLE_DISCLOSURE_TRIANGLE: | 5122 case ui::AX_ROLE_DISCLOSURE_TRIANGLE: |
5197 ia_role = ROLE_SYSTEM_PUSHBUTTON; | 5123 ia_role = ROLE_SYSTEM_PUSHBUTTON; |
5198 break; | 5124 break; |
5199 case ui::AX_ROLE_DOCUMENT: | 5125 case ui::AX_ROLE_DOCUMENT: |
5200 case ui::AX_ROLE_ROOT_WEB_AREA: | 5126 case ui::AX_ROLE_ROOT_WEB_AREA: |
5201 case ui::AX_ROLE_WEB_AREA: | 5127 case ui::AX_ROLE_WEB_AREA: |
5202 ia_role = ROLE_SYSTEM_DOCUMENT; | 5128 ia_role = ROLE_SYSTEM_DOCUMENT; |
5203 ia_state |= STATE_SYSTEM_READONLY; | |
5204 ia_state |= STATE_SYSTEM_FOCUSABLE; | |
5205 break; | 5129 break; |
5206 case ui::AX_ROLE_EMBEDDED_OBJECT: | 5130 case ui::AX_ROLE_EMBEDDED_OBJECT: |
5207 if (owner()->PlatformChildCount()) { | 5131 if (owner()->PlatformChildCount()) { |
5208 // Windows screen readers assume that IA2_ROLE_EMBEDDED_OBJECT | 5132 // Windows screen readers assume that IA2_ROLE_EMBEDDED_OBJECT |
5209 // doesn't have any children, but it may be something like a | 5133 // doesn't have any children, but it may be something like a |
5210 // browser plugin that has a document inside. | 5134 // browser plugin that has a document inside. |
5211 ia_role = ROLE_SYSTEM_GROUPING; | 5135 ia_role = ROLE_SYSTEM_GROUPING; |
5212 } else { | 5136 } else { |
5213 ia_role = ROLE_SYSTEM_CLIENT; | 5137 ia_role = ROLE_SYSTEM_CLIENT; |
5214 ia2_role = IA2_ROLE_EMBEDDED_OBJECT; | 5138 ia2_role = IA2_ROLE_EMBEDDED_OBJECT; |
(...skipping 17 matching lines...) Expand all Loading... |
5232 ia_role = ROLE_SYSTEM_GROUPING; | 5156 ia_role = ROLE_SYSTEM_GROUPING; |
5233 ia2_role = IA2_ROLE_FOOTER; | 5157 ia2_role = IA2_ROLE_FOOTER; |
5234 break; | 5158 break; |
5235 case ui::AX_ROLE_GENERIC_CONTAINER: | 5159 case ui::AX_ROLE_GENERIC_CONTAINER: |
5236 ia_role = ROLE_SYSTEM_GROUPING; | 5160 ia_role = ROLE_SYSTEM_GROUPING; |
5237 ia2_role = IA2_ROLE_SECTION; | 5161 ia2_role = IA2_ROLE_SECTION; |
5238 role_name = html_tag.empty() ? L"div" : html_tag; | 5162 role_name = html_tag.empty() ? L"div" : html_tag; |
5239 break; | 5163 break; |
5240 case ui::AX_ROLE_GRID: | 5164 case ui::AX_ROLE_GRID: |
5241 ia_role = ROLE_SYSTEM_TABLE; | 5165 ia_role = ROLE_SYSTEM_TABLE; |
5242 // TODO(aleventhal) this changed between ARIA 1.0 and 1.1, | |
5243 // need to determine whether grids/treegrids should really be readonly | |
5244 // or editable by default | |
5245 // ia_state |= STATE_SYSTEM_READONLY; | |
5246 break; | 5166 break; |
5247 case ui::AX_ROLE_GROUP: | 5167 case ui::AX_ROLE_GROUP: |
5248 ia_role = ROLE_SYSTEM_GROUPING; | 5168 ia_role = ROLE_SYSTEM_GROUPING; |
5249 break; | 5169 break; |
5250 case ui::AX_ROLE_HEADING: | 5170 case ui::AX_ROLE_HEADING: |
5251 role_name = html_tag; | 5171 role_name = html_tag; |
5252 if (html_tag.empty()) | 5172 if (html_tag.empty()) |
5253 ia_role = ROLE_SYSTEM_GROUPING; | 5173 ia_role = ROLE_SYSTEM_GROUPING; |
5254 ia2_role = IA2_ROLE_HEADING; | 5174 ia2_role = IA2_ROLE_HEADING; |
5255 break; | 5175 break; |
5256 case ui::AX_ROLE_IFRAME: | 5176 case ui::AX_ROLE_IFRAME: |
5257 ia_role = ROLE_SYSTEM_DOCUMENT; | 5177 ia_role = ROLE_SYSTEM_DOCUMENT; |
5258 ia2_role = IA2_ROLE_INTERNAL_FRAME; | 5178 ia2_role = IA2_ROLE_INTERNAL_FRAME; |
5259 ia_state = STATE_SYSTEM_READONLY; | |
5260 break; | 5179 break; |
5261 case ui::AX_ROLE_IFRAME_PRESENTATIONAL: | 5180 case ui::AX_ROLE_IFRAME_PRESENTATIONAL: |
5262 ia_role = ROLE_SYSTEM_GROUPING; | 5181 ia_role = ROLE_SYSTEM_GROUPING; |
5263 break; | 5182 break; |
5264 case ui::AX_ROLE_IMAGE: | 5183 case ui::AX_ROLE_IMAGE: |
5265 ia_role = ROLE_SYSTEM_GRAPHIC; | 5184 ia_role = ROLE_SYSTEM_GRAPHIC; |
5266 ia_state |= STATE_SYSTEM_READONLY; | |
5267 break; | 5185 break; |
5268 case ui::AX_ROLE_IMAGE_MAP: | 5186 case ui::AX_ROLE_IMAGE_MAP: |
5269 role_name = html_tag; | 5187 role_name = html_tag; |
5270 ia2_role = IA2_ROLE_IMAGE_MAP; | 5188 ia2_role = IA2_ROLE_IMAGE_MAP; |
5271 ia_state |= STATE_SYSTEM_READONLY; | |
5272 break; | 5189 break; |
5273 case ui::AX_ROLE_IMAGE_MAP_LINK: | 5190 case ui::AX_ROLE_IMAGE_MAP_LINK: |
5274 ia_role = ROLE_SYSTEM_LINK; | 5191 ia_role = ROLE_SYSTEM_LINK; |
5275 ia_state |= STATE_SYSTEM_LINKED; | |
5276 ia_state |= STATE_SYSTEM_READONLY; | |
5277 break; | 5192 break; |
5278 case ui::AX_ROLE_INPUT_TIME: | 5193 case ui::AX_ROLE_INPUT_TIME: |
5279 ia_role = ROLE_SYSTEM_GROUPING; | 5194 ia_role = ROLE_SYSTEM_GROUPING; |
5280 break; | 5195 break; |
5281 case ui::AX_ROLE_LABEL_TEXT: | 5196 case ui::AX_ROLE_LABEL_TEXT: |
5282 case ui::AX_ROLE_LEGEND: | 5197 case ui::AX_ROLE_LEGEND: |
5283 ia_role = ROLE_SYSTEM_TEXT; | 5198 ia_role = ROLE_SYSTEM_TEXT; |
5284 ia2_role = IA2_ROLE_LABEL; | 5199 ia2_role = IA2_ROLE_LABEL; |
5285 break; | 5200 break; |
5286 case ui::AX_ROLE_LINK: | 5201 case ui::AX_ROLE_LINK: |
5287 ia_role = ROLE_SYSTEM_LINK; | 5202 ia_role = ROLE_SYSTEM_LINK; |
5288 ia_state |= STATE_SYSTEM_LINKED; | |
5289 break; | 5203 break; |
5290 case ui::AX_ROLE_LIST: | 5204 case ui::AX_ROLE_LIST: |
5291 ia_role = ROLE_SYSTEM_LIST; | 5205 ia_role = ROLE_SYSTEM_LIST; |
5292 ia_state |= STATE_SYSTEM_READONLY; | |
5293 break; | 5206 break; |
5294 case ui::AX_ROLE_LIST_BOX: | 5207 case ui::AX_ROLE_LIST_BOX: |
5295 ia_role = ROLE_SYSTEM_LIST; | 5208 ia_role = ROLE_SYSTEM_LIST; |
5296 break; | 5209 break; |
5297 case ui::AX_ROLE_LIST_BOX_OPTION: | 5210 case ui::AX_ROLE_LIST_BOX_OPTION: |
5298 ia_role = ROLE_SYSTEM_LISTITEM; | 5211 ia_role = ROLE_SYSTEM_LISTITEM; |
5299 break; | 5212 break; |
5300 case ui::AX_ROLE_LIST_ITEM: | 5213 case ui::AX_ROLE_LIST_ITEM: |
5301 ia_role = ROLE_SYSTEM_LISTITEM; | 5214 ia_role = ROLE_SYSTEM_LISTITEM; |
5302 ia_state |= STATE_SYSTEM_READONLY; | |
5303 break; | 5215 break; |
5304 case ui::AX_ROLE_MAIN: | 5216 case ui::AX_ROLE_MAIN: |
5305 ia_role = ROLE_SYSTEM_GROUPING; | 5217 ia_role = ROLE_SYSTEM_GROUPING; |
5306 ia2_role = IA2_ROLE_PARAGRAPH; | 5218 ia2_role = IA2_ROLE_PARAGRAPH; |
5307 break; | 5219 break; |
5308 case ui::AX_ROLE_MARK: | 5220 case ui::AX_ROLE_MARK: |
5309 ia_role = ROLE_SYSTEM_TEXT; | 5221 ia_role = ROLE_SYSTEM_TEXT; |
5310 ia2_role = IA2_ROLE_TEXT_FRAME; | 5222 ia2_role = IA2_ROLE_TEXT_FRAME; |
5311 break; | 5223 break; |
5312 case ui::AX_ROLE_MARQUEE: | 5224 case ui::AX_ROLE_MARQUEE: |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5367 ia_role = ROLE_SYSTEM_BUTTONMENU; | 5279 ia_role = ROLE_SYSTEM_BUTTONMENU; |
5368 } | 5280 } |
5369 break; | 5281 break; |
5370 case ui::AX_ROLE_PRE: | 5282 case ui::AX_ROLE_PRE: |
5371 role_name = html_tag; | 5283 role_name = html_tag; |
5372 ia_role = ROLE_SYSTEM_TEXT; | 5284 ia_role = ROLE_SYSTEM_TEXT; |
5373 ia2_role = IA2_ROLE_PARAGRAPH; | 5285 ia2_role = IA2_ROLE_PARAGRAPH; |
5374 break; | 5286 break; |
5375 case ui::AX_ROLE_PROGRESS_INDICATOR: | 5287 case ui::AX_ROLE_PROGRESS_INDICATOR: |
5376 ia_role = ROLE_SYSTEM_PROGRESSBAR; | 5288 ia_role = ROLE_SYSTEM_PROGRESSBAR; |
5377 ia_state |= STATE_SYSTEM_READONLY; | |
5378 break; | 5289 break; |
5379 case ui::AX_ROLE_RADIO_BUTTON: | 5290 case ui::AX_ROLE_RADIO_BUTTON: |
5380 ia_role = ROLE_SYSTEM_RADIOBUTTON; | 5291 ia_role = ROLE_SYSTEM_RADIOBUTTON; |
5381 break; | 5292 break; |
5382 case ui::AX_ROLE_RADIO_GROUP: | 5293 case ui::AX_ROLE_RADIO_GROUP: |
5383 ia_role = ROLE_SYSTEM_GROUPING; | 5294 ia_role = ROLE_SYSTEM_GROUPING; |
5384 break; | 5295 break; |
5385 case ui::AX_ROLE_REGION: | 5296 case ui::AX_ROLE_REGION: |
5386 if (html_tag == L"section") { | 5297 if (html_tag == L"section") { |
5387 ia_role = ROLE_SYSTEM_GROUPING; | 5298 ia_role = ROLE_SYSTEM_GROUPING; |
(...skipping 12 matching lines...) Expand all Loading... |
5400 case ui::AX_ROLE_ROW_HEADER: | 5311 case ui::AX_ROLE_ROW_HEADER: |
5401 ia_role = ROLE_SYSTEM_ROWHEADER; | 5312 ia_role = ROLE_SYSTEM_ROWHEADER; |
5402 break; | 5313 break; |
5403 case ui::AX_ROLE_RUBY: | 5314 case ui::AX_ROLE_RUBY: |
5404 ia_role = ROLE_SYSTEM_TEXT; | 5315 ia_role = ROLE_SYSTEM_TEXT; |
5405 ia2_role = IA2_ROLE_TEXT_FRAME; | 5316 ia2_role = IA2_ROLE_TEXT_FRAME; |
5406 break; | 5317 break; |
5407 case ui::AX_ROLE_RULER: | 5318 case ui::AX_ROLE_RULER: |
5408 ia_role = ROLE_SYSTEM_CLIENT; | 5319 ia_role = ROLE_SYSTEM_CLIENT; |
5409 ia2_role = IA2_ROLE_RULER; | 5320 ia2_role = IA2_ROLE_RULER; |
5410 ia_state |= STATE_SYSTEM_READONLY; | |
5411 break; | 5321 break; |
5412 case ui::AX_ROLE_SCROLL_AREA: | 5322 case ui::AX_ROLE_SCROLL_AREA: |
5413 ia_role = ROLE_SYSTEM_CLIENT; | 5323 ia_role = ROLE_SYSTEM_CLIENT; |
5414 ia2_role = IA2_ROLE_SCROLL_PANE; | 5324 ia2_role = IA2_ROLE_SCROLL_PANE; |
5415 ia_state |= STATE_SYSTEM_READONLY; | |
5416 ia2_state &= ~(IA2_STATE_EDITABLE); | 5325 ia2_state &= ~(IA2_STATE_EDITABLE); |
5417 break; | 5326 break; |
5418 case ui::AX_ROLE_SCROLL_BAR: | 5327 case ui::AX_ROLE_SCROLL_BAR: |
5419 ia_role = ROLE_SYSTEM_SCROLLBAR; | 5328 ia_role = ROLE_SYSTEM_SCROLLBAR; |
5420 break; | 5329 break; |
5421 case ui::AX_ROLE_SEARCH: | 5330 case ui::AX_ROLE_SEARCH: |
5422 ia_role = ROLE_SYSTEM_GROUPING; | 5331 ia_role = ROLE_SYSTEM_GROUPING; |
5423 ia2_role = IA2_ROLE_SECTION; | 5332 ia2_role = IA2_ROLE_SECTION; |
5424 break; | 5333 break; |
5425 case ui::AX_ROLE_SLIDER: | 5334 case ui::AX_ROLE_SLIDER: |
(...skipping 25 matching lines...) Expand all Loading... |
5451 break; | 5360 break; |
5452 case ui::AX_ROLE_TAB: | 5361 case ui::AX_ROLE_TAB: |
5453 ia_role = ROLE_SYSTEM_PAGETAB; | 5362 ia_role = ROLE_SYSTEM_PAGETAB; |
5454 break; | 5363 break; |
5455 case ui::AX_ROLE_TABLE: | 5364 case ui::AX_ROLE_TABLE: |
5456 ia_role = ROLE_SYSTEM_TABLE; | 5365 ia_role = ROLE_SYSTEM_TABLE; |
5457 break; | 5366 break; |
5458 case ui::AX_ROLE_TABLE_HEADER_CONTAINER: | 5367 case ui::AX_ROLE_TABLE_HEADER_CONTAINER: |
5459 ia_role = ROLE_SYSTEM_GROUPING; | 5368 ia_role = ROLE_SYSTEM_GROUPING; |
5460 ia2_role = IA2_ROLE_SECTION; | 5369 ia2_role = IA2_ROLE_SECTION; |
5461 ia_state |= STATE_SYSTEM_READONLY; | |
5462 break; | 5370 break; |
5463 case ui::AX_ROLE_TAB_LIST: | 5371 case ui::AX_ROLE_TAB_LIST: |
5464 ia_role = ROLE_SYSTEM_PAGETABLIST; | 5372 ia_role = ROLE_SYSTEM_PAGETABLIST; |
5465 break; | 5373 break; |
5466 case ui::AX_ROLE_TAB_PANEL: | 5374 case ui::AX_ROLE_TAB_PANEL: |
5467 ia_role = ROLE_SYSTEM_PROPERTYPAGE; | 5375 ia_role = ROLE_SYSTEM_PROPERTYPAGE; |
5468 break; | 5376 break; |
5469 case ui::AX_ROLE_TERM: | 5377 case ui::AX_ROLE_TERM: |
5470 ia_role = ROLE_SYSTEM_LISTITEM; | 5378 ia_role = ROLE_SYSTEM_LISTITEM; |
5471 ia_state |= STATE_SYSTEM_READONLY; | |
5472 break; | 5379 break; |
5473 case ui::AX_ROLE_TOGGLE_BUTTON: | 5380 case ui::AX_ROLE_TOGGLE_BUTTON: |
5474 ia_role = ROLE_SYSTEM_PUSHBUTTON; | 5381 ia_role = ROLE_SYSTEM_PUSHBUTTON; |
5475 ia2_role = IA2_ROLE_TOGGLE_BUTTON; | 5382 ia2_role = IA2_ROLE_TOGGLE_BUTTON; |
5476 break; | 5383 break; |
5477 case ui::AX_ROLE_TEXT_FIELD: | 5384 case ui::AX_ROLE_TEXT_FIELD: |
5478 case ui::AX_ROLE_SEARCH_BOX: | 5385 case ui::AX_ROLE_SEARCH_BOX: |
5479 ia_role = ROLE_SYSTEM_TEXT; | 5386 ia_role = ROLE_SYSTEM_TEXT; |
5480 if (owner()->HasState(ui::AX_STATE_MULTILINE)) { | 5387 if (owner()->HasState(ui::AX_STATE_MULTILINE)) { |
5481 ia2_state |= IA2_STATE_MULTI_LINE; | 5388 ia2_state |= IA2_STATE_MULTI_LINE; |
5482 } else { | 5389 } else { |
5483 ia2_state |= IA2_STATE_SINGLE_LINE; | 5390 ia2_state |= IA2_STATE_SINGLE_LINE; |
5484 } | 5391 } |
5485 if (owner()->HasState(ui::AX_STATE_READ_ONLY)) | |
5486 ia_state |= STATE_SYSTEM_READONLY; | |
5487 ia2_state |= IA2_STATE_SELECTABLE_TEXT; | 5392 ia2_state |= IA2_STATE_SELECTABLE_TEXT; |
5488 break; | 5393 break; |
5489 case ui::AX_ROLE_ABBR: | 5394 case ui::AX_ROLE_ABBR: |
5490 case ui::AX_ROLE_TIME: | 5395 case ui::AX_ROLE_TIME: |
5491 role_name = html_tag; | 5396 role_name = html_tag; |
5492 ia_role = ROLE_SYSTEM_TEXT; | 5397 ia_role = ROLE_SYSTEM_TEXT; |
5493 ia2_role = IA2_ROLE_TEXT_FRAME; | 5398 ia2_role = IA2_ROLE_TEXT_FRAME; |
5494 break; | 5399 break; |
5495 case ui::AX_ROLE_TIMER: | 5400 case ui::AX_ROLE_TIMER: |
5496 ia_role = ROLE_SYSTEM_CLOCK; | 5401 ia_role = ROLE_SYSTEM_CLOCK; |
5497 ia_state |= STATE_SYSTEM_READONLY; | |
5498 break; | 5402 break; |
5499 case ui::AX_ROLE_TOOLBAR: | 5403 case ui::AX_ROLE_TOOLBAR: |
5500 ia_role = ROLE_SYSTEM_TOOLBAR; | 5404 ia_role = ROLE_SYSTEM_TOOLBAR; |
5501 ia_state |= STATE_SYSTEM_READONLY; | |
5502 break; | 5405 break; |
5503 case ui::AX_ROLE_TOOLTIP: | 5406 case ui::AX_ROLE_TOOLTIP: |
5504 ia_role = ROLE_SYSTEM_TOOLTIP; | 5407 ia_role = ROLE_SYSTEM_TOOLTIP; |
5505 ia_state |= STATE_SYSTEM_READONLY; | |
5506 break; | 5408 break; |
5507 case ui::AX_ROLE_TREE: | 5409 case ui::AX_ROLE_TREE: |
5508 ia_role = ROLE_SYSTEM_OUTLINE; | 5410 ia_role = ROLE_SYSTEM_OUTLINE; |
5509 break; | 5411 break; |
5510 case ui::AX_ROLE_TREE_GRID: | 5412 case ui::AX_ROLE_TREE_GRID: |
5511 ia_role = ROLE_SYSTEM_OUTLINE; | 5413 ia_role = ROLE_SYSTEM_OUTLINE; |
5512 break; | 5414 break; |
5513 case ui::AX_ROLE_TREE_ITEM: | 5415 case ui::AX_ROLE_TREE_ITEM: |
5514 ia_role = ROLE_SYSTEM_OUTLINEITEM; | 5416 ia_role = ROLE_SYSTEM_OUTLINEITEM; |
5515 break; | 5417 break; |
(...skipping 12 matching lines...) Expand all Loading... |
5528 case ui::AX_ROLE_IGNORED: | 5430 case ui::AX_ROLE_IGNORED: |
5529 case ui::AX_ROLE_LOG: | 5431 case ui::AX_ROLE_LOG: |
5530 case ui::AX_ROLE_NONE: | 5432 case ui::AX_ROLE_NONE: |
5531 case ui::AX_ROLE_PRESENTATIONAL: | 5433 case ui::AX_ROLE_PRESENTATIONAL: |
5532 case ui::AX_ROLE_SLIDER_THUMB: | 5434 case ui::AX_ROLE_SLIDER_THUMB: |
5533 default: | 5435 default: |
5534 ia_role = ROLE_SYSTEM_CLIENT; | 5436 ia_role = ROLE_SYSTEM_CLIENT; |
5535 break; | 5437 break; |
5536 } | 5438 } |
5537 | 5439 |
5538 // Compute the final value of READONLY for MSAA. | |
5539 // | |
5540 // We always set the READONLY state for elements that have the | |
5541 // aria-readonly attribute and for a few roles (in the switch above), | |
5542 // including read-only text fields. | |
5543 // The majority of focusable controls should not have the read-only state | |
5544 // set. | |
5545 if (owner()->HasState(ui::AX_STATE_FOCUSABLE) && | |
5546 ia_role != ROLE_SYSTEM_DOCUMENT && ia_role != ROLE_SYSTEM_TEXT) { | |
5547 ia_state &= ~(STATE_SYSTEM_READONLY); | |
5548 } | |
5549 if (!owner()->HasState(ui::AX_STATE_READ_ONLY)) | |
5550 ia_state &= ~(STATE_SYSTEM_READONLY); | |
5551 if (owner()->GetBoolAttribute(ui::AX_ATTR_ARIA_READONLY)) | |
5552 ia_state |= STATE_SYSTEM_READONLY; | |
5553 | |
5554 // The role should always be set. | 5440 // The role should always be set. |
5555 DCHECK(!role_name.empty() || ia_role); | 5441 DCHECK(!role_name.empty() || ia_role); |
5556 | 5442 |
5557 // If we didn't explicitly set the IAccessible2 role, make it the same | 5443 // If we didn't explicitly set the IAccessible2 role, make it the same |
5558 // as the MSAA role. | 5444 // as the MSAA role. |
5559 if (!ia2_role) | 5445 if (!ia2_role) |
5560 ia2_role = ia_role; | 5446 ia2_role = ia_role; |
5561 | 5447 |
5562 win_attributes_->ia_role = ia_role; | 5448 win_attributes_->ia_role = ia_role; |
5563 win_attributes_->ia_state = ia_state; | 5449 win_attributes_->ia_state = MSAAState(); |
5564 win_attributes_->role_name = role_name; | 5450 win_attributes_->role_name = role_name; |
5565 win_attributes_->ia2_role = ia2_role; | 5451 win_attributes_->ia2_role = ia2_role; |
5566 win_attributes_->ia2_state = ia2_state; | 5452 win_attributes_->ia2_state = ia2_state; |
5567 } | 5453 } |
5568 | 5454 |
5569 bool BrowserAccessibilityComWin::IsInTreeGrid( | 5455 bool BrowserAccessibilityComWin::IsInTreeGrid( |
5570 const BrowserAccessibility* item) { | 5456 const BrowserAccessibility* item) { |
5571 BrowserAccessibility* container = item->PlatformGetParent(); | 5457 BrowserAccessibility* container = item->PlatformGetParent(); |
5572 if (container && container->GetRole() == ui::AX_ROLE_GROUP) { | 5458 if (container && container->GetRole() == ui::AX_ROLE_GROUP) { |
5573 // If parent was a rowgroup, we need to look at the grandparent | 5459 // If parent was a rowgroup, we need to look at the grandparent |
5574 container = container->PlatformGetParent(); | 5460 container = container->PlatformGetParent(); |
5575 } | 5461 } |
5576 | 5462 |
5577 if (!container) { | 5463 if (!container) { |
5578 return false; | 5464 return false; |
5579 } | 5465 } |
5580 | 5466 |
5581 return container->GetRole() == ui::AX_ROLE_TREE_GRID; | 5467 return container->GetRole() == ui::AX_ROLE_TREE_GRID; |
5582 } | 5468 } |
5583 | 5469 |
5584 BrowserAccessibilityComWin* ToBrowserAccessibilityComWin( | 5470 BrowserAccessibilityComWin* ToBrowserAccessibilityComWin( |
5585 BrowserAccessibility* obj) { | 5471 BrowserAccessibility* obj) { |
5586 if (!obj || !obj->IsNative()) | 5472 if (!obj || !obj->IsNative()) |
5587 return nullptr; | 5473 return nullptr; |
5588 auto* result = static_cast<BrowserAccessibilityWin*>(obj)->GetCOM(); | 5474 auto* result = static_cast<BrowserAccessibilityWin*>(obj)->GetCOM(); |
5589 return result; | 5475 return result; |
5590 } | 5476 } |
5591 | 5477 |
5592 } // namespace content | 5478 } // namespace content |
OLD | NEW |