| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <stddef.h> | 5 #include <stddef.h> |
| 6 #include <stdint.h> | 6 #include <stdint.h> |
| 7 | 7 |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| 11 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
| 12 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
| 13 #include "base/strings/sys_string_conversions.h" | 13 #include "base/strings/sys_string_conversions.h" |
| 14 #include "base/win/scoped_bstr.h" | 14 #include "base/win/scoped_bstr.h" |
| 15 #include "base/win/scoped_comptr.h" | 15 #include "base/win/scoped_comptr.h" |
| 16 #include "base/win/scoped_variant.h" | 16 #include "base/win/scoped_variant.h" |
| 17 #include "content/browser/accessibility/accessibility_mode_helper.h" | 17 #include "content/browser/accessibility/accessibility_mode_helper.h" |
| 18 #include "content/browser/accessibility/accessibility_tree_formatter.h" | 18 #include "content/browser/accessibility/accessibility_tree_formatter.h" |
| 19 #include "content/browser/accessibility/accessibility_tree_formatter_utils_win.h
" | 19 #include "content/browser/accessibility/accessibility_tree_formatter_utils_win.h
" |
| 20 #include "content/browser/accessibility/browser_accessibility_win.h" |
| 20 #include "content/browser/renderer_host/render_view_host_impl.h" | 21 #include "content/browser/renderer_host/render_view_host_impl.h" |
| 21 #include "content/public/browser/notification_service.h" | 22 #include "content/public/browser/notification_service.h" |
| 22 #include "content/public/browser/notification_types.h" | 23 #include "content/public/browser/notification_types.h" |
| 23 #include "content/public/browser/render_frame_host.h" | 24 #include "content/public/browser/render_frame_host.h" |
| 24 #include "content/public/browser/render_widget_host_view.h" | 25 #include "content/public/browser/render_widget_host_view.h" |
| 25 #include "content/public/browser/web_contents.h" | 26 #include "content/public/browser/web_contents.h" |
| 26 #include "content/public/common/url_constants.h" | 27 #include "content/public/common/url_constants.h" |
| 27 #include "content/public/test/content_browser_test.h" | 28 #include "content/public/test/content_browser_test.h" |
| 28 #include "content/public/test/content_browser_test_utils.h" | 29 #include "content/public/test/content_browser_test_utils.h" |
| 29 #include "content/shell/browser/shell.h" | 30 #include "content/shell/browser/shell.h" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 56 | 57 |
| 57 protected: | 58 protected: |
| 58 class AccessibleChecker; | 59 class AccessibleChecker; |
| 59 void LoadInitialAccessibilityTreeFromHtml(const std::string& html); | 60 void LoadInitialAccessibilityTreeFromHtml(const std::string& html); |
| 60 IAccessible* GetRendererAccessible(); | 61 IAccessible* GetRendererAccessible(); |
| 61 void ExecuteScript(const std::wstring& script); | 62 void ExecuteScript(const std::wstring& script); |
| 62 void SetUpInputField( | 63 void SetUpInputField( |
| 63 base::win::ScopedComPtr<IAccessibleText>* input_text); | 64 base::win::ScopedComPtr<IAccessibleText>* input_text); |
| 64 void SetUpTextareaField( | 65 void SetUpTextareaField( |
| 65 base::win::ScopedComPtr<IAccessibleText>* textarea_text); | 66 base::win::ScopedComPtr<IAccessibleText>* textarea_text); |
| 67 void SetUpSampleParagraph( |
| 68 base::win::ScopedComPtr<IAccessibleText>* paragraph_text); |
| 66 | 69 |
| 67 static base::win::ScopedComPtr<IAccessible> GetAccessibleFromVariant( | 70 static base::win::ScopedComPtr<IAccessible> GetAccessibleFromVariant( |
| 68 IAccessible* parent, | 71 IAccessible* parent, |
| 69 VARIANT* var); | 72 VARIANT* var); |
| 70 static HRESULT QueryIAccessible2(IAccessible* accessible, | 73 static HRESULT QueryIAccessible2(IAccessible* accessible, |
| 71 IAccessible2** accessible2); | 74 IAccessible2** accessible2); |
| 72 static void FindNodeInAccessibilityTree(IAccessible* node, | 75 static void FindNodeInAccessibilityTree(IAccessible* node, |
| 73 int32_t expected_role, | 76 int32_t expected_role, |
| 74 const std::wstring& expected_name, | 77 const std::wstring& expected_name, |
| 75 int32_t depth, | 78 int32_t depth, |
| 76 bool* found); | 79 bool* found); |
| 77 static void CheckTextAtOffset( | 80 static void CheckTextAtOffset( |
| 78 base::win::ScopedComPtr<IAccessibleText>& element, | 81 base::win::ScopedComPtr<IAccessibleText>& object, |
| 79 LONG offset, | 82 LONG offset, |
| 80 IA2TextBoundaryType boundary_type, | 83 IA2TextBoundaryType boundary_type, |
| 81 LONG expected_start_offset, | 84 LONG expected_start_offset, |
| 82 LONG expected_end_offset, | 85 LONG expected_end_offset, |
| 83 const std::wstring& expected_text); | 86 const std::wstring& expected_text); |
| 84 static std::vector<base::win::ScopedVariant> GetAllAccessibleChildren( | 87 static std::vector<base::win::ScopedVariant> GetAllAccessibleChildren( |
| 85 IAccessible* element); | 88 IAccessible* element); |
| 86 | 89 |
| 87 private: | 90 private: |
| 88 DISALLOW_COPY_AND_ASSIGN(AccessibilityWinBrowserTest); | 91 DISALLOW_COPY_AND_ASSIGN(AccessibilityWinBrowserTest); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 net::EscapeQueryParamValue(INPUT_CONTENTS, false) + std::string( | 129 net::EscapeQueryParamValue(INPUT_CONTENTS, false) + std::string( |
| 127 "'></form></body></html>")); | 130 "'></form></body></html>")); |
| 128 | 131 |
| 129 // Retrieve the IAccessible interface for the web page. | 132 // Retrieve the IAccessible interface for the web page. |
| 130 base::win::ScopedComPtr<IAccessible> document(GetRendererAccessible()); | 133 base::win::ScopedComPtr<IAccessible> document(GetRendererAccessible()); |
| 131 std::vector<base::win::ScopedVariant> document_children = | 134 std::vector<base::win::ScopedVariant> document_children = |
| 132 GetAllAccessibleChildren(document.get()); | 135 GetAllAccessibleChildren(document.get()); |
| 133 ASSERT_EQ(1u, document_children.size()); | 136 ASSERT_EQ(1u, document_children.size()); |
| 134 | 137 |
| 135 base::win::ScopedComPtr<IAccessible2> form; | 138 base::win::ScopedComPtr<IAccessible2> form; |
| 136 HRESULT hr = QueryIAccessible2(GetAccessibleFromVariant( | 139 ASSERT_HRESULT_SUCCEEDED(QueryIAccessible2( |
| 137 document.get(), document_children[0].AsInput()).get(), form.Receive()); | 140 GetAccessibleFromVariant(document.get(), document_children[0].AsInput()) |
| 138 ASSERT_EQ(S_OK, hr); | 141 .get(), |
| 142 form.Receive())); |
| 139 std::vector<base::win::ScopedVariant> form_children = | 143 std::vector<base::win::ScopedVariant> form_children = |
| 140 GetAllAccessibleChildren(form.get()); | 144 GetAllAccessibleChildren(form.get()); |
| 141 ASSERT_EQ(2u, form_children.size()); | 145 ASSERT_EQ(2u, form_children.size()); |
| 142 | 146 |
| 143 // Find the input text field. | 147 // Find the input text field. |
| 144 base::win::ScopedComPtr<IAccessible2> input; | 148 base::win::ScopedComPtr<IAccessible2> input; |
| 145 hr = QueryIAccessible2(GetAccessibleFromVariant( | 149 ASSERT_HRESULT_SUCCEEDED(QueryIAccessible2( |
| 146 form.get(), form_children[1].AsInput()).get(), input.Receive()); | 150 GetAccessibleFromVariant(form.get(), form_children[1].AsInput()).get(), |
| 147 ASSERT_EQ(S_OK, hr); | 151 input.Receive())); |
| 148 LONG input_role = 0; | 152 LONG input_role = 0; |
| 149 hr = input->role(&input_role); | 153 ASSERT_HRESULT_SUCCEEDED(input->role(&input_role)); |
| 150 ASSERT_EQ(S_OK, hr); | |
| 151 ASSERT_EQ(ROLE_SYSTEM_TEXT, input_role); | 154 ASSERT_EQ(ROLE_SYSTEM_TEXT, input_role); |
| 152 | 155 |
| 153 // Retrieve the IAccessibleText interface for the field. | 156 // Retrieve the IAccessibleText interface for the field. |
| 154 hr = input.QueryInterface(input_text->Receive()); | 157 ASSERT_HRESULT_SUCCEEDED(input.QueryInterface(input_text->Receive())); |
| 155 ASSERT_EQ(S_OK, hr); | |
| 156 | 158 |
| 157 // Set the caret on the last character. | 159 // Set the caret on the last character. |
| 158 AccessibilityNotificationWaiter waiter( | 160 AccessibilityNotificationWaiter waiter( |
| 159 shell(), AccessibilityModeComplete, | 161 shell(), AccessibilityModeComplete, |
| 160 ui::AX_EVENT_TEXT_SELECTION_CHANGED); | 162 ui::AX_EVENT_TEXT_SELECTION_CHANGED); |
| 161 std::wstring caret_offset = base::UTF16ToWide(base::IntToString16( | 163 std::wstring caret_offset = base::UTF16ToWide(base::IntToString16( |
| 162 static_cast<int>(CONTENTS_LENGTH - 1))); | 164 static_cast<int>(CONTENTS_LENGTH - 1))); |
| 163 ExecuteScript(std::wstring( | 165 ExecuteScript(std::wstring( |
| 164 L"var textField = document.getElementById('textField');" | 166 L"var textField = document.getElementById('textField');" |
| 165 L"textField.focus();" | 167 L"textField.focus();" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 178 net::EscapeQueryParamValue(TEXTAREA_CONTENTS, false) + std::string( | 180 net::EscapeQueryParamValue(TEXTAREA_CONTENTS, false) + std::string( |
| 179 "</textarea></body></html>")); | 181 "</textarea></body></html>")); |
| 180 | 182 |
| 181 // Retrieve the IAccessible interface for the web page. | 183 // Retrieve the IAccessible interface for the web page. |
| 182 base::win::ScopedComPtr<IAccessible> document(GetRendererAccessible()); | 184 base::win::ScopedComPtr<IAccessible> document(GetRendererAccessible()); |
| 183 std::vector<base::win::ScopedVariant> document_children = | 185 std::vector<base::win::ScopedVariant> document_children = |
| 184 GetAllAccessibleChildren(document.get()); | 186 GetAllAccessibleChildren(document.get()); |
| 185 ASSERT_EQ(1u, document_children.size()); | 187 ASSERT_EQ(1u, document_children.size()); |
| 186 | 188 |
| 187 base::win::ScopedComPtr<IAccessible2> section; | 189 base::win::ScopedComPtr<IAccessible2> section; |
| 188 HRESULT hr = QueryIAccessible2(GetAccessibleFromVariant( | 190 ASSERT_HRESULT_SUCCEEDED(QueryIAccessible2( |
| 189 document.get(), document_children[0].AsInput()).get(), section.Receive()); | 191 GetAccessibleFromVariant(document.get(), document_children[0].AsInput()) |
| 190 ASSERT_EQ(S_OK, hr); | 192 .get(), |
| 193 section.Receive())); |
| 191 std::vector<base::win::ScopedVariant> section_children = | 194 std::vector<base::win::ScopedVariant> section_children = |
| 192 GetAllAccessibleChildren(section.get()); | 195 GetAllAccessibleChildren(section.get()); |
| 193 ASSERT_EQ(1u, section_children.size()); | 196 ASSERT_EQ(1u, section_children.size()); |
| 194 | 197 |
| 195 // Find the textarea text field. | 198 // Find the textarea text field. |
| 196 base::win::ScopedComPtr<IAccessible2> textarea; | 199 base::win::ScopedComPtr<IAccessible2> textarea; |
| 197 hr = QueryIAccessible2(GetAccessibleFromVariant( | 200 ASSERT_HRESULT_SUCCEEDED(QueryIAccessible2( |
| 198 section.get(), section_children[0].AsInput()).get(), textarea.Receive()); | 201 GetAccessibleFromVariant(section.get(), section_children[0].AsInput()) |
| 199 ASSERT_EQ(S_OK, hr); | 202 .get(), |
| 203 textarea.Receive())); |
| 200 LONG textarea_role = 0; | 204 LONG textarea_role = 0; |
| 201 hr = textarea->role(&textarea_role); | 205 ASSERT_HRESULT_SUCCEEDED(textarea->role(&textarea_role)); |
| 202 ASSERT_EQ(S_OK, hr); | |
| 203 ASSERT_EQ(ROLE_SYSTEM_TEXT, textarea_role); | 206 ASSERT_EQ(ROLE_SYSTEM_TEXT, textarea_role); |
| 204 | 207 |
| 205 // Retrieve the IAccessibleText interface for the field. | 208 // Retrieve the IAccessibleText interface for the field. |
| 206 hr = textarea.QueryInterface(textarea_text->Receive()); | 209 ASSERT_HRESULT_SUCCEEDED(textarea.QueryInterface(textarea_text->Receive())); |
| 207 ASSERT_EQ(S_OK, hr); | |
| 208 | 210 |
| 209 // Set the caret on the last character. | 211 // Set the caret on the last character. |
| 210 AccessibilityNotificationWaiter waiter( | 212 AccessibilityNotificationWaiter waiter( |
| 211 shell(), AccessibilityModeComplete, | 213 shell(), AccessibilityModeComplete, |
| 212 ui::AX_EVENT_TEXT_SELECTION_CHANGED); | 214 ui::AX_EVENT_TEXT_SELECTION_CHANGED); |
| 213 std::wstring caret_offset = base::UTF16ToWide(base::IntToString16( | 215 std::wstring caret_offset = base::UTF16ToWide(base::IntToString16( |
| 214 static_cast<int>(CONTENTS_LENGTH - 1))); | 216 static_cast<int>(CONTENTS_LENGTH - 1))); |
| 215 ExecuteScript(std::wstring( | 217 ExecuteScript(std::wstring( |
| 216 L"var textField = document.getElementById('textField');" | 218 L"var textField = document.getElementById('textField');" |
| 217 L"textField.focus();" | 219 L"textField.focus();" |
| 218 L"textField.setSelectionRange(") + | 220 L"textField.setSelectionRange(") + |
| 219 caret_offset + L"," + caret_offset + L");"); | 221 caret_offset + L"," + caret_offset + L");"); |
| 220 waiter.WaitForNotification(); | 222 waiter.WaitForNotification(); |
| 221 } | 223 } |
| 222 | 224 |
| 225 // Loads a page with a paragraph of sample text. |
| 226 void AccessibilityWinBrowserTest::SetUpSampleParagraph( |
| 227 base::win::ScopedComPtr<IAccessibleText>* paragraph_text) { |
| 228 ASSERT_NE(nullptr, paragraph_text); |
| 229 LoadInitialAccessibilityTreeFromHtml(std::string( |
| 230 "<!DOCTYPE html><html><body>" |
| 231 "<p><b>Game theory</b> is \"the study of " |
| 232 "<a href=\"#\" title=\"Mathematical model\">mathematical models</a> " |
| 233 "of conflict and<br>cooperation between intelligent rational " |
| 234 "decision-makers.\"</p></body></html>")); |
| 235 |
| 236 // Retrieve the IAccessible interface for the web page. |
| 237 base::win::ScopedComPtr<IAccessible> document(GetRendererAccessible()); |
| 238 std::vector<base::win::ScopedVariant> document_children = |
| 239 GetAllAccessibleChildren(document.get()); |
| 240 ASSERT_EQ(1u, document_children.size()); |
| 241 |
| 242 base::win::ScopedComPtr<IAccessible2> paragraph; |
| 243 ASSERT_HRESULT_SUCCEEDED(QueryIAccessible2( |
| 244 GetAccessibleFromVariant(document.get(), document_children[0].AsInput()) |
| 245 .get(), |
| 246 paragraph.Receive())); |
| 247 LONG paragraph_role = 0; |
| 248 ASSERT_HRESULT_SUCCEEDED(paragraph->role(¶graph_role)); |
| 249 ASSERT_EQ(IA2_ROLE_PARAGRAPH, paragraph_role); |
| 250 ASSERT_HRESULT_SUCCEEDED(paragraph.QueryInterface(paragraph_text->Receive())); |
| 251 } |
| 223 | 252 |
| 224 // Static helpers ------------------------------------------------ | 253 // Static helpers ------------------------------------------------ |
| 225 | 254 |
| 226 base::win::ScopedComPtr<IAccessible> | 255 base::win::ScopedComPtr<IAccessible> |
| 227 AccessibilityWinBrowserTest::GetAccessibleFromVariant( | 256 AccessibilityWinBrowserTest::GetAccessibleFromVariant( |
| 228 IAccessible* parent, | 257 IAccessible* parent, |
| 229 VARIANT* var) { | 258 VARIANT* var) { |
| 230 base::win::ScopedComPtr<IAccessible> ptr; | 259 base::win::ScopedComPtr<IAccessible> ptr; |
| 231 switch (V_VT(var)) { | 260 switch (V_VT(var)) { |
| 232 case VT_DISPATCH: { | 261 case VT_DISPATCH: { |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 found); | 329 found); |
| 301 if (*found) | 330 if (*found) |
| 302 return; | 331 return; |
| 303 } | 332 } |
| 304 } | 333 } |
| 305 } | 334 } |
| 306 | 335 |
| 307 // Ensures that the text and the start and end offsets retrieved using | 336 // Ensures that the text and the start and end offsets retrieved using |
| 308 // get_textAtOffset match the expected values. | 337 // get_textAtOffset match the expected values. |
| 309 void AccessibilityWinBrowserTest::CheckTextAtOffset( | 338 void AccessibilityWinBrowserTest::CheckTextAtOffset( |
| 310 base::win::ScopedComPtr<IAccessibleText>& element, | 339 base::win::ScopedComPtr<IAccessibleText>& object, |
| 311 LONG offset, | 340 LONG offset, |
| 312 IA2TextBoundaryType boundary_type, | 341 IA2TextBoundaryType boundary_type, |
| 313 LONG expected_start_offset, | 342 LONG expected_start_offset, |
| 314 LONG expected_end_offset, | 343 LONG expected_end_offset, |
| 315 const std::wstring& expected_text) { | 344 const std::wstring& expected_text) { |
| 316 testing::Message message; | 345 testing::Message message; |
| 317 message << "While checking for \'" << expected_text << "\' at " << | 346 message << "While checking for \'" << expected_text << "\' at " << |
| 318 expected_start_offset << '-' << expected_end_offset << '.'; | 347 expected_start_offset << '-' << expected_end_offset << '.'; |
| 319 SCOPED_TRACE(message); | 348 SCOPED_TRACE(message); |
| 320 | 349 |
| 321 LONG start_offset = 0; | 350 LONG start_offset = 0; |
| 322 LONG end_offset = 0; | 351 LONG end_offset = 0; |
| 323 base::win::ScopedBstr text; | 352 base::win::ScopedBstr text; |
| 324 HRESULT hr = element->get_textAtOffset( | 353 HRESULT hr = object->get_textAtOffset(offset, boundary_type, &start_offset, |
| 325 offset, boundary_type, | 354 &end_offset, text.Receive()); |
| 326 &start_offset, &end_offset, text.Receive()); | |
| 327 EXPECT_EQ(S_OK, hr); | 355 EXPECT_EQ(S_OK, hr); |
| 328 EXPECT_EQ(expected_start_offset, start_offset); | 356 EXPECT_EQ(expected_start_offset, start_offset); |
| 329 EXPECT_EQ(expected_end_offset, end_offset); | 357 EXPECT_EQ(expected_end_offset, end_offset); |
| 330 EXPECT_EQ(expected_text, std::wstring(text, text.Length())); | 358 EXPECT_EQ(expected_text, std::wstring(text, text.Length())); |
| 331 } | 359 } |
| 332 | 360 |
| 333 std::vector<base::win::ScopedVariant> | 361 std::vector<base::win::ScopedVariant> |
| 334 AccessibilityWinBrowserTest::GetAllAccessibleChildren( | 362 AccessibilityWinBrowserTest::GetAllAccessibleChildren( |
| 335 IAccessible* element) { | 363 IAccessible* element) { |
| 336 LONG child_count = 0; | 364 LONG child_count = 0; |
| (...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 947 AccessibleChecker grouping2_checker(std::wstring(), ROLE_SYSTEM_GROUPING, | 975 AccessibleChecker grouping2_checker(std::wstring(), ROLE_SYSTEM_GROUPING, |
| 948 std::wstring()); | 976 std::wstring()); |
| 949 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, | 977 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, |
| 950 std::wstring()); | 978 std::wstring()); |
| 951 document_checker.AppendExpectedChild(&grouping1_checker); | 979 document_checker.AppendExpectedChild(&grouping1_checker); |
| 952 document_checker.AppendExpectedChild(&grouping2_checker); | 980 document_checker.AppendExpectedChild(&grouping2_checker); |
| 953 document_checker.CheckAccessible(GetRendererAccessible()); | 981 document_checker.CheckAccessible(GetRendererAccessible()); |
| 954 } | 982 } |
| 955 | 983 |
| 956 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 984 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
| 957 TestSetCaretOffset) { | 985 TestCharacterExtentsWithInvalidArguments) { |
| 986 base::win::ScopedComPtr<IAccessibleText> paragraph_text; |
| 987 SetUpSampleParagraph(¶graph_text); |
| 988 |
| 989 LONG invalid_offset = -3; |
| 990 LONG x = -1, y = -1; |
| 991 LONG width = -1, height = -1; |
| 992 |
| 993 HRESULT hr = paragraph_text->get_characterExtents( |
| 994 invalid_offset, IA2_COORDTYPE_SCREEN_RELATIVE, &x, &y, &width, &height); |
| 995 EXPECT_EQ(E_INVALIDARG, hr); |
| 996 EXPECT_EQ(-1, x); |
| 997 EXPECT_EQ(-1, y); |
| 998 EXPECT_EQ(-1, width); |
| 999 EXPECT_EQ(-1, height); |
| 1000 hr = paragraph_text->get_characterExtents( |
| 1001 invalid_offset, IA2_COORDTYPE_PARENT_RELATIVE, &x, &y, &width, &height); |
| 1002 EXPECT_EQ(E_INVALIDARG, hr); |
| 1003 EXPECT_EQ(-1, x); |
| 1004 EXPECT_EQ(-1, y); |
| 1005 EXPECT_EQ(-1, width); |
| 1006 EXPECT_EQ(-1, height); |
| 1007 |
| 1008 LONG n_characters; |
| 1009 ASSERT_HRESULT_SUCCEEDED(paragraph_text->get_nCharacters(&n_characters)); |
| 1010 ASSERT_LT(0, n_characters); |
| 1011 |
| 1012 invalid_offset = n_characters + 1; |
| 1013 hr = paragraph_text->get_characterExtents( |
| 1014 invalid_offset, IA2_COORDTYPE_SCREEN_RELATIVE, &x, &y, &width, &height); |
| 1015 EXPECT_EQ(E_INVALIDARG, hr); |
| 1016 EXPECT_EQ(-1, x); |
| 1017 EXPECT_EQ(-1, y); |
| 1018 EXPECT_EQ(-1, width); |
| 1019 EXPECT_EQ(-1, height); |
| 1020 hr = paragraph_text->get_characterExtents( |
| 1021 invalid_offset, IA2_COORDTYPE_PARENT_RELATIVE, &x, &y, &width, &height); |
| 1022 EXPECT_EQ(E_INVALIDARG, hr); |
| 1023 EXPECT_EQ(-1, x); |
| 1024 EXPECT_EQ(-1, y); |
| 1025 EXPECT_EQ(-1, width); |
| 1026 EXPECT_EQ(-1, height); |
| 1027 } |
| 1028 |
| 1029 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, TestCharacterExtents) { |
| 1030 base::win::ScopedComPtr<IAccessibleText> paragraph_text; |
| 1031 SetUpSampleParagraph(¶graph_text); |
| 1032 |
| 1033 const LONG newline_offset = 46; |
| 1034 LONG n_characters; |
| 1035 ASSERT_HRESULT_SUCCEEDED(paragraph_text->get_nCharacters(&n_characters)); |
| 1036 ASSERT_LT(0, n_characters); |
| 1037 |
| 1038 LONG x, y, width, height; |
| 1039 LONG previous_x, previous_y; |
| 1040 |
| 1041 for (int coordinate = IA2_COORDTYPE_SCREEN_RELATIVE; |
| 1042 coordinate <= IA2_COORDTYPE_PARENT_RELATIVE; ++coordinate) { |
| 1043 auto coordinate_type = static_cast<IA2CoordinateType>(coordinate); |
| 1044 EXPECT_HRESULT_SUCCEEDED(paragraph_text->get_characterExtents( |
| 1045 0, coordinate_type, &x, &y, &width, &height)); |
| 1046 EXPECT_LE(0, x) << "at offset 0"; |
| 1047 EXPECT_LE(0, y) << "at offset 0"; |
| 1048 EXPECT_LT(0, width) << "at offset 0"; |
| 1049 EXPECT_LT(0, height) << "at offset 0"; |
| 1050 |
| 1051 for (LONG offset = 1; offset < newline_offset; ++offset) { |
| 1052 previous_x = x; |
| 1053 previous_y = y; |
| 1054 |
| 1055 EXPECT_HRESULT_SUCCEEDED(paragraph_text->get_characterExtents( |
| 1056 offset, coordinate_type, &x, &y, &width, &height)); |
| 1057 EXPECT_LT(previous_x, x) << "at offset " << offset; |
| 1058 EXPECT_EQ(previous_y, y) << "at offset " << offset; |
| 1059 EXPECT_LT(0, width) << "at offset " << offset; |
| 1060 EXPECT_LT(0, height) << "at offset " << offset; |
| 1061 } |
| 1062 |
| 1063 EXPECT_HRESULT_SUCCEEDED(paragraph_text->get_characterExtents( |
| 1064 newline_offset + 1, coordinate_type, &x, &y, &width, &height)); |
| 1065 EXPECT_LE(0, x) << "at offset " << newline_offset + 1; |
| 1066 EXPECT_GT(previous_x, x) << "at offset " << newline_offset + 1; |
| 1067 EXPECT_LT(previous_y, y) << "at offset " << newline_offset + 1; |
| 1068 EXPECT_LT(0, width) << "at offset " << newline_offset + 1; |
| 1069 EXPECT_LT(0, height) << "at offset " << newline_offset + 1; |
| 1070 |
| 1071 for (LONG offset = newline_offset + 2; offset < n_characters; ++offset) { |
| 1072 previous_x = x; |
| 1073 previous_y = y; |
| 1074 |
| 1075 EXPECT_HRESULT_SUCCEEDED(paragraph_text->get_characterExtents( |
| 1076 offset, coordinate_type, &x, &y, &width, &height)); |
| 1077 EXPECT_LT(previous_x, x) << "at offset " << offset; |
| 1078 EXPECT_EQ(previous_y, y) << "at offset " << offset; |
| 1079 EXPECT_LT(0, width) << "at offset " << offset; |
| 1080 EXPECT_LT(0, height) << "at offset " << offset; |
| 1081 } |
| 1082 } |
| 1083 } |
| 1084 |
| 1085 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, TestSetCaretOffset) { |
| 958 base::win::ScopedComPtr<IAccessibleText> input_text; | 1086 base::win::ScopedComPtr<IAccessibleText> input_text; |
| 959 SetUpInputField(&input_text); | 1087 SetUpInputField(&input_text); |
| 960 | 1088 |
| 961 LONG caret_offset = 0; | 1089 LONG caret_offset = 0; |
| 962 HRESULT hr = input_text->get_caretOffset(&caret_offset); | 1090 HRESULT hr = input_text->get_caretOffset(&caret_offset); |
| 963 EXPECT_EQ(S_OK, hr); | 1091 EXPECT_EQ(S_OK, hr); |
| 964 EXPECT_EQ(CONTENTS_LENGTH - 1, caret_offset); | 1092 EXPECT_EQ(CONTENTS_LENGTH - 1, caret_offset); |
| 965 | 1093 |
| 966 AccessibilityNotificationWaiter waiter( | 1094 AccessibilityNotificationWaiter waiter( |
| 967 shell(), AccessibilityModeComplete, | 1095 shell(), AccessibilityModeComplete, |
| (...skipping 25 matching lines...) Expand all Loading... |
| 993 hr = textarea_text->setCaretOffset(caret_offset); | 1121 hr = textarea_text->setCaretOffset(caret_offset); |
| 994 EXPECT_EQ(S_OK, hr); | 1122 EXPECT_EQ(S_OK, hr); |
| 995 waiter.WaitForNotification(); | 1123 waiter.WaitForNotification(); |
| 996 | 1124 |
| 997 hr = textarea_text->get_caretOffset(&caret_offset); | 1125 hr = textarea_text->get_caretOffset(&caret_offset); |
| 998 EXPECT_EQ(S_OK, hr); | 1126 EXPECT_EQ(S_OK, hr); |
| 999 EXPECT_EQ(0, caret_offset); | 1127 EXPECT_EQ(0, caret_offset); |
| 1000 } | 1128 } |
| 1001 | 1129 |
| 1002 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 1130 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
| 1003 TestTextAtOffsetWithInvalidArgs) { | 1131 TestTextAtOffsetWithInvalidArguments) { |
| 1004 base::win::ScopedComPtr<IAccessibleText> input_text; | 1132 base::win::ScopedComPtr<IAccessibleText> input_text; |
| 1005 SetUpInputField(&input_text); | 1133 SetUpInputField(&input_text); |
| 1006 HRESULT hr = input_text->get_textAtOffset( | 1134 HRESULT hr = input_text->get_textAtOffset( |
| 1007 0, IA2_TEXT_BOUNDARY_CHAR, NULL, NULL, NULL); | 1135 0, IA2_TEXT_BOUNDARY_CHAR, NULL, NULL, NULL); |
| 1008 EXPECT_EQ(E_INVALIDARG, hr); | 1136 EXPECT_EQ(E_INVALIDARG, hr); |
| 1009 | 1137 |
| 1010 // Test invalid offset. | 1138 // Test invalid offset. |
| 1011 LONG start_offset = 0; | 1139 LONG start_offset = 0; |
| 1012 LONG end_offset = 0; | 1140 LONG end_offset = 0; |
| 1013 base::win::ScopedBstr text; | 1141 base::win::ScopedBstr text; |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1086 hr = input_text->get_textAtOffset( | 1214 hr = input_text->get_textAtOffset( |
| 1087 IA2_TEXT_OFFSET_LENGTH, IA2_TEXT_BOUNDARY_ALL, | 1215 IA2_TEXT_OFFSET_LENGTH, IA2_TEXT_BOUNDARY_ALL, |
| 1088 &start_offset, &end_offset, text.Receive()); | 1216 &start_offset, &end_offset, text.Receive()); |
| 1089 EXPECT_EQ(S_FALSE, hr); | 1217 EXPECT_EQ(S_FALSE, hr); |
| 1090 EXPECT_EQ(0, start_offset); | 1218 EXPECT_EQ(0, start_offset); |
| 1091 EXPECT_EQ(0, end_offset); | 1219 EXPECT_EQ(0, end_offset); |
| 1092 EXPECT_EQ(nullptr, static_cast<BSTR>(text)); | 1220 EXPECT_EQ(nullptr, static_cast<BSTR>(text)); |
| 1093 } | 1221 } |
| 1094 | 1222 |
| 1095 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 1223 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
| 1096 TestMultiLineTextAtOffsetWithInvalidArgs) { | 1224 TestMultiLineTextAtOffsetWithInvalidArguments) { |
| 1097 base::win::ScopedComPtr<IAccessibleText> textarea_text; | 1225 base::win::ScopedComPtr<IAccessibleText> textarea_text; |
| 1098 SetUpTextareaField(&textarea_text); | 1226 SetUpTextareaField(&textarea_text); |
| 1099 HRESULT hr = textarea_text->get_textAtOffset( | 1227 HRESULT hr = textarea_text->get_textAtOffset( |
| 1100 0, IA2_TEXT_BOUNDARY_CHAR, NULL, NULL, NULL); | 1228 0, IA2_TEXT_BOUNDARY_CHAR, NULL, NULL, NULL); |
| 1101 EXPECT_EQ(E_INVALIDARG, hr); | 1229 EXPECT_EQ(E_INVALIDARG, hr); |
| 1102 | 1230 |
| 1103 // Test invalid offset. | 1231 // Test invalid offset. |
| 1104 LONG start_offset = 0; | 1232 LONG start_offset = 0; |
| 1105 LONG end_offset = 0; | 1233 LONG end_offset = 0; |
| 1106 base::win::ScopedBstr text; | 1234 base::win::ScopedBstr text; |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1371 40, CONTENTS_LENGTH, L"like\"."); | 1499 40, CONTENTS_LENGTH, L"like\"."); |
| 1372 CheckTextAtOffset(textarea_text, 45, IA2_TEXT_BOUNDARY_WORD, | 1500 CheckTextAtOffset(textarea_text, 45, IA2_TEXT_BOUNDARY_WORD, |
| 1373 40, CONTENTS_LENGTH, L"like\"."); | 1501 40, CONTENTS_LENGTH, L"like\"."); |
| 1374 | 1502 |
| 1375 // Test special offsets. | 1503 // Test special offsets. |
| 1376 CheckTextAtOffset(textarea_text, IA2_TEXT_OFFSET_CARET, | 1504 CheckTextAtOffset(textarea_text, IA2_TEXT_OFFSET_CARET, |
| 1377 IA2_TEXT_BOUNDARY_WORD, 40, CONTENTS_LENGTH, L"like\"."); | 1505 IA2_TEXT_BOUNDARY_WORD, 40, CONTENTS_LENGTH, L"like\"."); |
| 1378 } | 1506 } |
| 1379 | 1507 |
| 1380 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 1508 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
| 1509 TestStaticTextAtOffsetWithBoundaryWord) { |
| 1510 base::win::ScopedComPtr<IAccessibleText> paragraph_text; |
| 1511 SetUpSampleParagraph(¶graph_text); |
| 1512 base::string16 embedded_character( |
| 1513 1, BrowserAccessibilityWin::kEmbeddedCharacter); |
| 1514 std::vector<std::wstring> words; |
| 1515 words.push_back(L"Game "); |
| 1516 words.push_back(L"theory "); |
| 1517 words.push_back(L"is \""); |
| 1518 words.push_back(L"the "); |
| 1519 words.push_back(L"study "); |
| 1520 words.push_back(L"of " + embedded_character + L' '); |
| 1521 words.push_back(L"of "); |
| 1522 words.push_back(L"conflict "); |
| 1523 words.push_back(L"and\n"); |
| 1524 words.push_back(L"cooperation "); |
| 1525 words.push_back(L"between "); |
| 1526 words.push_back(L"intelligent "); |
| 1527 words.push_back(L"rational "); |
| 1528 words.push_back(L"decision-"); |
| 1529 words.push_back(L"makers.\""); |
| 1530 |
| 1531 // Try to retrieve one word after another. |
| 1532 LONG word_start_offset = 0; |
| 1533 for (auto& word : words) { |
| 1534 LONG word_end_offset = word_start_offset + word.size(); |
| 1535 CheckTextAtOffset(paragraph_text, word_start_offset, IA2_TEXT_BOUNDARY_WORD, |
| 1536 word_start_offset, word_end_offset, word); |
| 1537 word_start_offset = word_end_offset; |
| 1538 } |
| 1539 } |
| 1540 |
| 1541 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
| 1381 TestTextAtOffsetWithBoundarySentence) { | 1542 TestTextAtOffsetWithBoundarySentence) { |
| 1382 base::win::ScopedComPtr<IAccessibleText> input_text; | 1543 base::win::ScopedComPtr<IAccessibleText> input_text; |
| 1383 SetUpInputField(&input_text); | 1544 SetUpInputField(&input_text); |
| 1384 | 1545 |
| 1385 // Sentence navigation is not currently implemented. | 1546 // Sentence navigation is not currently implemented. |
| 1386 LONG start_offset = 0; | 1547 LONG start_offset = 0; |
| 1387 LONG end_offset = 0; | 1548 LONG end_offset = 0; |
| 1388 base::win::ScopedBstr text; | 1549 base::win::ScopedBstr text; |
| 1389 HRESULT hr = input_text->get_textAtOffset( | 1550 HRESULT hr = input_text->get_textAtOffset( |
| 1390 5, IA2_TEXT_BOUNDARY_SENTENCE, | 1551 5, IA2_TEXT_BOUNDARY_SENTENCE, |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1462 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 1623 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
| 1463 TestMultiLineTextAtOffsetWithBoundaryAll) { | 1624 TestMultiLineTextAtOffsetWithBoundaryAll) { |
| 1464 base::win::ScopedComPtr<IAccessibleText> textarea_text; | 1625 base::win::ScopedComPtr<IAccessibleText> textarea_text; |
| 1465 SetUpTextareaField(&textarea_text); | 1626 SetUpTextareaField(&textarea_text); |
| 1466 | 1627 |
| 1467 CheckTextAtOffset(textarea_text, CONTENTS_LENGTH - 1, IA2_TEXT_BOUNDARY_ALL, | 1628 CheckTextAtOffset(textarea_text, CONTENTS_LENGTH - 1, IA2_TEXT_BOUNDARY_ALL, |
| 1468 0, CONTENTS_LENGTH, base::SysUTF8ToWide(TEXTAREA_CONTENTS)); | 1629 0, CONTENTS_LENGTH, base::SysUTF8ToWide(TEXTAREA_CONTENTS)); |
| 1469 } | 1630 } |
| 1470 | 1631 |
| 1471 } // namespace content | 1632 } // namespace content |
| OLD | NEW |