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

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

Issue 2943243002: Forward BrowserAccessibility get_accState to AXPlatformNode. (Closed)
Patch Set: Mask out focus changes when determining if we should broadcast EVENT_OBJECT_STATECHANGE Created 3 years, 5 months 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) 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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « content/browser/accessibility/browser_accessibility_com_win.h ('k') | ui/accessibility/platform/ax_fake_caret_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698