| 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 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 } | 130 } |
| 131 | 131 |
| 132 STDMETHODIMP BrowserAccessibilityComWin::get_uniqueID(LONG* unique_id) { | 132 STDMETHODIMP BrowserAccessibilityComWin::get_uniqueID(LONG* unique_id) { |
| 133 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_UNIQUE_ID); | 133 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_UNIQUE_ID); |
| 134 if (!owner()) | 134 if (!owner()) |
| 135 return E_FAIL; | 135 return E_FAIL; |
| 136 | 136 |
| 137 if (!unique_id) | 137 if (!unique_id) |
| 138 return E_INVALIDARG; | 138 return E_INVALIDARG; |
| 139 | 139 |
| 140 *unique_id = -owner()->unique_id(); | 140 *unique_id = -AXPlatformNodeWin::unique_id(); |
| 141 return S_OK; | 141 return S_OK; |
| 142 } | 142 } |
| 143 | 143 |
| 144 STDMETHODIMP BrowserAccessibilityComWin::get_windowHandle(HWND* window_handle) { | 144 STDMETHODIMP BrowserAccessibilityComWin::get_windowHandle(HWND* window_handle) { |
| 145 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_WINDOW_HANDLE); | 145 WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_WINDOW_HANDLE); |
| 146 if (!owner()) | 146 if (!owner()) |
| 147 return E_FAIL; | 147 return E_FAIL; |
| 148 | 148 |
| 149 if (!window_handle) | 149 if (!window_handle) |
| 150 return E_INVALIDARG; | 150 return E_INVALIDARG; |
| (...skipping 1091 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1242 AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes); | 1242 AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes); |
| 1243 if (!owner()) | 1243 if (!owner()) |
| 1244 return E_FAIL; | 1244 return E_FAIL; |
| 1245 | 1245 |
| 1246 if (!hyperlink || index < 0 || | 1246 if (!hyperlink || index < 0 || |
| 1247 index >= static_cast<long>(hyperlinks().size())) { | 1247 index >= static_cast<long>(hyperlinks().size())) { |
| 1248 return E_INVALIDARG; | 1248 return E_INVALIDARG; |
| 1249 } | 1249 } |
| 1250 | 1250 |
| 1251 int32_t id = hyperlinks()[index]; | 1251 int32_t id = hyperlinks()[index]; |
| 1252 BrowserAccessibilityComWin* link = | 1252 auto* link = static_cast<BrowserAccessibilityComWin*>( |
| 1253 ToBrowserAccessibilityComWin(owner()->GetFromUniqueID(id)); | 1253 AXPlatformNodeWin::GetFromUniqueId(id)); |
| 1254 if (!link) | 1254 if (!link) |
| 1255 return E_FAIL; | 1255 return E_FAIL; |
| 1256 | 1256 |
| 1257 *hyperlink = static_cast<IAccessibleHyperlink*>(link->NewReference()); | 1257 *hyperlink = static_cast<IAccessibleHyperlink*>(link->NewReference()); |
| 1258 return S_OK; | 1258 return S_OK; |
| 1259 } | 1259 } |
| 1260 | 1260 |
| 1261 STDMETHODIMP BrowserAccessibilityComWin::get_hyperlinkIndex( | 1261 STDMETHODIMP BrowserAccessibilityComWin::get_hyperlinkIndex( |
| 1262 long char_index, | 1262 long char_index, |
| 1263 long* hyperlink_index) { | 1263 long* hyperlink_index) { |
| (...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1701 | 1701 |
| 1702 base::string16 tag; | 1702 base::string16 tag; |
| 1703 if (owner()->GetString16Attribute(ui::AX_ATTR_HTML_TAG, &tag)) | 1703 if (owner()->GetString16Attribute(ui::AX_ATTR_HTML_TAG, &tag)) |
| 1704 *node_name = SysAllocString(tag.c_str()); | 1704 *node_name = SysAllocString(tag.c_str()); |
| 1705 else | 1705 else |
| 1706 *node_name = nullptr; | 1706 *node_name = nullptr; |
| 1707 | 1707 |
| 1708 *name_space_id = 0; | 1708 *name_space_id = 0; |
| 1709 *node_value = SysAllocString(value().c_str()); | 1709 *node_value = SysAllocString(value().c_str()); |
| 1710 *num_children = owner()->PlatformChildCount(); | 1710 *num_children = owner()->PlatformChildCount(); |
| 1711 *unique_id = -owner()->unique_id(); | 1711 *unique_id = -AXPlatformNodeWin::unique_id(); |
| 1712 | 1712 |
| 1713 if (owner()->IsDocument()) { | 1713 if (owner()->IsDocument()) { |
| 1714 *node_type = NODETYPE_DOCUMENT; | 1714 *node_type = NODETYPE_DOCUMENT; |
| 1715 } else if (owner()->IsTextOnlyObject()) { | 1715 } else if (owner()->IsTextOnlyObject()) { |
| 1716 *node_type = NODETYPE_TEXT; | 1716 *node_type = NODETYPE_TEXT; |
| 1717 } else { | 1717 } else { |
| 1718 *node_type = NODETYPE_ELEMENT; | 1718 *node_type = NODETYPE_ELEMENT; |
| 1719 } | 1719 } |
| 1720 | 1720 |
| 1721 return S_OK; | 1721 return S_OK; |
| (...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2455 // the character index of each embedded object character to the id of the | 2455 // the character index of each embedded object character to the id of the |
| 2456 // child object it points to. | 2456 // child object it points to. |
| 2457 for (unsigned int i = 0; i < owner()->PlatformChildCount(); ++i) { | 2457 for (unsigned int i = 0; i < owner()->PlatformChildCount(); ++i) { |
| 2458 auto* child = ToBrowserAccessibilityComWin(owner()->PlatformGetChild(i)); | 2458 auto* child = ToBrowserAccessibilityComWin(owner()->PlatformGetChild(i)); |
| 2459 DCHECK(child); | 2459 DCHECK(child); |
| 2460 // Similar to Firefox, we don't expose text-only objects in IA2 hypertext. | 2460 // Similar to Firefox, we don't expose text-only objects in IA2 hypertext. |
| 2461 if (child->owner()->IsTextOnlyObject()) { | 2461 if (child->owner()->IsTextOnlyObject()) { |
| 2462 win_attributes_->hypertext += child->name(); | 2462 win_attributes_->hypertext += child->name(); |
| 2463 } else { | 2463 } else { |
| 2464 int32_t char_offset = static_cast<int32_t>(owner()->GetText().size()); | 2464 int32_t char_offset = static_cast<int32_t>(owner()->GetText().size()); |
| 2465 int32_t child_unique_id = child->owner()->unique_id(); | 2465 int32_t child_unique_id = child->unique_id(); |
| 2466 int32_t index = hyperlinks().size(); | 2466 int32_t index = hyperlinks().size(); |
| 2467 win_attributes_->hyperlink_offset_to_index[char_offset] = index; | 2467 win_attributes_->hyperlink_offset_to_index[char_offset] = index; |
| 2468 win_attributes_->hyperlinks.push_back(child_unique_id); | 2468 win_attributes_->hyperlinks.push_back(child_unique_id); |
| 2469 win_attributes_->hypertext += kEmbeddedCharacter; | 2469 win_attributes_->hypertext += kEmbeddedCharacter; |
| 2470 } | 2470 } |
| 2471 } | 2471 } |
| 2472 } | 2472 } |
| 2473 | 2473 |
| 2474 void BrowserAccessibilityComWin::UpdateStep3FireEvents( | 2474 void BrowserAccessibilityComWin::UpdateStep3FireEvents( |
| 2475 bool is_subtree_creation) { | 2475 bool is_subtree_creation) { |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2570 // Detach BrowserAccessibilityWin from us. | 2570 // Detach BrowserAccessibilityWin from us. |
| 2571 owner_ = nullptr; | 2571 owner_ = nullptr; |
| 2572 AXPlatformNodeWin::Destroy(); | 2572 AXPlatformNodeWin::Destroy(); |
| 2573 } | 2573 } |
| 2574 | 2574 |
| 2575 void BrowserAccessibilityComWin::Init(ui::AXPlatformNodeDelegate* delegate) { | 2575 void BrowserAccessibilityComWin::Init(ui::AXPlatformNodeDelegate* delegate) { |
| 2576 owner_ = static_cast<BrowserAccessibilityWin*>(delegate); | 2576 owner_ = static_cast<BrowserAccessibilityWin*>(delegate); |
| 2577 AXPlatformNodeBase::Init(delegate); | 2577 AXPlatformNodeBase::Init(delegate); |
| 2578 } | 2578 } |
| 2579 | 2579 |
| 2580 ui::AXPlatformNode* BrowserAccessibilityComWin::GetFromUniqueId( | |
| 2581 int32_t unique_id) { | |
| 2582 return ToBrowserAccessibilityComWin( | |
| 2583 BrowserAccessibility::GetFromUniqueID(unique_id)); | |
| 2584 } | |
| 2585 | |
| 2586 std::vector<base::string16> BrowserAccessibilityComWin::ComputeTextAttributes() | 2580 std::vector<base::string16> BrowserAccessibilityComWin::ComputeTextAttributes() |
| 2587 const { | 2581 const { |
| 2588 std::vector<base::string16> attributes; | 2582 std::vector<base::string16> attributes; |
| 2589 | 2583 |
| 2590 // We include list markers for now, but there might be other objects that are | 2584 // We include list markers for now, but there might be other objects that are |
| 2591 // auto generated. | 2585 // auto generated. |
| 2592 // TODO(nektar): Compute what objects are auto-generated in Blink. | 2586 // TODO(nektar): Compute what objects are auto-generated in Blink. |
| 2593 if (owner()->GetRole() == ui::AX_ROLE_LIST_MARKER) | 2587 if (owner()->GetRole() == ui::AX_ROLE_LIST_MARKER) |
| 2594 attributes.push_back(L"auto-generated:true"); | 2588 attributes.push_back(L"auto-generated:true"); |
| 2595 else | 2589 else |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2824 | 2818 |
| 2825 LONG child_id = var_id.lVal; | 2819 LONG child_id = var_id.lVal; |
| 2826 if (child_id == CHILDID_SELF) | 2820 if (child_id == CHILDID_SELF) |
| 2827 return this; | 2821 return this; |
| 2828 | 2822 |
| 2829 if (child_id >= 1 && | 2823 if (child_id >= 1 && |
| 2830 child_id <= static_cast<LONG>(owner()->PlatformChildCount())) | 2824 child_id <= static_cast<LONG>(owner()->PlatformChildCount())) |
| 2831 return ToBrowserAccessibilityComWin( | 2825 return ToBrowserAccessibilityComWin( |
| 2832 owner()->PlatformGetChild(child_id - 1)); | 2826 owner()->PlatformGetChild(child_id - 1)); |
| 2833 | 2827 |
| 2834 BrowserAccessibilityComWin* child = ToBrowserAccessibilityComWin( | 2828 auto* child = static_cast<BrowserAccessibilityComWin*>( |
| 2835 BrowserAccessibility::GetFromUniqueID(-child_id)); | 2829 AXPlatformNodeWin::GetFromUniqueId(-child_id)); |
| 2836 if (child && child->owner()->IsDescendantOf(owner())) | 2830 if (child && child->owner()->IsDescendantOf(owner())) |
| 2837 return child; | 2831 return child; |
| 2838 | 2832 |
| 2839 return nullptr; | 2833 return nullptr; |
| 2840 } | 2834 } |
| 2841 | 2835 |
| 2842 HRESULT BrowserAccessibilityComWin::GetStringAttributeAsBstr( | 2836 HRESULT BrowserAccessibilityComWin::GetStringAttributeAsBstr( |
| 2843 ui::AXStringAttribute attribute, | 2837 ui::AXStringAttribute attribute, |
| 2844 BSTR* value_bstr) { | 2838 BSTR* value_bstr) { |
| 2845 base::string16 str; | 2839 base::string16 str; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2899 BrowserAccessibilityComWin::GetHyperlinkFromHypertextOffset(int offset) const { | 2893 BrowserAccessibilityComWin::GetHyperlinkFromHypertextOffset(int offset) const { |
| 2900 std::map<int32_t, int32_t>::iterator iterator = | 2894 std::map<int32_t, int32_t>::iterator iterator = |
| 2901 hyperlink_offset_to_index().find(offset); | 2895 hyperlink_offset_to_index().find(offset); |
| 2902 if (iterator == hyperlink_offset_to_index().end()) | 2896 if (iterator == hyperlink_offset_to_index().end()) |
| 2903 return nullptr; | 2897 return nullptr; |
| 2904 | 2898 |
| 2905 int32_t index = iterator->second; | 2899 int32_t index = iterator->second; |
| 2906 DCHECK_GE(index, 0); | 2900 DCHECK_GE(index, 0); |
| 2907 DCHECK_LT(index, static_cast<int32_t>(hyperlinks().size())); | 2901 DCHECK_LT(index, static_cast<int32_t>(hyperlinks().size())); |
| 2908 int32_t id = hyperlinks()[index]; | 2902 int32_t id = hyperlinks()[index]; |
| 2909 BrowserAccessibilityComWin* hyperlink = | 2903 auto* hyperlink = static_cast<BrowserAccessibilityComWin*>( |
| 2910 ToBrowserAccessibilityComWin(owner()->GetFromUniqueID(id)); | 2904 AXPlatformNodeWin::GetFromUniqueId(id)); |
| 2911 if (!hyperlink) | 2905 if (!hyperlink) |
| 2912 return nullptr; | 2906 return nullptr; |
| 2913 return hyperlink; | 2907 return hyperlink; |
| 2914 } | 2908 } |
| 2915 | 2909 |
| 2916 int32_t BrowserAccessibilityComWin::GetHyperlinkIndexFromChild( | 2910 int32_t BrowserAccessibilityComWin::GetHyperlinkIndexFromChild( |
| 2917 const BrowserAccessibilityComWin& child) const { | 2911 const BrowserAccessibilityComWin& child) const { |
| 2918 if (hyperlinks().empty()) | 2912 if (hyperlinks().empty()) |
| 2919 return -1; | 2913 return -1; |
| 2920 | 2914 |
| 2921 auto iterator = std::find(hyperlinks().begin(), hyperlinks().end(), | 2915 auto iterator = |
| 2922 child.owner()->unique_id()); | 2916 std::find(hyperlinks().begin(), hyperlinks().end(), child.unique_id()); |
| 2923 if (iterator == hyperlinks().end()) | 2917 if (iterator == hyperlinks().end()) |
| 2924 return -1; | 2918 return -1; |
| 2925 | 2919 |
| 2926 return static_cast<int32_t>(iterator - hyperlinks().begin()); | 2920 return static_cast<int32_t>(iterator - hyperlinks().begin()); |
| 2927 } | 2921 } |
| 2928 | 2922 |
| 2929 int32_t BrowserAccessibilityComWin::GetHypertextOffsetFromHyperlinkIndex( | 2923 int32_t BrowserAccessibilityComWin::GetHypertextOffsetFromHyperlinkIndex( |
| 2930 int32_t hyperlink_index) const { | 2924 int32_t hyperlink_index) const { |
| 2931 for (auto& offset_index : hyperlink_offset_to_index()) { | 2925 for (auto& offset_index : hyperlink_offset_to_index()) { |
| 2932 if (offset_index.second == hyperlink_index) | 2926 if (offset_index.second == hyperlink_index) |
| (...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3371 | 3365 |
| 3372 BrowserAccessibilityComWin* ToBrowserAccessibilityComWin( | 3366 BrowserAccessibilityComWin* ToBrowserAccessibilityComWin( |
| 3373 BrowserAccessibility* obj) { | 3367 BrowserAccessibility* obj) { |
| 3374 if (!obj || !obj->IsNative()) | 3368 if (!obj || !obj->IsNative()) |
| 3375 return nullptr; | 3369 return nullptr; |
| 3376 auto* result = static_cast<BrowserAccessibilityWin*>(obj)->GetCOM(); | 3370 auto* result = static_cast<BrowserAccessibilityWin*>(obj)->GetCOM(); |
| 3377 return result; | 3371 return result; |
| 3378 } | 3372 } |
| 3379 | 3373 |
| 3380 } // namespace content | 3374 } // namespace content |
| OLD | NEW |