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/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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |