| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_state_impl.h" |
| 5 #include "content/browser/renderer_host/render_view_host_impl.h" | 6 #include "content/browser/renderer_host/render_view_host_impl.h" |
| 6 #include "content/browser/renderer_host/render_widget_host_impl.h" | 7 #include "content/browser/renderer_host/render_widget_host_impl.h" |
| 7 #include "content/browser/renderer_host/render_widget_host_view_base.h" | 8 #include "content/browser/renderer_host/render_widget_host_view_base.h" |
| 8 #include "content/browser/web_contents/web_contents_impl.h" | 9 #include "content/browser/web_contents/web_contents_impl.h" |
| 9 #include "content/public/browser/render_view_host.h" | 10 #include "content/public/browser/render_view_host.h" |
| 10 #include "content/public/browser/render_widget_host.h" | 11 #include "content/public/browser/render_widget_host.h" |
| 11 #include "content/public/browser/render_widget_host_view.h" | 12 #include "content/public/browser/render_widget_host_view.h" |
| 12 #include "content/public/browser/web_contents.h" | 13 #include "content/public/browser/web_contents.h" |
| 13 #include "content/public/common/url_constants.h" | 14 #include "content/public/common/url_constants.h" |
| 14 #include "content/public/test/content_browser_test.h" | 15 #include "content/public/test/content_browser_test.h" |
| 15 #include "content/public/test/content_browser_test_utils.h" | 16 #include "content/public/test/content_browser_test_utils.h" |
| 16 #include "content/shell/browser/shell.h" | 17 #include "content/shell/browser/shell.h" |
| 17 #include "content/test/accessibility_browser_test_utils.h" | 18 #include "content/test/accessibility_browser_test_utils.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
| 19 | 20 |
| 20 namespace content { | 21 namespace content { |
| 21 | 22 |
| 22 const char kMinimalPageDataURL[] = | 23 const char kMinimalPageDataURL[] = |
| 23 "data:text/html,<html><head></head><body>Hello, world</body></html>"; | 24 "data:text/html,<html><head></head><body>Hello, world</body></html>"; |
| 24 | 25 |
| 25 class AccessibilityModeTest : public ContentBrowserTest { | 26 class AccessibilityModeTest : public ContentBrowserTest { |
| 26 protected: | 27 protected: |
| 27 WebContentsImpl* web_contents() { | 28 WebContentsImpl* web_contents() { |
| 28 return static_cast<WebContentsImpl*>(shell()->web_contents()); | 29 return static_cast<WebContentsImpl*>(shell()->web_contents()); |
| 29 } | 30 } |
| 30 | 31 |
| 31 void ExpectBrowserAccessibilityManager(bool expect_bam, | 32 protected: |
| 32 std::string message = "") { | 33 BrowserAccessibility* FindNode(ui::AXRole role, |
| 33 if (expect_bam) { | 34 const std::string& name) { |
| 34 EXPECT_NE( | 35 BrowserAccessibility* root = GetManager()->GetRoot(); |
| 35 (BrowserAccessibilityManager*)NULL, | 36 CHECK(root); |
| 36 web_contents()->GetRootBrowserAccessibilityManager()) << message; | 37 return FindNodeInSubtree(*root, role, name); |
| 37 } else { | |
| 38 EXPECT_EQ( | |
| 39 (BrowserAccessibilityManager*)NULL, | |
| 40 web_contents()->GetRootBrowserAccessibilityManager()) << message; | |
| 41 } | |
| 42 } | 38 } |
| 43 | 39 |
| 44 bool ShouldBeBrowserAccessibilityManager(AccessibilityMode mode) { | 40 BrowserAccessibilityManager* GetManager() { |
| 45 switch (mode) { | 41 WebContentsImpl* web_contents = |
| 46 case AccessibilityModeOff: | 42 static_cast<WebContentsImpl*>(shell()->web_contents()); |
| 47 case ACCESSIBILITY_MODE_WEB_CONTENTS_ONLY: | 43 return web_contents->GetRootBrowserAccessibilityManager(); |
| 48 return false; | 44 } |
| 49 case ACCESSIBILITY_MODE_COMPLETE: | 45 |
| 50 return true; | 46 private: |
| 51 default: | 47 BrowserAccessibility* FindNodeInSubtree( |
| 52 NOTREACHED(); | 48 BrowserAccessibility& node, |
| 49 ui::AXRole role, |
| 50 const std::string& name) { |
| 51 if (node.GetRole() == role && |
| 52 node.GetStringAttribute(ui::AX_ATTR_NAME) == name) |
| 53 return &node; |
| 54 for (unsigned int i = 0; i < node.PlatformChildCount(); ++i) { |
| 55 BrowserAccessibility* result = FindNodeInSubtree( |
| 56 *node.PlatformGetChild(i), role, name); |
| 57 if (result) |
| 58 return result; |
| 53 } | 59 } |
| 54 return false; | 60 return nullptr; |
| 55 } | 61 } |
| 56 }; | 62 }; |
| 57 | 63 |
| 58 IN_PROC_BROWSER_TEST_F(AccessibilityModeTest, AccessibilityModeOff) { | 64 IN_PROC_BROWSER_TEST_F(AccessibilityModeTest, AccessibilityModeOff) { |
| 59 NavigateToURL(shell(), GURL(kMinimalPageDataURL)); | 65 NavigateToURL(shell(), GURL(kMinimalPageDataURL)); |
| 60 | 66 |
| 61 EXPECT_EQ(AccessibilityModeOff, web_contents()->GetAccessibilityMode()); | 67 EXPECT_EQ(AccessibilityModeOff, web_contents()->GetAccessibilityMode()); |
| 62 ExpectBrowserAccessibilityManager( | 68 EXPECT_FALSE(GetManager()); |
| 63 ShouldBeBrowserAccessibilityManager(AccessibilityModeOff)); | |
| 64 } | 69 } |
| 65 | 70 |
| 66 IN_PROC_BROWSER_TEST_F(AccessibilityModeTest, ACCESSIBILITY_MODE_COMPLETE) { | 71 IN_PROC_BROWSER_TEST_F(AccessibilityModeTest, AccessibilityModeComplete) { |
| 67 NavigateToURL(shell(), GURL(kMinimalPageDataURL)); | 72 NavigateToURL(shell(), GURL(kMinimalPageDataURL)); |
| 68 ASSERT_EQ(AccessibilityModeOff, web_contents()->GetAccessibilityMode()); | 73 ASSERT_EQ(AccessibilityModeOff, web_contents()->GetAccessibilityMode()); |
| 69 | 74 |
| 70 AccessibilityNotificationWaiter waiter(shell()->web_contents()); | 75 AccessibilityNotificationWaiter waiter(shell()->web_contents()); |
| 71 web_contents()->AddAccessibilityMode(ACCESSIBILITY_MODE_COMPLETE); | 76 web_contents()->AddAccessibilityMode(ACCESSIBILITY_MODE_COMPLETE); |
| 72 EXPECT_EQ(ACCESSIBILITY_MODE_COMPLETE, | 77 EXPECT_EQ(ACCESSIBILITY_MODE_COMPLETE, |
| 73 web_contents()->GetAccessibilityMode()); | 78 web_contents()->GetAccessibilityMode()); |
| 74 waiter.WaitForNotification(); | 79 waiter.WaitForNotification(); |
| 75 ExpectBrowserAccessibilityManager( | 80 EXPECT_TRUE(GetManager()); |
| 76 ShouldBeBrowserAccessibilityManager(ACCESSIBILITY_MODE_COMPLETE)); | |
| 77 } | 81 } |
| 78 | 82 |
| 79 IN_PROC_BROWSER_TEST_F(AccessibilityModeTest, | 83 IN_PROC_BROWSER_TEST_F(AccessibilityModeTest, |
| 80 ACCESSIBILITY_MODE_WEB_CONTENTS_ONLY) { | 84 AccessibilityModeWebContentsOnly) { |
| 81 NavigateToURL(shell(), GURL(kMinimalPageDataURL)); | 85 NavigateToURL(shell(), GURL(kMinimalPageDataURL)); |
| 82 ASSERT_EQ(AccessibilityModeOff, web_contents()->GetAccessibilityMode()); | 86 ASSERT_EQ(AccessibilityModeOff, web_contents()->GetAccessibilityMode()); |
| 83 | 87 |
| 84 AccessibilityNotificationWaiter waiter(shell()->web_contents()); | 88 AccessibilityNotificationWaiter waiter(shell()->web_contents()); |
| 85 web_contents()->AddAccessibilityMode(ACCESSIBILITY_MODE_WEB_CONTENTS_ONLY); | 89 web_contents()->AddAccessibilityMode(ACCESSIBILITY_MODE_WEB_CONTENTS_ONLY); |
| 86 EXPECT_EQ(ACCESSIBILITY_MODE_WEB_CONTENTS_ONLY, | 90 EXPECT_EQ(ACCESSIBILITY_MODE_WEB_CONTENTS_ONLY, |
| 87 web_contents()->GetAccessibilityMode()); | 91 web_contents()->GetAccessibilityMode()); |
| 88 waiter.WaitForNotification(); | 92 waiter.WaitForNotification(); |
| 89 // No BrowserAccessibilityManager expected for | 93 // No BrowserAccessibilityManager expected for this mode. |
| 90 // ACCESSIBILITY_MODE_WEB_CONTENTS_ONLY | 94 EXPECT_FALSE(GetManager()); |
| 91 ExpectBrowserAccessibilityManager(ShouldBeBrowserAccessibilityManager( | |
| 92 ACCESSIBILITY_MODE_WEB_CONTENTS_ONLY)); | |
| 93 } | 95 } |
| 94 | 96 |
| 95 IN_PROC_BROWSER_TEST_F(AccessibilityModeTest, AddingModes) { | 97 IN_PROC_BROWSER_TEST_F(AccessibilityModeTest, AddingModes) { |
| 96 NavigateToURL(shell(), GURL(kMinimalPageDataURL)); | 98 NavigateToURL(shell(), GURL(kMinimalPageDataURL)); |
| 97 | 99 |
| 98 AccessibilityNotificationWaiter waiter(shell()->web_contents()); | 100 AccessibilityNotificationWaiter waiter(shell()->web_contents()); |
| 99 web_contents()->AddAccessibilityMode(ACCESSIBILITY_MODE_WEB_CONTENTS_ONLY); | 101 web_contents()->AddAccessibilityMode(ACCESSIBILITY_MODE_WEB_CONTENTS_ONLY); |
| 100 EXPECT_EQ(ACCESSIBILITY_MODE_WEB_CONTENTS_ONLY, | 102 EXPECT_EQ(ACCESSIBILITY_MODE_WEB_CONTENTS_ONLY, |
| 101 web_contents()->GetAccessibilityMode()); | 103 web_contents()->GetAccessibilityMode()); |
| 102 waiter.WaitForNotification(); | 104 waiter.WaitForNotification(); |
| 103 ExpectBrowserAccessibilityManager( | 105 EXPECT_FALSE(GetManager()); |
| 104 ShouldBeBrowserAccessibilityManager(ACCESSIBILITY_MODE_WEB_CONTENTS_ONLY), | |
| 105 "Should be no BrowserAccessibilityManager " | |
| 106 "for ACCESSIBILITY_MODE_WEB_CONTENTS_ONLY"); | |
| 107 | 106 |
| 108 AccessibilityNotificationWaiter waiter2(shell()->web_contents()); | 107 AccessibilityNotificationWaiter waiter2(shell()->web_contents()); |
| 109 web_contents()->AddAccessibilityMode(ACCESSIBILITY_MODE_COMPLETE); | 108 web_contents()->AddAccessibilityMode(ACCESSIBILITY_MODE_COMPLETE); |
| 110 EXPECT_EQ(ACCESSIBILITY_MODE_COMPLETE, | 109 EXPECT_EQ(ACCESSIBILITY_MODE_COMPLETE, |
| 111 web_contents()->GetAccessibilityMode()); | 110 web_contents()->GetAccessibilityMode()); |
| 112 waiter2.WaitForNotification(); | 111 waiter2.WaitForNotification(); |
| 113 ExpectBrowserAccessibilityManager( | 112 EXPECT_TRUE(GetManager()); |
| 114 ShouldBeBrowserAccessibilityManager(ACCESSIBILITY_MODE_COMPLETE), | 113 } |
| 115 "Should be a BrowserAccessibilityManager " | 114 |
| 116 "for ACCESSIBILITY_MODE_COMPLETE"); | 115 IN_PROC_BROWSER_TEST_F(AccessibilityModeTest, |
| 116 FullAccessibilityHasInlineTextBoxes) { |
| 117 NavigateToURL(shell(), GURL(url::kAboutBlankURL)); |
| 118 |
| 119 AccessibilityNotificationWaiter waiter(shell()->web_contents(), |
| 120 ACCESSIBILITY_MODE_COMPLETE, |
| 121 ui::AX_EVENT_LOAD_COMPLETE); |
| 122 GURL url("data:text/html,<p>Para</p>"); |
| 123 NavigateToURL(shell(), url); |
| 124 waiter.WaitForNotification(); |
| 125 |
| 126 BrowserAccessibility* text = FindNode(ui::AX_ROLE_STATIC_TEXT, "Para"); |
| 127 ASSERT_NE(nullptr, text); |
| 128 ASSERT_EQ(1U, text->InternalChildCount()); |
| 129 BrowserAccessibility* inline_text = text->InternalGetChild(0); |
| 130 ASSERT_NE(nullptr, inline_text); |
| 131 EXPECT_EQ(ui::AX_ROLE_INLINE_TEXT_BOX, inline_text->GetRole()); |
| 132 } |
| 133 |
| 134 IN_PROC_BROWSER_TEST_F(AccessibilityModeTest, |
| 135 MinimalAccessibilityModeHasNoInlineTextBoxes) { |
| 136 NavigateToURL(shell(), GURL(url::kAboutBlankURL)); |
| 137 |
| 138 AccessibilityNotificationWaiter waiter( |
| 139 shell()->web_contents(), |
| 140 ACCESSIBILITY_MODE_FLAG_NATIVE_APIS | |
| 141 ACCESSIBILITY_MODE_FLAG_WEB_CONTENTS, |
| 142 ui::AX_EVENT_LOAD_COMPLETE); |
| 143 GURL url("data:text/html,<p>Para</p>"); |
| 144 NavigateToURL(shell(), url); |
| 145 waiter.WaitForNotification(); |
| 146 |
| 147 BrowserAccessibility* text = FindNode(ui::AX_ROLE_STATIC_TEXT, "Para"); |
| 148 ASSERT_NE(nullptr, text); |
| 149 EXPECT_EQ(0U, text->InternalChildCount()); |
| 150 } |
| 151 |
| 152 IN_PROC_BROWSER_TEST_F(AccessibilityModeTest, AddScreenReaderModeFlag) { |
| 153 NavigateToURL(shell(), GURL(url::kAboutBlankURL)); |
| 154 |
| 155 AccessibilityNotificationWaiter waiter( |
| 156 shell()->web_contents(), |
| 157 ACCESSIBILITY_MODE_FLAG_NATIVE_APIS | |
| 158 ACCESSIBILITY_MODE_FLAG_WEB_CONTENTS, |
| 159 ui::AX_EVENT_LOAD_COMPLETE); |
| 160 GURL url("data:text/html,<input aria-label=Foo placeholder=Bar>"); |
| 161 NavigateToURL(shell(), url); |
| 162 waiter.WaitForNotification(); |
| 163 |
| 164 BrowserAccessibility* textbox = FindNode(ui::AX_ROLE_TEXT_FIELD, "Foo"); |
| 165 ASSERT_NE(nullptr, textbox); |
| 166 EXPECT_FALSE(textbox->HasStringAttribute(ui::AX_ATTR_PLACEHOLDER)); |
| 167 int original_id = textbox->GetId(); |
| 168 |
| 169 AccessibilityNotificationWaiter waiter2( |
| 170 shell()->web_contents(), 0, ui::AX_EVENT_LAYOUT_COMPLETE); |
| 171 BrowserAccessibilityStateImpl::GetInstance()->AddAccessibilityModeFlags( |
| 172 ACCESSIBILITY_MODE_FLAG_SCREEN_READER); |
| 173 waiter2.WaitForNotification(); |
| 174 |
| 175 BrowserAccessibility* textbox2 = FindNode(ui::AX_ROLE_TEXT_FIELD, "Foo"); |
| 176 ASSERT_NE(nullptr, textbox2); |
| 177 EXPECT_TRUE(textbox2->HasStringAttribute(ui::AX_ATTR_PLACEHOLDER)); |
| 178 EXPECT_NE(original_id, textbox2->GetId()); |
| 117 } | 179 } |
| 118 | 180 |
| 119 } // namespace content | 181 } // namespace content |
| OLD | NEW |