OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/renderer_host/input/touch_selection_controller_client_
aura.h" | 5 #include "content/browser/renderer_host/input/touch_selection_controller_client_
aura.h" |
6 | 6 |
| 7 #include "base/command_line.h" |
7 #include "base/json/json_reader.h" | 8 #include "base/json/json_reader.h" |
8 #include "base/macros.h" | 9 #include "base/macros.h" |
9 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
10 #include "content/browser/renderer_host/render_widget_host_view_aura.h" | 11 #include "content/browser/renderer_host/render_widget_host_view_aura.h" |
11 #include "content/browser/web_contents/web_contents_impl.h" | 12 #include "content/browser/web_contents/web_contents_impl.h" |
12 #include "content/public/test/browser_test_utils.h" | 13 #include "content/public/test/browser_test_utils.h" |
13 #include "content/public/test/content_browser_test.h" | 14 #include "content/public/test/content_browser_test.h" |
14 #include "content/public/test/content_browser_test_utils.h" | 15 #include "content/public/test/content_browser_test_utils.h" |
15 #include "content/shell/browser/shell.h" | 16 #include "content/shell/browser/shell.h" |
16 #include "ui/aura/window.h" | 17 #include "ui/aura/window.h" |
17 #include "ui/aura/window_tree_host.h" | 18 #include "ui/aura/window_tree_host.h" |
18 #include "ui/events/event_utils.h" | 19 #include "ui/events/event_utils.h" |
19 #include "ui/events/test/event_generator.h" | 20 #include "ui/events/test/event_generator.h" |
| 21 #include "ui/gfx/switches.h" |
20 #include "ui/touch_selection/touch_selection_controller_test_api.h" | 22 #include "ui/touch_selection/touch_selection_controller_test_api.h" |
21 | 23 |
22 namespace content { | 24 namespace content { |
23 namespace { | 25 namespace { |
24 | 26 |
25 bool JSONToPoint(const std::string& str, gfx::PointF* point) { | 27 bool JSONToPoint(const std::string& str, gfx::PointF* point) { |
26 scoped_ptr<base::Value> value = base::JSONReader::Read(str); | 28 scoped_ptr<base::Value> value = base::JSONReader::Read(str); |
27 if (!value) | 29 if (!value) |
28 return false; | 30 return false; |
29 base::DictionaryValue* root; | 31 base::DictionaryValue* root; |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 return JSONToPoint(str, point); | 148 return JSONToPoint(str, point); |
147 } | 149 } |
148 return false; | 150 return false; |
149 } | 151 } |
150 | 152 |
151 bool EmptyTextfield() { | 153 bool EmptyTextfield() { |
152 return ExecuteScript(shell()->web_contents()->GetMainFrame(), | 154 return ExecuteScript(shell()->web_contents()->GetMainFrame(), |
153 "empty_textfield()"); | 155 "empty_textfield()"); |
154 } | 156 } |
155 | 157 |
| 158 RenderWidgetHostViewAura* GetRenderWidgetHostViewAura() { |
| 159 return static_cast<RenderWidgetHostViewAura*>( |
| 160 shell()->web_contents()->GetRenderWidgetHostView()); |
| 161 } |
| 162 |
| 163 TestTouchSelectionControllerClientAura* selection_controller_client() { |
| 164 return selection_controller_client_; |
| 165 } |
| 166 |
| 167 void InitSelectionController() { |
| 168 RenderWidgetHostViewAura* rwhva = GetRenderWidgetHostViewAura(); |
| 169 selection_controller_client_ = |
| 170 new TestTouchSelectionControllerClientAura(rwhva); |
| 171 rwhva->SetSelectionControllerClientForTest( |
| 172 make_scoped_ptr(selection_controller_client_)); |
| 173 } |
| 174 |
156 private: | 175 private: |
157 void SetUpOnMainThread() override { | 176 void SetUpOnMainThread() override { |
158 ContentBrowserTest::SetUpOnMainThread(); | 177 ContentBrowserTest::SetUpOnMainThread(); |
159 if (!ui::TouchSelectionMenuRunner::GetInstance()) | 178 if (!ui::TouchSelectionMenuRunner::GetInstance()) |
160 menu_runner_.reset(new TestTouchSelectionMenuRunner); | 179 menu_runner_.reset(new TestTouchSelectionMenuRunner); |
161 } | 180 } |
162 | 181 |
163 void TearDownOnMainThread() override { | 182 void TearDownOnMainThread() override { |
164 menu_runner_ = nullptr; | 183 menu_runner_ = nullptr; |
| 184 selection_controller_client_ = nullptr; |
165 ContentBrowserTest::TearDownOnMainThread(); | 185 ContentBrowserTest::TearDownOnMainThread(); |
166 } | 186 } |
167 | 187 |
168 scoped_ptr<TestTouchSelectionMenuRunner> menu_runner_; | 188 scoped_ptr<TestTouchSelectionMenuRunner> menu_runner_; |
169 | 189 |
| 190 TestTouchSelectionControllerClientAura* selection_controller_client_ = |
| 191 nullptr; |
| 192 |
170 DISALLOW_COPY_AND_ASSIGN(TouchSelectionControllerClientAuraTest); | 193 DISALLOW_COPY_AND_ASSIGN(TouchSelectionControllerClientAuraTest); |
171 }; | 194 }; |
172 | 195 |
173 // Tests that long-pressing on a text brings up selection handles and the quick | 196 // Tests that long-pressing on a text brings up selection handles and the quick |
174 // menu properly. | 197 // menu properly. |
175 IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAuraTest, BasicSelection) { | 198 IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAuraTest, BasicSelection) { |
176 // Set the test page up. | 199 // Set the test page up. |
177 ASSERT_NO_FATAL_FAILURE(StartTestWithPage("/touch_selection.html")); | 200 ASSERT_NO_FATAL_FAILURE(StartTestWithPage("/touch_selection.html")); |
178 WebContents* web_contents = | 201 InitSelectionController(); |
179 static_cast<WebContentsImpl*>(shell()->web_contents()); | |
180 RenderWidgetHostViewAura* rwhva = static_cast<RenderWidgetHostViewAura*>( | |
181 web_contents->GetRenderWidgetHostView()); | |
182 TestTouchSelectionControllerClientAura* selection_controller_client = | |
183 new TestTouchSelectionControllerClientAura(rwhva); | |
184 rwhva->SetSelectionControllerClientForTest( | |
185 make_scoped_ptr(selection_controller_client)); | |
186 | 202 |
| 203 RenderWidgetHostViewAura* rwhva = GetRenderWidgetHostViewAura(); |
187 EXPECT_EQ(ui::TouchSelectionController::INACTIVE, | 204 EXPECT_EQ(ui::TouchSelectionController::INACTIVE, |
188 rwhva->selection_controller()->active_status()); | 205 rwhva->selection_controller()->active_status()); |
189 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); | 206 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); |
190 | 207 |
191 // Long-press on the text and wait for handles to appear. | 208 // Long-press on the text and wait for handles to appear. |
192 selection_controller_client->InitWaitForSelectionEvent( | 209 selection_controller_client()->InitWaitForSelectionEvent( |
193 ui::SELECTION_HANDLES_SHOWN); | 210 ui::SELECTION_HANDLES_SHOWN); |
194 | 211 |
195 gfx::PointF point; | 212 gfx::PointF point; |
196 ASSERT_TRUE(GetPointInsideText(&point)); | 213 ASSERT_TRUE(GetPointInsideText(&point)); |
197 ui::GestureEvent long_press( | 214 ui::GestureEvent long_press( |
198 point.x(), point.y(), 0, ui::EventTimeForNow(), | 215 point.x(), point.y(), 0, ui::EventTimeForNow(), |
199 ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS)); | 216 ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS)); |
200 rwhva->OnGestureEvent(&long_press); | 217 rwhva->OnGestureEvent(&long_press); |
201 | 218 |
202 selection_controller_client->Wait(); | 219 selection_controller_client()->Wait(); |
203 | 220 |
204 // Check that selection is active and the quick menu is showing. | 221 // Check that selection is active and the quick menu is showing. |
205 EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE, | 222 EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE, |
206 rwhva->selection_controller()->active_status()); | 223 rwhva->selection_controller()->active_status()); |
207 EXPECT_TRUE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); | 224 EXPECT_TRUE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); |
208 } | 225 } |
209 | 226 |
210 // Tests that tapping in a textfield brings up the insertion handle, but not the | 227 // Tests that tapping in a textfield brings up the insertion handle, but not the |
211 // quick menu, initially. Then, successive taps on the insertion handle toggle | 228 // quick menu, initially. Then, successive taps on the insertion handle toggle |
212 // the quick menu visibility. | 229 // the quick menu visibility. |
213 IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAuraTest, | 230 IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAuraTest, |
214 BasicInsertionFollowedByTapsOnHandle) { | 231 BasicInsertionFollowedByTapsOnHandle) { |
215 // Set the test page up. | 232 // Set the test page up. |
216 ASSERT_NO_FATAL_FAILURE(StartTestWithPage("/touch_selection.html")); | 233 ASSERT_NO_FATAL_FAILURE(StartTestWithPage("/touch_selection.html")); |
217 WebContents* web_contents = | 234 InitSelectionController(); |
218 static_cast<WebContentsImpl*>(shell()->web_contents()); | |
219 RenderWidgetHostViewAura* rwhva = static_cast<RenderWidgetHostViewAura*>( | |
220 web_contents->GetRenderWidgetHostView()); | |
221 TestTouchSelectionControllerClientAura* selection_controller_client = | |
222 new TestTouchSelectionControllerClientAura(rwhva); | |
223 rwhva->SetSelectionControllerClientForTest( | |
224 make_scoped_ptr(selection_controller_client)); | |
225 | 235 |
| 236 RenderWidgetHostViewAura* rwhva = GetRenderWidgetHostViewAura(); |
226 EXPECT_EQ(ui::TouchSelectionController::INACTIVE, | 237 EXPECT_EQ(ui::TouchSelectionController::INACTIVE, |
227 rwhva->selection_controller()->active_status()); | 238 rwhva->selection_controller()->active_status()); |
228 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); | 239 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); |
229 | 240 |
230 ui::test::EventGeneratorDelegate* generator_delegate = | 241 ui::test::EventGeneratorDelegate* generator_delegate = |
231 ui::test::EventGenerator::default_delegate; | 242 ui::test::EventGenerator::default_delegate; |
232 ui::test::EventGenerator generator( | 243 gfx::NativeView native_view = rwhva->GetNativeView(); |
233 web_contents->GetContentNativeView()->GetRootWindow()); | 244 ui::test::EventGenerator generator(native_view->GetRootWindow()); |
234 | 245 |
235 // Tap inside the textfield and wait for the insertion handle to appear. | 246 // Tap inside the textfield and wait for the insertion handle to appear. |
236 selection_controller_client->InitWaitForSelectionEvent( | 247 selection_controller_client()->InitWaitForSelectionEvent( |
237 ui::INSERTION_HANDLE_SHOWN); | 248 ui::INSERTION_HANDLE_SHOWN); |
238 | 249 |
239 gfx::PointF point_f; | 250 gfx::PointF point_f; |
240 ASSERT_TRUE(GetPointInsideTextfield(&point_f)); | 251 ASSERT_TRUE(GetPointInsideTextfield(&point_f)); |
241 gfx::Point point = gfx::ToRoundedPoint(point_f); | 252 gfx::Point point = gfx::ToRoundedPoint(point_f); |
242 generator_delegate->ConvertPointFromTarget( | 253 generator_delegate->ConvertPointFromTarget(native_view, &point); |
243 web_contents->GetContentNativeView(), &point); | |
244 generator.GestureTapAt(point); | 254 generator.GestureTapAt(point); |
245 | 255 |
246 selection_controller_client->Wait(); | 256 selection_controller_client()->Wait(); |
247 | 257 |
248 // Check that insertion is active, but the quick menu is not showing. | 258 // Check that insertion is active, but the quick menu is not showing. |
249 EXPECT_EQ(ui::TouchSelectionController::INSERTION_ACTIVE, | 259 EXPECT_EQ(ui::TouchSelectionController::INSERTION_ACTIVE, |
250 rwhva->selection_controller()->active_status()); | 260 rwhva->selection_controller()->active_status()); |
251 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); | 261 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); |
252 | 262 |
253 // Tap on the insertion handle; the quick menu should appear. | 263 // Tap on the insertion handle; the quick menu should appear. |
254 gfx::Point handle_center = gfx::ToRoundedPoint( | 264 gfx::Point handle_center = gfx::ToRoundedPoint( |
255 rwhva->selection_controller()->GetStartHandleRect().CenterPoint()); | 265 rwhva->selection_controller()->GetStartHandleRect().CenterPoint()); |
256 generator_delegate->ConvertPointFromTarget( | 266 generator_delegate->ConvertPointFromTarget(native_view, &handle_center); |
257 web_contents->GetContentNativeView(), &handle_center); | |
258 generator.GestureTapAt(handle_center); | 267 generator.GestureTapAt(handle_center); |
259 EXPECT_TRUE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); | 268 EXPECT_TRUE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); |
260 | 269 |
261 // Tap once more on the insertion handle; the quick menu should disappear. | 270 // Tap once more on the insertion handle; the quick menu should disappear. |
262 generator.GestureTapAt(handle_center); | 271 generator.GestureTapAt(handle_center); |
263 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); | 272 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); |
264 } | 273 } |
265 | 274 |
266 // Tests that tapping in an empty textfield does not bring up the insertion | 275 // Tests that tapping in an empty textfield does not bring up the insertion |
267 // handle. | 276 // handle. |
268 IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAuraTest, | 277 IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAuraTest, |
269 EmptyTextfieldInsertionOnTap) { | 278 EmptyTextfieldInsertionOnTap) { |
270 // Set the test page up. | 279 // Set the test page up. |
271 ASSERT_NO_FATAL_FAILURE(StartTestWithPage("/touch_selection.html")); | 280 ASSERT_NO_FATAL_FAILURE(StartTestWithPage("/touch_selection.html")); |
272 WebContents* web_contents = | 281 InitSelectionController(); |
273 static_cast<WebContentsImpl*>(shell()->web_contents()); | 282 |
274 RenderWidgetHostViewAura* rwhva = static_cast<RenderWidgetHostViewAura*>( | 283 RenderWidgetHostViewAura* rwhva = GetRenderWidgetHostViewAura(); |
275 web_contents->GetRenderWidgetHostView()); | |
276 TestTouchSelectionControllerClientAura* selection_controller_client = | |
277 new TestTouchSelectionControllerClientAura(rwhva); | |
278 rwhva->SetSelectionControllerClientForTest( | |
279 make_scoped_ptr(selection_controller_client)); | |
280 | 284 |
281 // Clear textfield contents. | 285 // Clear textfield contents. |
282 ASSERT_TRUE(EmptyTextfield()); | 286 ASSERT_TRUE(EmptyTextfield()); |
283 | 287 |
284 EXPECT_EQ(ui::TouchSelectionController::INACTIVE, | 288 EXPECT_EQ(ui::TouchSelectionController::INACTIVE, |
285 rwhva->selection_controller()->active_status()); | 289 rwhva->selection_controller()->active_status()); |
286 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); | 290 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); |
287 | 291 |
288 // Tap inside the textfield and wait for the insertion cursor. | 292 // Tap inside the textfield and wait for the insertion cursor. |
289 selection_controller_client->InitWaitForSelectionEvent( | 293 selection_controller_client()->InitWaitForSelectionEvent( |
290 ui::SELECTION_ESTABLISHED); | 294 ui::SELECTION_ESTABLISHED); |
291 | 295 |
292 gfx::PointF point; | 296 gfx::PointF point; |
293 ASSERT_TRUE(GetPointInsideTextfield(&point)); | 297 ASSERT_TRUE(GetPointInsideTextfield(&point)); |
294 ui::GestureEventDetails tap_details(ui::ET_GESTURE_TAP); | 298 ui::GestureEventDetails tap_details(ui::ET_GESTURE_TAP); |
295 tap_details.set_tap_count(1); | 299 tap_details.set_tap_count(1); |
296 ui::GestureEvent tap(point.x(), point.y(), 0, ui::EventTimeForNow(), | 300 ui::GestureEvent tap(point.x(), point.y(), 0, ui::EventTimeForNow(), |
297 tap_details); | 301 tap_details); |
298 rwhva->OnGestureEvent(&tap); | 302 rwhva->OnGestureEvent(&tap); |
299 | 303 |
300 selection_controller_client->Wait(); | 304 selection_controller_client()->Wait(); |
301 | 305 |
302 // Check that insertion is not active and the quick menu is not showing. | 306 // Check that insertion is not active and the quick menu is not showing. |
303 EXPECT_EQ(ui::TouchSelectionController::INACTIVE, | 307 EXPECT_EQ(ui::TouchSelectionController::INACTIVE, |
304 rwhva->selection_controller()->active_status()); | 308 rwhva->selection_controller()->active_status()); |
305 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); | 309 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); |
306 } | 310 } |
307 | 311 |
308 // Tests that the quick menu is hidden whenever a touch point is active. | 312 // Tests that the quick menu is hidden whenever a touch point is active. |
309 IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAuraTest, | 313 IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAuraTest, |
310 QuickMenuHiddenOnTouch) { | 314 QuickMenuHiddenOnTouch) { |
311 // Set the test page up. | 315 // Set the test page up. |
312 ASSERT_NO_FATAL_FAILURE(StartTestWithPage("/touch_selection.html")); | 316 ASSERT_NO_FATAL_FAILURE(StartTestWithPage("/touch_selection.html")); |
313 WebContents* web_contents = | 317 InitSelectionController(); |
314 static_cast<WebContentsImpl*>(shell()->web_contents()); | |
315 RenderWidgetHostViewAura* rwhva = static_cast<RenderWidgetHostViewAura*>( | |
316 web_contents->GetRenderWidgetHostView()); | |
317 TestTouchSelectionControllerClientAura* selection_controller_client = | |
318 new TestTouchSelectionControllerClientAura(rwhva); | |
319 rwhva->SetSelectionControllerClientForTest( | |
320 make_scoped_ptr(selection_controller_client)); | |
321 | 318 |
| 319 RenderWidgetHostViewAura* rwhva = GetRenderWidgetHostViewAura(); |
322 EXPECT_EQ(ui::TouchSelectionController::INACTIVE, | 320 EXPECT_EQ(ui::TouchSelectionController::INACTIVE, |
323 rwhva->selection_controller()->active_status()); | 321 rwhva->selection_controller()->active_status()); |
324 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); | 322 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); |
325 | 323 |
326 // Long-press on the text and wait for selection handles to appear. | 324 // Long-press on the text and wait for selection handles to appear. |
327 selection_controller_client->InitWaitForSelectionEvent( | 325 selection_controller_client()->InitWaitForSelectionEvent( |
328 ui::SELECTION_HANDLES_SHOWN); | 326 ui::SELECTION_HANDLES_SHOWN); |
329 | 327 |
330 gfx::PointF point; | 328 gfx::PointF point; |
331 ASSERT_TRUE(GetPointInsideText(&point)); | 329 ASSERT_TRUE(GetPointInsideText(&point)); |
332 ui::GestureEvent long_press( | 330 ui::GestureEvent long_press( |
333 point.x(), point.y(), 0, ui::EventTimeForNow(), | 331 point.x(), point.y(), 0, ui::EventTimeForNow(), |
334 ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS)); | 332 ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS)); |
335 rwhva->OnGestureEvent(&long_press); | 333 rwhva->OnGestureEvent(&long_press); |
336 | 334 |
337 selection_controller_client->Wait(); | 335 selection_controller_client()->Wait(); |
338 | 336 |
339 EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE, | 337 EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE, |
340 rwhva->selection_controller()->active_status()); | 338 rwhva->selection_controller()->active_status()); |
341 EXPECT_TRUE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); | 339 EXPECT_TRUE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); |
342 | 340 |
343 ui::test::EventGenerator generator( | 341 ui::test::EventGenerator generator(rwhva->GetNativeView()->GetRootWindow(), |
344 web_contents->GetContentNativeView()->GetRootWindow(), | 342 rwhva->GetNativeView()); |
345 web_contents->GetContentNativeView()); | |
346 | 343 |
347 // Put the first finger down: the quick menu should get hidden. | 344 // Put the first finger down: the quick menu should get hidden. |
348 generator.PressTouchId(0); | 345 generator.PressTouchId(0); |
349 EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE, | 346 EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE, |
350 rwhva->selection_controller()->active_status()); | 347 rwhva->selection_controller()->active_status()); |
351 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); | 348 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); |
352 | 349 |
353 // Put a second finger down: the quick menu should remain hidden. | 350 // Put a second finger down: the quick menu should remain hidden. |
354 generator.PressTouchId(1); | 351 generator.PressTouchId(1); |
355 EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE, | 352 EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE, |
(...skipping 10 matching lines...) Expand all Loading... |
366 generator.ReleaseTouchId(1); | 363 generator.ReleaseTouchId(1); |
367 EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE, | 364 EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE, |
368 rwhva->selection_controller()->active_status()); | 365 rwhva->selection_controller()->active_status()); |
369 EXPECT_TRUE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); | 366 EXPECT_TRUE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); |
370 } | 367 } |
371 | 368 |
372 // Tests that the quick menu and touch handles are hidden during an scroll. | 369 // Tests that the quick menu and touch handles are hidden during an scroll. |
373 IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAuraTest, HiddenOnScroll) { | 370 IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAuraTest, HiddenOnScroll) { |
374 // Set the test page up. | 371 // Set the test page up. |
375 ASSERT_NO_FATAL_FAILURE(StartTestWithPage("/touch_selection.html")); | 372 ASSERT_NO_FATAL_FAILURE(StartTestWithPage("/touch_selection.html")); |
376 WebContents* web_contents = | 373 InitSelectionController(); |
377 static_cast<WebContentsImpl*>(shell()->web_contents()); | 374 |
378 RenderWidgetHostViewAura* rwhva = static_cast<RenderWidgetHostViewAura*>( | 375 RenderWidgetHostViewAura* rwhva = GetRenderWidgetHostViewAura(); |
379 web_contents->GetRenderWidgetHostView()); | |
380 TestTouchSelectionControllerClientAura* selection_controller_client = | |
381 new TestTouchSelectionControllerClientAura(rwhva); | |
382 rwhva->SetSelectionControllerClientForTest( | |
383 make_scoped_ptr(selection_controller_client)); | |
384 ui::TouchSelectionControllerTestApi selection_controller_test_api( | 376 ui::TouchSelectionControllerTestApi selection_controller_test_api( |
385 rwhva->selection_controller()); | 377 rwhva->selection_controller()); |
386 | 378 |
387 EXPECT_EQ(ui::TouchSelectionController::INACTIVE, | 379 EXPECT_EQ(ui::TouchSelectionController::INACTIVE, |
388 rwhva->selection_controller()->active_status()); | 380 rwhva->selection_controller()->active_status()); |
389 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); | 381 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); |
390 | 382 |
391 // Long-press on the text and wait for selection handles to appear. | 383 // Long-press on the text and wait for selection handles to appear. |
392 selection_controller_client->InitWaitForSelectionEvent( | 384 selection_controller_client()->InitWaitForSelectionEvent( |
393 ui::SELECTION_HANDLES_SHOWN); | 385 ui::SELECTION_HANDLES_SHOWN); |
394 | 386 |
395 gfx::PointF point; | 387 gfx::PointF point; |
396 ASSERT_TRUE(GetPointInsideText(&point)); | 388 ASSERT_TRUE(GetPointInsideText(&point)); |
397 ui::GestureEvent long_press( | 389 ui::GestureEvent long_press( |
398 point.x(), point.y(), 0, ui::EventTimeForNow(), | 390 point.x(), point.y(), 0, ui::EventTimeForNow(), |
399 ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS)); | 391 ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS)); |
400 rwhva->OnGestureEvent(&long_press); | 392 rwhva->OnGestureEvent(&long_press); |
401 | 393 |
402 selection_controller_client->Wait(); | 394 selection_controller_client()->Wait(); |
403 | 395 |
404 EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE, | 396 EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE, |
405 rwhva->selection_controller()->active_status()); | 397 rwhva->selection_controller()->active_status()); |
406 EXPECT_FALSE(selection_controller_test_api.temporarily_hidden()); | 398 EXPECT_FALSE(selection_controller_test_api.temporarily_hidden()); |
407 EXPECT_TRUE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); | 399 EXPECT_TRUE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); |
408 | 400 |
409 // Put a finger down: the quick menu should go away, while touch handles stay | 401 // Put a finger down: the quick menu should go away, while touch handles stay |
410 // there. | 402 // there. |
411 ui::TouchEvent touch_down(ui::ET_TOUCH_PRESSED, gfx::Point(10, 10), 0, | 403 ui::TouchEvent touch_down(ui::ET_TOUCH_PRESSED, gfx::Point(10, 10), 0, |
412 ui::EventTimeForNow()); | 404 ui::EventTimeForNow()); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
445 rwhva->selection_controller()->active_status()); | 437 rwhva->selection_controller()->active_status()); |
446 EXPECT_FALSE(selection_controller_test_api.temporarily_hidden()); | 438 EXPECT_FALSE(selection_controller_test_api.temporarily_hidden()); |
447 EXPECT_TRUE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); | 439 EXPECT_TRUE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); |
448 } | 440 } |
449 | 441 |
450 // Tests that touch selection gets deactivated after an overscroll completes. | 442 // Tests that touch selection gets deactivated after an overscroll completes. |
451 IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAuraTest, | 443 IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAuraTest, |
452 HiddenAfterOverscroll) { | 444 HiddenAfterOverscroll) { |
453 // Set the page up. | 445 // Set the page up. |
454 ASSERT_NO_FATAL_FAILURE(StartTestWithPage("/touch_selection.html")); | 446 ASSERT_NO_FATAL_FAILURE(StartTestWithPage("/touch_selection.html")); |
455 WebContents* web_contents = | 447 InitSelectionController(); |
456 static_cast<WebContentsImpl*>(shell()->web_contents()); | |
457 RenderWidgetHostViewAura* rwhva = static_cast<RenderWidgetHostViewAura*>( | |
458 web_contents->GetRenderWidgetHostView()); | |
459 TestTouchSelectionControllerClientAura* selection_controller_client = | |
460 new TestTouchSelectionControllerClientAura(rwhva); | |
461 rwhva->SetSelectionControllerClientForTest( | |
462 make_scoped_ptr(selection_controller_client)); | |
463 | 448 |
| 449 RenderWidgetHostViewAura* rwhva = GetRenderWidgetHostViewAura(); |
464 EXPECT_EQ(ui::TouchSelectionController::INACTIVE, | 450 EXPECT_EQ(ui::TouchSelectionController::INACTIVE, |
465 rwhva->selection_controller()->active_status()); | 451 rwhva->selection_controller()->active_status()); |
466 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); | 452 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); |
467 | 453 |
468 // Long-press on the text and wait for touch handles to appear. | 454 // Long-press on the text and wait for touch handles to appear. |
469 selection_controller_client->InitWaitForSelectionEvent( | 455 selection_controller_client()->InitWaitForSelectionEvent( |
470 ui::SELECTION_HANDLES_SHOWN); | 456 ui::SELECTION_HANDLES_SHOWN); |
471 | 457 |
472 gfx::PointF point; | 458 gfx::PointF point; |
473 ASSERT_TRUE(GetPointInsideText(&point)); | 459 ASSERT_TRUE(GetPointInsideText(&point)); |
474 ui::GestureEvent long_press( | 460 ui::GestureEvent long_press( |
475 point.x(), point.y(), 0, ui::EventTimeForNow(), | 461 point.x(), point.y(), 0, ui::EventTimeForNow(), |
476 ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS)); | 462 ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS)); |
477 rwhva->OnGestureEvent(&long_press); | 463 rwhva->OnGestureEvent(&long_press); |
478 | 464 |
479 selection_controller_client->Wait(); | 465 selection_controller_client()->Wait(); |
480 | 466 |
481 EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE, | 467 EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE, |
482 rwhva->selection_controller()->active_status()); | 468 rwhva->selection_controller()->active_status()); |
483 EXPECT_TRUE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); | 469 EXPECT_TRUE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); |
484 | 470 |
485 // Scroll such that an overscroll is initiated and wait for it to complete: | 471 // Scroll such that an overscroll is initiated and wait for it to complete: |
486 // touch selection should not be active at the end. | 472 // touch selection should not be active at the end. |
487 selection_controller_client->InitWaitForSelectionEvent( | 473 selection_controller_client()->InitWaitForSelectionEvent( |
488 ui::SELECTION_HANDLES_CLEARED); | 474 ui::SELECTION_HANDLES_CLEARED); |
489 | 475 |
490 ui::GestureEvent scroll_begin( | 476 ui::GestureEvent scroll_begin( |
491 10, 10, 0, ui::EventTimeForNow(), | 477 10, 10, 0, ui::EventTimeForNow(), |
492 ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN)); | 478 ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN)); |
493 rwhva->OnGestureEvent(&scroll_begin); | 479 rwhva->OnGestureEvent(&scroll_begin); |
494 | 480 |
495 ui::GestureEvent scroll_update( | 481 ui::GestureEvent scroll_update( |
496 210, 10, 0, ui::EventTimeForNow(), | 482 210, 10, 0, ui::EventTimeForNow(), |
497 ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_UPDATE, 200, 0)); | 483 ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_UPDATE, 200, 0)); |
498 rwhva->OnGestureEvent(&scroll_update); | 484 rwhva->OnGestureEvent(&scroll_update); |
499 | 485 |
500 ui::GestureEvent scroll_end( | 486 ui::GestureEvent scroll_end( |
501 210, 10, 0, ui::EventTimeForNow(), | 487 210, 10, 0, ui::EventTimeForNow(), |
502 ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_END)); | 488 ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_END)); |
503 rwhva->OnGestureEvent(&scroll_end); | 489 rwhva->OnGestureEvent(&scroll_end); |
504 | 490 |
505 selection_controller_client->Wait(); | 491 selection_controller_client()->Wait(); |
506 | 492 |
507 EXPECT_EQ(ui::TouchSelectionController::INACTIVE, | 493 EXPECT_EQ(ui::TouchSelectionController::INACTIVE, |
508 rwhva->selection_controller()->active_status()); | 494 rwhva->selection_controller()->active_status()); |
509 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); | 495 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); |
510 } | 496 } |
511 | 497 |
| 498 class TouchSelectionControllerClientAuraScaleFactorTest |
| 499 : public TouchSelectionControllerClientAuraTest { |
| 500 public: |
| 501 void SetUpCommandLine(base::CommandLine* command_line) override { |
| 502 command_line->AppendSwitchASCII(switches::kForceDeviceScaleFactor, "2"); |
| 503 } |
| 504 }; |
| 505 |
| 506 #if defined(OS_WIN) |
| 507 // High DPI tests are disabled on Windows due to crbug.com/545547. |
| 508 #define MAYBE_SelectionHandleCoordinates DISABLED_SelectionHandleCoordinates |
| 509 #define MAYBE_InsertionHandleCoordinates DISABLED_InsertionHandleCoordinates |
| 510 #else |
| 511 #define MAYBE_SelectionHandleCoordinates SelectionHandleCoordinates |
| 512 #define MAYBE_InsertionHandleCoordinates InsertionHandleCoordinates |
| 513 #endif |
| 514 |
| 515 // Tests that selection handles are properly positioned at 2x DSF. |
| 516 IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAuraScaleFactorTest, |
| 517 MAYBE_SelectionHandleCoordinates) { |
| 518 // Set the test page up. |
| 519 ASSERT_NO_FATAL_FAILURE(StartTestWithPage("/touch_selection.html")); |
| 520 InitSelectionController(); |
| 521 |
| 522 RenderWidgetHostViewAura* rwhva = GetRenderWidgetHostViewAura(); |
| 523 |
| 524 EXPECT_EQ(ui::TouchSelectionController::INACTIVE, |
| 525 rwhva->selection_controller()->active_status()); |
| 526 EXPECT_FALSE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); |
| 527 EXPECT_EQ(2.f, rwhva->current_device_scale_factor()); |
| 528 |
| 529 // Long-press on the text and wait for handles to appear. |
| 530 selection_controller_client()->InitWaitForSelectionEvent( |
| 531 ui::SELECTION_HANDLES_SHOWN); |
| 532 gfx::PointF point; |
| 533 ASSERT_TRUE(GetPointInsideText(&point)); |
| 534 ui::GestureEvent long_press( |
| 535 point.x(), point.y(), 0, ui::EventTimeForNow(), |
| 536 ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS)); |
| 537 rwhva->OnGestureEvent(&long_press); |
| 538 selection_controller_client()->Wait(); |
| 539 |
| 540 // Check that selection is active and the quick menu is showing. |
| 541 EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE, |
| 542 rwhva->selection_controller()->active_status()); |
| 543 EXPECT_TRUE(ui::TouchSelectionMenuRunner::GetInstance()->IsRunning()); |
| 544 const ui::TouchSelectionController* controller = |
| 545 GetRenderWidgetHostViewAura()->selection_controller(); |
| 546 |
| 547 gfx::PointF start_top = controller->start().edge_top(); |
| 548 |
| 549 // The selection start should be uppper left, and selection end should be |
| 550 // upper right. |
| 551 EXPECT_LT(controller->start().edge_top().x(), point.x()); |
| 552 EXPECT_LT(controller->start().edge_bottom().x(), point.x()); |
| 553 |
| 554 EXPECT_LT(point.x(), controller->end().edge_top().x()); |
| 555 EXPECT_LT(point.x(), controller->end().edge_bottom().x()); |
| 556 |
| 557 // Handles are created below the selection. The top position should roughly |
| 558 // be within the handle size from the touch position. |
| 559 float handle_size = controller->start().edge_bottom().y() - |
| 560 controller->start().edge_top().y(); |
| 561 float handle_max_bottom = point.y() + handle_size; |
| 562 EXPECT_GT(handle_max_bottom, controller->start().edge_top().y()); |
| 563 EXPECT_GT(handle_max_bottom, controller->end().edge_top().y()); |
| 564 |
| 565 gfx::Point handle_point = gfx::ToRoundedPoint( |
| 566 rwhva->selection_controller()->GetStartHandleRect().CenterPoint()); |
| 567 |
| 568 // Move the selection handle. Touch the handle first. |
| 569 selection_controller_client()->InitWaitForSelectionEvent( |
| 570 ui::SELECTION_HANDLE_DRAG_STARTED); |
| 571 ui::TouchEvent touch_down(ui::ET_TOUCH_PRESSED, handle_point, 0, |
| 572 ui::EventTimeForNow()); |
| 573 rwhva->OnTouchEvent(&touch_down); |
| 574 selection_controller_client()->Wait(); |
| 575 |
| 576 // Move it. |
| 577 selection_controller_client()->InitWaitForSelectionEvent( |
| 578 ui::SELECTION_HANDLES_MOVED); |
| 579 handle_point.Offset(10, 0); |
| 580 ui::TouchEvent touch_move(ui::ET_TOUCH_MOVED, handle_point, 0, |
| 581 ui::EventTimeForNow()); |
| 582 rwhva->OnTouchEvent(&touch_move); |
| 583 selection_controller_client()->Wait(); |
| 584 |
| 585 // Then release. |
| 586 selection_controller_client()->InitWaitForSelectionEvent( |
| 587 ui::SELECTION_HANDLE_DRAG_STOPPED); |
| 588 ui::TouchEvent touch_up(ui::ET_TOUCH_RELEASED, handle_point, 0, |
| 589 ui::EventTimeForNow()); |
| 590 rwhva->OnTouchEvent(&touch_up); |
| 591 selection_controller_client()->Wait(); |
| 592 |
| 593 // The handle should have moved to right. |
| 594 EXPECT_EQ(start_top.y(), controller->start().edge_top().y()); |
| 595 EXPECT_LT(start_top.x(), controller->start().edge_top().x()); |
| 596 |
| 597 EXPECT_EQ(ui::TouchSelectionController::SELECTION_ACTIVE, |
| 598 rwhva->selection_controller()->active_status()); |
| 599 } |
| 600 |
| 601 // Tests that insertion handles are properly positioned at 2x DSF. |
| 602 IN_PROC_BROWSER_TEST_F(TouchSelectionControllerClientAuraScaleFactorTest, |
| 603 MAYBE_InsertionHandleCoordinates) { |
| 604 // Set the test page up. |
| 605 ASSERT_NO_FATAL_FAILURE(StartTestWithPage("/touch_selection.html")); |
| 606 InitSelectionController(); |
| 607 |
| 608 RenderWidgetHostViewAura* rwhva = GetRenderWidgetHostViewAura(); |
| 609 |
| 610 // Tap inside the textfield and wait for the insertion cursor. |
| 611 selection_controller_client()->InitWaitForSelectionEvent( |
| 612 ui::INSERTION_HANDLE_SHOWN); |
| 613 |
| 614 gfx::PointF point; |
| 615 ASSERT_TRUE(GetPointInsideTextfield(&point)); |
| 616 ui::GestureEventDetails tap_details(ui::ET_GESTURE_TAP); |
| 617 tap_details.set_tap_count(1); |
| 618 ui::GestureEvent tap(point.x(), point.y(), 0, ui::EventTimeForNow(), |
| 619 tap_details); |
| 620 rwhva->OnGestureEvent(&tap); |
| 621 |
| 622 selection_controller_client()->Wait(); |
| 623 |
| 624 EXPECT_EQ(ui::TouchSelectionController::INSERTION_ACTIVE, |
| 625 rwhva->selection_controller()->active_status()); |
| 626 |
| 627 gfx::RectF initial_handle_rect = |
| 628 rwhva->selection_controller()->GetStartHandleRect(); |
| 629 |
| 630 // Move the insertion handle. Touch the handle first. |
| 631 gfx::Point handle_point = |
| 632 gfx::ToRoundedPoint(initial_handle_rect.CenterPoint()); |
| 633 |
| 634 selection_controller_client()->InitWaitForSelectionEvent( |
| 635 ui::INSERTION_HANDLE_DRAG_STARTED); |
| 636 ui::TouchEvent touch_down(ui::ET_TOUCH_PRESSED, handle_point, 0, |
| 637 ui::EventTimeForNow()); |
| 638 rwhva->OnTouchEvent(&touch_down); |
| 639 selection_controller_client()->Wait(); |
| 640 |
| 641 // Move it. |
| 642 selection_controller_client()->InitWaitForSelectionEvent( |
| 643 ui::INSERTION_HANDLE_MOVED); |
| 644 handle_point.Offset(10, 0); |
| 645 ui::TouchEvent touch_move(ui::ET_TOUCH_MOVED, handle_point, 0, |
| 646 ui::EventTimeForNow()); |
| 647 rwhva->OnTouchEvent(&touch_move); |
| 648 selection_controller_client()->Wait(); |
| 649 |
| 650 // Then release. |
| 651 selection_controller_client()->InitWaitForSelectionEvent( |
| 652 ui::INSERTION_HANDLE_DRAG_STOPPED); |
| 653 ui::TouchEvent touch_up(ui::ET_TOUCH_RELEASED, handle_point, 0, |
| 654 ui::EventTimeForNow()); |
| 655 rwhva->OnTouchEvent(&touch_up); |
| 656 selection_controller_client()->Wait(); |
| 657 |
| 658 gfx::RectF moved_handle_rect = |
| 659 rwhva->selection_controller()->GetStartHandleRect(); |
| 660 |
| 661 // The handle should have moved to right. |
| 662 EXPECT_EQ(initial_handle_rect.y(), moved_handle_rect.y()); |
| 663 EXPECT_LT(initial_handle_rect.x(), moved_handle_rect.x()); |
| 664 |
| 665 EXPECT_EQ(ui::TouchSelectionController::INSERTION_ACTIVE, |
| 666 rwhva->selection_controller()->active_status()); |
| 667 } |
| 668 |
512 } // namespace content | 669 } // namespace content |
OLD | NEW |