Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: content/browser/renderer_host/render_widget_host_unittest.cc

Issue 138163016: [DevTools] Touch emulation in content. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/basictypes.h" 5 #include "base/basictypes.h"
6 #include "base/bind.h" 6 #include "base/bind.h"
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/scoped_ptr.h"
9 #include "base/memory/shared_memory.h" 9 #include "base/memory/shared_memory.h"
10 #include "base/timer/timer.h" 10 #include "base/timer/timer.h"
(...skipping 30 matching lines...) Expand all
41 41
42 #if defined(OS_WIN) || defined(USE_AURA) 42 #if defined(OS_WIN) || defined(USE_AURA)
43 #include "content/browser/renderer_host/ui_events_helper.h" 43 #include "content/browser/renderer_host/ui_events_helper.h"
44 #include "ui/events/event.h" 44 #include "ui/events/event.h"
45 #endif 45 #endif
46 46
47 using base::TimeDelta; 47 using base::TimeDelta;
48 using blink::WebGestureEvent; 48 using blink::WebGestureEvent;
49 using blink::WebInputEvent; 49 using blink::WebInputEvent;
50 using blink::WebKeyboardEvent; 50 using blink::WebKeyboardEvent;
51 using blink::WebMouseEvent;
51 using blink::WebMouseWheelEvent; 52 using blink::WebMouseWheelEvent;
52 using blink::WebTouchEvent; 53 using blink::WebTouchEvent;
53 using blink::WebTouchPoint; 54 using blink::WebTouchPoint;
54 55
55 namespace content { 56 namespace content {
56 57
57 // TestOverscrollDelegate ------------------------------------------------------ 58 // TestOverscrollDelegate ------------------------------------------------------
58 59
59 class TestOverscrollDelegate : public OverscrollControllerDelegate { 60 class TestOverscrollDelegate : public OverscrollControllerDelegate {
60 public: 61 public:
(...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 637
637 void SendInputEventACK(WebInputEvent::Type type, 638 void SendInputEventACK(WebInputEvent::Type type,
638 InputEventAckState ack_result) { 639 InputEventAckState ack_result) {
639 scoped_ptr<IPC::Message> response( 640 scoped_ptr<IPC::Message> response(
640 new InputHostMsg_HandleInputEvent_ACK(0, type, ack_result, 641 new InputHostMsg_HandleInputEvent_ACK(0, type, ack_result,
641 ui::LatencyInfo())); 642 ui::LatencyInfo()));
642 host_->OnMessageReceived(*response); 643 host_->OnMessageReceived(*response);
643 } 644 }
644 645
645 void SimulateKeyboardEvent(WebInputEvent::Type type) { 646 void SimulateKeyboardEvent(WebInputEvent::Type type) {
646 WebKeyboardEvent event = SyntheticWebKeyboardEventBuilder::Build(type); 647 SimulateKeyboardEvent(type, 0);
647 NativeWebKeyboardEvent native_event; 648 }
648 memcpy(&native_event, &event, sizeof(event)); 649
650 void SimulateKeyboardEvent(WebInputEvent::Type type, int modifiers) {
651 WebKeyboardEvent event = SyntheticWebKeyboardEventBuilder::Build(type);
652 event.modifiers = modifiers;
653 NativeWebKeyboardEvent native_event;
654 memcpy(&native_event, &event, sizeof(event));
649 host_->ForwardKeyboardEvent(native_event); 655 host_->ForwardKeyboardEvent(native_event);
650 } 656 }
651 657
652 void SimulateMouseEvent(WebInputEvent::Type type) { 658 void SimulateMouseEvent(WebInputEvent::Type type) {
653 host_->ForwardMouseEvent(SyntheticWebMouseEventBuilder::Build(type)); 659 host_->ForwardMouseEvent(SyntheticWebMouseEventBuilder::Build(type));
654 } 660 }
655 661
656 void SimulateMouseEventWithLatencyInfo(WebInputEvent::Type type, 662 void SimulateMouseEventWithLatencyInfo(WebInputEvent::Type type,
657 const ui::LatencyInfo& ui_latency) { 663 const ui::LatencyInfo& ui_latency) {
658 host_->ForwardMouseEventWithLatencyInfo( 664 host_->ForwardMouseEventWithLatencyInfo(
(...skipping 10 matching lines...) Expand all
669 float dY, 675 float dY,
670 int modifiers, 676 int modifiers,
671 bool precise, 677 bool precise,
672 const ui::LatencyInfo& ui_latency) { 678 const ui::LatencyInfo& ui_latency) {
673 host_->ForwardWheelEventWithLatencyInfo( 679 host_->ForwardWheelEventWithLatencyInfo(
674 SyntheticWebMouseWheelEventBuilder::Build(dX, dY, modifiers, precise), 680 SyntheticWebMouseWheelEventBuilder::Build(dX, dY, modifiers, precise),
675 ui_latency); 681 ui_latency);
676 } 682 }
677 683
678 void SimulateMouseMove(int x, int y, int modifiers) { 684 void SimulateMouseMove(int x, int y, int modifiers) {
679 host_->ForwardMouseEvent( 685 SimulateMouseEvent(WebInputEvent::MouseMove, x, y, modifiers, false);
680 SyntheticWebMouseEventBuilder::Build(WebInputEvent::MouseMove, 686 }
681 x, 687
682 y, 688 void SimulateMouseEvent(
683 modifiers)); 689 WebInputEvent::Type type, int x, int y, int modifiers, bool pressed) {
690 WebMouseEvent event =
691 SyntheticWebMouseEventBuilder::Build(type, x, y, modifiers);
692 if (pressed)
693 event.button = WebMouseEvent::ButtonLeft;
694 event.timeStampSeconds = base::Time::Now().ToDoubleT();
695 host_->ForwardMouseEvent(event);
684 } 696 }
685 697
686 void SimulateWheelEventWithPhase(WebMouseWheelEvent::Phase phase) { 698 void SimulateWheelEventWithPhase(WebMouseWheelEvent::Phase phase) {
687 host_->ForwardWheelEvent(SyntheticWebMouseWheelEventBuilder::Build(phase)); 699 host_->ForwardWheelEvent(SyntheticWebMouseWheelEventBuilder::Build(phase));
688 } 700 }
689 701
690 // Inject provided synthetic WebGestureEvent instance. 702 // Inject provided synthetic WebGestureEvent instance.
691 void SimulateGestureEventCore(const WebGestureEvent& gesture_event) { 703 void SimulateGestureEventCore(const WebGestureEvent& gesture_event) {
692 host_->ForwardGestureEvent(gesture_event); 704 host_->ForwardGestureEvent(gesture_event);
693 } 705 }
(...skipping 1677 matching lines...) Expand 10 before | Expand all | Expand 10 after
2371 EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode()); 2383 EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode());
2372 EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->completed_mode()); 2384 EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->completed_mode());
2373 2385
2374 SimulateGestureEvent(WebInputEvent::GestureScrollEnd, 2386 SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
2375 WebGestureEvent::Touchscreen); 2387 WebGestureEvent::Touchscreen);
2376 EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode()); 2388 EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
2377 EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->completed_mode()); 2389 EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->completed_mode());
2378 process_->sink().ClearMessages(); 2390 process_->sink().ClearMessages();
2379 } 2391 }
2380 2392
2393 std::string GetInputMessageTypes(RenderWidgetHostProcess* process) {
2394 const WebInputEvent* event = NULL;
2395 ui::LatencyInfo latency_info;
2396 bool is_keyboard_shortcut;
2397 std::string result;
2398 for (size_t i = 0; i < process->sink().message_count(); ++i) {
2399 const IPC::Message *message = process->sink().GetMessageAt(i);
2400 EXPECT_EQ(InputMsg_HandleInputEvent::ID, message->type());
2401 EXPECT_TRUE(InputMsg_HandleInputEvent::Read(
2402 message, &event, &latency_info, &is_keyboard_shortcut));
2403 if (i != 0)
2404 result += " ";
2405 result += WebInputEventTraits::GetName(event->type);
2406 }
2407 process->sink().ClearMessages();
2408 return result;
2409 }
2410
2411 TEST_F(RenderWidgetHostTest, TouchEmulator) {
2412 host_->DisableGestureDebounce();
jdduke (slow) 2014/04/08 19:14:11 Nice.
2413 host_->OnMessageReceived(ViewHostMsg_SetTouchEventEmulationEnabled(0, true));
2414 process_->sink().ClearMessages();
2415 view_->set_bounds(gfx::Rect(0, 0, 400, 200));
2416 view_->Show();
2417
2418 SimulateMouseEvent(WebInputEvent::MouseMove, 10, 10, 0, false);
2419 EXPECT_EQ(0U, process_->sink().message_count());
2420
2421 // Mouse press becomes touch start which in turn becomes tap.
2422 SimulateMouseEvent(WebInputEvent::MouseDown, 10, 10, 0, true);
2423 EXPECT_EQ("TouchStart", GetInputMessageTypes(process_));
2424 SendInputEventACK(WebInputEvent::TouchStart,
2425 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2426 EXPECT_EQ("GestureTapDown", GetInputMessageTypes(process_));
2427 SendInputEventACK(WebInputEvent::GestureTapDown,
2428 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2429
2430 // Mouse drag generates touch move, cancels tap and starts scroll.
2431 SimulateMouseEvent(WebInputEvent::MouseMove, 10, 30, 0, true);
2432 EXPECT_EQ("TouchMove", GetInputMessageTypes(process_));
2433 SendInputEventACK(WebInputEvent::TouchMove,
2434 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2435 EXPECT_EQ("GestureTapCancel GestureScrollBegin GestureScrollUpdate",
2436 GetInputMessageTypes(process_));
2437 SendInputEventACK(WebInputEvent::GestureTapCancel,
2438 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2439 SendInputEventACK(WebInputEvent::GestureScrollBegin,
2440 INPUT_EVENT_ACK_STATE_CONSUMED);
2441 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
2442 INPUT_EVENT_ACK_STATE_CONSUMED);
2443 EXPECT_EQ(0U, process_->sink().message_count());
2444
2445 // Mouse drag with shift becomes pinch.
2446 SimulateMouseEvent(
2447 WebInputEvent::MouseMove, 10, 40, WebInputEvent::ShiftKey, true);
2448 EXPECT_EQ("GesturePinchBegin",
2449 GetInputMessageTypes(process_));
2450 SendInputEventACK(WebInputEvent::GesturePinchBegin,
2451 INPUT_EVENT_ACK_STATE_CONSUMED);
2452 EXPECT_EQ(0U, process_->sink().message_count());
2453
2454 SimulateMouseEvent(
2455 WebInputEvent::MouseMove, 10, 50, WebInputEvent::ShiftKey, true);
2456 EXPECT_EQ("GesturePinchUpdate",
2457 GetInputMessageTypes(process_));
2458 SendInputEventACK(WebInputEvent::GesturePinchUpdate,
2459 INPUT_EVENT_ACK_STATE_CONSUMED);
2460 EXPECT_EQ(0U, process_->sink().message_count());
2461
2462 // Mouse drag without shift becomes scroll again.
2463 SimulateMouseEvent(WebInputEvent::MouseMove, 10, 60, 0, true);
2464 EXPECT_EQ("GesturePinchEnd GestureScrollUpdate",
2465 GetInputMessageTypes(process_));
2466 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
2467 INPUT_EVENT_ACK_STATE_CONSUMED);
2468 EXPECT_EQ(0U, process_->sink().message_count());
2469
2470 SimulateMouseEvent(WebInputEvent::MouseMove, 10, 70, 0, true);
2471 EXPECT_EQ("GestureScrollUpdate",
2472 GetInputMessageTypes(process_));
2473 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
2474 INPUT_EVENT_ACK_STATE_CONSUMED);
2475 EXPECT_EQ(0U, process_->sink().message_count());
2476
2477 SimulateMouseEvent(WebInputEvent::MouseUp, 10, 70, 0, true);
2478 EXPECT_EQ("TouchEnd", GetInputMessageTypes(process_));
2479 SendInputEventACK(WebInputEvent::TouchEnd,
2480 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2481 EXPECT_EQ("GestureScrollEnd", GetInputMessageTypes(process_));
2482 SendInputEventACK(WebInputEvent::GestureScrollEnd,
2483 INPUT_EVENT_ACK_STATE_CONSUMED);
2484 EXPECT_EQ(0U, process_->sink().message_count());
2485
2486 // Mouse move does nothing.
2487 SimulateMouseEvent(WebInputEvent::MouseMove, 10, 80, 0, false);
2488 EXPECT_EQ(0U, process_->sink().message_count());
2489
2490 // Another mouse down continues scroll.
2491 SimulateMouseEvent(WebInputEvent::MouseDown, 10, 80, 0, true);
2492 EXPECT_EQ("TouchStart", GetInputMessageTypes(process_));
2493 SendInputEventACK(WebInputEvent::TouchStart,
2494 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2495 EXPECT_EQ("GestureTapDown", GetInputMessageTypes(process_));
2496 SendInputEventACK(WebInputEvent::GestureTapDown,
2497 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2498 EXPECT_EQ(0U, process_->sink().message_count());
2499
2500 SimulateMouseEvent(WebInputEvent::MouseMove, 10, 100, 0, true);
2501 EXPECT_EQ("TouchMove", GetInputMessageTypes(process_));
2502 SendInputEventACK(WebInputEvent::TouchMove,
2503 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2504 EXPECT_EQ("GestureTapCancel GestureScrollBegin GestureScrollUpdate",
2505 GetInputMessageTypes(process_));
2506 SendInputEventACK(WebInputEvent::GestureTapCancel,
2507 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2508 SendInputEventACK(WebInputEvent::GestureScrollBegin,
2509 INPUT_EVENT_ACK_STATE_CONSUMED);
2510 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
2511 INPUT_EVENT_ACK_STATE_CONSUMED);
2512 EXPECT_EQ(0U, process_->sink().message_count());
2513
2514 // Another pinch.
2515 SimulateMouseEvent(
2516 WebInputEvent::MouseMove, 10, 110, WebInputEvent::ShiftKey, true);
2517 EXPECT_EQ("GesturePinchBegin",
2518 GetInputMessageTypes(process_));
2519 SendInputEventACK(WebInputEvent::GesturePinchBegin,
2520 INPUT_EVENT_ACK_STATE_CONSUMED);
2521 EXPECT_EQ(0U, process_->sink().message_count());
2522
2523 SimulateMouseEvent(
2524 WebInputEvent::MouseMove, 10, 120, WebInputEvent::ShiftKey, true);
2525 EXPECT_EQ("GesturePinchUpdate",
2526 GetInputMessageTypes(process_));
2527 SendInputEventACK(WebInputEvent::GesturePinchUpdate,
2528 INPUT_EVENT_ACK_STATE_CONSUMED);
2529 EXPECT_EQ(0U, process_->sink().message_count());
2530
2531 // Turn off emulation.
2532 host_->OnMessageReceived(ViewHostMsg_SetTouchEventEmulationEnabled(0, false));
2533 EXPECT_EQ("TouchCancel GesturePinchEnd GestureScrollEnd",
2534 GetInputMessageTypes(process_));
2535 SendInputEventACK(WebInputEvent::TouchCancel,
2536 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2537 SendInputEventACK(WebInputEvent::GesturePinchEnd,
2538 INPUT_EVENT_ACK_STATE_CONSUMED);
2539 SendInputEventACK(WebInputEvent::GestureScrollEnd,
2540 INPUT_EVENT_ACK_STATE_CONSUMED);
2541 EXPECT_EQ(0U, process_->sink().message_count());
2542
2543 // Mouse event should pass untouched.
2544 SimulateMouseEvent(
2545 WebInputEvent::MouseMove, 10, 10, WebInputEvent::ShiftKey, true);
2546 EXPECT_EQ("MouseMove", GetInputMessageTypes(process_));
2547 SendInputEventACK(WebInputEvent::MouseMove,
2548 INPUT_EVENT_ACK_STATE_CONSUMED);
2549 EXPECT_EQ(0U, process_->sink().message_count());
2550
2551 // Turn on emulation.
2552 host_->OnMessageReceived(ViewHostMsg_SetTouchEventEmulationEnabled(0, true));
2553 EXPECT_EQ(0U, process_->sink().message_count());
2554
2555 // Another touch.
2556 SimulateMouseEvent(WebInputEvent::MouseDown, 10, 10, 0, true);
2557 EXPECT_EQ("TouchStart", GetInputMessageTypes(process_));
2558 SendInputEventACK(WebInputEvent::TouchStart,
2559 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2560 EXPECT_EQ("GestureTapDown", GetInputMessageTypes(process_));
2561 SendInputEventACK(WebInputEvent::GestureTapDown,
2562 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2563 EXPECT_EQ(0U, process_->sink().message_count());
2564
2565 // Now move mouse, and disable emulation before ack.
2566 SimulateMouseEvent(WebInputEvent::MouseMove, 10, 30, 0, true);
2567 EXPECT_EQ("TouchMove", GetInputMessageTypes(process_));
2568 host_->OnMessageReceived(ViewHostMsg_SetTouchEventEmulationEnabled(0, false));
2569 EXPECT_EQ(0U, process_->sink().message_count());
2570
2571 SendInputEventACK(WebInputEvent::TouchMove,
2572 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2573 EXPECT_EQ(
2574 "GestureTapCancel GestureScrollBegin GestureScrollUpdate TouchCancel",
2575 GetInputMessageTypes(process_));
2576 SendInputEventACK(WebInputEvent::GestureTapCancel,
2577 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2578 SendInputEventACK(WebInputEvent::GestureScrollBegin,
2579 INPUT_EVENT_ACK_STATE_CONSUMED);
2580 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
2581 INPUT_EVENT_ACK_STATE_CONSUMED);
2582 SendInputEventACK(WebInputEvent::TouchCancel,
2583 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2584 EXPECT_EQ("GestureScrollEnd", GetInputMessageTypes(process_));
2585 SendInputEventACK(WebInputEvent::GestureScrollEnd,
2586 INPUT_EVENT_ACK_STATE_CONSUMED);
2587 EXPECT_EQ(0U, process_->sink().message_count());
2588 }
2589
2381 #define TEST_InputRouterRoutes_NOARGS(INPUTMSG) \ 2590 #define TEST_InputRouterRoutes_NOARGS(INPUTMSG) \
2382 TEST_F(RenderWidgetHostTest, InputRouterRoutes##INPUTMSG) { \ 2591 TEST_F(RenderWidgetHostTest, InputRouterRoutes##INPUTMSG) { \
2383 host_->SetupForInputRouterTest(); \ 2592 host_->SetupForInputRouterTest(); \
2384 host_->INPUTMSG(); \ 2593 host_->INPUTMSG(); \
2385 EXPECT_TRUE(host_->mock_input_router()->send_event_called_); \ 2594 EXPECT_TRUE(host_->mock_input_router()->send_event_called_); \
2386 } 2595 }
2387 2596
2388 TEST_InputRouterRoutes_NOARGS(Focus); 2597 TEST_InputRouterRoutes_NOARGS(Focus);
2389 TEST_InputRouterRoutes_NOARGS(Blur); 2598 TEST_InputRouterRoutes_NOARGS(Blur);
2390 TEST_InputRouterRoutes_NOARGS(LostCapture); 2599 TEST_InputRouterRoutes_NOARGS(LostCapture);
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
2611 2820
2612 // Tests RWHI::ForwardTouchEventWithLatencyInfo(). 2821 // Tests RWHI::ForwardTouchEventWithLatencyInfo().
2613 PressTouchPoint(0, 1); 2822 PressTouchPoint(0, 1);
2614 SendTouchEvent(); 2823 SendTouchEvent();
2615 CheckLatencyInfoComponentInMessage( 2824 CheckLatencyInfoComponentInMessage(
2616 process_, GetLatencyComponentId(), WebInputEvent::TouchStart); 2825 process_, GetLatencyComponentId(), WebInputEvent::TouchStart);
2617 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED); 2826 SendInputEventACK(WebInputEvent::TouchStart, INPUT_EVENT_ACK_STATE_CONSUMED);
2618 } 2827 }
2619 2828
2620 } // namespace content 2829 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698