| 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 595 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   606 STDMETHODIMP BrowserAccessibilityComWin::get_accState(VARIANT var_id, |   606 STDMETHODIMP BrowserAccessibilityComWin::get_accState(VARIANT var_id, | 
|   607                                                       VARIANT* state) { |   607                                                       VARIANT* state) { | 
|   608   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_STATE); |   608   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_STATE); | 
|   609   if (!owner()) |   609   if (!owner()) | 
|   610     return E_FAIL; |   610     return E_FAIL; | 
|   611  |   611  | 
|   612   return AXPlatformNodeWin::get_accState(var_id, state); |   612   return AXPlatformNodeWin::get_accState(var_id, state); | 
|   613 } |   613 } | 
|   614  |   614  | 
|   615 bool BrowserAccessibilityComWin::IsRangeValueSupported() { |   615 bool BrowserAccessibilityComWin::IsRangeValueSupported() { | 
|   616   switch (ia_role()) { |   616   switch (MSAARole()) { | 
|   617     case ROLE_SYSTEM_PROGRESSBAR: |   617     case ROLE_SYSTEM_PROGRESSBAR: | 
|   618     case ROLE_SYSTEM_SLIDER: |   618     case ROLE_SYSTEM_SLIDER: | 
|   619     case ROLE_SYSTEM_SPINBUTTON: |   619     case ROLE_SYSTEM_SPINBUTTON: | 
|   620     case ROLE_SYSTEM_SCROLLBAR: |   620     case ROLE_SYSTEM_SCROLLBAR: | 
|   621       return true; |   621       return true; | 
|   622     case ROLE_SYSTEM_SEPARATOR: |   622     case ROLE_SYSTEM_SEPARATOR: | 
|   623       return owner()->HasState(ui::AX_STATE_FOCUSABLE); |   623       return owner()->HasState(ui::AX_STATE_FOCUSABLE); | 
|   624     default: |   624     default: | 
|   625       return false; |   625       return false; | 
|   626   } |   626   } | 
| (...skipping 2767 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3394 // |  3394 // | 
|  3395  |  3395  | 
|  3396 // static |  3396 // static | 
|  3397 HRESULT WINAPI BrowserAccessibilityComWin::InternalQueryInterface( |  3397 HRESULT WINAPI BrowserAccessibilityComWin::InternalQueryInterface( | 
|  3398     void* this_ptr, |  3398     void* this_ptr, | 
|  3399     const _ATL_INTMAP_ENTRY* entries, |  3399     const _ATL_INTMAP_ENTRY* entries, | 
|  3400     REFIID iid, |  3400     REFIID iid, | 
|  3401     void** object) { |  3401     void** object) { | 
|  3402   BrowserAccessibilityComWin* accessibility = |  3402   BrowserAccessibilityComWin* accessibility = | 
|  3403       reinterpret_cast<BrowserAccessibilityComWin*>(this_ptr); |  3403       reinterpret_cast<BrowserAccessibilityComWin*>(this_ptr); | 
|  3404   int32_t ia_role = accessibility->ia_role(); |  3404   int32_t ia_role = accessibility->MSAARole(); | 
|  3405   if (iid == IID_IAccessibleImage) { |  3405   if (iid == IID_IAccessibleImage) { | 
|  3406     if (ia_role != ROLE_SYSTEM_GRAPHIC) { |  3406     if (ia_role != ROLE_SYSTEM_GRAPHIC) { | 
|  3407       *object = NULL; |  3407       *object = NULL; | 
|  3408       return E_NOINTERFACE; |  3408       return E_NOINTERFACE; | 
|  3409     } |  3409     } | 
|  3410   } else if (iid == IID_IAccessibleTable || iid == IID_IAccessibleTable2) { |  3410   } else if (iid == IID_IAccessibleTable || iid == IID_IAccessibleTable2) { | 
|  3411     if (ia_role != ROLE_SYSTEM_TABLE) { |  3411     if (ia_role != ROLE_SYSTEM_TABLE) { | 
|  3412       *object = NULL; |  3412       *object = NULL; | 
|  3413       return E_NOINTERFACE; |  3413       return E_NOINTERFACE; | 
|  3414     } |  3414     } | 
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3653   // Expose aria-colindex and aria-rowindex in a cell or row. |  3653   // Expose aria-colindex and aria-rowindex in a cell or row. | 
|  3654   if (ui::IsCellOrTableHeaderRole(owner()->GetRole()) || |  3654   if (ui::IsCellOrTableHeaderRole(owner()->GetRole()) || | 
|  3655       owner()->GetRole() == ui::AX_ROLE_ROW) { |  3655       owner()->GetRole() == ui::AX_ROLE_ROW) { | 
|  3656     if (owner()->GetRole() != ui::AX_ROLE_ROW) |  3656     if (owner()->GetRole() != ui::AX_ROLE_ROW) | 
|  3657       IntAttributeToIA2(ui::AX_ATTR_ARIA_CELL_COLUMN_INDEX, "colindex"); |  3657       IntAttributeToIA2(ui::AX_ATTR_ARIA_CELL_COLUMN_INDEX, "colindex"); | 
|  3658     IntAttributeToIA2(ui::AX_ATTR_ARIA_CELL_ROW_INDEX, "rowindex"); |  3658     IntAttributeToIA2(ui::AX_ATTR_ARIA_CELL_ROW_INDEX, "rowindex"); | 
|  3659   } |  3659   } | 
|  3660  |  3660  | 
|  3661   // Expose row or column header sort direction. |  3661   // Expose row or column header sort direction. | 
|  3662   int32_t sort_direction; |  3662   int32_t sort_direction; | 
|  3663   if ((ia_role() == ROLE_SYSTEM_COLUMNHEADER || |  3663   if ((MSAARole() == ROLE_SYSTEM_COLUMNHEADER || | 
|  3664        ia_role() == ROLE_SYSTEM_ROWHEADER) && |  3664        MSAARole() == ROLE_SYSTEM_ROWHEADER) && | 
|  3665       owner()->GetIntAttribute(ui::AX_ATTR_SORT_DIRECTION, &sort_direction)) { |  3665       owner()->GetIntAttribute(ui::AX_ATTR_SORT_DIRECTION, &sort_direction)) { | 
|  3666     switch (static_cast<ui::AXSortDirection>(sort_direction)) { |  3666     switch (static_cast<ui::AXSortDirection>(sort_direction)) { | 
|  3667       case ui::AX_SORT_DIRECTION_NONE: |  3667       case ui::AX_SORT_DIRECTION_NONE: | 
|  3668         break; |  3668         break; | 
|  3669       case ui::AX_SORT_DIRECTION_UNSORTED: |  3669       case ui::AX_SORT_DIRECTION_UNSORTED: | 
|  3670         win_attributes_->ia2_attributes.push_back(L"sort:none"); |  3670         win_attributes_->ia2_attributes.push_back(L"sort:none"); | 
|  3671         break; |  3671         break; | 
|  3672       case ui::AX_SORT_DIRECTION_ASCENDING: |  3672       case ui::AX_SORT_DIRECTION_ASCENDING: | 
|  3673         win_attributes_->ia2_attributes.push_back(L"sort:ascending"); |  3673         win_attributes_->ia2_attributes.push_back(L"sort:ascending"); | 
|  3674         break; |  3674         break; | 
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3733  |  3733  | 
|  3734   int error_message_id; |  3734   int error_message_id; | 
|  3735   if (owner()->GetIntAttribute(ui::AX_ATTR_ERRORMESSAGE_ID, &error_message_id)) |  3735   if (owner()->GetIntAttribute(ui::AX_ATTR_ERRORMESSAGE_ID, &error_message_id)) | 
|  3736     AddRelation(IA2_RELATION_ERROR_MESSAGE, error_message_id); |  3736     AddRelation(IA2_RELATION_ERROR_MESSAGE, error_message_id); | 
|  3737  |  3737  | 
|  3738   UpdateRequiredAttributes(); |  3738   UpdateRequiredAttributes(); | 
|  3739   // If this is a web area for a presentational iframe, give it a role of |  3739   // If this is a web area for a presentational iframe, give it a role of | 
|  3740   // something other than DOCUMENT so that the fact that it's a separate doc |  3740   // something other than DOCUMENT so that the fact that it's a separate doc | 
|  3741   // is not exposed to AT. |  3741   // is not exposed to AT. | 
|  3742   if (owner()->IsWebAreaForPresentationalIframe()) { |  3742   if (owner()->IsWebAreaForPresentationalIframe()) { | 
|  3743     win_attributes_->ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  3744     win_attributes_->ia2_role = ROLE_SYSTEM_GROUPING; |  3743     win_attributes_->ia2_role = ROLE_SYSTEM_GROUPING; | 
|  3745   } |  3744   } | 
|  3746 } |  3745 } | 
|  3747  |  3746  | 
|  3748 void BrowserAccessibilityComWin::UpdateStep2ComputeHypertext() { |  3747 void BrowserAccessibilityComWin::UpdateStep2ComputeHypertext() { | 
|  3749   if (owner()->IsSimpleTextControl()) { |  3748   if (owner()->IsSimpleTextControl()) { | 
|  3750     win_attributes_->hypertext = value(); |  3749     win_attributes_->hypertext = value(); | 
|  3751     return; |  3750     return; | 
|  3752   } |  3751   } | 
|  3753  |  3752  | 
| (...skipping 1159 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  4913   } |  4912   } | 
|  4914 } |  4913 } | 
|  4915  |  4914  | 
|  4916 void BrowserAccessibilityComWin::FireNativeEvent(LONG win_event_type) const { |  4915 void BrowserAccessibilityComWin::FireNativeEvent(LONG win_event_type) const { | 
|  4917   (new BrowserAccessibilityEventWin(BrowserAccessibilityEvent::FromTreeChange, |  4916   (new BrowserAccessibilityEventWin(BrowserAccessibilityEvent::FromTreeChange, | 
|  4918                                     ui::AX_EVENT_NONE, win_event_type, owner())) |  4917                                     ui::AX_EVENT_NONE, win_event_type, owner())) | 
|  4919       ->Fire(); |  4918       ->Fire(); | 
|  4920 } |  4919 } | 
|  4921  |  4920  | 
|  4922 void BrowserAccessibilityComWin::InitRoleAndState() { |  4921 void BrowserAccessibilityComWin::InitRoleAndState() { | 
|  4923   int32_t ia_role = 0; |  | 
|  4924   base::string16 role_name; |  | 
|  4925   int32_t ia2_role = 0; |  4922   int32_t ia2_role = 0; | 
|  4926   int32_t ia2_state = IA2_STATE_OPAQUE; |  4923   int32_t ia2_state = IA2_STATE_OPAQUE; | 
|  4927  |  4924  | 
|  4928   const auto checked_state = static_cast<ui::AXCheckedState>( |  4925   const auto checked_state = static_cast<ui::AXCheckedState>( | 
|  4929       owner()->GetIntAttribute(ui::AX_ATTR_CHECKED_STATE)); |  4926       owner()->GetIntAttribute(ui::AX_ATTR_CHECKED_STATE)); | 
|  4930   if (checked_state) { |  4927   if (checked_state) { | 
|  4931     ia2_state |= IA2_STATE_CHECKABLE; |  4928     ia2_state |= IA2_STATE_CHECKABLE; | 
|  4932   } |  4929   } | 
|  4933  |  4930  | 
|  4934   if (owner()->HasIntAttribute(ui::AX_ATTR_INVALID_STATE) && |  4931   if (owner()->HasIntAttribute(ui::AX_ATTR_INVALID_STATE) && | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
|  4959   } |  4956   } | 
|  4960  |  4957  | 
|  4961   if (!owner()->GetStringAttribute(ui::AX_ATTR_AUTO_COMPLETE).empty()) |  4958   if (!owner()->GetStringAttribute(ui::AX_ATTR_AUTO_COMPLETE).empty()) | 
|  4962     ia2_state |= IA2_STATE_SUPPORTS_AUTOCOMPLETION; |  4959     ia2_state |= IA2_STATE_SUPPORTS_AUTOCOMPLETION; | 
|  4963  |  4960  | 
|  4964   if (owner()->GetBoolAttribute(ui::AX_ATTR_MODAL)) |  4961   if (owner()->GetBoolAttribute(ui::AX_ATTR_MODAL)) | 
|  4965     ia2_state |= IA2_STATE_MODAL; |  4962     ia2_state |= IA2_STATE_MODAL; | 
|  4966  |  4963  | 
|  4967   base::string16 html_tag = owner()->GetString16Attribute(ui::AX_ATTR_HTML_TAG); |  4964   base::string16 html_tag = owner()->GetString16Attribute(ui::AX_ATTR_HTML_TAG); | 
|  4968   switch (owner()->GetRole()) { |  4965   switch (owner()->GetRole()) { | 
|  4969     case ui::AX_ROLE_ALERT: |  | 
|  4970       ia_role = ROLE_SYSTEM_ALERT; |  | 
|  4971       break; |  | 
|  4972     case ui::AX_ROLE_ALERT_DIALOG: |  | 
|  4973       ia_role = ROLE_SYSTEM_DIALOG; |  | 
|  4974       break; |  | 
|  4975     case ui::AX_ROLE_ANCHOR: |  | 
|  4976       ia_role = ROLE_SYSTEM_LINK; |  | 
|  4977       break; |  | 
|  4978     case ui::AX_ROLE_APPLICATION: |  | 
|  4979       ia_role = ROLE_SYSTEM_APPLICATION; |  | 
|  4980       break; |  | 
|  4981     case ui::AX_ROLE_ARTICLE: |  | 
|  4982       ia_role = ROLE_SYSTEM_DOCUMENT; |  | 
|  4983       break; |  | 
|  4984     case ui::AX_ROLE_AUDIO: |  | 
|  4985       ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  4986       break; |  | 
|  4987     case ui::AX_ROLE_BANNER: |  4966     case ui::AX_ROLE_BANNER: | 
|  4988       ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  4989       ia2_role = IA2_ROLE_HEADER; |  4967       ia2_role = IA2_ROLE_HEADER; | 
|  4990       break; |  4968       break; | 
|  4991     case ui::AX_ROLE_BLOCKQUOTE: |  4969     case ui::AX_ROLE_BLOCKQUOTE: | 
|  4992       role_name = html_tag; |  | 
|  4993       ia2_role = IA2_ROLE_SECTION; |  4970       ia2_role = IA2_ROLE_SECTION; | 
|  4994       break; |  4971       break; | 
|  4995     case ui::AX_ROLE_BUSY_INDICATOR: |  | 
|  4996       ia_role = ROLE_SYSTEM_ANIMATION; |  | 
|  4997       break; |  | 
|  4998     case ui::AX_ROLE_BUTTON: |  | 
|  4999       ia_role = ROLE_SYSTEM_PUSHBUTTON; |  | 
|  5000       break; |  | 
|  5001     case ui::AX_ROLE_CANVAS: |  4972     case ui::AX_ROLE_CANVAS: | 
|  5002       if (owner()->GetBoolAttribute(ui::AX_ATTR_CANVAS_HAS_FALLBACK)) { |  4973       if (owner()->GetBoolAttribute(ui::AX_ATTR_CANVAS_HAS_FALLBACK)) { | 
|  5003         role_name = L"canvas"; |  | 
|  5004         ia2_role = IA2_ROLE_CANVAS; |  4974         ia2_role = IA2_ROLE_CANVAS; | 
|  5005       } else { |  | 
|  5006         ia_role = ROLE_SYSTEM_GRAPHIC; |  | 
|  5007       } |  4975       } | 
|  5008       break; |  4976       break; | 
|  5009     case ui::AX_ROLE_CAPTION: |  4977     case ui::AX_ROLE_CAPTION: | 
|  5010       ia_role = ROLE_SYSTEM_TEXT; |  | 
|  5011       ia2_role = IA2_ROLE_CAPTION; |  4978       ia2_role = IA2_ROLE_CAPTION; | 
|  5012       break; |  4979       break; | 
|  5013     case ui::AX_ROLE_CELL: |  | 
|  5014       ia_role = ROLE_SYSTEM_CELL; |  | 
|  5015       break; |  | 
|  5016     case ui::AX_ROLE_CHECK_BOX: |  | 
|  5017       ia_role = ROLE_SYSTEM_CHECKBUTTON; |  | 
|  5018       break; |  | 
|  5019     case ui::AX_ROLE_COLOR_WELL: |  4980     case ui::AX_ROLE_COLOR_WELL: | 
|  5020       ia_role = ROLE_SYSTEM_TEXT; |  | 
|  5021       ia2_role = IA2_ROLE_COLOR_CHOOSER; |  4981       ia2_role = IA2_ROLE_COLOR_CHOOSER; | 
|  5022       break; |  4982       break; | 
|  5023     case ui::AX_ROLE_COLUMN: |  | 
|  5024       ia_role = ROLE_SYSTEM_COLUMN; |  | 
|  5025       break; |  | 
|  5026     case ui::AX_ROLE_COLUMN_HEADER: |  | 
|  5027       ia_role = ROLE_SYSTEM_COLUMNHEADER; |  | 
|  5028       break; |  | 
|  5029     case ui::AX_ROLE_COMBO_BOX: |  | 
|  5030       ia_role = ROLE_SYSTEM_COMBOBOX; |  | 
|  5031       break; |  | 
|  5032     case ui::AX_ROLE_COMPLEMENTARY: |  4983     case ui::AX_ROLE_COMPLEMENTARY: | 
|  5033       ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  5034       ia2_role = IA2_ROLE_NOTE; |  4984       ia2_role = IA2_ROLE_NOTE; | 
|  5035       break; |  4985       break; | 
|  5036     case ui::AX_ROLE_CONTENT_INFO: |  4986     case ui::AX_ROLE_CONTENT_INFO: | 
|  5037       ia_role = ROLE_SYSTEM_TEXT; |  | 
|  5038       ia2_role = IA2_ROLE_PARAGRAPH; |  4987       ia2_role = IA2_ROLE_PARAGRAPH; | 
|  5039       break; |  4988       break; | 
|  5040     case ui::AX_ROLE_DATE: |  4989     case ui::AX_ROLE_DATE: | 
|  5041     case ui::AX_ROLE_DATE_TIME: |  4990     case ui::AX_ROLE_DATE_TIME: | 
|  5042       ia_role = ROLE_SYSTEM_DROPLIST; |  | 
|  5043       ia2_role = IA2_ROLE_DATE_EDITOR; |  4991       ia2_role = IA2_ROLE_DATE_EDITOR; | 
|  5044       break; |  4992       break; | 
|  5045     case ui::AX_ROLE_DEFINITION: |  4993     case ui::AX_ROLE_DEFINITION: | 
|  5046       role_name = html_tag; |  | 
|  5047       ia2_role = IA2_ROLE_PARAGRAPH; |  4994       ia2_role = IA2_ROLE_PARAGRAPH; | 
|  5048       break; |  4995       break; | 
|  5049     case ui::AX_ROLE_DESCRIPTION_LIST_DETAIL: |  4996     case ui::AX_ROLE_DESCRIPTION_LIST_DETAIL: | 
|  5050       role_name = html_tag; |  | 
|  5051       ia_role = ROLE_SYSTEM_TEXT; |  | 
|  5052       ia2_role = IA2_ROLE_PARAGRAPH; |  4997       ia2_role = IA2_ROLE_PARAGRAPH; | 
|  5053       break; |  4998       break; | 
|  5054     case ui::AX_ROLE_DESCRIPTION_LIST: |  | 
|  5055       role_name = html_tag; |  | 
|  5056       ia_role = ROLE_SYSTEM_LIST; |  | 
|  5057       break; |  | 
|  5058     case ui::AX_ROLE_DESCRIPTION_LIST_TERM: |  | 
|  5059       ia_role = ROLE_SYSTEM_LISTITEM; |  | 
|  5060       break; |  | 
|  5061     case ui::AX_ROLE_DETAILS: |  | 
|  5062       role_name = html_tag; |  | 
|  5063       ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  5064       break; |  | 
|  5065     case ui::AX_ROLE_DIALOG: |  | 
|  5066       ia_role = ROLE_SYSTEM_DIALOG; |  | 
|  5067       break; |  | 
|  5068     case ui::AX_ROLE_DISCLOSURE_TRIANGLE: |  | 
|  5069       ia_role = ROLE_SYSTEM_PUSHBUTTON; |  | 
|  5070       break; |  | 
|  5071     case ui::AX_ROLE_DOCUMENT: |  | 
|  5072     case ui::AX_ROLE_ROOT_WEB_AREA: |  | 
|  5073     case ui::AX_ROLE_WEB_AREA: |  | 
|  5074       ia_role = ROLE_SYSTEM_DOCUMENT; |  | 
|  5075       break; |  | 
|  5076     case ui::AX_ROLE_EMBEDDED_OBJECT: |  4999     case ui::AX_ROLE_EMBEDDED_OBJECT: | 
|  5077       if (owner()->PlatformChildCount()) { |  5000       if (!owner()->PlatformChildCount()) { | 
|  5078         // Windows screen readers assume that IA2_ROLE_EMBEDDED_OBJECT |  | 
|  5079         // doesn't have any children, but it may be something like a |  | 
|  5080         // browser plugin that has a document inside. |  | 
|  5081         ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  5082       } else { |  | 
|  5083         ia_role = ROLE_SYSTEM_CLIENT; |  | 
|  5084         ia2_role = IA2_ROLE_EMBEDDED_OBJECT; |  5001         ia2_role = IA2_ROLE_EMBEDDED_OBJECT; | 
|  5085       } |  5002       } | 
|  5086       break; |  5003       break; | 
|  5087     case ui::AX_ROLE_FIGCAPTION: |  5004     case ui::AX_ROLE_FIGCAPTION: | 
|  5088       role_name = html_tag; |  | 
|  5089       ia2_role = IA2_ROLE_CAPTION; |  5005       ia2_role = IA2_ROLE_CAPTION; | 
|  5090       break; |  5006       break; | 
|  5091     case ui::AX_ROLE_FIGURE: |  | 
|  5092       ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  5093       break; |  | 
|  5094     case ui::AX_ROLE_FEED: |  | 
|  5095       ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  5096       break; |  | 
|  5097     case ui::AX_ROLE_FORM: |  5007     case ui::AX_ROLE_FORM: | 
|  5098       role_name = L"form"; |  | 
|  5099       ia2_role = IA2_ROLE_FORM; |  5008       ia2_role = IA2_ROLE_FORM; | 
|  5100       break; |  5009       break; | 
|  5101     case ui::AX_ROLE_FOOTER: |  5010     case ui::AX_ROLE_FOOTER: | 
|  5102       ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  5103       ia2_role = IA2_ROLE_FOOTER; |  5011       ia2_role = IA2_ROLE_FOOTER; | 
|  5104       break; |  5012       break; | 
|  5105     case ui::AX_ROLE_GENERIC_CONTAINER: |  5013     case ui::AX_ROLE_GENERIC_CONTAINER: | 
|  5106       ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  5107       ia2_role = IA2_ROLE_SECTION; |  5014       ia2_role = IA2_ROLE_SECTION; | 
|  5108       role_name = html_tag.empty() ? L"div" : html_tag; |  | 
|  5109       break; |  | 
|  5110     case ui::AX_ROLE_GRID: |  | 
|  5111       ia_role = ROLE_SYSTEM_TABLE; |  | 
|  5112       break; |  | 
|  5113     case ui::AX_ROLE_GROUP: |  | 
|  5114       ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  5115       break; |  5015       break; | 
|  5116     case ui::AX_ROLE_HEADING: |  5016     case ui::AX_ROLE_HEADING: | 
|  5117       role_name = html_tag; |  | 
|  5118       if (html_tag.empty()) |  | 
|  5119         ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  5120       ia2_role = IA2_ROLE_HEADING; |  5017       ia2_role = IA2_ROLE_HEADING; | 
|  5121       break; |  5018       break; | 
|  5122     case ui::AX_ROLE_IFRAME: |  5019     case ui::AX_ROLE_IFRAME: | 
|  5123       ia_role = ROLE_SYSTEM_DOCUMENT; |  | 
|  5124       ia2_role = IA2_ROLE_INTERNAL_FRAME; |  5020       ia2_role = IA2_ROLE_INTERNAL_FRAME; | 
|  5125       break; |  5021       break; | 
|  5126     case ui::AX_ROLE_IFRAME_PRESENTATIONAL: |  | 
|  5127       ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  5128       break; |  | 
|  5129     case ui::AX_ROLE_IMAGE: |  | 
|  5130       ia_role = ROLE_SYSTEM_GRAPHIC; |  | 
|  5131       break; |  | 
|  5132     case ui::AX_ROLE_IMAGE_MAP: |  5022     case ui::AX_ROLE_IMAGE_MAP: | 
|  5133       role_name = html_tag; |  | 
|  5134       ia2_role = IA2_ROLE_IMAGE_MAP; |  5023       ia2_role = IA2_ROLE_IMAGE_MAP; | 
|  5135       break; |  5024       break; | 
|  5136     case ui::AX_ROLE_IMAGE_MAP_LINK: |  | 
|  5137       ia_role = ROLE_SYSTEM_LINK; |  | 
|  5138       break; |  | 
|  5139     case ui::AX_ROLE_INPUT_TIME: |  | 
|  5140       ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  5141       break; |  | 
|  5142     case ui::AX_ROLE_LABEL_TEXT: |  5025     case ui::AX_ROLE_LABEL_TEXT: | 
|  5143     case ui::AX_ROLE_LEGEND: |  5026     case ui::AX_ROLE_LEGEND: | 
|  5144       ia_role = ROLE_SYSTEM_TEXT; |  | 
|  5145       ia2_role = IA2_ROLE_LABEL; |  5027       ia2_role = IA2_ROLE_LABEL; | 
|  5146       break; |  5028       break; | 
|  5147     case ui::AX_ROLE_LINK: |  | 
|  5148       ia_role = ROLE_SYSTEM_LINK; |  | 
|  5149       break; |  | 
|  5150     case ui::AX_ROLE_LIST: |  | 
|  5151       ia_role = ROLE_SYSTEM_LIST; |  | 
|  5152       break; |  | 
|  5153     case ui::AX_ROLE_LIST_BOX: |  | 
|  5154       ia_role = ROLE_SYSTEM_LIST; |  | 
|  5155       break; |  | 
|  5156     case ui::AX_ROLE_LIST_BOX_OPTION: |  | 
|  5157       ia_role = ROLE_SYSTEM_LISTITEM; |  | 
|  5158       break; |  | 
|  5159     case ui::AX_ROLE_LIST_ITEM: |  | 
|  5160       ia_role = ROLE_SYSTEM_LISTITEM; |  | 
|  5161       break; |  | 
|  5162     case ui::AX_ROLE_MAIN: |  5029     case ui::AX_ROLE_MAIN: | 
|  5163       ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  5164       ia2_role = IA2_ROLE_PARAGRAPH; |  5030       ia2_role = IA2_ROLE_PARAGRAPH; | 
|  5165       break; |  5031       break; | 
|  5166     case ui::AX_ROLE_MARK: |  5032     case ui::AX_ROLE_MARK: | 
|  5167       ia_role = ROLE_SYSTEM_TEXT; |  | 
|  5168       ia2_role = IA2_ROLE_TEXT_FRAME; |  5033       ia2_role = IA2_ROLE_TEXT_FRAME; | 
|  5169       break; |  5034       break; | 
|  5170     case ui::AX_ROLE_MARQUEE: |  | 
|  5171       ia_role = ROLE_SYSTEM_ANIMATION; |  | 
|  5172       break; |  | 
|  5173     case ui::AX_ROLE_MATH: |  | 
|  5174       ia_role = ROLE_SYSTEM_EQUATION; |  | 
|  5175       break; |  | 
|  5176     case ui::AX_ROLE_MENU: |  | 
|  5177     case ui::AX_ROLE_MENU_BUTTON: |  | 
|  5178       ia_role = ROLE_SYSTEM_MENUPOPUP; |  | 
|  5179       break; |  | 
|  5180     case ui::AX_ROLE_MENU_BAR: |  | 
|  5181       ia_role = ROLE_SYSTEM_MENUBAR; |  | 
|  5182       break; |  | 
|  5183     case ui::AX_ROLE_MENU_ITEM: |  | 
|  5184       ia_role = ROLE_SYSTEM_MENUITEM; |  | 
|  5185       break; |  | 
|  5186     case ui::AX_ROLE_MENU_ITEM_CHECK_BOX: |  5035     case ui::AX_ROLE_MENU_ITEM_CHECK_BOX: | 
|  5187       ia_role = ROLE_SYSTEM_MENUITEM; |  | 
|  5188       ia2_role = IA2_ROLE_CHECK_MENU_ITEM; |  5036       ia2_role = IA2_ROLE_CHECK_MENU_ITEM; | 
|  5189       break; |  5037       break; | 
|  5190     case ui::AX_ROLE_MENU_ITEM_RADIO: |  5038     case ui::AX_ROLE_MENU_ITEM_RADIO: | 
|  5191       ia_role = ROLE_SYSTEM_MENUITEM; |  | 
|  5192       ia2_role = IA2_ROLE_RADIO_MENU_ITEM; |  5039       ia2_role = IA2_ROLE_RADIO_MENU_ITEM; | 
|  5193       break; |  5040       break; | 
|  5194     case ui::AX_ROLE_MENU_LIST_POPUP: |  5041     case ui::AX_ROLE_MENU_LIST_POPUP: | 
|  5195       ia_role = ROLE_SYSTEM_LIST; |  | 
|  5196       ia2_state &= ~(IA2_STATE_EDITABLE); |  5042       ia2_state &= ~(IA2_STATE_EDITABLE); | 
|  5197       break; |  5043       break; | 
|  5198     case ui::AX_ROLE_MENU_LIST_OPTION: |  5044     case ui::AX_ROLE_MENU_LIST_OPTION: | 
|  5199       ia_role = ROLE_SYSTEM_LISTITEM; |  | 
|  5200       ia2_state &= ~(IA2_STATE_EDITABLE); |  5045       ia2_state &= ~(IA2_STATE_EDITABLE); | 
|  5201       break; |  5046       break; | 
|  5202     case ui::AX_ROLE_METER: |  | 
|  5203       role_name = html_tag; |  | 
|  5204       ia_role = ROLE_SYSTEM_PROGRESSBAR; |  | 
|  5205       break; |  | 
|  5206     case ui::AX_ROLE_NAVIGATION: |  5047     case ui::AX_ROLE_NAVIGATION: | 
|  5207       ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  5208       ia2_role = IA2_ROLE_SECTION; |  5048       ia2_role = IA2_ROLE_SECTION; | 
|  5209       break; |  5049       break; | 
|  5210     case ui::AX_ROLE_NOTE: |  5050     case ui::AX_ROLE_NOTE: | 
|  5211       ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  5212       ia2_role = IA2_ROLE_NOTE; |  5051       ia2_role = IA2_ROLE_NOTE; | 
|  5213       break; |  5052       break; | 
|  5214     case ui::AX_ROLE_OUTLINE: |  | 
|  5215       ia_role = ROLE_SYSTEM_OUTLINE; |  | 
|  5216       break; |  | 
|  5217     case ui::AX_ROLE_PARAGRAPH: |  5053     case ui::AX_ROLE_PARAGRAPH: | 
|  5218       role_name = L"P"; |  | 
|  5219       ia2_role = IA2_ROLE_PARAGRAPH; |  5054       ia2_role = IA2_ROLE_PARAGRAPH; | 
|  5220       break; |  5055       break; | 
|  5221     case ui::AX_ROLE_POP_UP_BUTTON: |  | 
|  5222       if (html_tag == L"select") { |  | 
|  5223         ia_role = ROLE_SYSTEM_COMBOBOX; |  | 
|  5224       } else { |  | 
|  5225         ia_role = ROLE_SYSTEM_BUTTONMENU; |  | 
|  5226       } |  | 
|  5227       break; |  | 
|  5228     case ui::AX_ROLE_PRE: |  5056     case ui::AX_ROLE_PRE: | 
|  5229       role_name = html_tag; |  | 
|  5230       ia_role = ROLE_SYSTEM_TEXT; |  | 
|  5231       ia2_role = IA2_ROLE_PARAGRAPH; |  5057       ia2_role = IA2_ROLE_PARAGRAPH; | 
|  5232       break; |  5058       break; | 
|  5233     case ui::AX_ROLE_PROGRESS_INDICATOR: |  | 
|  5234       ia_role = ROLE_SYSTEM_PROGRESSBAR; |  | 
|  5235       break; |  | 
|  5236     case ui::AX_ROLE_RADIO_BUTTON: |  | 
|  5237       ia_role = ROLE_SYSTEM_RADIOBUTTON; |  | 
|  5238       break; |  | 
|  5239     case ui::AX_ROLE_RADIO_GROUP: |  | 
|  5240       ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  5241       break; |  | 
|  5242     case ui::AX_ROLE_REGION: |  5059     case ui::AX_ROLE_REGION: | 
|  5243       if (html_tag == L"section") { |  5060       if (html_tag == L"section") { | 
|  5244         ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  5245         ia2_role = IA2_ROLE_SECTION; |  5061         ia2_role = IA2_ROLE_SECTION; | 
|  5246       } else { |  | 
|  5247         ia_role = ROLE_SYSTEM_PANE; |  | 
|  5248       } |  5062       } | 
|  5249       break; |  5063       break; | 
|  5250     case ui::AX_ROLE_ROW: { |  | 
|  5251       // Role changes depending on whether row is inside a treegrid |  | 
|  5252       // https://www.w3.org/TR/core-aam-1.1/#role-map-row |  | 
|  5253       ia_role = |  | 
|  5254           IsInTreeGrid(owner()) ? ROLE_SYSTEM_OUTLINEITEM : ROLE_SYSTEM_ROW; |  | 
|  5255       break; |  | 
|  5256     } |  | 
|  5257     case ui::AX_ROLE_ROW_HEADER: |  | 
|  5258       ia_role = ROLE_SYSTEM_ROWHEADER; |  | 
|  5259       break; |  | 
|  5260     case ui::AX_ROLE_RUBY: |  5064     case ui::AX_ROLE_RUBY: | 
|  5261       ia_role = ROLE_SYSTEM_TEXT; |  | 
|  5262       ia2_role = IA2_ROLE_TEXT_FRAME; |  5065       ia2_role = IA2_ROLE_TEXT_FRAME; | 
|  5263       break; |  5066       break; | 
|  5264     case ui::AX_ROLE_RULER: |  5067     case ui::AX_ROLE_RULER: | 
|  5265       ia_role = ROLE_SYSTEM_CLIENT; |  | 
|  5266       ia2_role = IA2_ROLE_RULER; |  5068       ia2_role = IA2_ROLE_RULER; | 
|  5267       break; |  5069       break; | 
|  5268     case ui::AX_ROLE_SCROLL_AREA: |  5070     case ui::AX_ROLE_SCROLL_AREA: | 
|  5269       ia_role = ROLE_SYSTEM_CLIENT; |  | 
|  5270       ia2_role = IA2_ROLE_SCROLL_PANE; |  5071       ia2_role = IA2_ROLE_SCROLL_PANE; | 
|  5271       ia2_state &= ~(IA2_STATE_EDITABLE); |  5072       ia2_state &= ~(IA2_STATE_EDITABLE); | 
|  5272       break; |  5073       break; | 
|  5273     case ui::AX_ROLE_SCROLL_BAR: |  | 
|  5274       ia_role = ROLE_SYSTEM_SCROLLBAR; |  | 
|  5275       break; |  | 
|  5276     case ui::AX_ROLE_SEARCH: |  5074     case ui::AX_ROLE_SEARCH: | 
|  5277       ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  5278       ia2_role = IA2_ROLE_SECTION; |  5075       ia2_role = IA2_ROLE_SECTION; | 
|  5279       break; |  5076       break; | 
|  5280     case ui::AX_ROLE_SLIDER: |  | 
|  5281       ia_role = ROLE_SYSTEM_SLIDER; |  | 
|  5282       break; |  | 
|  5283     case ui::AX_ROLE_SPIN_BUTTON: |  | 
|  5284       ia_role = ROLE_SYSTEM_SPINBUTTON; |  | 
|  5285       break; |  | 
|  5286     case ui::AX_ROLE_SPIN_BUTTON_PART: |  | 
|  5287       ia_role = ROLE_SYSTEM_PUSHBUTTON; |  | 
|  5288       break; |  | 
|  5289     case ui::AX_ROLE_ANNOTATION: |  | 
|  5290     case ui::AX_ROLE_LIST_MARKER: |  | 
|  5291     case ui::AX_ROLE_STATIC_TEXT: |  | 
|  5292       ia_role = ROLE_SYSTEM_STATICTEXT; |  | 
|  5293       break; |  | 
|  5294     case ui::AX_ROLE_STATUS: |  | 
|  5295       ia_role = ROLE_SYSTEM_STATUSBAR; |  | 
|  5296       break; |  | 
|  5297     case ui::AX_ROLE_SPLITTER: |  | 
|  5298       ia_role = ROLE_SYSTEM_SEPARATOR; |  | 
|  5299       break; |  | 
|  5300     case ui::AX_ROLE_SVG_ROOT: |  | 
|  5301       ia_role = ROLE_SYSTEM_GRAPHIC; |  | 
|  5302       break; |  | 
|  5303     case ui::AX_ROLE_SWITCH: |  5077     case ui::AX_ROLE_SWITCH: | 
|  5304       role_name = L"switch"; |  | 
|  5305       ia2_role = IA2_ROLE_TOGGLE_BUTTON; |  5078       ia2_role = IA2_ROLE_TOGGLE_BUTTON; | 
|  5306       break; |  5079       break; | 
|  5307     case ui::AX_ROLE_TAB: |  | 
|  5308       ia_role = ROLE_SYSTEM_PAGETAB; |  | 
|  5309       break; |  | 
|  5310     case ui::AX_ROLE_TABLE: |  | 
|  5311       ia_role = ROLE_SYSTEM_TABLE; |  | 
|  5312       break; |  | 
|  5313     case ui::AX_ROLE_TABLE_HEADER_CONTAINER: |  5080     case ui::AX_ROLE_TABLE_HEADER_CONTAINER: | 
|  5314       ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  5315       ia2_role = IA2_ROLE_SECTION; |  5081       ia2_role = IA2_ROLE_SECTION; | 
|  5316       break; |  5082       break; | 
|  5317     case ui::AX_ROLE_TAB_LIST: |  | 
|  5318       ia_role = ROLE_SYSTEM_PAGETABLIST; |  | 
|  5319       break; |  | 
|  5320     case ui::AX_ROLE_TAB_PANEL: |  | 
|  5321       ia_role = ROLE_SYSTEM_PROPERTYPAGE; |  | 
|  5322       break; |  | 
|  5323     case ui::AX_ROLE_TERM: |  | 
|  5324       ia_role = ROLE_SYSTEM_LISTITEM; |  | 
|  5325       break; |  | 
|  5326     case ui::AX_ROLE_TOGGLE_BUTTON: |  5083     case ui::AX_ROLE_TOGGLE_BUTTON: | 
|  5327       ia_role = ROLE_SYSTEM_PUSHBUTTON; |  | 
|  5328       ia2_role = IA2_ROLE_TOGGLE_BUTTON; |  5084       ia2_role = IA2_ROLE_TOGGLE_BUTTON; | 
|  5329       break; |  5085       break; | 
|  5330     case ui::AX_ROLE_TEXT_FIELD: |  5086     case ui::AX_ROLE_TEXT_FIELD: | 
|  5331     case ui::AX_ROLE_SEARCH_BOX: |  5087     case ui::AX_ROLE_SEARCH_BOX: | 
|  5332       ia_role = ROLE_SYSTEM_TEXT; |  | 
|  5333       ia2_state |= IA2_STATE_SELECTABLE_TEXT; |  5088       ia2_state |= IA2_STATE_SELECTABLE_TEXT; | 
|  5334       break; |  5089       break; | 
|  5335     case ui::AX_ROLE_ABBR: |  5090     case ui::AX_ROLE_ABBR: | 
|  5336     case ui::AX_ROLE_TIME: |  5091     case ui::AX_ROLE_TIME: | 
|  5337       role_name = html_tag; |  | 
|  5338       ia_role = ROLE_SYSTEM_TEXT; |  | 
|  5339       ia2_role = IA2_ROLE_TEXT_FRAME; |  5092       ia2_role = IA2_ROLE_TEXT_FRAME; | 
|  5340       break; |  5093       break; | 
|  5341     case ui::AX_ROLE_TIMER: |  | 
|  5342       ia_role = ROLE_SYSTEM_CLOCK; |  | 
|  5343       break; |  | 
|  5344     case ui::AX_ROLE_TOOLBAR: |  | 
|  5345       ia_role = ROLE_SYSTEM_TOOLBAR; |  | 
|  5346       break; |  | 
|  5347     case ui::AX_ROLE_TOOLTIP: |  | 
|  5348       ia_role = ROLE_SYSTEM_TOOLTIP; |  | 
|  5349       break; |  | 
|  5350     case ui::AX_ROLE_TREE: |  | 
|  5351       ia_role = ROLE_SYSTEM_OUTLINE; |  | 
|  5352       break; |  | 
|  5353     case ui::AX_ROLE_TREE_GRID: |  | 
|  5354       ia_role = ROLE_SYSTEM_OUTLINE; |  | 
|  5355       break; |  | 
|  5356     case ui::AX_ROLE_TREE_ITEM: |  | 
|  5357       ia_role = ROLE_SYSTEM_OUTLINEITEM; |  | 
|  5358       break; |  | 
|  5359     case ui::AX_ROLE_LINE_BREAK: |  | 
|  5360       ia_role = ROLE_SYSTEM_WHITESPACE; |  | 
|  5361       break; |  | 
|  5362     case ui::AX_ROLE_VIDEO: |  | 
|  5363       ia_role = ROLE_SYSTEM_GROUPING; |  | 
|  5364       break; |  | 
|  5365     case ui::AX_ROLE_WINDOW: |  | 
|  5366       ia_role = ROLE_SYSTEM_WINDOW; |  | 
|  5367       break; |  | 
|  5368  |  | 
|  5369     // TODO(dmazzoni): figure out the proper MSAA role for all of these. |  | 
|  5370     case ui::AX_ROLE_DIRECTORY: |  | 
|  5371     case ui::AX_ROLE_IGNORED: |  | 
|  5372     case ui::AX_ROLE_LOG: |  | 
|  5373     case ui::AX_ROLE_NONE: |  | 
|  5374     case ui::AX_ROLE_PRESENTATIONAL: |  | 
|  5375     case ui::AX_ROLE_SLIDER_THUMB: |  | 
|  5376     default: |  5094     default: | 
|  5377       ia_role = ROLE_SYSTEM_CLIENT; |  | 
|  5378       break; |  5095       break; | 
|  5379   } |  5096   } | 
|  5380  |  5097  | 
|  5381   // The role should always be set. |  5098   win_attributes_->ia_role = MSAARole(); | 
|  5382   DCHECK(!role_name.empty() || ia_role); |  5099   win_attributes_->ia_state = MSAAState(); | 
 |  5100   win_attributes_->role_name = base::UTF8ToUTF16(StringOverrideForMSAARole()); | 
|  5383  |  5101  | 
|  5384   // If we didn't explicitly set the IAccessible2 role, make it the same |  5102   // If we didn't explicitly set the IAccessible2 role, make it the same | 
|  5385   // as the MSAA role. |  5103   // as the MSAA role. | 
|  5386   if (!ia2_role) |  5104   if (!ia2_role) | 
|  5387     ia2_role = ia_role; |  5105     ia2_role = win_attributes_->ia_role; | 
|  5388  |  5106  | 
|  5389   win_attributes_->ia_role = ia_role; |  | 
|  5390   win_attributes_->ia_state = MSAAState(); |  | 
|  5391   win_attributes_->role_name = role_name; |  | 
|  5392   win_attributes_->ia2_role = ia2_role; |  5107   win_attributes_->ia2_role = ia2_role; | 
|  5393   win_attributes_->ia2_state = ia2_state; |  5108   win_attributes_->ia2_state = ia2_state; | 
|  5394 } |  5109 } | 
|  5395  |  5110  | 
|  5396 bool BrowserAccessibilityComWin::IsInTreeGrid( |  | 
|  5397     const BrowserAccessibility* item) { |  | 
|  5398   BrowserAccessibility* container = item->PlatformGetParent(); |  | 
|  5399   if (container && container->GetRole() == ui::AX_ROLE_GROUP) { |  | 
|  5400     // If parent was a rowgroup, we need to look at the grandparent |  | 
|  5401     container = container->PlatformGetParent(); |  | 
|  5402   } |  | 
|  5403  |  | 
|  5404   if (!container) { |  | 
|  5405     return false; |  | 
|  5406   } |  | 
|  5407  |  | 
|  5408   return container->GetRole() == ui::AX_ROLE_TREE_GRID; |  | 
|  5409 } |  | 
|  5410  |  | 
|  5411 BrowserAccessibilityComWin* ToBrowserAccessibilityComWin( |  5111 BrowserAccessibilityComWin* ToBrowserAccessibilityComWin( | 
|  5412     BrowserAccessibility* obj) { |  5112     BrowserAccessibility* obj) { | 
|  5413   if (!obj || !obj->IsNative()) |  5113   if (!obj || !obj->IsNative()) | 
|  5414     return nullptr; |  5114     return nullptr; | 
|  5415   auto* result = static_cast<BrowserAccessibilityWin*>(obj)->GetCOM(); |  5115   auto* result = static_cast<BrowserAccessibilityWin*>(obj)->GetCOM(); | 
|  5416   return result; |  5116   return result; | 
|  5417 } |  5117 } | 
|  5418  |  5118  | 
|  5419 }  // namespace content |  5119 }  // namespace content | 
| OLD | NEW |