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 <memory> |
8 #include <vector> | 9 #include <vector> |
9 | 10 |
10 #include "base/macros.h" | 11 #include "base/macros.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/accessibility/browser_accessibility_win.h" |
21 #include "content/browser/renderer_host/render_view_host_impl.h" | 21 #include "content/browser/renderer_host/render_view_host_impl.h" |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 | 360 |
361 std::vector<base::win::ScopedVariant> | 361 std::vector<base::win::ScopedVariant> |
362 AccessibilityWinBrowserTest::GetAllAccessibleChildren( | 362 AccessibilityWinBrowserTest::GetAllAccessibleChildren( |
363 IAccessible* element) { | 363 IAccessible* element) { |
364 LONG child_count = 0; | 364 LONG child_count = 0; |
365 HRESULT hr = element->get_accChildCount(&child_count); | 365 HRESULT hr = element->get_accChildCount(&child_count); |
366 EXPECT_EQ(S_OK, hr); | 366 EXPECT_EQ(S_OK, hr); |
367 if (child_count <= 0) | 367 if (child_count <= 0) |
368 return std::vector<base::win::ScopedVariant>(); | 368 return std::vector<base::win::ScopedVariant>(); |
369 | 369 |
370 scoped_ptr<VARIANT[]> children_array(new VARIANT[child_count]); | 370 std::unique_ptr<VARIANT[]> children_array(new VARIANT[child_count]); |
371 LONG obtained_count = 0; | 371 LONG obtained_count = 0; |
372 hr = AccessibleChildren( | 372 hr = AccessibleChildren( |
373 element, 0, child_count, children_array.get(), &obtained_count); | 373 element, 0, child_count, children_array.get(), &obtained_count); |
374 EXPECT_EQ(S_OK, hr); | 374 EXPECT_EQ(S_OK, hr); |
375 EXPECT_EQ(child_count, obtained_count); | 375 EXPECT_EQ(child_count, obtained_count); |
376 | 376 |
377 std::vector<base::win::ScopedVariant> children( | 377 std::vector<base::win::ScopedVariant> children( |
378 static_cast<size_t>(child_count)); | 378 static_cast<size_t>(child_count)); |
379 for (size_t i = 0; i < children.size(); i++) { | 379 for (size_t i = 0; i < children.size(); i++) { |
380 children[i].Reset(children_array[i]); | 380 children[i].Reset(children_array[i]); |
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
660 radio_group_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); | 660 radio_group_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); |
661 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, | 661 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, |
662 std::wstring()); | 662 std::wstring()); |
663 list_item_checker.AppendExpectedChild(&list_marker_checker); | 663 list_item_checker.AppendExpectedChild(&list_marker_checker); |
664 list_item_checker.AppendExpectedChild(&static_text_checker); | 664 list_item_checker.AppendExpectedChild(&static_text_checker); |
665 radio_group_checker.AppendExpectedChild(&list_item_checker); | 665 radio_group_checker.AppendExpectedChild(&list_item_checker); |
666 document_checker.AppendExpectedChild(&radio_group_checker); | 666 document_checker.AppendExpectedChild(&radio_group_checker); |
667 document_checker.CheckAccessible(GetRendererAccessible()); | 667 document_checker.CheckAccessible(GetRendererAccessible()); |
668 | 668 |
669 // Set focus to the radio group. | 669 // Set focus to the radio group. |
670 scoped_ptr<AccessibilityNotificationWaiter> waiter( | 670 std::unique_ptr<AccessibilityNotificationWaiter> waiter( |
671 new AccessibilityNotificationWaiter( | 671 new AccessibilityNotificationWaiter(shell(), AccessibilityModeComplete, |
672 shell(), AccessibilityModeComplete, | 672 ui::AX_EVENT_FOCUS)); |
673 ui::AX_EVENT_FOCUS)); | |
674 ExecuteScript(L"document.body.children[0].focus()"); | 673 ExecuteScript(L"document.body.children[0].focus()"); |
675 waiter->WaitForNotification(); | 674 waiter->WaitForNotification(); |
676 | 675 |
677 // Check that the accessibility tree of the browser has been updated. | 676 // Check that the accessibility tree of the browser has been updated. |
678 radio_group_checker.SetExpectedState( | 677 radio_group_checker.SetExpectedState( |
679 STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_FOCUSED); | 678 STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_FOCUSED); |
680 document_checker.CheckAccessible(GetRendererAccessible()); | 679 document_checker.CheckAccessible(GetRendererAccessible()); |
681 | 680 |
682 // Set the active descendant of the radio group | 681 // Set the active descendant of the radio group |
683 waiter.reset(new AccessibilityNotificationWaiter( | 682 waiter.reset(new AccessibilityNotificationWaiter( |
(...skipping 21 matching lines...) Expand all Loading... |
705 checkbox_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); | 704 checkbox_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); |
706 AccessibleChecker body_checker(std::wstring(), L"body", IA2_ROLE_SECTION, | 705 AccessibleChecker body_checker(std::wstring(), L"body", IA2_ROLE_SECTION, |
707 std::wstring()); | 706 std::wstring()); |
708 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, | 707 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, |
709 std::wstring()); | 708 std::wstring()); |
710 body_checker.AppendExpectedChild(&checkbox_checker); | 709 body_checker.AppendExpectedChild(&checkbox_checker); |
711 document_checker.AppendExpectedChild(&body_checker); | 710 document_checker.AppendExpectedChild(&body_checker); |
712 document_checker.CheckAccessible(GetRendererAccessible()); | 711 document_checker.CheckAccessible(GetRendererAccessible()); |
713 | 712 |
714 // Check the checkbox. | 713 // Check the checkbox. |
715 scoped_ptr<AccessibilityNotificationWaiter> waiter( | 714 std::unique_ptr<AccessibilityNotificationWaiter> waiter( |
716 new AccessibilityNotificationWaiter( | 715 new AccessibilityNotificationWaiter(shell(), AccessibilityModeComplete, |
717 shell(), AccessibilityModeComplete, | 716 ui::AX_EVENT_CHECKED_STATE_CHANGED)); |
718 ui::AX_EVENT_CHECKED_STATE_CHANGED)); | |
719 ExecuteScript(L"document.body.children[0].checked=true"); | 717 ExecuteScript(L"document.body.children[0].checked=true"); |
720 waiter->WaitForNotification(); | 718 waiter->WaitForNotification(); |
721 | 719 |
722 // Check that the accessibility tree of the browser has been updated. | 720 // Check that the accessibility tree of the browser has been updated. |
723 checkbox_checker.SetExpectedState( | 721 checkbox_checker.SetExpectedState( |
724 STATE_SYSTEM_CHECKED | STATE_SYSTEM_FOCUSABLE); | 722 STATE_SYSTEM_CHECKED | STATE_SYSTEM_FOCUSABLE); |
725 document_checker.CheckAccessible(GetRendererAccessible()); | 723 document_checker.CheckAccessible(GetRendererAccessible()); |
726 } | 724 } |
727 | 725 |
728 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 726 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
729 TestNotificationChildrenChanged) { | 727 TestNotificationChildrenChanged) { |
730 // The role attribute causes the node to be in the accessibility tree. | 728 // The role attribute causes the node to be in the accessibility tree. |
731 LoadInitialAccessibilityTreeFromHtml("<body role=group></body>"); | 729 LoadInitialAccessibilityTreeFromHtml("<body role=group></body>"); |
732 | 730 |
733 // Check the browser's copy of the renderer accessibility tree. | 731 // Check the browser's copy of the renderer accessibility tree. |
734 AccessibleChecker group_checker(std::wstring(), ROLE_SYSTEM_GROUPING, | 732 AccessibleChecker group_checker(std::wstring(), ROLE_SYSTEM_GROUPING, |
735 std::wstring()); | 733 std::wstring()); |
736 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, | 734 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, |
737 std::wstring()); | 735 std::wstring()); |
738 document_checker.AppendExpectedChild(&group_checker); | 736 document_checker.AppendExpectedChild(&group_checker); |
739 document_checker.CheckAccessible(GetRendererAccessible()); | 737 document_checker.CheckAccessible(GetRendererAccessible()); |
740 | 738 |
741 // Change the children of the document body. | 739 // Change the children of the document body. |
742 scoped_ptr<AccessibilityNotificationWaiter> waiter( | 740 std::unique_ptr<AccessibilityNotificationWaiter> waiter( |
743 new AccessibilityNotificationWaiter( | 741 new AccessibilityNotificationWaiter(shell(), AccessibilityModeComplete, |
744 shell(), | 742 ui::AX_EVENT_CHILDREN_CHANGED)); |
745 AccessibilityModeComplete, | |
746 ui::AX_EVENT_CHILDREN_CHANGED)); | |
747 ExecuteScript(L"document.body.innerHTML='<b>new text</b>'"); | 743 ExecuteScript(L"document.body.innerHTML='<b>new text</b>'"); |
748 waiter->WaitForNotification(); | 744 waiter->WaitForNotification(); |
749 | 745 |
750 // Check that the accessibility tree of the browser has been updated. | 746 // Check that the accessibility tree of the browser has been updated. |
751 AccessibleChecker text_checker( | 747 AccessibleChecker text_checker( |
752 L"new text", ROLE_SYSTEM_STATICTEXT, std::wstring()); | 748 L"new text", ROLE_SYSTEM_STATICTEXT, std::wstring()); |
753 group_checker.AppendExpectedChild(&text_checker); | 749 group_checker.AppendExpectedChild(&text_checker); |
754 document_checker.CheckAccessible(GetRendererAccessible()); | 750 document_checker.CheckAccessible(GetRendererAccessible()); |
755 } | 751 } |
756 | 752 |
757 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 753 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
758 TestNotificationChildrenChanged2) { | 754 TestNotificationChildrenChanged2) { |
759 // The role attribute causes the node to be in the accessibility tree. | 755 // The role attribute causes the node to be in the accessibility tree. |
760 LoadInitialAccessibilityTreeFromHtml( | 756 LoadInitialAccessibilityTreeFromHtml( |
761 "<div role=group style='visibility: hidden'>text</div>"); | 757 "<div role=group style='visibility: hidden'>text</div>"); |
762 | 758 |
763 // Check the accessible tree of the browser. | 759 // Check the accessible tree of the browser. |
764 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, | 760 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, |
765 std::wstring()); | 761 std::wstring()); |
766 document_checker.CheckAccessible(GetRendererAccessible()); | 762 document_checker.CheckAccessible(GetRendererAccessible()); |
767 | 763 |
768 // Change the children of the document body. | 764 // Change the children of the document body. |
769 scoped_ptr<AccessibilityNotificationWaiter> waiter( | 765 std::unique_ptr<AccessibilityNotificationWaiter> waiter( |
770 new AccessibilityNotificationWaiter( | 766 new AccessibilityNotificationWaiter(shell(), AccessibilityModeComplete, |
771 shell(), AccessibilityModeComplete, | 767 ui::AX_EVENT_CHILDREN_CHANGED)); |
772 ui::AX_EVENT_CHILDREN_CHANGED)); | |
773 ExecuteScript(L"document.body.children[0].style.visibility='visible'"); | 768 ExecuteScript(L"document.body.children[0].style.visibility='visible'"); |
774 waiter->WaitForNotification(); | 769 waiter->WaitForNotification(); |
775 | 770 |
776 // Check that the accessibility tree of the browser has been updated. | 771 // Check that the accessibility tree of the browser has been updated. |
777 AccessibleChecker static_text_checker(L"text", ROLE_SYSTEM_STATICTEXT, | 772 AccessibleChecker static_text_checker(L"text", ROLE_SYSTEM_STATICTEXT, |
778 std::wstring()); | 773 std::wstring()); |
779 AccessibleChecker group_checker(std::wstring(), ROLE_SYSTEM_GROUPING, | 774 AccessibleChecker group_checker(std::wstring(), ROLE_SYSTEM_GROUPING, |
780 std::wstring()); | 775 std::wstring()); |
781 document_checker.AppendExpectedChild(&group_checker); | 776 document_checker.AppendExpectedChild(&group_checker); |
782 group_checker.AppendExpectedChild(&static_text_checker); | 777 group_checker.AppendExpectedChild(&static_text_checker); |
783 document_checker.CheckAccessible(GetRendererAccessible()); | 778 document_checker.CheckAccessible(GetRendererAccessible()); |
784 } | 779 } |
785 | 780 |
786 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 781 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
787 TestNotificationFocusChanged) { | 782 TestNotificationFocusChanged) { |
788 // The role attribute causes the node to be in the accessibility tree. | 783 // The role attribute causes the node to be in the accessibility tree. |
789 LoadInitialAccessibilityTreeFromHtml("<div role=group tabindex='-1'></div>"); | 784 LoadInitialAccessibilityTreeFromHtml("<div role=group tabindex='-1'></div>"); |
790 | 785 |
791 // Check the browser's copy of the renderer accessibility tree. | 786 // Check the browser's copy of the renderer accessibility tree. |
792 SCOPED_TRACE("Check initial tree"); | 787 SCOPED_TRACE("Check initial tree"); |
793 AccessibleChecker group_checker(std::wstring(), ROLE_SYSTEM_GROUPING, | 788 AccessibleChecker group_checker(std::wstring(), ROLE_SYSTEM_GROUPING, |
794 std::wstring()); | 789 std::wstring()); |
795 group_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); | 790 group_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); |
796 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, | 791 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, |
797 std::wstring()); | 792 std::wstring()); |
798 document_checker.AppendExpectedChild(&group_checker); | 793 document_checker.AppendExpectedChild(&group_checker); |
799 document_checker.CheckAccessible(GetRendererAccessible()); | 794 document_checker.CheckAccessible(GetRendererAccessible()); |
800 | 795 |
801 // Focus the div in the document | 796 // Focus the div in the document |
802 scoped_ptr<AccessibilityNotificationWaiter> waiter( | 797 std::unique_ptr<AccessibilityNotificationWaiter> waiter( |
803 new AccessibilityNotificationWaiter( | 798 new AccessibilityNotificationWaiter(shell(), AccessibilityModeComplete, |
804 shell(), AccessibilityModeComplete, | 799 ui::AX_EVENT_FOCUS)); |
805 ui::AX_EVENT_FOCUS)); | |
806 ExecuteScript(L"document.body.children[0].focus()"); | 800 ExecuteScript(L"document.body.children[0].focus()"); |
807 waiter->WaitForNotification(); | 801 waiter->WaitForNotification(); |
808 | 802 |
809 // Check that the accessibility tree of the browser has been updated. | 803 // Check that the accessibility tree of the browser has been updated. |
810 SCOPED_TRACE("Check updated tree after focusing div"); | 804 SCOPED_TRACE("Check updated tree after focusing div"); |
811 group_checker.SetExpectedState( | 805 group_checker.SetExpectedState( |
812 STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_FOCUSED); | 806 STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_FOCUSED); |
813 document_checker.CheckAccessible(GetRendererAccessible()); | 807 document_checker.CheckAccessible(GetRendererAccessible()); |
814 | 808 |
815 // Focus the document accessible. This will un-focus the current node. | 809 // Focus the document accessible. This will un-focus the current node. |
(...skipping 26 matching lines...) Expand all Loading... |
842 text_field_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); | 836 text_field_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); |
843 AccessibleChecker body_checker(std::wstring(), L"body", IA2_ROLE_SECTION, | 837 AccessibleChecker body_checker(std::wstring(), L"body", IA2_ROLE_SECTION, |
844 std::wstring()); | 838 std::wstring()); |
845 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, | 839 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT, |
846 std::wstring()); | 840 std::wstring()); |
847 body_checker.AppendExpectedChild(&text_field_checker); | 841 body_checker.AppendExpectedChild(&text_field_checker); |
848 document_checker.AppendExpectedChild(&body_checker); | 842 document_checker.AppendExpectedChild(&body_checker); |
849 document_checker.CheckAccessible(GetRendererAccessible()); | 843 document_checker.CheckAccessible(GetRendererAccessible()); |
850 | 844 |
851 // Set the value of the text control | 845 // Set the value of the text control |
852 scoped_ptr<AccessibilityNotificationWaiter> waiter( | 846 std::unique_ptr<AccessibilityNotificationWaiter> waiter( |
853 new AccessibilityNotificationWaiter( | 847 new AccessibilityNotificationWaiter(shell(), AccessibilityModeComplete, |
854 shell(), AccessibilityModeComplete, | 848 ui::AX_EVENT_VALUE_CHANGED)); |
855 ui::AX_EVENT_VALUE_CHANGED)); | |
856 ExecuteScript(L"document.body.children[0].value='new value'"); | 849 ExecuteScript(L"document.body.children[0].value='new value'"); |
857 waiter->WaitForNotification(); | 850 waiter->WaitForNotification(); |
858 | 851 |
859 // Check that the accessibility tree of the browser has been updated. | 852 // Check that the accessibility tree of the browser has been updated. |
860 text_field_checker.SetExpectedValue(L"new value"); | 853 text_field_checker.SetExpectedValue(L"new value"); |
861 document_checker.CheckAccessible(GetRendererAccessible()); | 854 document_checker.CheckAccessible(GetRendererAccessible()); |
862 } | 855 } |
863 | 856 |
864 // This test verifies that the web content's accessibility tree is a | 857 // This test verifies that the web content's accessibility tree is a |
865 // descendant of the main browser window's accessibility tree, so that | 858 // descendant of the main browser window's accessibility tree, so that |
(...skipping 757 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1623 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 1616 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
1624 TestMultiLineTextAtOffsetWithBoundaryAll) { | 1617 TestMultiLineTextAtOffsetWithBoundaryAll) { |
1625 base::win::ScopedComPtr<IAccessibleText> textarea_text; | 1618 base::win::ScopedComPtr<IAccessibleText> textarea_text; |
1626 SetUpTextareaField(&textarea_text); | 1619 SetUpTextareaField(&textarea_text); |
1627 | 1620 |
1628 CheckTextAtOffset(textarea_text, CONTENTS_LENGTH - 1, IA2_TEXT_BOUNDARY_ALL, | 1621 CheckTextAtOffset(textarea_text, CONTENTS_LENGTH - 1, IA2_TEXT_BOUNDARY_ALL, |
1629 0, CONTENTS_LENGTH, base::SysUTF8ToWide(TEXTAREA_CONTENTS)); | 1622 0, CONTENTS_LENGTH, base::SysUTF8ToWide(TEXTAREA_CONTENTS)); |
1630 } | 1623 } |
1631 | 1624 |
1632 } // namespace content | 1625 } // namespace content |
OLD | NEW |