| 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 <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "base/win/scoped_bstr.h" | 9 #include "base/win/scoped_bstr.h" |
| 10 #include "base/win/scoped_comptr.h" | 10 #include "base/win/scoped_comptr.h" |
| 11 #include "base/win/scoped_variant.h" | 11 #include "base/win/scoped_variant.h" |
| 12 #include "content/browser/accessibility/accessibility_tree_formatter_utils_win.h
" | 12 #include "content/browser/accessibility/accessibility_tree_formatter_utils_win.h
" |
| 13 #include "content/browser/renderer_host/render_view_host_impl.h" | 13 #include "content/browser/renderer_host/render_view_host_impl.h" |
| 14 #include "content/public/browser/notification_service.h" | 14 #include "content/public/browser/notification_service.h" |
| 15 #include "content/public/browser/notification_types.h" | 15 #include "content/public/browser/notification_types.h" |
| 16 #include "content/public/browser/render_frame_host.h" | 16 #include "content/public/browser/render_frame_host.h" |
| 17 #include "content/public/browser/render_widget_host_view.h" | 17 #include "content/public/browser/render_widget_host_view.h" |
| 18 #include "content/public/browser/web_contents.h" | 18 #include "content/public/browser/web_contents.h" |
| 19 #include "content/public/common/url_constants.h" | 19 #include "content/public/common/url_constants.h" |
| 20 #include "content/public/test/content_browser_test.h" | 20 #include "content/public/test/content_browser_test.h" |
| 21 #include "content/public/test/content_browser_test_utils.h" | 21 #include "content/public/test/content_browser_test_utils.h" |
| 22 #include "content/shell/browser/shell.h" | 22 #include "content/shell/browser/shell.h" |
| 23 #include "content/test/accessibility_browser_test_utils.h" | 23 #include "content/test/accessibility_browser_test_utils.h" |
| 24 #include "third_party/iaccessible2/ia2_api_all.h" | 24 #include "third_party/iaccessible2/ia2_api_all.h" |
| 25 #include "third_party/isimpledom/ISimpleDOMNode.h" | 25 #include "third_party/isimpledom/ISimpleDOMNode.h" |
| 26 | 26 #include "ui/aura/window.h" |
| 27 // TODO(dmazzoni): Disabled accessibility tests on Win64. crbug.com/179717 | 27 #include "ui/aura/window_tree_host.h" |
| 28 #if defined(ARCH_CPU_X86_64) | |
| 29 #define MAYBE(x) DISABLED_##x | |
| 30 #else | |
| 31 #define MAYBE(x) x | |
| 32 #endif | |
| 33 | 28 |
| 34 namespace content { | 29 namespace content { |
| 35 | 30 |
| 36 namespace { | 31 namespace { |
| 37 | 32 |
| 38 | |
| 39 // Helpers -------------------------------------------------------------------- | 33 // Helpers -------------------------------------------------------------------- |
| 40 | 34 |
| 41 base::win::ScopedComPtr<IAccessible> GetAccessibleFromResultVariant( | 35 base::win::ScopedComPtr<IAccessible> GetAccessibleFromResultVariant( |
| 42 IAccessible* parent, | 36 IAccessible* parent, |
| 43 VARIANT* var) { | 37 VARIANT* var) { |
| 44 base::win::ScopedComPtr<IAccessible> ptr; | 38 base::win::ScopedComPtr<IAccessible> ptr; |
| 45 switch (V_VT(var)) { | 39 switch (V_VT(var)) { |
| 46 case VT_DISPATCH: { | 40 case VT_DISPATCH: { |
| 47 IDispatch* dispatch = V_DISPATCH(var); | 41 IDispatch* dispatch = V_DISPATCH(var); |
| 48 if (dispatch) | 42 if (dispatch) |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 node->get_accName(childid_self, name_bstr.Receive()); | 78 node->get_accName(childid_self, name_bstr.Receive()); |
| 85 std::wstring name(name_bstr, name_bstr.Length()); | 79 std::wstring name(name_bstr, name_bstr.Length()); |
| 86 base::win::ScopedVariant role; | 80 base::win::ScopedVariant role; |
| 87 node->get_accRole(childid_self, role.Receive()); | 81 node->get_accRole(childid_self, role.Receive()); |
| 88 ASSERT_EQ(VT_I4, role.type()); | 82 ASSERT_EQ(VT_I4, role.type()); |
| 89 | 83 |
| 90 // Print the accessibility tree as we go, because if this test fails | 84 // Print the accessibility tree as we go, because if this test fails |
| 91 // on the bots, this is really helpful in figuring out why. | 85 // on the bots, this is really helpful in figuring out why. |
| 92 for (int i = 0; i < depth; i++) | 86 for (int i = 0; i < depth; i++) |
| 93 printf(" "); | 87 printf(" "); |
| 94 printf("role=%d name=%s\n", V_I4(&role), base::WideToUTF8(name).c_str()); | 88 printf("role=%s name=%s\n", |
| 89 base::WideToUTF8(IAccessibleRoleToString(V_I4(&role))).c_str(), |
| 90 base::WideToUTF8(name).c_str()); |
| 95 | 91 |
| 96 if (expected_role == V_I4(&role) && expected_name == name) { | 92 if (expected_role == V_I4(&role) && expected_name == name) { |
| 97 *found = true; | 93 *found = true; |
| 98 return; | 94 return; |
| 99 } | 95 } |
| 100 | 96 |
| 101 LONG child_count = 0; | 97 LONG child_count = 0; |
| 102 HRESULT hr = node->get_accChildCount(&child_count); | 98 HRESULT hr = node->get_accChildCount(&child_count); |
| 103 ASSERT_EQ(S_OK, hr); | 99 ASSERT_EQ(S_OK, hr); |
| 104 | 100 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 shell(), AccessibilityModeComplete, | 147 shell(), AccessibilityModeComplete, |
| 152 ui::AX_EVENT_LOAD_COMPLETE); | 148 ui::AX_EVENT_LOAD_COMPLETE); |
| 153 GURL html_data_url("data:text/html," + html); | 149 GURL html_data_url("data:text/html," + html); |
| 154 NavigateToURL(shell(), html_data_url); | 150 NavigateToURL(shell(), html_data_url); |
| 155 waiter.WaitForNotification(); | 151 waiter.WaitForNotification(); |
| 156 } | 152 } |
| 157 | 153 |
| 158 // Retrieve the MSAA client accessibility object for the Render Widget Host View | 154 // Retrieve the MSAA client accessibility object for the Render Widget Host View |
| 159 // of the selected tab. | 155 // of the selected tab. |
| 160 IAccessible* AccessibilityWinBrowserTest::GetRendererAccessible() { | 156 IAccessible* AccessibilityWinBrowserTest::GetRendererAccessible() { |
| 161 HWND hwnd_render_widget_host_view = | 157 content::WebContents* web_contents = shell()->web_contents(); |
| 162 shell()->web_contents()->GetRenderWidgetHostView()->GetNativeView(); | 158 return web_contents->GetRenderWidgetHostView()->GetNativeViewAccessible(); |
| 163 | |
| 164 // Invoke windows screen reader detection by sending the WM_GETOBJECT message | |
| 165 // with kIdCustom as the LPARAM. | |
| 166 const int32 kIdCustom = 1; | |
| 167 SendMessage( | |
| 168 hwnd_render_widget_host_view, WM_GETOBJECT, OBJID_CLIENT, kIdCustom); | |
| 169 | |
| 170 IAccessible* accessible; | |
| 171 HRESULT hr = AccessibleObjectFromWindow( | |
| 172 hwnd_render_widget_host_view, OBJID_CLIENT, | |
| 173 IID_IAccessible, reinterpret_cast<void**>(&accessible)); | |
| 174 | |
| 175 EXPECT_EQ(S_OK, hr); | |
| 176 EXPECT_NE(accessible, reinterpret_cast<IAccessible*>(NULL)); | |
| 177 | |
| 178 return accessible; | |
| 179 } | 159 } |
| 180 | 160 |
| 181 void AccessibilityWinBrowserTest::ExecuteScript(const std::wstring& script) { | 161 void AccessibilityWinBrowserTest::ExecuteScript(const std::wstring& script) { |
| 182 shell()->web_contents()->GetMainFrame()->ExecuteJavaScript(script); | 162 shell()->web_contents()->GetMainFrame()->ExecuteJavaScript(script); |
| 183 } | 163 } |
| 184 | 164 |
| 185 | 165 |
| 186 // AccessibleChecker ---------------------------------------------------------- | 166 // AccessibleChecker ---------------------------------------------------------- |
| 187 | 167 |
| 188 class AccessibleChecker { | 168 class AccessibleChecker { |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 return base::string16(V_BSTR(&role), SysStringLen(V_BSTR(&role))); | 391 return base::string16(V_BSTR(&role), SysStringLen(V_BSTR(&role))); |
| 412 return base::string16(); | 392 return base::string16(); |
| 413 } | 393 } |
| 414 | 394 |
| 415 } // namespace | 395 } // namespace |
| 416 | 396 |
| 417 | 397 |
| 418 // Tests ---------------------------------------------------------------------- | 398 // Tests ---------------------------------------------------------------------- |
| 419 | 399 |
| 420 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 400 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
| 421 MAYBE(TestBusyAccessibilityTree)) { | 401 TestBusyAccessibilityTree) { |
| 422 NavigateToURL(shell(), GURL(url::kAboutBlankURL)); | 402 NavigateToURL(shell(), GURL(url::kAboutBlankURL)); |
| 423 | 403 |
| 424 // The initial accessible returned should have state STATE_SYSTEM_BUSY while | 404 // The initial accessible returned should have state STATE_SYSTEM_BUSY while |
| 425 // the accessibility tree is being requested from the renderer. | 405 // the accessibility tree is being requested from the renderer. |
| 426 AccessibleChecker document1_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, | 406 AccessibleChecker document1_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, |
| 427 std::wstring()); | 407 std::wstring()); |
| 428 document1_checker.SetExpectedState( | 408 document1_checker.SetExpectedState( |
| 429 STATE_SYSTEM_READONLY | STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_FOCUSED | | 409 STATE_SYSTEM_READONLY | STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_FOCUSED | |
| 430 STATE_SYSTEM_BUSY); | 410 STATE_SYSTEM_BUSY); |
| 431 document1_checker.CheckAccessible(GetRendererAccessible()); | 411 document1_checker.CheckAccessible(GetRendererAccessible()); |
| 432 } | 412 } |
| 433 | 413 |
| 434 // Flaky, http://crbug.com/167320 . | |
| 435 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | |
| 436 DISABLED_TestRendererAccessibilityTree) { | |
| 437 LoadInitialAccessibilityTreeFromHtml( | |
| 438 "<html><head><title>Accessibility Win Test</title></head>" | |
| 439 "<body><input type='button' value='push' /><input type='checkbox' />" | |
| 440 "</body></html>"); | |
| 441 | |
| 442 // Check the browser's copy of the renderer accessibility tree. | |
| 443 AccessibleChecker button_checker(L"push", ROLE_SYSTEM_PUSHBUTTON, | |
| 444 std::wstring()); | |
| 445 AccessibleChecker checkbox_checker(std::wstring(), ROLE_SYSTEM_CHECKBUTTON, | |
| 446 std::wstring()); | |
| 447 AccessibleChecker body_checker(std::wstring(), L"body", IA2_ROLE_SECTION, | |
| 448 std::wstring()); | |
| 449 AccessibleChecker document2_checker(L"Accessibility Win Test", | |
| 450 ROLE_SYSTEM_DOCUMENT, std::wstring()); | |
| 451 body_checker.AppendExpectedChild(&button_checker); | |
| 452 body_checker.AppendExpectedChild(&checkbox_checker); | |
| 453 document2_checker.AppendExpectedChild(&body_checker); | |
| 454 document2_checker.CheckAccessible(GetRendererAccessible()); | |
| 455 | |
| 456 // Check that document accessible has a parent accessible. | |
| 457 base::win::ScopedComPtr<IAccessible> document_accessible( | |
| 458 GetRendererAccessible()); | |
| 459 ASSERT_NE(document_accessible.get(), reinterpret_cast<IAccessible*>(NULL)); | |
| 460 base::win::ScopedComPtr<IDispatch> parent_dispatch; | |
| 461 HRESULT hr = document_accessible->get_accParent(parent_dispatch.Receive()); | |
| 462 EXPECT_EQ(S_OK, hr); | |
| 463 EXPECT_NE(parent_dispatch, reinterpret_cast<IDispatch*>(NULL)); | |
| 464 | |
| 465 // Navigate to another page. | |
| 466 NavigateToURL(shell(), GURL(url::kAboutBlankURL)); | |
| 467 | |
| 468 // Verify that the IAccessible reference still points to a valid object and | |
| 469 // that calls to its methods fail since the tree is no longer valid after | |
| 470 // the page navagation. | |
| 471 base::win::ScopedBstr name; | |
| 472 base::win::ScopedVariant childid_self(CHILDID_SELF); | |
| 473 hr = document_accessible->get_accName(childid_self, name.Receive()); | |
| 474 ASSERT_EQ(E_FAIL, hr); | |
| 475 } | |
| 476 | |
| 477 // Periodically failing. See crbug.com/145537 | 414 // Periodically failing. See crbug.com/145537 |
| 478 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 415 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
| 479 DISABLED_TestNotificationActiveDescendantChanged) { | 416 DISABLED_TestNotificationActiveDescendantChanged) { |
| 480 LoadInitialAccessibilityTreeFromHtml( | 417 LoadInitialAccessibilityTreeFromHtml( |
| 481 "<ul tabindex='-1' role='radiogroup' aria-label='ul'>" | 418 "<ul tabindex='-1' role='radiogroup' aria-label='ul'>" |
| 482 "<li id='li'>li</li></ul>"); | 419 "<li id='li'>li</li></ul>"); |
| 483 | 420 |
| 484 // Check the browser's copy of the renderer accessibility tree. | 421 // Check the browser's copy of the renderer accessibility tree. |
| 485 AccessibleChecker list_marker_checker(L"\x2022", ROLE_SYSTEM_TEXT, | 422 AccessibleChecker list_marker_checker(L"\x2022", ROLE_SYSTEM_TEXT, |
| 486 std::wstring()); | 423 std::wstring()); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 522 waiter->WaitForNotification(); | 459 waiter->WaitForNotification(); |
| 523 | 460 |
| 524 // Check that the accessibility tree of the browser has been updated. | 461 // Check that the accessibility tree of the browser has been updated. |
| 525 list_item_checker.SetExpectedState( | 462 list_item_checker.SetExpectedState( |
| 526 STATE_SYSTEM_READONLY | STATE_SYSTEM_FOCUSED); | 463 STATE_SYSTEM_READONLY | STATE_SYSTEM_FOCUSED); |
| 527 radio_group_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); | 464 radio_group_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); |
| 528 document_checker.CheckAccessible(GetRendererAccessible()); | 465 document_checker.CheckAccessible(GetRendererAccessible()); |
| 529 } | 466 } |
| 530 | 467 |
| 531 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 468 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
| 532 MAYBE(TestNotificationCheckedStateChanged)) { | 469 TestNotificationCheckedStateChanged) { |
| 533 LoadInitialAccessibilityTreeFromHtml( | 470 LoadInitialAccessibilityTreeFromHtml( |
| 534 "<body><input type='checkbox' /></body>"); | 471 "<body><input type='checkbox' /></body>"); |
| 535 | 472 |
| 536 // Check the browser's copy of the renderer accessibility tree. | 473 // Check the browser's copy of the renderer accessibility tree. |
| 537 AccessibleChecker checkbox_checker(std::wstring(), ROLE_SYSTEM_CHECKBUTTON, | 474 AccessibleChecker checkbox_checker(std::wstring(), ROLE_SYSTEM_CHECKBUTTON, |
| 538 std::wstring()); | 475 std::wstring()); |
| 539 checkbox_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); | 476 checkbox_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); |
| 540 AccessibleChecker body_checker(std::wstring(), L"body", IA2_ROLE_SECTION, | 477 AccessibleChecker body_checker(std::wstring(), L"body", IA2_ROLE_SECTION, |
| 541 std::wstring()); | 478 std::wstring()); |
| 542 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, | 479 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 553 ExecuteScript(L"document.body.children[0].checked=true"); | 490 ExecuteScript(L"document.body.children[0].checked=true"); |
| 554 waiter->WaitForNotification(); | 491 waiter->WaitForNotification(); |
| 555 | 492 |
| 556 // Check that the accessibility tree of the browser has been updated. | 493 // Check that the accessibility tree of the browser has been updated. |
| 557 checkbox_checker.SetExpectedState( | 494 checkbox_checker.SetExpectedState( |
| 558 STATE_SYSTEM_CHECKED | STATE_SYSTEM_FOCUSABLE); | 495 STATE_SYSTEM_CHECKED | STATE_SYSTEM_FOCUSABLE); |
| 559 document_checker.CheckAccessible(GetRendererAccessible()); | 496 document_checker.CheckAccessible(GetRendererAccessible()); |
| 560 } | 497 } |
| 561 | 498 |
| 562 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 499 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
| 563 MAYBE(TestNotificationChildrenChanged)) { | 500 TestNotificationChildrenChanged) { |
| 564 // The role attribute causes the node to be in the accessibility tree. | 501 // The role attribute causes the node to be in the accessibility tree. |
| 565 LoadInitialAccessibilityTreeFromHtml("<body role=group></body>"); | 502 LoadInitialAccessibilityTreeFromHtml("<body role=group></body>"); |
| 566 | 503 |
| 567 // Check the browser's copy of the renderer accessibility tree. | 504 // Check the browser's copy of the renderer accessibility tree. |
| 568 AccessibleChecker group_checker(std::wstring(), ROLE_SYSTEM_GROUPING, | 505 AccessibleChecker group_checker(std::wstring(), ROLE_SYSTEM_GROUPING, |
| 569 std::wstring()); | 506 std::wstring()); |
| 570 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, | 507 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, |
| 571 std::wstring()); | 508 std::wstring()); |
| 572 document_checker.AppendExpectedChild(&group_checker); | 509 document_checker.AppendExpectedChild(&group_checker); |
| 573 document_checker.CheckAccessible(GetRendererAccessible()); | 510 document_checker.CheckAccessible(GetRendererAccessible()); |
| 574 | 511 |
| 575 // Change the children of the document body. | 512 // Change the children of the document body. |
| 576 scoped_ptr<AccessibilityNotificationWaiter> waiter( | 513 scoped_ptr<AccessibilityNotificationWaiter> waiter( |
| 577 new AccessibilityNotificationWaiter( | 514 new AccessibilityNotificationWaiter( |
| 578 shell(), | 515 shell(), |
| 579 AccessibilityModeComplete, | 516 AccessibilityModeComplete, |
| 580 ui::AX_EVENT_CHILDREN_CHANGED)); | 517 ui::AX_EVENT_CHILDREN_CHANGED)); |
| 581 ExecuteScript(L"document.body.innerHTML='<b>new text</b>'"); | 518 ExecuteScript(L"document.body.innerHTML='<b>new text</b>'"); |
| 582 waiter->WaitForNotification(); | 519 waiter->WaitForNotification(); |
| 583 | 520 |
| 584 // Check that the accessibility tree of the browser has been updated. | 521 // Check that the accessibility tree of the browser has been updated. |
| 585 AccessibleChecker text_checker(L"new text", ROLE_SYSTEM_TEXT, std::wstring()); | 522 AccessibleChecker text_checker( |
| 523 L"new text", ROLE_SYSTEM_STATICTEXT, std::wstring()); |
| 586 group_checker.AppendExpectedChild(&text_checker); | 524 group_checker.AppendExpectedChild(&text_checker); |
| 587 document_checker.CheckAccessible(GetRendererAccessible()); | 525 document_checker.CheckAccessible(GetRendererAccessible()); |
| 588 } | 526 } |
| 589 | 527 |
| 590 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 528 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
| 591 MAYBE(TestNotificationChildrenChanged2)) { | 529 TestNotificationChildrenChanged2) { |
| 592 // The role attribute causes the node to be in the accessibility tree. | 530 // The role attribute causes the node to be in the accessibility tree. |
| 593 LoadInitialAccessibilityTreeFromHtml( | 531 LoadInitialAccessibilityTreeFromHtml( |
| 594 "<div role=group style='visibility: hidden'>text</div>"); | 532 "<div role=group style='visibility: hidden'>text</div>"); |
| 595 | 533 |
| 596 // Check the accessible tree of the browser. | 534 // Check the accessible tree of the browser. |
| 597 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, | 535 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, |
| 598 std::wstring()); | 536 std::wstring()); |
| 599 document_checker.CheckAccessible(GetRendererAccessible()); | 537 document_checker.CheckAccessible(GetRendererAccessible()); |
| 600 | 538 |
| 601 // Change the children of the document body. | 539 // Change the children of the document body. |
| 602 scoped_ptr<AccessibilityNotificationWaiter> waiter( | 540 scoped_ptr<AccessibilityNotificationWaiter> waiter( |
| 603 new AccessibilityNotificationWaiter( | 541 new AccessibilityNotificationWaiter( |
| 604 shell(), AccessibilityModeComplete, | 542 shell(), AccessibilityModeComplete, |
| 605 ui::AX_EVENT_CHILDREN_CHANGED)); | 543 ui::AX_EVENT_CHILDREN_CHANGED)); |
| 606 ExecuteScript(L"document.body.children[0].style.visibility='visible'"); | 544 ExecuteScript(L"document.body.children[0].style.visibility='visible'"); |
| 607 waiter->WaitForNotification(); | 545 waiter->WaitForNotification(); |
| 608 | 546 |
| 609 // Check that the accessibility tree of the browser has been updated. | 547 // Check that the accessibility tree of the browser has been updated. |
| 610 AccessibleChecker static_text_checker(L"text", ROLE_SYSTEM_TEXT, | 548 AccessibleChecker static_text_checker(L"text", ROLE_SYSTEM_STATICTEXT, |
| 611 std::wstring()); | 549 std::wstring()); |
| 612 AccessibleChecker group_checker(std::wstring(), ROLE_SYSTEM_GROUPING, | 550 AccessibleChecker group_checker(std::wstring(), ROLE_SYSTEM_GROUPING, |
| 613 std::wstring()); | 551 std::wstring()); |
| 614 document_checker.AppendExpectedChild(&group_checker); | 552 document_checker.AppendExpectedChild(&group_checker); |
| 615 group_checker.AppendExpectedChild(&static_text_checker); | 553 group_checker.AppendExpectedChild(&static_text_checker); |
| 616 document_checker.CheckAccessible(GetRendererAccessible()); | 554 document_checker.CheckAccessible(GetRendererAccessible()); |
| 617 } | 555 } |
| 618 | 556 |
| 619 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 557 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
| 620 MAYBE(TestNotificationFocusChanged)) { | 558 TestNotificationFocusChanged) { |
| 621 // The role attribute causes the node to be in the accessibility tree. | 559 // The role attribute causes the node to be in the accessibility tree. |
| 622 LoadInitialAccessibilityTreeFromHtml("<div role=group tabindex='-1'></div>"); | 560 LoadInitialAccessibilityTreeFromHtml("<div role=group tabindex='-1'></div>"); |
| 623 | 561 |
| 624 // Check the browser's copy of the renderer accessibility tree. | 562 // Check the browser's copy of the renderer accessibility tree. |
| 625 SCOPED_TRACE("Check initial tree"); | 563 SCOPED_TRACE("Check initial tree"); |
| 626 AccessibleChecker group_checker(std::wstring(), ROLE_SYSTEM_GROUPING, | 564 AccessibleChecker group_checker(std::wstring(), ROLE_SYSTEM_GROUPING, |
| 627 std::wstring()); | 565 std::wstring()); |
| 628 group_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); | 566 group_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); |
| 629 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, | 567 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, |
| 630 std::wstring()); | 568 std::wstring()); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 658 ASSERT_EQ(S_OK, hr); | 596 ASSERT_EQ(S_OK, hr); |
| 659 waiter->WaitForNotification(); | 597 waiter->WaitForNotification(); |
| 660 | 598 |
| 661 // Check that the accessibility tree of the browser has been updated. | 599 // Check that the accessibility tree of the browser has been updated. |
| 662 SCOPED_TRACE("Check updated tree after focusing document again"); | 600 SCOPED_TRACE("Check updated tree after focusing document again"); |
| 663 group_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); | 601 group_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); |
| 664 document_checker.CheckAccessible(GetRendererAccessible()); | 602 document_checker.CheckAccessible(GetRendererAccessible()); |
| 665 } | 603 } |
| 666 | 604 |
| 667 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 605 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
| 668 MAYBE(TestNotificationValueChanged)) { | 606 TestNotificationValueChanged) { |
| 669 LoadInitialAccessibilityTreeFromHtml( | 607 LoadInitialAccessibilityTreeFromHtml( |
| 670 "<body><input type='text' value='old value'/></body>"); | 608 "<body><input type='text' value='old value'/></body>"); |
| 671 | 609 |
| 672 // Check the browser's copy of the renderer accessibility tree. | 610 // Check the browser's copy of the renderer accessibility tree. |
| 673 AccessibleChecker text_field_checker(std::wstring(), ROLE_SYSTEM_TEXT, | 611 AccessibleChecker text_field_checker(std::wstring(), ROLE_SYSTEM_TEXT, |
| 674 L"old value"); | 612 L"old value"); |
| 675 text_field_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); | 613 text_field_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); |
| 676 AccessibleChecker body_checker(std::wstring(), L"body", IA2_ROLE_SECTION, | 614 AccessibleChecker body_checker(std::wstring(), L"body", IA2_ROLE_SECTION, |
| 677 std::wstring()); | 615 std::wstring()); |
| 678 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, | 616 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, |
| 679 std::wstring()); | 617 std::wstring()); |
| 680 body_checker.AppendExpectedChild(&text_field_checker); | 618 body_checker.AppendExpectedChild(&text_field_checker); |
| 681 document_checker.AppendExpectedChild(&body_checker); | 619 document_checker.AppendExpectedChild(&body_checker); |
| 682 document_checker.CheckAccessible(GetRendererAccessible()); | 620 document_checker.CheckAccessible(GetRendererAccessible()); |
| 683 | 621 |
| 684 // Set the value of the text control | 622 // Set the value of the text control |
| 685 scoped_ptr<AccessibilityNotificationWaiter> waiter( | 623 scoped_ptr<AccessibilityNotificationWaiter> waiter( |
| 686 new AccessibilityNotificationWaiter( | 624 new AccessibilityNotificationWaiter( |
| 687 shell(), AccessibilityModeComplete, | 625 shell(), AccessibilityModeComplete, |
| 688 ui::AX_EVENT_VALUE_CHANGE)); | 626 ui::AX_EVENT_VALUE_CHANGED)); |
| 689 ExecuteScript(L"document.body.children[0].value='new value'"); | 627 ExecuteScript(L"document.body.children[0].value='new value'"); |
| 690 waiter->WaitForNotification(); | 628 waiter->WaitForNotification(); |
| 691 | 629 |
| 692 // Check that the accessibility tree of the browser has been updated. | 630 // Check that the accessibility tree of the browser has been updated. |
| 693 text_field_checker.SetExpectedValue(L"new value"); | 631 text_field_checker.SetExpectedValue(L"new value"); |
| 694 document_checker.CheckAccessible(GetRendererAccessible()); | 632 document_checker.CheckAccessible(GetRendererAccessible()); |
| 695 } | 633 } |
| 696 | 634 |
| 697 // This test verifies that the web content's accessibility tree is a | 635 // This test verifies that the web content's accessibility tree is a |
| 698 // descendant of the main browser window's accessibility tree, so that | 636 // descendant of the main browser window's accessibility tree, so that |
| 699 // tools like AccExplorer32 or AccProbe can be used to examine Chrome's | 637 // tools like AccExplorer32 or AccProbe can be used to examine Chrome's |
| 700 // accessibility support. | 638 // accessibility support. |
| 701 // | 639 // |
| 702 // If you made a change and this test now fails, check that the NativeViewHost | 640 // If you made a change and this test now fails, check that the NativeViewHost |
| 703 // that wraps the tab contents returns the IAccessible implementation | 641 // that wraps the tab contents returns the IAccessible implementation |
| 704 // provided by RenderWidgetHostViewWin in GetNativeViewAccessible(). | 642 // provided by RenderWidgetHostViewWin in GetNativeViewAccessible(). |
| 705 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 643 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
| 706 MAYBE(ContainsRendererAccessibilityTree)) { | 644 ContainsRendererAccessibilityTree) { |
| 707 LoadInitialAccessibilityTreeFromHtml( | 645 LoadInitialAccessibilityTreeFromHtml( |
| 708 "<html><head><title>MyDocument</title></head>" | 646 "<html><head><title>MyDocument</title></head>" |
| 709 "<body>Content</body></html>"); | 647 "<body>Content</body></html>"); |
| 710 | 648 |
| 711 // Get the accessibility object for the browser window. | 649 // Get the accessibility object for the window tree host. |
| 712 HWND browser_hwnd = shell()->window(); | 650 aura::Window* window = shell()->window(); |
| 651 CHECK(window); |
| 652 aura::WindowTreeHost* window_tree_host = window->GetHost(); |
| 653 CHECK(window_tree_host); |
| 654 HWND hwnd = window_tree_host->GetAcceleratedWidget(); |
| 655 CHECK(hwnd); |
| 713 base::win::ScopedComPtr<IAccessible> browser_accessible; | 656 base::win::ScopedComPtr<IAccessible> browser_accessible; |
| 714 HRESULT hr = AccessibleObjectFromWindow( | 657 HRESULT hr = AccessibleObjectFromWindow( |
| 715 browser_hwnd, | 658 hwnd, |
| 716 OBJID_WINDOW, | 659 OBJID_WINDOW, |
| 717 IID_IAccessible, | 660 IID_IAccessible, |
| 718 reinterpret_cast<void**>(browser_accessible.Receive())); | 661 reinterpret_cast<void**>(browser_accessible.Receive())); |
| 719 ASSERT_EQ(S_OK, hr); | 662 ASSERT_EQ(S_OK, hr); |
| 720 | 663 |
| 721 bool found = false; | 664 bool found = false; |
| 722 RecursiveFindNodeInAccessibilityTree( | 665 RecursiveFindNodeInAccessibilityTree( |
| 723 browser_accessible.get(), ROLE_SYSTEM_DOCUMENT, L"MyDocument", 0, &found); | 666 browser_accessible.get(), ROLE_SYSTEM_DOCUMENT, L"MyDocument", 0, &found); |
| 724 ASSERT_EQ(found, true); | 667 ASSERT_EQ(found, true); |
| 725 } | 668 } |
| 726 | 669 |
| 727 // Disabled because of http://crbug.com/144390. | |
| 728 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 670 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
| 729 DISABLED_TestToggleButtonRoleAndStates) { | 671 SupportsISimpleDOM) { |
| 730 AccessibleChecker* button_checker; | |
| 731 std::string button_html("data:text/html,"); | |
| 732 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, | |
| 733 std::wstring()); | |
| 734 AccessibleChecker body_checker(std::wstring(), L"body", IA2_ROLE_SECTION, | |
| 735 std::wstring()); | |
| 736 document_checker.AppendExpectedChild(&body_checker); | |
| 737 | |
| 738 // Temporary macro | |
| 739 #define ADD_BUTTON(html, ia2_role, state) \ | |
| 740 button_html += html; \ | |
| 741 button_checker = new AccessibleChecker(L"x", ROLE_SYSTEM_PUSHBUTTON, \ | |
| 742 ia2_role, std::wstring()); \ | |
| 743 button_checker->SetExpectedState(state); \ | |
| 744 body_checker.AppendExpectedChild(button_checker) | |
| 745 | |
| 746 // If aria-pressed is 'undefined', empty or not present, use PUSHBUTTON | |
| 747 // Otherwise use TOGGLE_BUTTON, even if the value is invalid. | |
| 748 // The spec does this in an attempt future-proof in case new values are added. | |
| 749 ADD_BUTTON("<span role='button' aria-pressed='false'>x</span>", | |
| 750 IA2_ROLE_TOGGLE_BUTTON, 0); | |
| 751 ADD_BUTTON("<span role='button' aria-pressed='true'>x</span>", | |
| 752 IA2_ROLE_TOGGLE_BUTTON, STATE_SYSTEM_PRESSED); | |
| 753 ADD_BUTTON("<span role='button' aria-pressed='mixed'>x</span>", | |
| 754 IA2_ROLE_TOGGLE_BUTTON, STATE_SYSTEM_MIXED); | |
| 755 ADD_BUTTON("<span role='button' aria-pressed='xyz'>x</span>", | |
| 756 IA2_ROLE_TOGGLE_BUTTON, 0); | |
| 757 ADD_BUTTON("<span role='button' aria-pressed=''>x</span>", | |
| 758 ROLE_SYSTEM_PUSHBUTTON, 0); | |
| 759 ADD_BUTTON("<span role='button' aria-pressed>x</span>", | |
| 760 ROLE_SYSTEM_PUSHBUTTON, 0); | |
| 761 ADD_BUTTON("<span role='button' aria-pressed='undefined'>x</span>", | |
| 762 ROLE_SYSTEM_PUSHBUTTON, 0); | |
| 763 ADD_BUTTON("<span role='button'>x</span>", ROLE_SYSTEM_PUSHBUTTON, 0); | |
| 764 ADD_BUTTON("<input type='button' aria-pressed='true' value='x'/>", | |
| 765 IA2_ROLE_TOGGLE_BUTTON, STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_PRESSED); | |
| 766 ADD_BUTTON("<input type='button' aria-pressed='false' value='x'/>", | |
| 767 IA2_ROLE_TOGGLE_BUTTON, STATE_SYSTEM_FOCUSABLE); | |
| 768 ADD_BUTTON("<input type='button' aria-pressed='mixed' value='x'>", | |
| 769 IA2_ROLE_TOGGLE_BUTTON, STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_MIXED); | |
| 770 ADD_BUTTON("<input type='button' aria-pressed='xyz' value='x'/>", | |
| 771 IA2_ROLE_TOGGLE_BUTTON, STATE_SYSTEM_FOCUSABLE); | |
| 772 ADD_BUTTON("<input type='button' aria-pressed='' value='x'/>", | |
| 773 ROLE_SYSTEM_PUSHBUTTON, STATE_SYSTEM_FOCUSABLE); | |
| 774 ADD_BUTTON("<input type='button' aria-pressed value='x'>", | |
| 775 ROLE_SYSTEM_PUSHBUTTON, STATE_SYSTEM_FOCUSABLE); | |
| 776 ADD_BUTTON("<input type='button' aria-pressed='undefined' value='x'>", | |
| 777 ROLE_SYSTEM_PUSHBUTTON, STATE_SYSTEM_FOCUSABLE); | |
| 778 ADD_BUTTON("<input type='button' value='x'>", | |
| 779 ROLE_SYSTEM_PUSHBUTTON, STATE_SYSTEM_FOCUSABLE); | |
| 780 ADD_BUTTON("<button aria-pressed='true'>x</button>", | |
| 781 IA2_ROLE_TOGGLE_BUTTON, STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_PRESSED); | |
| 782 ADD_BUTTON("<button aria-pressed='false'>x</button>", | |
| 783 IA2_ROLE_TOGGLE_BUTTON, STATE_SYSTEM_FOCUSABLE); | |
| 784 ADD_BUTTON("<button aria-pressed='mixed'>x</button>", IA2_ROLE_TOGGLE_BUTTON, | |
| 785 STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_MIXED); | |
| 786 ADD_BUTTON("<button aria-pressed='xyz'>x</button>", IA2_ROLE_TOGGLE_BUTTON, | |
| 787 STATE_SYSTEM_FOCUSABLE); | |
| 788 ADD_BUTTON("<button aria-pressed=''>x</button>", | |
| 789 ROLE_SYSTEM_PUSHBUTTON, STATE_SYSTEM_FOCUSABLE); | |
| 790 ADD_BUTTON("<button aria-pressed>x</button>", | |
| 791 ROLE_SYSTEM_PUSHBUTTON, STATE_SYSTEM_FOCUSABLE); | |
| 792 ADD_BUTTON("<button aria-pressed='undefined'>x</button>", | |
| 793 ROLE_SYSTEM_PUSHBUTTON, STATE_SYSTEM_FOCUSABLE); | |
| 794 ADD_BUTTON("<button>x</button>", ROLE_SYSTEM_PUSHBUTTON, | |
| 795 STATE_SYSTEM_FOCUSABLE); | |
| 796 #undef ADD_BUTTON // Temporary macro | |
| 797 | |
| 798 LoadInitialAccessibilityTreeFromHtml(button_html); | |
| 799 document_checker.CheckAccessible(GetRendererAccessible()); | |
| 800 } | |
| 801 | |
| 802 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | |
| 803 MAYBE(SupportsISimpleDOM)) { | |
| 804 LoadInitialAccessibilityTreeFromHtml( | 672 LoadInitialAccessibilityTreeFromHtml( |
| 805 "<body><input type='checkbox' /></body>"); | 673 "<body><input type='checkbox' /></body>"); |
| 806 | 674 |
| 807 // Get the IAccessible object for the document. | 675 // Get the IAccessible object for the document. |
| 808 base::win::ScopedComPtr<IAccessible> document_accessible( | 676 base::win::ScopedComPtr<IAccessible> document_accessible( |
| 809 GetRendererAccessible()); | 677 GetRendererAccessible()); |
| 810 ASSERT_NE(document_accessible.get(), reinterpret_cast<IAccessible*>(NULL)); | 678 ASSERT_NE(document_accessible.get(), reinterpret_cast<IAccessible*>(NULL)); |
| 811 | 679 |
| 812 // Get the ISimpleDOM object for the document. | 680 // Get the ISimpleDOM object for the document. |
| 813 base::win::ScopedComPtr<IServiceProvider> service_provider; | 681 base::win::ScopedComPtr<IServiceProvider> service_provider; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 857 ASSERT_EQ(S_OK, hr); | 725 ASSERT_EQ(S_OK, hr); |
| 858 hr = checkbox_isimpledomnode->get_nodeInfo( | 726 hr = checkbox_isimpledomnode->get_nodeInfo( |
| 859 node_name.Receive(), &name_space_id, node_value.Receive(), &num_children, | 727 node_name.Receive(), &name_space_id, node_value.Receive(), &num_children, |
| 860 &unique_id, &node_type); | 728 &unique_id, &node_type); |
| 861 ASSERT_EQ(S_OK, hr); | 729 ASSERT_EQ(S_OK, hr); |
| 862 EXPECT_EQ(L"input", std::wstring(node_name, node_name.Length())); | 730 EXPECT_EQ(L"input", std::wstring(node_name, node_name.Length())); |
| 863 EXPECT_EQ(NODETYPE_ELEMENT, node_type); | 731 EXPECT_EQ(NODETYPE_ELEMENT, node_type); |
| 864 EXPECT_EQ(0, num_children); | 732 EXPECT_EQ(0, num_children); |
| 865 } | 733 } |
| 866 | 734 |
| 867 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, MAYBE(TestRoleGroup)) { | 735 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, TestRoleGroup) { |
| 868 LoadInitialAccessibilityTreeFromHtml( | 736 LoadInitialAccessibilityTreeFromHtml( |
| 869 "<fieldset></fieldset><div role=group></div>"); | 737 "<fieldset></fieldset><div role=group></div>"); |
| 870 | 738 |
| 871 // Check the browser's copy of the renderer accessibility tree. | 739 // Check the browser's copy of the renderer accessibility tree. |
| 872 AccessibleChecker grouping1_checker(std::wstring(), ROLE_SYSTEM_GROUPING, | 740 AccessibleChecker grouping1_checker(std::wstring(), ROLE_SYSTEM_GROUPING, |
| 873 std::wstring()); | 741 std::wstring()); |
| 874 AccessibleChecker grouping2_checker(std::wstring(), ROLE_SYSTEM_GROUPING, | 742 AccessibleChecker grouping2_checker(std::wstring(), ROLE_SYSTEM_GROUPING, |
| 875 std::wstring()); | 743 std::wstring()); |
| 876 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, | 744 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, |
| 877 std::wstring()); | 745 std::wstring()); |
| 878 document_checker.AppendExpectedChild(&grouping1_checker); | 746 document_checker.AppendExpectedChild(&grouping1_checker); |
| 879 document_checker.AppendExpectedChild(&grouping2_checker); | 747 document_checker.AppendExpectedChild(&grouping2_checker); |
| 880 document_checker.CheckAccessible(GetRendererAccessible()); | 748 document_checker.CheckAccessible(GetRendererAccessible()); |
| 881 } | 749 } |
| 882 | 750 |
| 883 } // namespace content | 751 } // namespace content |
| OLD | NEW |