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 = -AXPlatformNodeWin::unique_id(); | 140 *unique_id = -owner()->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 auto* link = static_cast<BrowserAccessibilityComWin*>( | 1252 BrowserAccessibilityComWin* link = |
1253 AXPlatformNodeWin::GetFromUniqueId(id)); | 1253 ToBrowserAccessibilityComWin(owner()->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 = -AXPlatformNodeWin::unique_id(); | 1711 *unique_id = -owner()->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 754 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2476 // the character index of each embedded object character to the id of the | 2476 // the character index of each embedded object character to the id of the |
2477 // child object it points to. | 2477 // child object it points to. |
2478 for (unsigned int i = 0; i < owner()->PlatformChildCount(); ++i) { | 2478 for (unsigned int i = 0; i < owner()->PlatformChildCount(); ++i) { |
2479 auto* child = ToBrowserAccessibilityComWin(owner()->PlatformGetChild(i)); | 2479 auto* child = ToBrowserAccessibilityComWin(owner()->PlatformGetChild(i)); |
2480 DCHECK(child); | 2480 DCHECK(child); |
2481 // Similar to Firefox, we don't expose text-only objects in IA2 hypertext. | 2481 // Similar to Firefox, we don't expose text-only objects in IA2 hypertext. |
2482 if (child->owner()->IsTextOnlyObject()) { | 2482 if (child->owner()->IsTextOnlyObject()) { |
2483 win_attributes_->hypertext += child->name(); | 2483 win_attributes_->hypertext += child->name(); |
2484 } else { | 2484 } else { |
2485 int32_t char_offset = static_cast<int32_t>(owner()->GetText().size()); | 2485 int32_t char_offset = static_cast<int32_t>(owner()->GetText().size()); |
2486 int32_t child_unique_id = child->unique_id(); | 2486 int32_t child_unique_id = child->owner()->unique_id(); |
2487 int32_t index = hyperlinks().size(); | 2487 int32_t index = hyperlinks().size(); |
2488 win_attributes_->hyperlink_offset_to_index[char_offset] = index; | 2488 win_attributes_->hyperlink_offset_to_index[char_offset] = index; |
2489 win_attributes_->hyperlinks.push_back(child_unique_id); | 2489 win_attributes_->hyperlinks.push_back(child_unique_id); |
2490 win_attributes_->hypertext += kEmbeddedCharacter; | 2490 win_attributes_->hypertext += kEmbeddedCharacter; |
2491 } | 2491 } |
2492 } | 2492 } |
2493 } | 2493 } |
2494 | 2494 |
2495 void BrowserAccessibilityComWin::UpdateStep3FireEvents( | 2495 void BrowserAccessibilityComWin::UpdateStep3FireEvents( |
2496 bool is_subtree_creation) { | 2496 bool is_subtree_creation) { |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2591 // Detach BrowserAccessibilityWin from us. | 2591 // Detach BrowserAccessibilityWin from us. |
2592 owner_ = nullptr; | 2592 owner_ = nullptr; |
2593 AXPlatformNodeWin::Destroy(); | 2593 AXPlatformNodeWin::Destroy(); |
2594 } | 2594 } |
2595 | 2595 |
2596 void BrowserAccessibilityComWin::Init(ui::AXPlatformNodeDelegate* delegate) { | 2596 void BrowserAccessibilityComWin::Init(ui::AXPlatformNodeDelegate* delegate) { |
2597 owner_ = static_cast<BrowserAccessibilityWin*>(delegate); | 2597 owner_ = static_cast<BrowserAccessibilityWin*>(delegate); |
2598 AXPlatformNodeBase::Init(delegate); | 2598 AXPlatformNodeBase::Init(delegate); |
2599 } | 2599 } |
2600 | 2600 |
| 2601 ui::AXPlatformNode* BrowserAccessibilityComWin::GetFromUniqueId( |
| 2602 int32_t unique_id) { |
| 2603 return ToBrowserAccessibilityComWin( |
| 2604 BrowserAccessibility::GetFromUniqueID(unique_id)); |
| 2605 } |
| 2606 |
2601 std::vector<base::string16> BrowserAccessibilityComWin::ComputeTextAttributes() | 2607 std::vector<base::string16> BrowserAccessibilityComWin::ComputeTextAttributes() |
2602 const { | 2608 const { |
2603 std::vector<base::string16> attributes; | 2609 std::vector<base::string16> attributes; |
2604 | 2610 |
2605 // We include list markers for now, but there might be other objects that are | 2611 // We include list markers for now, but there might be other objects that are |
2606 // auto generated. | 2612 // auto generated. |
2607 // TODO(nektar): Compute what objects are auto-generated in Blink. | 2613 // TODO(nektar): Compute what objects are auto-generated in Blink. |
2608 if (owner()->GetRole() == ui::AX_ROLE_LIST_MARKER) | 2614 if (owner()->GetRole() == ui::AX_ROLE_LIST_MARKER) |
2609 attributes.push_back(L"auto-generated:true"); | 2615 attributes.push_back(L"auto-generated:true"); |
2610 else | 2616 else |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2839 | 2845 |
2840 LONG child_id = var_id.lVal; | 2846 LONG child_id = var_id.lVal; |
2841 if (child_id == CHILDID_SELF) | 2847 if (child_id == CHILDID_SELF) |
2842 return this; | 2848 return this; |
2843 | 2849 |
2844 if (child_id >= 1 && | 2850 if (child_id >= 1 && |
2845 child_id <= static_cast<LONG>(owner()->PlatformChildCount())) | 2851 child_id <= static_cast<LONG>(owner()->PlatformChildCount())) |
2846 return ToBrowserAccessibilityComWin( | 2852 return ToBrowserAccessibilityComWin( |
2847 owner()->PlatformGetChild(child_id - 1)); | 2853 owner()->PlatformGetChild(child_id - 1)); |
2848 | 2854 |
2849 auto* child = static_cast<BrowserAccessibilityComWin*>( | 2855 BrowserAccessibilityComWin* child = ToBrowserAccessibilityComWin( |
2850 AXPlatformNodeWin::GetFromUniqueId(-child_id)); | 2856 BrowserAccessibility::GetFromUniqueID(-child_id)); |
2851 if (child && child->owner()->IsDescendantOf(owner())) | 2857 if (child && child->owner()->IsDescendantOf(owner())) |
2852 return child; | 2858 return child; |
2853 | 2859 |
2854 return nullptr; | 2860 return nullptr; |
2855 } | 2861 } |
2856 | 2862 |
2857 HRESULT BrowserAccessibilityComWin::GetStringAttributeAsBstr( | 2863 HRESULT BrowserAccessibilityComWin::GetStringAttributeAsBstr( |
2858 ui::AXStringAttribute attribute, | 2864 ui::AXStringAttribute attribute, |
2859 BSTR* value_bstr) { | 2865 BSTR* value_bstr) { |
2860 base::string16 str; | 2866 base::string16 str; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2914 BrowserAccessibilityComWin::GetHyperlinkFromHypertextOffset(int offset) const { | 2920 BrowserAccessibilityComWin::GetHyperlinkFromHypertextOffset(int offset) const { |
2915 std::map<int32_t, int32_t>::iterator iterator = | 2921 std::map<int32_t, int32_t>::iterator iterator = |
2916 hyperlink_offset_to_index().find(offset); | 2922 hyperlink_offset_to_index().find(offset); |
2917 if (iterator == hyperlink_offset_to_index().end()) | 2923 if (iterator == hyperlink_offset_to_index().end()) |
2918 return nullptr; | 2924 return nullptr; |
2919 | 2925 |
2920 int32_t index = iterator->second; | 2926 int32_t index = iterator->second; |
2921 DCHECK_GE(index, 0); | 2927 DCHECK_GE(index, 0); |
2922 DCHECK_LT(index, static_cast<int32_t>(hyperlinks().size())); | 2928 DCHECK_LT(index, static_cast<int32_t>(hyperlinks().size())); |
2923 int32_t id = hyperlinks()[index]; | 2929 int32_t id = hyperlinks()[index]; |
2924 auto* hyperlink = static_cast<BrowserAccessibilityComWin*>( | 2930 BrowserAccessibilityComWin* hyperlink = |
2925 AXPlatformNodeWin::GetFromUniqueId(id)); | 2931 ToBrowserAccessibilityComWin(owner()->GetFromUniqueID(id)); |
2926 if (!hyperlink) | 2932 if (!hyperlink) |
2927 return nullptr; | 2933 return nullptr; |
2928 return hyperlink; | 2934 return hyperlink; |
2929 } | 2935 } |
2930 | 2936 |
2931 int32_t BrowserAccessibilityComWin::GetHyperlinkIndexFromChild( | 2937 int32_t BrowserAccessibilityComWin::GetHyperlinkIndexFromChild( |
2932 const BrowserAccessibilityComWin& child) const { | 2938 const BrowserAccessibilityComWin& child) const { |
2933 if (hyperlinks().empty()) | 2939 if (hyperlinks().empty()) |
2934 return -1; | 2940 return -1; |
2935 | 2941 |
2936 auto iterator = | 2942 auto iterator = std::find(hyperlinks().begin(), hyperlinks().end(), |
2937 std::find(hyperlinks().begin(), hyperlinks().end(), child.unique_id()); | 2943 child.owner()->unique_id()); |
2938 if (iterator == hyperlinks().end()) | 2944 if (iterator == hyperlinks().end()) |
2939 return -1; | 2945 return -1; |
2940 | 2946 |
2941 return static_cast<int32_t>(iterator - hyperlinks().begin()); | 2947 return static_cast<int32_t>(iterator - hyperlinks().begin()); |
2942 } | 2948 } |
2943 | 2949 |
2944 int32_t BrowserAccessibilityComWin::GetHypertextOffsetFromHyperlinkIndex( | 2950 int32_t BrowserAccessibilityComWin::GetHypertextOffsetFromHyperlinkIndex( |
2945 int32_t hyperlink_index) const { | 2951 int32_t hyperlink_index) const { |
2946 for (auto& offset_index : hyperlink_offset_to_index()) { | 2952 for (auto& offset_index : hyperlink_offset_to_index()) { |
2947 if (offset_index.second == hyperlink_index) | 2953 if (offset_index.second == hyperlink_index) |
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3386 | 3392 |
3387 BrowserAccessibilityComWin* ToBrowserAccessibilityComWin( | 3393 BrowserAccessibilityComWin* ToBrowserAccessibilityComWin( |
3388 BrowserAccessibility* obj) { | 3394 BrowserAccessibility* obj) { |
3389 if (!obj || !obj->IsNative()) | 3395 if (!obj || !obj->IsNative()) |
3390 return nullptr; | 3396 return nullptr; |
3391 auto* result = static_cast<BrowserAccessibilityWin*>(obj)->GetCOM(); | 3397 auto* result = static_cast<BrowserAccessibilityWin*>(obj)->GetCOM(); |
3392 return result; | 3398 return result; |
3393 } | 3399 } |
3394 | 3400 |
3395 } // namespace content | 3401 } // namespace content |
OLD | NEW |