| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "base/utf_string_conversions.h" | |
| 6 #include "content/common/accessibility_messages.h" | |
| 7 #include "content/common/accessibility_node_data.h" | |
| 8 #include "content/common/view_messages.h" | |
| 9 #include "content/renderer/render_view_impl.h" | |
| 10 #include "content/public/test/render_view_test.h" | |
| 11 #include "testing/gtest/include/gtest/gtest.h" | |
| 12 #include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" | |
| 13 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" | |
| 14 | |
| 15 namespace content { | |
| 16 | |
| 17 class RendererAccessibilityTest : public RenderViewTest { | |
| 18 public: | |
| 19 RendererAccessibilityTest() {} | |
| 20 | |
| 21 RenderViewImpl* view() { | |
| 22 return static_cast<RenderViewImpl*>(view_); | |
| 23 } | |
| 24 | |
| 25 virtual void SetUp() { | |
| 26 RenderViewTest::SetUp(); | |
| 27 sink_ = &render_thread_->sink(); | |
| 28 } | |
| 29 | |
| 30 void SetMode(AccessibilityMode mode) { | |
| 31 view()->OnSetAccessibilityMode(mode); | |
| 32 } | |
| 33 | |
| 34 void GetLastAccNotification( | |
| 35 AccessibilityHostMsg_NotificationParams* params) { | |
| 36 const IPC::Message* message = | |
| 37 sink_->GetUniqueMessageMatching(AccessibilityHostMsg_Notifications::ID); | |
| 38 ASSERT_TRUE(message); | |
| 39 Tuple1<std::vector<AccessibilityHostMsg_NotificationParams> > param; | |
| 40 AccessibilityHostMsg_Notifications::Read(message, ¶m); | |
| 41 ASSERT_EQ(param.a.size(), 1U); | |
| 42 *params = param.a[0]; | |
| 43 } | |
| 44 | |
| 45 protected: | |
| 46 IPC::TestSink* sink_; | |
| 47 | |
| 48 DISALLOW_COPY_AND_ASSIGN(RendererAccessibilityTest); | |
| 49 }; | |
| 50 | |
| 51 TEST_F(RendererAccessibilityTest, EditableTextModeFocusNotifications) { | |
| 52 SetMode(AccessibilityModeEditableTextOnly); | |
| 53 | |
| 54 // Set a minimum size and give focus so simulated events work. | |
| 55 view()->webwidget()->resize(WebKit::WebSize(500, 500)); | |
| 56 view()->webwidget()->setFocus(true); | |
| 57 | |
| 58 std::string html = | |
| 59 "<body>" | |
| 60 " <input>" | |
| 61 " <textarea></textarea>" | |
| 62 " <p contentEditable>Editable</p>" | |
| 63 " <div tabindex=0 role=textbox>Textbox</div>" | |
| 64 " <button>Button</button>" | |
| 65 " <a href=#>Link</a>" | |
| 66 "</body>"; | |
| 67 | |
| 68 // Load the test page. | |
| 69 LoadHTML(html.c_str()); | |
| 70 | |
| 71 // We should have sent a message to the browser with the initial focus | |
| 72 // on the document. | |
| 73 { | |
| 74 SCOPED_TRACE("Initial focus on document"); | |
| 75 AccessibilityHostMsg_NotificationParams notification; | |
| 76 GetLastAccNotification(¬ification); | |
| 77 EXPECT_EQ(notification.notification_type, | |
| 78 AccessibilityNotificationLayoutComplete); | |
| 79 EXPECT_EQ(notification.includes_children, true); | |
| 80 EXPECT_EQ(notification.id, 1); | |
| 81 EXPECT_EQ(notification.acc_tree.id, 1); | |
| 82 EXPECT_EQ(notification.acc_tree.role, | |
| 83 AccessibilityNodeData::ROLE_ROOT_WEB_AREA); | |
| 84 EXPECT_EQ(notification.acc_tree.state, | |
| 85 (1U << AccessibilityNodeData::STATE_READONLY) | | |
| 86 (1U << AccessibilityNodeData::STATE_FOCUSABLE) | | |
| 87 (1U << AccessibilityNodeData::STATE_FOCUSED)); | |
| 88 EXPECT_EQ(notification.acc_tree.children.size(), 1U); | |
| 89 } | |
| 90 | |
| 91 // Now focus the input element, and check everything again. | |
| 92 { | |
| 93 SCOPED_TRACE("input"); | |
| 94 sink_->ClearMessages(); | |
| 95 ExecuteJavaScript("document.querySelector('input').focus();"); | |
| 96 AccessibilityHostMsg_NotificationParams notification; | |
| 97 GetLastAccNotification(¬ification); | |
| 98 EXPECT_EQ(notification.notification_type, | |
| 99 AccessibilityNotificationFocusChanged); | |
| 100 EXPECT_EQ(notification.includes_children, true); | |
| 101 EXPECT_EQ(notification.id, 3); | |
| 102 EXPECT_EQ(notification.acc_tree.id, 1); | |
| 103 EXPECT_EQ(notification.acc_tree.role, | |
| 104 AccessibilityNodeData::ROLE_ROOT_WEB_AREA); | |
| 105 EXPECT_EQ(notification.acc_tree.state, | |
| 106 (1U << AccessibilityNodeData::STATE_READONLY) | | |
| 107 (1U << AccessibilityNodeData::STATE_FOCUSABLE)); | |
| 108 EXPECT_EQ(notification.acc_tree.children.size(), 1U); | |
| 109 EXPECT_EQ(notification.acc_tree.children[0].id, 3); | |
| 110 EXPECT_EQ(notification.acc_tree.children[0].role, | |
| 111 AccessibilityNodeData::ROLE_GROUP); | |
| 112 EXPECT_EQ(notification.acc_tree.children[0].state, | |
| 113 (1U << AccessibilityNodeData::STATE_FOCUSABLE) | | |
| 114 (1U << AccessibilityNodeData::STATE_FOCUSED)); | |
| 115 } | |
| 116 | |
| 117 // Check other editable text nodes. | |
| 118 { | |
| 119 SCOPED_TRACE("textarea"); | |
| 120 sink_->ClearMessages(); | |
| 121 ExecuteJavaScript("document.querySelector('textarea').focus();"); | |
| 122 AccessibilityHostMsg_NotificationParams notification; | |
| 123 GetLastAccNotification(¬ification); | |
| 124 EXPECT_EQ(notification.id, 4); | |
| 125 EXPECT_EQ(notification.acc_tree.children[0].state, | |
| 126 (1U << AccessibilityNodeData::STATE_FOCUSABLE) | | |
| 127 (1U << AccessibilityNodeData::STATE_FOCUSED)); | |
| 128 } | |
| 129 | |
| 130 { | |
| 131 SCOPED_TRACE("contentEditable"); | |
| 132 sink_->ClearMessages(); | |
| 133 ExecuteJavaScript("document.querySelector('p').focus();"); | |
| 134 AccessibilityHostMsg_NotificationParams notification; | |
| 135 GetLastAccNotification(¬ification); | |
| 136 EXPECT_EQ(notification.id, 5); | |
| 137 EXPECT_EQ(notification.acc_tree.children[0].state, | |
| 138 (1U << AccessibilityNodeData::STATE_FOCUSABLE) | | |
| 139 (1U << AccessibilityNodeData::STATE_FOCUSED)); | |
| 140 } | |
| 141 | |
| 142 { | |
| 143 SCOPED_TRACE("role=textarea"); | |
| 144 sink_->ClearMessages(); | |
| 145 ExecuteJavaScript("document.querySelector('div').focus();"); | |
| 146 AccessibilityHostMsg_NotificationParams notification; | |
| 147 GetLastAccNotification(¬ification); | |
| 148 EXPECT_EQ(notification.id, 6); | |
| 149 EXPECT_EQ(notification.acc_tree.children[0].state, | |
| 150 (1U << AccessibilityNodeData::STATE_FOCUSABLE) | | |
| 151 (1U << AccessibilityNodeData::STATE_FOCUSED)); | |
| 152 } | |
| 153 | |
| 154 // Try focusing things that aren't editable text. | |
| 155 { | |
| 156 SCOPED_TRACE("button"); | |
| 157 sink_->ClearMessages(); | |
| 158 ExecuteJavaScript("document.querySelector('button').focus();"); | |
| 159 AccessibilityHostMsg_NotificationParams notification; | |
| 160 GetLastAccNotification(¬ification); | |
| 161 EXPECT_EQ(notification.id, 7); | |
| 162 EXPECT_EQ(notification.acc_tree.children[0].state, | |
| 163 (1U << AccessibilityNodeData::STATE_FOCUSABLE) | | |
| 164 (1U << AccessibilityNodeData::STATE_FOCUSED) | | |
| 165 (1U << AccessibilityNodeData::STATE_READONLY)); | |
| 166 } | |
| 167 | |
| 168 { | |
| 169 SCOPED_TRACE("link"); | |
| 170 sink_->ClearMessages(); | |
| 171 ExecuteJavaScript("document.querySelector('a').focus();"); | |
| 172 AccessibilityHostMsg_NotificationParams notification; | |
| 173 GetLastAccNotification(¬ification); | |
| 174 EXPECT_EQ(notification.id, 8); | |
| 175 EXPECT_EQ(notification.acc_tree.children[0].state, | |
| 176 (1U << AccessibilityNodeData::STATE_FOCUSABLE) | | |
| 177 (1U << AccessibilityNodeData::STATE_FOCUSED) | | |
| 178 (1U << AccessibilityNodeData::STATE_READONLY)); | |
| 179 } | |
| 180 | |
| 181 // Clear focus. | |
| 182 { | |
| 183 SCOPED_TRACE("Back to document."); | |
| 184 sink_->ClearMessages(); | |
| 185 ExecuteJavaScript("document.activeElement.blur()"); | |
| 186 AccessibilityHostMsg_NotificationParams notification; | |
| 187 GetLastAccNotification(¬ification); | |
| 188 EXPECT_EQ(notification.id, 1); | |
| 189 } | |
| 190 } | |
| 191 | |
| 192 } // namespace content | |
| OLD | NEW |