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 "base/strings/utf_string_conversions.h" | 5 #include "base/strings/utf_string_conversions.h" |
6 #include "base/time/time.h" | 6 #include "base/time/time.h" |
7 #include "content/common/frame_messages.h" | 7 #include "content/common/frame_messages.h" |
8 #include "content/common/view_message_enums.h" | 8 #include "content/common/view_message_enums.h" |
9 #include "content/public/test/render_view_test.h" | 9 #include "content/public/test/render_view_test.h" |
10 #include "content/renderer/accessibility/renderer_accessibility_complete.h" | 10 #include "content/renderer/accessibility/renderer_accessibility_complete.h" |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 return event.update.nodes.size(); | 71 return event.update.nodes.size(); |
72 } | 72 } |
73 | 73 |
74 protected: | 74 protected: |
75 IPC::TestSink* sink_; | 75 IPC::TestSink* sink_; |
76 | 76 |
77 DISALLOW_COPY_AND_ASSIGN(RendererAccessibilityTest); | 77 DISALLOW_COPY_AND_ASSIGN(RendererAccessibilityTest); |
78 | 78 |
79 }; | 79 }; |
80 | 80 |
81 TEST_F(RendererAccessibilityTest, EditableTextModeFocusEvents) { | |
82 // This is not a test of true web accessibility, it's a test of | |
83 // a mode used on Windows 8 in Metro mode where an extremely simplified | |
84 // accessibility tree containing only the current focused node is | |
85 // generated. | |
86 SetMode(AccessibilityModeEditableTextOnly); | |
87 | |
88 // Set a minimum size and give focus so simulated events work. | |
89 view()->webwidget()->resize(blink::WebSize(500, 500)); | |
90 view()->webwidget()->setFocus(true); | |
91 | |
92 std::string html = | |
93 "<body>" | |
94 " <input>" | |
95 " <textarea></textarea>" | |
96 " <p contentEditable>Editable</p>" | |
97 " <div tabindex=0 role=textbox>Textbox</div>" | |
98 " <button>Button</button>" | |
99 " <a href=#>Link</a>" | |
100 "</body>"; | |
101 | |
102 // Load the test page. | |
103 LoadHTML(html.c_str()); | |
104 | |
105 // We should have sent a message to the browser with the initial focus | |
106 // on the document. | |
107 { | |
108 SCOPED_TRACE("Initial focus on document"); | |
109 AccessibilityHostMsg_EventParams event; | |
110 GetLastAccEvent(&event); | |
111 EXPECT_EQ(event.event_type, | |
112 ui::AX_EVENT_LAYOUT_COMPLETE); | |
113 EXPECT_EQ(event.id, 1); | |
114 EXPECT_EQ(event.update.nodes.size(), 2U); | |
115 EXPECT_EQ(event.update.nodes[0].id, 1); | |
116 EXPECT_EQ(event.update.nodes[0].role, | |
117 ui::AX_ROLE_ROOT_WEB_AREA); | |
118 EXPECT_EQ(event.update.nodes[0].state, | |
119 (1U << ui::AX_STATE_READ_ONLY) | | |
120 (1U << ui::AX_STATE_FOCUSABLE) | | |
121 (1U << ui::AX_STATE_FOCUSED)); | |
122 EXPECT_EQ(event.update.nodes[0].child_ids.size(), 1U); | |
123 } | |
124 | |
125 // Now focus the input element, and check everything again. | |
126 { | |
127 SCOPED_TRACE("input"); | |
128 sink_->ClearMessages(); | |
129 ExecuteJavaScript("document.querySelector('input').focus();"); | |
130 AccessibilityHostMsg_EventParams event; | |
131 GetLastAccEvent(&event); | |
132 EXPECT_EQ(event.event_type, | |
133 ui::AX_EVENT_FOCUS); | |
134 EXPECT_EQ(event.id, 3); | |
135 EXPECT_EQ(event.update.nodes[0].id, 1); | |
136 EXPECT_EQ(event.update.nodes[0].role, | |
137 ui::AX_ROLE_ROOT_WEB_AREA); | |
138 EXPECT_EQ(event.update.nodes[0].state, | |
139 (1U << ui::AX_STATE_READ_ONLY) | | |
140 (1U << ui::AX_STATE_FOCUSABLE)); | |
141 EXPECT_EQ(event.update.nodes[0].child_ids.size(), 1U); | |
142 EXPECT_EQ(event.update.nodes[1].id, 3); | |
143 EXPECT_EQ(event.update.nodes[1].role, | |
144 ui::AX_ROLE_GROUP); | |
145 EXPECT_EQ(event.update.nodes[1].state, | |
146 (1U << ui::AX_STATE_FOCUSABLE) | | |
147 (1U << ui::AX_STATE_FOCUSED)); | |
148 } | |
149 | |
150 // Check other editable text nodes. | |
151 { | |
152 SCOPED_TRACE("textarea"); | |
153 sink_->ClearMessages(); | |
154 ExecuteJavaScript("document.querySelector('textarea').focus();"); | |
155 AccessibilityHostMsg_EventParams event; | |
156 GetLastAccEvent(&event); | |
157 EXPECT_EQ(event.id, 4); | |
158 EXPECT_EQ(event.update.nodes[1].state, | |
159 (1U << ui::AX_STATE_FOCUSABLE) | | |
160 (1U << ui::AX_STATE_FOCUSED)); | |
161 } | |
162 | |
163 { | |
164 SCOPED_TRACE("contentEditable"); | |
165 sink_->ClearMessages(); | |
166 ExecuteJavaScript("document.querySelector('p').focus();"); | |
167 AccessibilityHostMsg_EventParams event; | |
168 GetLastAccEvent(&event); | |
169 EXPECT_EQ(event.id, 5); | |
170 EXPECT_EQ(event.update.nodes[1].state, | |
171 (1U << ui::AX_STATE_FOCUSABLE) | | |
172 (1U << ui::AX_STATE_FOCUSED)); | |
173 } | |
174 | |
175 { | |
176 SCOPED_TRACE("role=textarea"); | |
177 sink_->ClearMessages(); | |
178 ExecuteJavaScript("document.querySelector('div').focus();"); | |
179 AccessibilityHostMsg_EventParams event; | |
180 GetLastAccEvent(&event); | |
181 EXPECT_EQ(event.id, 6); | |
182 EXPECT_EQ(event.update.nodes[1].state, | |
183 (1U << ui::AX_STATE_FOCUSABLE) | | |
184 (1U << ui::AX_STATE_FOCUSED)); | |
185 } | |
186 | |
187 // Try focusing things that aren't editable text. | |
188 { | |
189 SCOPED_TRACE("button"); | |
190 sink_->ClearMessages(); | |
191 ExecuteJavaScript("document.querySelector('button').focus();"); | |
192 AccessibilityHostMsg_EventParams event; | |
193 GetLastAccEvent(&event); | |
194 EXPECT_EQ(event.id, 7); | |
195 EXPECT_EQ(event.update.nodes[1].state, | |
196 (1U << ui::AX_STATE_FOCUSABLE) | | |
197 (1U << ui::AX_STATE_FOCUSED) | | |
198 (1U << ui::AX_STATE_READ_ONLY)); | |
199 } | |
200 | |
201 { | |
202 SCOPED_TRACE("link"); | |
203 sink_->ClearMessages(); | |
204 ExecuteJavaScript("document.querySelector('a').focus();"); | |
205 AccessibilityHostMsg_EventParams event; | |
206 GetLastAccEvent(&event); | |
207 EXPECT_EQ(event.id, 8); | |
208 EXPECT_EQ(event.update.nodes[1].state, | |
209 (1U << ui::AX_STATE_FOCUSABLE) | | |
210 (1U << ui::AX_STATE_FOCUSED) | | |
211 (1U << ui::AX_STATE_READ_ONLY)); | |
212 } | |
213 | |
214 // Clear focus. | |
215 { | |
216 SCOPED_TRACE("Back to document."); | |
217 sink_->ClearMessages(); | |
218 ExecuteJavaScript("document.activeElement.blur()"); | |
219 AccessibilityHostMsg_EventParams event; | |
220 GetLastAccEvent(&event); | |
221 EXPECT_EQ(event.id, 1); | |
222 } | |
223 } | |
224 | |
225 TEST_F(RendererAccessibilityTest, SendFullAccessibilityTreeOnReload) { | 81 TEST_F(RendererAccessibilityTest, SendFullAccessibilityTreeOnReload) { |
226 // The job of RendererAccessibilityComplete is to serialize the | 82 // The job of RendererAccessibilityComplete is to serialize the |
227 // accessibility tree built by WebKit and send it to the browser. | 83 // accessibility tree built by WebKit and send it to the browser. |
228 // When the accessibility tree changes, it tries to send only | 84 // When the accessibility tree changes, it tries to send only |
229 // the nodes that actually changed or were reparented. This test | 85 // the nodes that actually changed or were reparented. This test |
230 // ensures that the messages sent are correct in cases when a page | 86 // ensures that the messages sent are correct in cases when a page |
231 // reloads, and that internal state is properly garbage-collected. | 87 // reloads, and that internal state is properly garbage-collected. |
232 std::string html = | 88 std::string html = |
233 "<body>" | 89 "<body>" |
234 " <div role='group' id='A'>" | 90 " <div role='group' id='A'>" |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
549 | 405 |
550 const IPC::Message* message = | 406 const IPC::Message* message = |
551 sink_->GetUniqueMessageMatching(AccessibilityHostMsg_Events::ID); | 407 sink_->GetUniqueMessageMatching(AccessibilityHostMsg_Events::ID); |
552 ASSERT_TRUE(message); | 408 ASSERT_TRUE(message); |
553 Tuple1<std::vector<AccessibilityHostMsg_EventParams> > param; | 409 Tuple1<std::vector<AccessibilityHostMsg_EventParams> > param; |
554 AccessibilityHostMsg_Events::Read(message, ¶m); | 410 AccessibilityHostMsg_Events::Read(message, ¶m); |
555 ASSERT_EQ(0U, param.a.size()); | 411 ASSERT_EQ(0U, param.a.size()); |
556 } | 412 } |
557 | 413 |
558 } // namespace content | 414 } // namespace content |
OLD | NEW |