15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
6424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/bind.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/shared_memory.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_thread_impl.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/backing_store.h"
12558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/browser/renderer_host/input/gesture_event_filter.h"
13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/renderer_host/input/input_router_impl.h"
14558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/browser/renderer_host/input/tap_suppression_controller.h"
15558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/browser/renderer_host/input/tap_suppression_controller_client.h"
16558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/browser/renderer_host/input/touch_event_queue.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/overscroll_controller.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/overscroll_controller_delegate.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_delegate.h"
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/common/input/synthetic_web_input_event_builders.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/input_messages.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/port/browser/render_widget_host_view_port.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/mock_render_process_host.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_context.h"
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/test/test_render_view_host.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/screen.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_view_aura.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/test/test_screen.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) || defined(USE_AURA)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/ui_events_helper.h"
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta;
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebGestureEvent;
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputEvent;
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using blink::WebKeyboardEvent;
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseWheelEvent;
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchEvent;
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchPoint;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TestOverscrollDelegate ------------------------------------------------------
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestOverscrollDelegate : public OverscrollControllerDelegate {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  explicit TestOverscrollDelegate(RenderWidgetHostView* view)
631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      : view_(view),
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        current_mode_(OVERSCROLL_NONE),
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        completed_mode_(OVERSCROLL_NONE),
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delta_x_(0.f),
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delta_y_(0.f) {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestOverscrollDelegate() {}
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OverscrollMode current_mode() const { return current_mode_; }
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OverscrollMode completed_mode() const { return completed_mode_; }
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float delta_x() const { return delta_x_; }
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float delta_y() const { return delta_y_; }
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Reset() {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_mode_ = OVERSCROLL_NONE;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    completed_mode_ = OVERSCROLL_NONE;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delta_x_ = delta_y_ = 0.f;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from OverscrollControllerDelegate:
851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual gfx::Rect GetVisibleBounds() const OVERRIDE {
861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return view_->IsShowing() ? view_->GetViewBounds() : gfx::Rect();
871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnOverscrollUpdate(float delta_x, float delta_y) OVERRIDE {
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delta_x_ = delta_x;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delta_y_ = delta_y;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnOverscrollComplete(OverscrollMode overscroll_mode) OVERRIDE {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(current_mode_, overscroll_mode);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    completed_mode_ = overscroll_mode;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_mode_ = OVERSCROLL_NONE;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnOverscrollModeChange(OverscrollMode old_mode,
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      OverscrollMode new_mode) OVERRIDE {
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(current_mode_, old_mode);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_mode_ = new_mode;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delta_x_ = delta_y_ = 0.f;
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RenderWidgetHostView* view_;
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OverscrollMode current_mode_;
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OverscrollMode completed_mode_;
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float delta_x_;
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float delta_y_;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestOverscrollDelegate);
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// MockInputRouter -------------------------------------------------------------
1172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochclass MockInputRouter : public InputRouter {
1192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch public:
1202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  explicit MockInputRouter(InputRouterClient* client)
1212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      : send_event_called_(false),
1222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        sent_mouse_event_(false),
1232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        sent_wheel_event_(false),
1242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        sent_keyboard_event_(false),
1252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        sent_gesture_event_(false),
1262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        send_touch_event_not_cancelled_(false),
1272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        message_received_(false),
1282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        client_(client) {
1292385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
1302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual ~MockInputRouter() {}
1312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1322385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // InputRouter
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void Flush() OVERRIDE {
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    flush_called_ = true;
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual bool SendInput(scoped_ptr<IPC::Message> message) OVERRIDE {
1372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    send_event_called_ = true;
1382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    return true;
1392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
1402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual void SendMouseEvent(
1412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      const MouseEventWithLatencyInfo& mouse_event) OVERRIDE {
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    sent_mouse_event_ = true;
1432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
1442385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual void SendWheelEvent(
1452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      const MouseWheelEventWithLatencyInfo& wheel_event) OVERRIDE {
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    sent_wheel_event_ = true;
1472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
1482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual void SendKeyboardEvent(
1492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      const NativeWebKeyboardEvent& key_event,
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const ui::LatencyInfo& latency_info,
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      bool is_shortcut) OVERRIDE {
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    sent_keyboard_event_ = true;
1532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
1542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual void SendGestureEvent(
1552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      const GestureEventWithLatencyInfo& gesture_event) OVERRIDE {
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    sent_gesture_event_ = true;
1572385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
1582385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual void SendTouchEvent(
1592385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      const TouchEventWithLatencyInfo& touch_event) OVERRIDE {
1608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    send_touch_event_not_cancelled_ =
1618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        client_->FilterInputEvent(touch_event.event, touch_event.latency) ==
1628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1642385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual const NativeWebKeyboardEvent* GetLastKeyboardEvent() const OVERRIDE {
1652385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    NOTREACHED();
1662385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    return NULL;
1672385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
1682385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual bool ShouldForwardTouchEvent() const OVERRIDE { return true; }
169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void OnViewUpdated(int view_flags) OVERRIDE {}
1702385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // IPC::Listener
1722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE {
1732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    message_received_ = true;
1742385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    return false;
1752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
1762385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bool flush_called_;
1782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  bool send_event_called_;
1792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  bool sent_mouse_event_;
1802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  bool sent_wheel_event_;
1812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  bool sent_keyboard_event_;
1822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  bool sent_gesture_event_;
1832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  bool send_touch_event_not_cancelled_;
1842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  bool message_received_;
1852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch private:
1872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  InputRouterClient* client_;
1882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  DISALLOW_COPY_AND_ASSIGN(MockInputRouter);
1902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch};
1912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MockRenderWidgetHost ----------------------------------------------------
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockRenderWidgetHost : public RenderWidgetHostImpl {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockRenderWidgetHost(
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RenderWidgetHostDelegate* delegate,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RenderProcessHost* process,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int routing_id)
2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      : RenderWidgetHostImpl(delegate, process, routing_id, false),
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unresponsive_timer_fired_(false) {
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_router_impl_ = static_cast<InputRouterImpl*>(input_router_.get());
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allow poking at a few private members.
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  using RenderWidgetHostImpl::OnPaintAtSizeAck;
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  using RenderWidgetHostImpl::OnUpdateRect;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using RenderWidgetHostImpl::RendererExited;
2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  using RenderWidgetHostImpl::last_requested_size_;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using RenderWidgetHostImpl::is_hidden_;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using RenderWidgetHostImpl::resize_ack_pending_;
212ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  using RenderWidgetHostImpl::input_router_;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool unresponsive_timer_fired() const {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return unresponsive_timer_fired_;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_hung_renderer_delay_ms(int delay_ms) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hung_renderer_delay_ms_ = delay_ms;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  unsigned GestureEventLastQueueEventSize() const {
223ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return gesture_event_filter()->coalesced_gesture_events_.size();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  WebGestureEvent GestureEventSecondFromLastQueueEvent() const {
227ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return gesture_event_filter()->coalesced_gesture_events_.at(
228b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      GestureEventLastQueueEventSize() - 2).event;
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  WebGestureEvent GestureEventLastQueueEvent() const {
232ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return gesture_event_filter()->coalesced_gesture_events_.back().event;
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  unsigned GestureEventDebouncingQueueSize() const {
236ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return gesture_event_filter()->debouncing_deferral_queue_.size();
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  WebGestureEvent GestureEventQueueEventAt(int i) const {
240ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return gesture_event_filter()->coalesced_gesture_events_.at(i).event;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool ScrollingInProgress() const {
244ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return gesture_event_filter()->scrolling_in_progress_;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool FlingInProgress() const {
248ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return gesture_event_filter()->fling_in_progress_;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool WillIgnoreNextACK() const {
252ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return gesture_event_filter()->ignore_next_ack_;
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetupForOverscrollControllerTest() {
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetOverscrollControllerEnabled(true);
2571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    overscroll_delegate_.reset(new TestOverscrollDelegate(GetView()));
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    overscroll_controller_->set_delegate(overscroll_delegate_.get());
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void DisableGestureDebounce() {
262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    gesture_event_filter()->set_debounce_enabled_for_testing(false);
263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_debounce_interval_time_ms(int delay_ms) {
266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    gesture_event_filter()->
267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        set_debounce_interval_time_ms_for_testing(delay_ms);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool TouchEventQueueEmpty() const {
2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return touch_event_queue()->empty();
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool ScrollStateIsContentScrolling() const {
2757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return scroll_state() == OverscrollController::STATE_CONTENT_SCROLLING;
2767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool ScrollStateIsOverscrolling() const {
2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return scroll_state() == OverscrollController::STATE_OVERSCROLLING;
2807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool ScrollStateIsUnknown() const {
2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return scroll_state() == OverscrollController::STATE_UNKNOWN;
2847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  OverscrollController::ScrollState scroll_state() const {
2877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return overscroll_controller_->scroll_state_;
2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OverscrollMode overscroll_mode() const {
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return overscroll_controller_->overscroll_mode_;
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float overscroll_delta_x() const {
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return overscroll_controller_->overscroll_delta_x_;
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float overscroll_delta_y() const {
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return overscroll_controller_->overscroll_delta_y_;
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestOverscrollDelegate* overscroll_delegate() {
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return overscroll_delegate_.get();
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  void SetupForInputRouterTest() {
3072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    mock_input_router_ = new MockInputRouter(this);
3082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    input_router_.reset(mock_input_router_);
3092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
3102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
3112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  MockInputRouter* mock_input_router() {
3122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    return mock_input_router_;
3132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
3142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void NotifyRendererUnresponsive() OVERRIDE {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unresponsive_timer_fired_ = true;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const TouchEventQueue* touch_event_queue() const {
321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return input_router_impl_->touch_event_queue_.get();
322ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
323ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const GestureEventFilter* gesture_event_filter() const {
325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return input_router_impl_->gesture_event_filter_.get();
3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
3274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  GestureEventFilter* gesture_event_filter() {
329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return input_router_impl_->gesture_event_filter_.get();
330ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
331ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool unresponsive_timer_fired_;
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // |input_router_impl_| and |mock_input_router_| are owned by
336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // RenderWidgetHostImpl.  The handles below are provided for convenience so
3372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // that we don't have to reinterpret_cast it all the time.
338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  InputRouterImpl* input_router_impl_;
3392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  MockInputRouter* mock_input_router_;
3402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TestOverscrollDelegate> overscroll_delegate_;
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockRenderWidgetHost);
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace  {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostProcess -----------------------------------------------------
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderWidgetHostProcess : public MockRenderProcessHost {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit RenderWidgetHostProcess(BrowserContext* browser_context)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : MockRenderProcessHost(browser_context),
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        current_update_buf_(NULL),
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        update_msg_should_reply_(false),
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        update_msg_reply_flags_(0) {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~RenderWidgetHostProcess() {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete current_update_buf_;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_update_msg_should_reply(bool reply) {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    update_msg_should_reply_ = reply;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_update_msg_reply_flags(int flags) {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    update_msg_reply_flags_ = flags;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fills the given update parameters with resonable default values.
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitUpdateRectParams(ViewHostMsg_UpdateRect_Params* params);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool HasConnection() const OVERRIDE { return true; }
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool WaitForBackingStoreMsg(int render_widget_id,
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::TimeDelta& max_delay,
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      IPC::Message* msg) OVERRIDE;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportDIB* current_update_buf_;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set to true when WaitForBackingStoreMsg should return a successful update
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // message reply. False implies timeout.
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool update_msg_should_reply_;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Indicates the flags that should be sent with a repaint request. This
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // only has an effect when update_msg_should_reply_ is true.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int update_msg_reply_flags_;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostProcess);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetHostProcess::InitUpdateRectParams(
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ViewHostMsg_UpdateRect_Params* params) {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the shared backing store.
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int w = 100, h = 100;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t pixel_size = w * h * 4;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!current_update_buf_)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_update_buf_ = TransportDIB::Create(pixel_size, 0);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->bitmap = current_update_buf_->id();
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->bitmap_rect = gfx::Rect(0, 0, w, h);
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params->scroll_delta = gfx::Vector2d();
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->copy_rects.push_back(params->bitmap_rect);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->view_size = gfx::Size(w, h);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->flags = update_msg_reply_flags_;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->needs_ack = true;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->scale_factor = 1;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetHostProcess::WaitForBackingStoreMsg(
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int render_widget_id,
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::TimeDelta& max_delay,
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Message* msg) {
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!update_msg_should_reply_)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Construct a fake update reply.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ViewHostMsg_UpdateRect_Params params;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitUpdateRectParams(&params);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ViewHostMsg_UpdateRect message(render_widget_id, params);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *msg = message;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TestView --------------------------------------------------------------------
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test view allows us to specify the size, and keep track of acked
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// touch-events.
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestView : public TestRenderWidgetHostView {
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TestView(RenderWidgetHostImpl* rwh)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : TestRenderWidgetHostView(rwh),
43490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        acked_event_count_(0),
4352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        gesture_event_type_(-1),
4362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        use_fake_physical_backing_size_(false),
4372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        ack_result_(INPUT_EVENT_ACK_STATE_UNKNOWN) {
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the bounds returned by GetViewBounds.
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_bounds(const gfx::Rect& bounds) {
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bounds_ = bounds;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const WebTouchEvent& acked_event() const { return acked_event_; }
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int acked_event_count() const { return acked_event_count_; }
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearAckedEvent() {
448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    acked_event_.type = blink::WebInputEvent::Undefined;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    acked_event_count_ = 0;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
452a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const WebMouseWheelEvent& unhandled_wheel_event() const {
453a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return unhandled_wheel_event_;
454a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
4552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  int gesture_event_type() const { return gesture_event_type_; }
4562385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  InputEventAckState ack_result() const { return ack_result_; }
457a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
45890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SetMockPhysicalBackingSize(const gfx::Size& mock_physical_backing_size) {
45990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    use_fake_physical_backing_size_ = true;
46090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    mock_physical_backing_size_ = mock_physical_backing_size;
46190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
46290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void ClearMockPhysicalBackingSize() {
46390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    use_fake_physical_backing_size_ = false;
46490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
46590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RenderWidgetHostView override.
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Rect GetViewBounds() const OVERRIDE {
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return bounds_;
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void ProcessAckedTouchEvent(const TouchEventWithLatencyInfo& touch,
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      InputEventAckState ack_result) OVERRIDE {
4727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    acked_event_ = touch.event;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++acked_event_count_;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void UnhandledWheelEvent(const WebMouseWheelEvent& event) OVERRIDE {
476a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    unhandled_wheel_event_ = event;
477a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
4782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual void GestureEventAck(int gesture_event_type,
4792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                               InputEventAckState ack_result) OVERRIDE {
4802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    gesture_event_type_ = gesture_event_type;
4812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    ack_result_ = ack_result;
4822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
48390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual gfx::Size GetPhysicalBackingSize() const OVERRIDE {
48490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (use_fake_physical_backing_size_)
48590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return mock_physical_backing_size_;
48690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return TestRenderWidgetHostView::GetPhysicalBackingSize();
48790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
490a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  WebMouseWheelEvent unhandled_wheel_event_;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebTouchEvent acked_event_;
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int acked_event_count_;
4932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  int gesture_event_type_;
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds_;
49590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool use_fake_physical_backing_size_;
49690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Size mock_physical_backing_size_;
4972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  InputEventAckState ack_result_;
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestView);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MockRenderWidgetHostDelegate --------------------------------------------
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockRenderWidgetHostDelegate : public RenderWidgetHostDelegate {
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockRenderWidgetHostDelegate()
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : prehandle_keyboard_event_(false),
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prehandle_keyboard_event_called_(false),
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prehandle_keyboard_event_type_(WebInputEvent::Undefined),
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unhandled_keyboard_event_called_(false),
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unhandled_keyboard_event_type_(WebInputEvent::Undefined) {
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockRenderWidgetHostDelegate() {}
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests that make sure we ignore keyboard event acknowledgments to events we
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // didn't send work by making sure we didn't call UnhandledKeyboardEvent().
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool unhandled_keyboard_event_called() const {
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return unhandled_keyboard_event_called_;
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebInputEvent::Type unhandled_keyboard_event_type() const {
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return unhandled_keyboard_event_type_;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool prehandle_keyboard_event_called() const {
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return prehandle_keyboard_event_called_;
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebInputEvent::Type prehandle_keyboard_event_type() const {
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return prehandle_keyboard_event_type_;
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_prehandle_keyboard_event(bool handle) {
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prehandle_keyboard_event_ = handle;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      bool* is_keyboard_shortcut) OVERRIDE {
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prehandle_keyboard_event_type_ = event.type;
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prehandle_keyboard_event_called_ = true;
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return prehandle_keyboard_event_;
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void HandleKeyboardEvent(
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const NativeWebKeyboardEvent& event) OVERRIDE {
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unhandled_keyboard_event_type_ = event.type;
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unhandled_keyboard_event_called_ = true;
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool prehandle_keyboard_event_;
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool prehandle_keyboard_event_called_;
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebInputEvent::Type prehandle_keyboard_event_type_;
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool unhandled_keyboard_event_called_;
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebInputEvent::Type unhandled_keyboard_event_type_;
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MockPaintingObserver --------------------------------------------------------
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockPaintingObserver : public NotificationObserver {
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WidgetDidReceivePaintAtSizeAck(RenderWidgetHostImpl* host,
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int tag,
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const gfx::Size& size) {
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_ = reinterpret_cast<MockRenderWidgetHost*>(host);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tag_ = tag;
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_ = size;
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Observe(int type,
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const NotificationSource& source,
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const NotificationDetails& details) OVERRIDE {
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type == NOTIFICATION_RENDER_WIDGET_HOST_DID_RECEIVE_PAINT_AT_SIZE_ACK) {
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::pair<int, gfx::Size>* size_ack_details =
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Details<std::pair<int, gfx::Size> >(details).ptr();
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WidgetDidReceivePaintAtSizeAck(
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          RenderWidgetHostImpl::From(Source<RenderWidgetHost>(source).ptr()),
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          size_ack_details->first,
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          size_ack_details->second);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockRenderWidgetHost* host() const { return host_; }
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tag() const { return tag_; }
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size size() const { return size_; }
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockRenderWidgetHost* host_;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tag_;
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size size_;
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderWidgetHostTest --------------------------------------------------------
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderWidgetHostTest : public testing::Test {
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
599424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  RenderWidgetHostTest()
600424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      : process_(NULL),
601424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        handle_key_press_event_(false),
602424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        handle_mouse_event_(false) {
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~RenderWidgetHostTest() {
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
607424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  bool KeyPressEventCallback(const NativeWebKeyboardEvent& /* event */) {
608424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return handle_key_press_event_;
609424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
610f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool MouseEventCallback(const blink::WebMouseEvent& /* event */) {
611424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return handle_mouse_event_;
612424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
613424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // testing::Test
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_context_.reset(new TestBrowserContext());
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_.reset(new MockRenderWidgetHostDelegate());
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_ = new RenderWidgetHostProcess(browser_context_.get());
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA)
6214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    aura::Env::CreateInstance();
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    screen_.reset(aura::TestScreen::Create());
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, screen_.get());
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_.reset(
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new MockRenderWidgetHost(delegate_.get(), process_, MSG_ROUTING_NONE));
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view_.reset(new TestView(host_.get()));
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_->SetView(view_.get());
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_->Init();
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() {
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    view_.reset();
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_.reset();
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_.reset();
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    process_ = NULL;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_context_.reset();
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Env::DeleteInstance();
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    screen_.reset();
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Process all pending tasks to avoid leaks.
644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SendInputEventACK(WebInputEvent::Type type,
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         InputEventAckState ack_result) {
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<IPC::Message> response(
6503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        new InputHostMsg_HandleInputEvent_ACK(0, type, ack_result,
6513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                                              ui::LatencyInfo()));
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_->OnMessageReceived(*response);
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SimulateKeyboardEvent(WebInputEvent::Type type) {
656a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  WebKeyboardEvent event = SyntheticWebKeyboardEventBuilder::Build(type);
657a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  NativeWebKeyboardEvent native_event;
658a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  memcpy(&native_event, &event, sizeof(event));
659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    host_->ForwardKeyboardEvent(native_event);
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SimulateMouseEvent(WebInputEvent::Type type) {
6631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    host_->ForwardMouseEvent(SyntheticWebMouseEventBuilder::Build(type));
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SimulateWheelEvent(float dX, float dY, int modifiers, bool precise) {
6674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    host_->ForwardWheelEvent(
6681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        SyntheticWebMouseWheelEventBuilder::Build(dX, dY, modifiers, precise));
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SimulateMouseMove(int x, int y, int modifiers) {
6724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    host_->ForwardMouseEvent(
6731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        SyntheticWebMouseEventBuilder::Build(WebInputEvent::MouseMove,
6741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                             x,
6751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                             y,
6761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                             modifiers));
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SimulateWheelEventWithPhase(WebMouseWheelEvent::Phase phase) {
6801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    host_->ForwardWheelEvent(SyntheticWebMouseWheelEventBuilder::Build(phase));
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Inject provided synthetic WebGestureEvent instance.
6844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void SimulateGestureEventCore(const WebGestureEvent& gesture_event) {
6854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    host_->ForwardGestureEvent(gesture_event);
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Inject simple synthetic WebGestureEvent instances.
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SimulateGestureEvent(WebInputEvent::Type type,
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            WebGestureEvent::SourceDevice sourceDevice) {
6914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SimulateGestureEventCore(
6921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        SyntheticWebGestureEventBuilder::Build(type, sourceDevice));
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SimulateGestureScrollUpdateEvent(float dX, float dY, int modifiers) {
6964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SimulateGestureEventCore(
6971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        SyntheticWebGestureEventBuilder::BuildScrollUpdate(dX, dY, modifiers));
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SimulateGesturePinchUpdateEvent(float scale,
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       float anchorX,
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       float anchorY,
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       int modifiers) {
7044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SimulateGestureEventCore(
7051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        SyntheticWebGestureEventBuilder::BuildPinchUpdate(scale,
7061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                          anchorX,
7071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                          anchorY,
7081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                          modifiers));
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Inject synthetic GestureFlingStart events.
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SimulateGestureFlingStartEvent(
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      float velocityX,
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      float velocityY,
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebGestureEvent::SourceDevice sourceDevice) {
7164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SimulateGestureEventCore(
7171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        SyntheticWebGestureEventBuilder::BuildFling(velocityX,
7181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                    velocityY,
7191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                    sourceDevice));
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the timestamp for the touch-event.
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetTouchTimestamp(base::TimeDelta timestamp) {
7244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    touch_event_.SetTimestamp(timestamp);
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends a touch event (irrespective of whether the page has a touch-event
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // handler or not).
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SendTouchEvent() {
7307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    host_->ForwardTouchEventWithLatencyInfo(touch_event_, ui::LatencyInfo());
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    touch_event_.ResetPoints();
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int PressTouchPoint(int x, int y) {
7364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return touch_event_.PressPoint(x, y);
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MoveTouchPoint(int index, int x, int y) {
7404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    touch_event_.MovePoint(index, x, y);
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReleaseTouchPoint(int index) {
7444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    touch_event_.ReleasePoint(index);
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const WebInputEvent* GetInputEventFromMessage(const IPC::Message& message) {
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PickleIterator iter(message);
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const char* data;
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int data_length;
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!message.ReadData(&iter, &data, &data_length))
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return NULL;
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return reinterpret_cast<const WebInputEvent*>(data);
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoopForUI message_loop_;
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestBrowserContext> browser_context_;
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostProcess* process_;  // Deleted automatically by the widget.
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockRenderWidgetHostDelegate> delegate_;
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockRenderWidgetHost> host_;
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestView> view_;
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<gfx::Screen> screen_;
764424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  bool handle_key_press_event_;
765424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  bool handle_mouse_event_;
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SyntheticWebTouchEvent touch_event_;
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostTest);
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if GTEST_HAS_PARAM_TEST
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RenderWidgetHostWithSourceTest ----------------------------------------------
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This is for tests that are to be run for all source devices.
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RenderWidgetHostWithSourceTest
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public RenderWidgetHostTest,
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      public testing::WithParamInterface<WebGestureEvent::SourceDevice> {
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // GTEST_HAS_PARAM_TEST
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -----------------------------------------------------------------------------
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderWidgetHostTest, Resize) {
7883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // The initial bounds is the empty rect, and the screen info hasn't been sent
7893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // yet, so setting it to the same thing shouldn't send the resize message.
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view_->set_bounds(gfx::Rect());
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->WasResized();
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(host_->resize_ack_pending_);
7933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID));
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Setting the bounds to a "real" rect should send out the notification.
79690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // but should not expect ack for empty physical backing size.
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect original_size(0, 0, 100, 100);
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  process_->sink().ClearMessages();
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view_->set_bounds(original_size);
80090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  view_->SetMockPhysicalBackingSize(gfx::Size());
80190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  host_->WasResized();
80290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(host_->resize_ack_pending_);
8037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(original_size.size(), host_->last_requested_size_);
80490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID));
80590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
80690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Setting the bounds to a "real" rect should send out the notification.
8077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // but should not expect ack for only physical backing size change.
80890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  process_->sink().ClearMessages();
80990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  view_->ClearMockPhysicalBackingSize();
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->WasResized();
8117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(host_->resize_ack_pending_);
8127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(original_size.size(), host_->last_requested_size_);
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID));
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Send out a update that's not a resize ack after setting resize ack pending
8167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // flag. This should not clean the resize ack pending flag.
8177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  process_->sink().ClearMessages();
8187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Rect second_size(0, 0, 110, 110);
8197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(host_->resize_ack_pending_);
8207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  view_->set_bounds(second_size);
8217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  host_->WasResized();
8227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(host_->resize_ack_pending_);
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ViewHostMsg_UpdateRect_Params params;
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  process_->InitUpdateRectParams(&params);
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->OnUpdateRect(params);
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(host_->resize_ack_pending_);
8277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(second_size.size(), host_->last_requested_size_);
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sending out a new notification should NOT send out a new IPC message since
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a resize ACK is pending.
8317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Rect third_size(0, 0, 120, 120);
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  process_->sink().ClearMessages();
8337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  view_->set_bounds(third_size);
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->WasResized();
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(host_->resize_ack_pending_);
8367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(second_size.size(), host_->last_requested_size_);
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID));
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send a update that's a resize ack, but for the original_size we sent. Since
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this isn't the second_size, the message handler should immediately send
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a new resize message for the new size to the renderer.
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  process_->sink().ClearMessages();
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.flags = ViewHostMsg_UpdateRect_Flags::IS_RESIZE_ACK;
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.view_size = original_size.size();
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->OnUpdateRect(params);
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(host_->resize_ack_pending_);
8477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(third_size.size(), host_->last_requested_size_);
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID));
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send the resize ack for the latest size.
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  process_->sink().ClearMessages();
8527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  params.view_size = third_size.size();
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->OnUpdateRect(params);
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(host_->resize_ack_pending_);
8557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(third_size.size(), host_->last_requested_size_);
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(process_->sink().GetFirstMessageMatching(ViewMsg_Resize::ID));
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now clearing the bounds should send out a notification but we shouldn't
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // expect a resize ack (since the renderer won't ack empty sizes). The message
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should contain the new size (0x0) and not the previous one that we skipped
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  process_->sink().ClearMessages();
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view_->set_bounds(gfx::Rect());
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->WasResized();
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(host_->resize_ack_pending_);
8657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(gfx::Size(), host_->last_requested_size_);
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID));
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send a rect that has no area but has either width or height set.
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  process_->sink().ClearMessages();
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view_->set_bounds(gfx::Rect(0, 0, 0, 30));
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->WasResized();
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(host_->resize_ack_pending_);
8737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(gfx::Size(0, 30), host_->last_requested_size_);
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID));
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the same size again. It should not be sent again.
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  process_->sink().ClearMessages();
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->WasResized();
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(host_->resize_ack_pending_);
8807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(gfx::Size(0, 30), host_->last_requested_size_);
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(process_->sink().GetFirstMessageMatching(ViewMsg_Resize::ID));
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A different size should be sent again, however.
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view_->set_bounds(gfx::Rect(0, 0, 0, 31));
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->WasResized();
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(host_->resize_ack_pending_);
8877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(gfx::Size(0, 31), host_->last_requested_size_);
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID));
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/25097.  If a renderer crashes between a resize and the
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// corresponding update message, we must be sure to clear the resize ack logic.
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderWidgetHostTest, ResizeThenCrash) {
894a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Clear the first Resize message that carried screen info.
895a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  process_->sink().ClearMessages();
896a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setting the bounds to a "real" rect should send out the notification.
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect original_size(0, 0, 100, 100);
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view_->set_bounds(original_size);
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->WasResized();
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(host_->resize_ack_pending_);
9027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(original_size.size(), host_->last_requested_size_);
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID));
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a renderer crash before the update message.  Ensure all the
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // resize ack logic is cleared.  Must clear the view first so it doesn't get
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // deleted.
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->SetView(NULL);
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->RendererExited(base::TERMINATION_STATUS_PROCESS_CRASHED, -1);
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(host_->resize_ack_pending_);
9117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(gfx::Size(), host_->last_requested_size_);
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset the view so we can exit the test cleanly.
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->SetView(view_.get());
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests setting custom background
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderWidgetHostTest, Background) {
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX)
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<RenderWidgetHostView> view(
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RenderWidgetHostView::CreateViewForWidget(host_.get()));
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) || defined(USE_AURA)
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(derat): Call this on all platforms: http://crbug.com/102450.
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // InitAsChild doesn't seem to work if NULL parent is passed on Windows,
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which leads to DCHECK failure in RenderWidgetHostView::Destroy.
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When you enable this for OS_WIN, enable |view.release()->Destroy()|
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // below.
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->InitAsChild(NULL);
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->SetView(view.get());
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a checkerboard background to test with.
93368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  gfx::Canvas canvas(gfx::Size(4, 4), 1.0f, true);
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas.FillRect(gfx::Rect(0, 0, 2, 2), SK_ColorBLACK);
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas.FillRect(gfx::Rect(2, 0, 2, 2), SK_ColorWHITE);
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas.FillRect(gfx::Rect(0, 2, 2, 2), SK_ColorWHITE);
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas.FillRect(gfx::Rect(2, 2, 2, 2), SK_ColorBLACK);
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const SkBitmap& background =
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      canvas.sk_canvas()->getDevice()->accessBitmap(false);
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the background and make sure we get back a copy.
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->SetBackground(background);
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, view->GetBackground().width());
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, view->GetBackground().height());
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(background.getSize(), view->GetBackground().getSize());
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  background.lockPixels();
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->GetBackground().lockPixels();
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(0 == memcmp(background.getPixels(),
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          view->GetBackground().getPixels(),
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          background.getSize()));
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->GetBackground().unlockPixels();
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  background.unlockPixels();
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const IPC::Message* set_background =
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      process_->sink().GetUniqueMessageMatching(ViewMsg_SetBackground::ID);
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(set_background);
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tuple1<SkBitmap> sent_background;
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ViewMsg_SetBackground::Read(set_background, &sent_background);
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(background.getSize(), sent_background.a.getSize());
960558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  background.lockPixels();
961558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  sent_background.a.lockPixels();
962558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(0 == memcmp(background.getPixels(),
963558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                          sent_background.a.getPixels(),
964558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                          background.getSize()));
965558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  sent_background.a.unlockPixels();
966558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  background.unlockPixels();
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
968558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_LINUX) || defined(USE_AURA)
969558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // See the comment above |InitAsChild(NULL)|.
970558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  host_->SetView(NULL);
971558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  static_cast<RenderWidgetHostViewPort*>(view.release())->Destroy();
972558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
974558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#else
975558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // TODO(port): Mac does not have gfx::Canvas. Maybe we can just change this
976558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // test to use SkCanvas directly?
977558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
979558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // TODO(aa): It would be nice to factor out the painting logic so that we
980558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // could test that, but it appears that would mean painting everything twice
981558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // since windows HDC structures are opaque.
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
984558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Tests getting the backing store with the renderer not setting repaint ack
985558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// flags.
986558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(RenderWidgetHostTest, GetBackingStore_NoRepaintAck) {
987558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // First set the view size to match what the renderer is rendering.
988558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ViewHostMsg_UpdateRect_Params params;
989558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  process_->InitUpdateRectParams(&params);
990558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  view_->set_bounds(gfx::Rect(params.view_size));
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // We don't currently have a backing store, and if the renderer doesn't send
993558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // one in time, we should get nothing.
994558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  process_->set_update_msg_should_reply(false);
995558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  BackingStore* backing = host_->GetBackingStore(true);
996558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_FALSE(backing);
997558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // The widget host should have sent a request for a repaint, and there should
998558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // be no paint ACK.
999558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Repaint::ID));
1000558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_FALSE(process_->sink().GetUniqueMessageMatching(
1001558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      ViewMsg_UpdateRect_ACK::ID));
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1003558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Allowing the renderer to reply in time should give is a backing store.
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
1005558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  process_->set_update_msg_should_reply(true);
1006558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  process_->set_update_msg_reply_flags(0);
1007558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  backing = host_->GetBackingStore(true);
1008558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(backing);
1009558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // The widget host should NOT have sent a request for a repaint, since there
1010558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // was an ACK already pending.
1011558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_FALSE(process_->sink().GetUniqueMessageMatching(ViewMsg_Repaint::ID));
1012558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
1013558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      ViewMsg_UpdateRect_ACK::ID));
1014558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1016558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Tests getting the backing store with the renderer sending a repaint ack.
1017558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(RenderWidgetHostTest, GetBackingStore_RepaintAck) {
1018558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // First set the view size to match what the renderer is rendering.
1019558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ViewHostMsg_UpdateRect_Params params;
1020558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  process_->InitUpdateRectParams(&params);
1021558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  view_->set_bounds(gfx::Rect(params.view_size));
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1023558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Doing a request request with the update message allowed should work and
1024558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // the repaint ack should work.
1025558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  process_->set_update_msg_should_reply(true);
1026558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  process_->set_update_msg_reply_flags(
1027558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      ViewHostMsg_UpdateRect_Flags::IS_REPAINT_ACK);
1028558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  BackingStore* backing = host_->GetBackingStore(true);
1029558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(backing);
1030558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // We still should not have sent out a repaint request since the last flags
1031558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // didn't have the repaint ack set, and the pending flag will still be set.
1032558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_Repaint::ID));
1033558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
1034558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      ViewMsg_UpdateRect_ACK::ID));
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1036558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Asking again for the backing store should just re-use the existing one
1037558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // and not send any messagse.
1038558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  process_->sink().ClearMessages();
1039558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  backing = host_->GetBackingStore(true);
1040558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(backing);
1041558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_FALSE(process_->sink().GetUniqueMessageMatching(ViewMsg_Repaint::ID));
1042558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_FALSE(process_->sink().GetUniqueMessageMatching(
1043558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      ViewMsg_UpdateRect_ACK::ID));
1044558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1046558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Test that we don't paint when we're hidden, but we still send the ACK. Most
1047558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// of the rest of the painting is tested in the GetBackingStore* ones.
1048558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(RenderWidgetHostTest, HiddenPaint) {
1049558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  BrowserThreadImpl ui_thread(BrowserThread::UI, base::MessageLoop::current());
1050558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Hide the widget, it should have sent out a message to the renderer.
1051558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_FALSE(host_->is_hidden_);
1052558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  host_->WasHidden();
1053558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(host_->is_hidden_);
1054558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(ViewMsg_WasHidden::ID));
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1056558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Send it an update as from the renderer.
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
1058558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ViewHostMsg_UpdateRect_Params params;
1059558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  process_->InitUpdateRectParams(&params);
1060558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  host_->OnUpdateRect(params);
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // It should have sent out the ACK.
1063558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
1064558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      ViewMsg_UpdateRect_ACK::ID));
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1066558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Now unhide.
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
1068558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  host_->WasShown();
1069558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_FALSE(host_->is_hidden_);
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1071558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // It should have sent out a restored message with a request to paint.
1072558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  const IPC::Message* restored = process_->sink().GetUniqueMessageMatching(
1073558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      ViewMsg_WasShown::ID);
1074558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(restored);
1075558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  Tuple1<bool> needs_repaint;
1076558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ViewMsg_WasShown::Read(restored, &needs_repaint);
1077558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(needs_repaint.a);
1078558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1080558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(RenderWidgetHostTest, PaintAtSize) {
1081558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  const int kPaintAtSizeTag = 42;
1082558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  host_->PaintAtSize(TransportDIB::GetFakeHandleForTest(), kPaintAtSizeTag,
1083558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                     gfx::Size(40, 60), gfx::Size(20, 30));
1084558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(
1085558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      process_->sink().GetUniqueMessageMatching(ViewMsg_PaintAtSize::ID));
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1087558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  NotificationRegistrar registrar;
1088558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  MockPaintingObserver observer;
1089558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  registrar.Add(
1090558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      &observer,
1091558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      NOTIFICATION_RENDER_WIDGET_HOST_DID_RECEIVE_PAINT_AT_SIZE_ACK,
1092558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      Source<RenderWidgetHost>(host_.get()));
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1094558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  host_->OnPaintAtSizeAck(kPaintAtSizeTag, gfx::Size(20, 30));
1095558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(host_.get(), observer.host());
1096558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(kPaintAtSizeTag, observer.tag());
1097558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(20, observer.size().width());
1098558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(30, observer.size().height());
1099558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1101558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(RenderWidgetHostTest, IgnoreKeyEventsHandledByRenderer) {
1102558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Simulate a keyboard event.
1103558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SimulateKeyboardEvent(WebInputEvent::RawKeyDown);
1104558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1105558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Make sure we sent the input event to the renderer.
1106558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
1107558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                  InputMsg_HandleInputEvent::ID));
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1110558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Send the simulated response from the renderer back.
1111558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::RawKeyDown,
11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_CONSUMED);
1113558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_FALSE(delegate_->unhandled_keyboard_event_called());
1114558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1116558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(RenderWidgetHostTest, PreHandleRawKeyDownEvent) {
1117558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Simluate the situation that the browser handled the key down event during
1118558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // pre-handle phrase.
1119558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  delegate_->set_prehandle_keyboard_event(true);
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Simulate a keyboard event.
1123558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SimulateKeyboardEvent(WebInputEvent::RawKeyDown);
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1125558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(delegate_->prehandle_keyboard_event_called());
1126558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(WebInputEvent::RawKeyDown,
1127558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch            delegate_->prehandle_keyboard_event_type());
11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1129558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Make sure the RawKeyDown event is not sent to the renderer.
11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // The browser won't pre-handle a Char event.
1133558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  delegate_->set_prehandle_keyboard_event(false);
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1135558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Forward the Char event.
1136558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SimulateKeyboardEvent(WebInputEvent::Char);
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1138558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Make sure the Char event is suppressed.
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1141558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Forward the KeyUp event.
1142558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SimulateKeyboardEvent(WebInputEvent::KeyUp);
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1144558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Make sure only KeyUp was sent to the renderer.
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
1146558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(InputMsg_HandleInputEvent::ID,
1147558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch            process_->sink().GetMessageAt(0)->type());
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1150558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Send the simulated response from the renderer back.
1151558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SendInputEventACK(WebInputEvent::KeyUp,
1152558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1153558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1154558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(delegate_->unhandled_keyboard_event_called());
1155558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(WebInputEvent::KeyUp, delegate_->unhandled_keyboard_event_type());
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11582385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_F(RenderWidgetHostTest, UnhandledWheelEvent) {
11592385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  SimulateWheelEvent(-5, 0, 0, true);
11602385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
11612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // Make sure we sent the input event to the renderer.
11622385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
11632385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                  InputMsg_HandleInputEvent::ID));
11642385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  process_->sink().ClearMessages();
11652385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
11662385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // Send the simulated response from the renderer back.
11672385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  SendInputEventACK(WebInputEvent::MouseWheel,
11682385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
11692385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_EQ(-5, view_->unhandled_wheel_event().deltaX);
11702385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
11712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
11722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_F(RenderWidgetHostTest, UnhandledGestureEvent) {
1173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
11742385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                       WebGestureEvent::Touchscreen);
11752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
11762385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // Make sure we sent the input event to the renderer.
11772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
11782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                  InputMsg_HandleInputEvent::ID));
11792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  process_->sink().ClearMessages();
11802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
11812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // Send the simulated response from the renderer back.
1182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
11832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(WebInputEvent::GestureScrollUpdate, view_->gesture_event_type());
11852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, view_->ack_result());
11862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
11872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the hang monitor timer expires properly if a new timer is started
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// while one is in progress (see crbug.com/11007).
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderWidgetHostTest, DontPostponeHangMonitorTimeout) {
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start with a short timeout.
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->StartHangMonitorTimeout(TimeDelta::FromMilliseconds(10));
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Immediately try to add a long 30 second timeout.
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(host_->unresponsive_timer_fired());
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->StartHangMonitorTimeout(TimeDelta::FromSeconds(30));
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait long enough for first timeout and see if it fired.
1199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->PostDelayedTask(
1200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FROM_HERE,
1201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::MessageLoop::QuitClosure(),
1202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TimeDelta::FromMilliseconds(10));
1203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->Run();
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(host_->unresponsive_timer_fired());
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the hang monitor timer expires properly if it is started, stopped,
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and then started again.
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderWidgetHostTest, StopAndStartHangMonitorTimeout) {
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start with a short timeout, then stop it.
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->StartHangMonitorTimeout(TimeDelta::FromMilliseconds(10));
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->StopHangMonitorTimeout();
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start it again to ensure it still works.
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(host_->unresponsive_timer_fired());
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->StartHangMonitorTimeout(TimeDelta::FromMilliseconds(10));
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait long enough for first timeout and see if it fired.
1219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->PostDelayedTask(
1220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FROM_HERE,
1221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::MessageLoop::QuitClosure(),
1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TimeDelta::FromMilliseconds(40));
1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->Run();
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(host_->unresponsive_timer_fired());
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the hang monitor timer expires properly if it is started, then
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// updated to a shorter duration.
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderWidgetHostTest, ShorterDelayHangMonitorTimeout) {
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start with a timeout.
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->StartHangMonitorTimeout(TimeDelta::FromMilliseconds(100));
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start it again with shorter delay.
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(host_->unresponsive_timer_fired());
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->StartHangMonitorTimeout(TimeDelta::FromMilliseconds(20));
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait long enough for the second timeout and see if it fired.
1238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->PostDelayedTask(
1239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FROM_HERE,
1240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::MessageLoop::QuitClosure(),
1241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TimeDelta::FromMilliseconds(25));
1242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->Run();
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(host_->unresponsive_timer_fired());
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the hang monitor catches two input events but only one ack.
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This can happen if the second input event causes the renderer to hang.
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test will catch a regression of crbug.com/111185.
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderWidgetHostTest, MultipleInputEvents) {
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Configure the host to wait 10ms before considering
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the renderer hung.
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->set_hung_renderer_delay_ms(10);
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send two events but only one ack.
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateKeyboardEvent(WebInputEvent::RawKeyDown);
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateKeyboardEvent(WebInputEvent::RawKeyDown);
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::RawKeyDown,
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_CONSUMED);
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait long enough for first timeout and see if it fired.
1261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->PostDelayedTask(
1262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FROM_HERE,
1263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::MessageLoop::QuitClosure(),
1264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TimeDelta::FromMilliseconds(40));
1265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->Run();
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(host_->unresponsive_timer_fired());
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test is not valid for Windows because getting the shared memory
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// size doesn't work.
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_WIN)
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RenderWidgetHostTest, IncorrectBitmapScaleFactor) {
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ViewHostMsg_UpdateRect_Params params;
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  process_->InitUpdateRectParams(&params);
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.scale_factor = params.scale_factor * 2;
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, process_->bad_msg_count());
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->OnUpdateRect(params);
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, process_->bad_msg_count());
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that scroll ACKs are correctly handled by the overscroll-navigation
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// controller.
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RenderWidgetHostTest, WheelScrollEventOverscrolls) {
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->SetupForOverscrollControllerTest();
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Simulate wheel events.
129058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(-5, 0, 0, true);  // sent directly
129158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(-1, 1, 0, true);  // enqueued
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateWheelEvent(-10, -3, 0, true);  // coalesced into previous event
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateWheelEvent(-15, -1, 0, true);  // coalesced into previous event
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateWheelEvent(-30, -3, 0, true);  // coalesced into previous event
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateWheelEvent(-20, 6, 1, true);  // enqueued, different modifiers
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
130090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Receive ACK the first wheel event as not processed.
13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
130290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Receive ACK for the second (coalesced) event as not processed. This will
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // start a back navigation. However, this will also cause the queued next
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // event to be sent to the renderer. But since overscroll navigation has
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // started, that event will also be included in the overscroll computation
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // instead of being sent to the renderer. So the result will be an overscroll
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // back navigation, and no event will be sent to the renderer.
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_WEST, host_->overscroll_mode());
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_WEST, host_->overscroll_delegate()->current_mode());
131858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  EXPECT_EQ(-81.f, host_->overscroll_delta_x());
131958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  EXPECT_EQ(-31.f, host_->overscroll_delegate()->delta_x());
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y());
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send a mouse-move event. This should cancel the overscroll navigation.
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateMouseMove(5, 10, 0);
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
1327d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
133090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Tests that if some scroll events are consumed towards the start, then
133158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// subsequent scrolls do not horizontal overscroll.
133258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochTEST_F(RenderWidgetHostTest, WheelScrollConsumedDoNotHorizOverscroll) {
133390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  host_->SetupForOverscrollControllerTest();
133490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  process_->sink().ClearMessages();
133590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
133690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Simulate wheel events.
133758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(-5, 0, 0, true);  // sent directly
133858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(-1, -1, 0, true);  // enqueued
133990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SimulateWheelEvent(-10, -3, 0, true);  // coalesced into previous event
134090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SimulateWheelEvent(-15, -1, 0, true);  // coalesced into previous event
134190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SimulateWheelEvent(-30, -3, 0, true);  // coalesced into previous event
134290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SimulateWheelEvent(-20, 6, 1, true);  // enqueued, different modifiers
134390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
134490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
134590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  process_->sink().ClearMessages();
134690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
134790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Receive ACK the first wheel event as processed.
134890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
134990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_CONSUMED);
135090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
135190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
135290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
135390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  process_->sink().ClearMessages();
135490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
135590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Receive ACK for the second (coalesced) event as not processed. This should
135690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // not initiate overscroll, since the beginning of the scroll has been
135790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // consumed. The queued event with different modifiers should be sent to the
135890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // renderer.
135990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
136090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
136190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
1362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
136390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
136490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  process_->sink().ClearMessages();
136590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
136690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
136790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
136890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
136990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
137090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Indicate the end of the scrolling from the touchpad.
137190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SimulateGestureFlingStartEvent(-1200.f, 0.f, WebGestureEvent::Touchpad);
137290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
137390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
137490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Start another scroll. This time, do not consume any scroll events.
137590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  process_->sink().ClearMessages();
137690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SimulateWheelEvent(0, -5, 0, true);  // sent directly
137790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SimulateWheelEvent(0, -1, 0, true);  // enqueued
137890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SimulateWheelEvent(-10, -3, 0, true);  // coalesced into previous event
137990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SimulateWheelEvent(-15, -1, 0, true);  // coalesced into previous event
138090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SimulateWheelEvent(-30, -3, 0, true);  // coalesced into previous event
138190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SimulateWheelEvent(-20, 6, 1, true);  // enqueued, different modifiers
138290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
138390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
138490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  process_->sink().ClearMessages();
138590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
138690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Receive ACK for the first wheel and the subsequent coalesced event as not
138790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // processed. This should start a back-overscroll.
138890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
138990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
139090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
139190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
139290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
139390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  process_->sink().ClearMessages();
139490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
139590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
139690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_WEST, host_->overscroll_mode());
139790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
139890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that wheel-scrolling correctly turns overscroll on and off.
14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RenderWidgetHostTest, WheelScrollOverscrollToggle) {
14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->SetupForOverscrollControllerTest();
14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send a wheel event. ACK the event as not processed. This should not
14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // initiate an overscroll gesture since it doesn't cross the threshold yet.
140658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(10, 0, 0, true);
14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Scroll some more so as to not overscroll.
141558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(10, 0, 0, true);
14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Scroll some more to initiate an overscroll.
142458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(40, 0, 0, true);
14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode());
14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode());
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(60.f, host_->overscroll_delta_x());
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(10.f, host_->overscroll_delegate()->delta_x());
14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y());
14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Scroll in the reverse direction enough to abort the overscroll.
143658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(-20, 0, 0, true);
14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Continue to scroll in the reverse direction.
144258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(-20, 0, 0, true);
14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Continue to scroll in the reverse direction enough to initiate overscroll
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // in that direction.
145258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(-55, 0, 0, true);
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_WEST, host_->overscroll_mode());
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_WEST, host_->overscroll_delegate()->current_mode());
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(-75.f, host_->overscroll_delta_x());
14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(-25.f, host_->overscroll_delegate()->delta_x());
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y());
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RenderWidgetHostTest, ScrollEventsOverscrollWithFling) {
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->SetupForOverscrollControllerTest();
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send a wheel event. ACK the event as not processed. This should not
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // initiate an overscroll gesture since it doesn't cross the threshold yet.
146958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(10, 0, 0, true);
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Scroll some more so as to not overscroll.
147858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(20, 0, 0, true);
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Scroll some more to initiate an overscroll.
148758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(30, 0, 0, true);
14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode());
14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode());
14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(60.f, host_->overscroll_delta_x());
14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(10.f, host_->overscroll_delegate()->delta_x());
14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y());
14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize());
14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send a fling start, but with a small velocity, so that the overscroll is
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // aborted. The fling should proceed to the renderer, through the gesture
15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // event filter.
15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureFlingStartEvent(0.f, 0.1f, WebGestureEvent::Touchpad);
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, host_->GestureEventLastQueueEventSize());
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Same as ScrollEventsOverscrollWithFling, but with zero velocity. Checks that
15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the zero-velocity fling does not reach the renderer.
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RenderWidgetHostTest, ScrollEventsOverscrollWithZeroFling) {
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->SetupForOverscrollControllerTest();
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send a wheel event. ACK the event as not processed. This should not
15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // initiate an overscroll gesture since it doesn't cross the threshold yet.
151658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(10, 0, 0, true);
15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Scroll some more so as to not overscroll.
152558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(20, 0, 0, true);
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Scroll some more to initiate an overscroll.
153458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(30, 0, 0, true);
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode());
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode());
15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(60.f, host_->overscroll_delta_x());
15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(10.f, host_->overscroll_delegate()->delta_x());
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y());
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize());
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send a fling start, but with a small velocity, so that the overscroll is
15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // aborted. The fling should proceed to the renderer, through the gesture
15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // event filter.
1549d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  SimulateGestureFlingStartEvent(10.f, 0.f, WebGestureEvent::Touchpad);
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
1551d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(1U, host_->GestureEventLastQueueEventSize());
1552d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that a fling in the opposite direction of the overscroll cancels the
15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// overscroll nav instead of completing it.
15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RenderWidgetHostTest, ReverseFlingCancelsOverscroll) {
15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->SetupForOverscrollControllerTest();
1559f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  host_->DisableGestureDebounce();
15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->set_bounds(gfx::Rect(0, 0, 400, 200));
15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->Show();
15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Start and end a gesture in the same direction without processing the
15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // gesture events in the renderer. This should initiate and complete an
15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // overscroll navigation.
15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         WebGestureEvent::Touchscreen);
15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SimulateGestureScrollUpdateEvent(300, -5, 0);
15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendInputEventACK(WebInputEvent::GestureScrollBegin,
15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      INPUT_EVENT_ACK_STATE_CONSUMED);
15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendInputEventACK(WebInputEvent::GestureScrollUpdate,
15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode());
15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode());
1577d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    process_->sink().ClearMessages();
15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         WebGestureEvent::Touchscreen);
15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->completed_mode());
15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
1583d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_EQ(1U, process_->sink().message_count());
15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendInputEventACK(WebInputEvent::GestureScrollEnd,
15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Start over, except instead of ending the gesture with ScrollEnd, end it
15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // with a FlingStart, with velocity in the reverse direction. This should
15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // initiate an overscroll navigation, but it should be cancelled because of
15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the fling in the opposite direction.
15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->overscroll_delegate()->Reset();
15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         WebGestureEvent::Touchscreen);
15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SimulateGestureScrollUpdateEvent(-300, -5, 0);
15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendInputEventACK(WebInputEvent::GestureScrollBegin,
15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      INPUT_EVENT_ACK_STATE_CONSUMED);
15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendInputEventACK(WebInputEvent::GestureScrollUpdate,
16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(OVERSCROLL_WEST, host_->overscroll_mode());
16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(OVERSCROLL_WEST, host_->overscroll_delegate()->current_mode());
1603d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    process_->sink().ClearMessages();
1604d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SimulateGestureFlingStartEvent(100, 0, WebGestureEvent::Touchscreen);
16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->completed_mode());
16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
1608d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_EQ(1U, process_->sink().message_count());
16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that touch-scroll events are handled correctly by the overscroll
16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// controller. This also tests that the overscroll controller and the
16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// gesture-event filter play nice with each other.
16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RenderWidgetHostTest, GestureScrollOverscrolls) {
16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Turn off debounce handling for test isolation.
16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->SetupForOverscrollControllerTest();
1618f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  host_->DisableGestureDebounce();
16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollBegin,
162490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send another gesture event and ACK as not being processed. This should
16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // initiate the navigation gesture.
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureScrollUpdateEvent(55, -5, 0);
16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode());
16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode());
16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(55.f, host_->overscroll_delta_x());
16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(-5.f, host_->overscroll_delta_y());
16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(5.f, host_->overscroll_delegate()->delta_x());
163858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  EXPECT_EQ(-5.f, host_->overscroll_delegate()->delta_y());
16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize());
16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send another gesture update event. This event should be consumed by the
16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // controller, and not be forwarded to the renderer. The gesture-event filter
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // should not also receive this event.
16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureScrollUpdateEvent(10, -5, 0);
16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode());
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode());
16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(65.f, host_->overscroll_delta_x());
16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(-10.f, host_->overscroll_delta_y());
16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(15.f, host_->overscroll_delegate()->delta_x());
165158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  EXPECT_EQ(-10.f, host_->overscroll_delegate()->delta_y());
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize());
16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now send a scroll end. This should cancel the overscroll gesture, and send
16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the event to the renderer. The gesture-event filter should receive this
16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // event.
16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
1663f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The scroll end event will have received a synthetic ack from the input
1664f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // router.
1665f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize());
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
166890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Tests that if the page is scrolled because of a scroll-gesture, then that
166958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// particular scroll sequence never generates overscroll if the scroll direction
167058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// is horizontal.
167158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochTEST_F(RenderWidgetHostTest, GestureScrollConsumedHorizontal) {
167290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Turn off debounce handling for test isolation.
167390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  host_->SetupForOverscrollControllerTest();
1674f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  host_->DisableGestureDebounce();
167590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  process_->sink().ClearMessages();
167690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
167790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
167890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
167958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateGestureScrollUpdateEvent(10, 0, 0);
168090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
168158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  // Start scrolling on content. ACK both events as being processed.
168290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollBegin,
168390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_CONSUMED);
168490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
168590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_CONSUMED);
168690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
168790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
1688d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  process_->sink().ClearMessages();
168990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
169090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Send another gesture event and ACK as not being processed. This should
169190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // not initiate overscroll because the beginning of the scroll event did
1692d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // scroll some content on the page. Since there was no overscroll, the event
1693d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // should reach the renderer.
169458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateGestureScrollUpdateEvent(55, 0, 0);
1695d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
169690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
169790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
169890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
169990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
170090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the overscroll controller plays nice with touch-scrolls and the
17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// gesture event filter with debounce filtering turned on.
17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RenderWidgetHostTest, GestureScrollDebounceOverscrolls) {
17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->SetupForOverscrollControllerTest();
17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->set_debounce_interval_time_ms(100);
17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start scrolling. Receive ACK as it being processed.
17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollBegin,
17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_CONSUMED);
17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send update events.
171758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateGestureScrollUpdateEvent(25, 0, 0);
17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, host_->GestureEventLastQueueEventSize());
17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventDebouncingQueueSize());
17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(host_->ScrollingInProgress());
17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Quickly end and restart the scroll gesture. These two events should get
17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // discarded.
17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, host_->GestureEventLastQueueEventSize());
17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, host_->GestureEventDebouncingQueueSize());
17312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
17332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
17342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, host_->GestureEventLastQueueEventSize());
17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, host_->GestureEventDebouncingQueueSize());
17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send another update event. This should get into the queue.
173958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateGestureScrollUpdateEvent(30, 0, 0);
17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, host_->GestureEventLastQueueEventSize());
17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventDebouncingQueueSize());
17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(host_->ScrollingInProgress());
17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Receive an ACK for the first scroll-update event as not being processed.
17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This will contribute to the overscroll gesture, but not enough for the
17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // overscroll controller to start consuming gesture events. This also cause
17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the queued gesture event to be forwarded to the renderer.
17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, host_->GestureEventLastQueueEventSize());
17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventDebouncingQueueSize());
17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send another update event. This should get into the queue.
175958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateGestureScrollUpdateEvent(10, 0, 0);
17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, host_->GestureEventLastQueueEventSize());
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventDebouncingQueueSize());
17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(host_->ScrollingInProgress());
17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Receive an ACK for the second scroll-update event as not being processed.
17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This will now initiate an overscroll. This will also cause the queued
17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // gesture event to be released. But instead of going to the renderer, it will
17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // be consumed by the overscroll controller.
17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode());
17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode());
17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(65.f, host_->overscroll_delta_x());
17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(15.f, host_->overscroll_delegate()->delta_x());
17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y());
17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize());
17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventDebouncingQueueSize());
17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the gesture debounce timer plays nice with the overscroll
17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// controller.
17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RenderWidgetHostTest, GestureScrollDebounceTimerOverscroll) {
17842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->SetupForOverscrollControllerTest();
17852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->set_debounce_interval_time_ms(10);
17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start scrolling. Receive ACK as it being processed.
17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollBegin,
17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_CONSUMED);
17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send update events.
179758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateGestureScrollUpdateEvent(55, 0, 0);
17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, host_->GestureEventLastQueueEventSize());
17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventDebouncingQueueSize());
18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(host_->ScrollingInProgress());
18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send an end event. This should get in the debounce queue.
18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, host_->GestureEventLastQueueEventSize());
18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, host_->GestureEventDebouncingQueueSize());
18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Receive ACK for the scroll-update event.
18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode());
18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode());
18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(55.f, host_->overscroll_delta_x());
18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(5.f, host_->overscroll_delegate()->delta_x());
18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y());
18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize());
18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, host_->GestureEventDebouncingQueueSize());
18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Let the timer for the debounce queue fire. That should release the queued
18242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // scroll-end event. Since overscroll has started, but there hasn't been
18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // enough overscroll to complete the gesture, the overscroll controller
18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // will reset the state. The scroll-end should therefore be dispatched to the
18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // renderer, and the gesture-event-filter should await an ACK for it.
1828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->PostDelayedTask(
1829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FROM_HERE,
1830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::MessageLoop::QuitClosure(),
1831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TimeDelta::FromMilliseconds(15));
1832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->Run();
18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
1836f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The scroll end event will have received a synthetic ack from the input
1837f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // router.
1838f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize());
18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventDebouncingQueueSize());
18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that when touch-events are dispatched to the renderer, the overscroll
18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// gesture deals with them correctly.
18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RenderWidgetHostTest, OverscrollWithTouchEvents) {
18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->SetupForOverscrollControllerTest();
18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->set_debounce_interval_time_ms(10);
18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true));
18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->set_bounds(gfx::Rect(0, 0, 400, 200));
18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->Show();
18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The test sends an intermingled sequence of touch and gesture events.
18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PressTouchPoint(0, 1);
18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendTouchEvent();
18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchStart,
18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MoveTouchPoint(0, 20, 5);
18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendTouchEvent();
18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchMove,
18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
187458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateGestureScrollUpdateEvent(20, 0, 0);
18752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollBegin,
18762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
18772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
18792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
18802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
18822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Another touch move event should reach the renderer since overscroll hasn't
18842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // started yet.
18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MoveTouchPoint(0, 65, 10);
18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendTouchEvent();
18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchMove,
18912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
189258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateGestureScrollUpdateEvent(45, 0, 0);
18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode());
18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode());
18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(65.f, host_->overscroll_delta_x());
18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(15.f, host_->overscroll_delegate()->delta_x());
18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y());
19004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(host_->TouchEventQueueEmpty());
19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Send another touch event. The page should get the touch-move event, even
19047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // though overscroll has started.
19052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MoveTouchPoint(0, 55, 5);
19062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendTouchEvent();
19077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
19084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(host_->TouchEventQueueEmpty());
19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode());
19102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode());
19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(65.f, host_->overscroll_delta_x());
19122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(15.f, host_->overscroll_delegate()->delta_x());
19132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y());
19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchMove,
19167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
19174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(host_->TouchEventQueueEmpty());
19187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  process_->sink().ClearMessages();
19197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
19202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureScrollUpdateEvent(-10, 0, 0);
19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
19224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(host_->TouchEventQueueEmpty());
19232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode());
19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode());
19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(55.f, host_->overscroll_delta_x());
19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(5.f, host_->overscroll_delegate()->delta_x());
19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y());
19282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MoveTouchPoint(0, 255, 5);
19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendTouchEvent();
19317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
19324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(host_->TouchEventQueueEmpty());
19337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  process_->sink().ClearMessages();
19347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchMove,
19357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
19367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureScrollUpdateEvent(200, 0, 0);
19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
19394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(host_->TouchEventQueueEmpty());
19402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode());
19412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode());
19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(255.f, host_->overscroll_delta_x());
19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(205.f, host_->overscroll_delegate()->delta_x());
19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y());
19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The touch-end/cancel event should always reach the renderer if the page has
1947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // touch handlers.
19482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ReleaseTouchPoint(0);
19492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendTouchEvent();
1950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
19514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(host_->TouchEventQueueEmpty());
1952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  process_->sink().ClearMessages();
1953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SendInputEventACK(WebInputEvent::TouchEnd,
1955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
19562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
19574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(host_->TouchEventQueueEmpty());
19582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1959f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimulateGestureEvent(blink::WebInputEvent::GestureScrollEnd,
19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
1961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->PostDelayedTask(
1962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FROM_HERE,
1963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::MessageLoop::QuitClosure(),
1964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TimeDelta::FromMilliseconds(10));
1965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->Run();
19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
19674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(host_->TouchEventQueueEmpty());
19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
19692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->completed_mode());
19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that touch-gesture end is dispatched to the renderer at the end of a
19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// touch-gesture initiated overscroll.
19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RenderWidgetHostTest, TouchGestureEndDispatchedAfterOverscrollComplete) {
19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->SetupForOverscrollControllerTest();
19772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->set_debounce_interval_time_ms(10);
19782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true));
19792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->set_bounds(gfx::Rect(0, 0, 400, 200));
19812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->Show();
19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start scrolling. Receive ACK as it being processed.
19842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
19862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
1987f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The scroll begin event will have received a synthetic ack from the input
1988f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // router.
1989f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize());
19902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
19912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollBegin,
19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_CONSUMED);
19932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize());
19942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
19972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send update events.
19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureScrollUpdateEvent(55, -5, 0);
20002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, host_->GestureEventLastQueueEventSize());
20012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventDebouncingQueueSize());
20022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(host_->ScrollingInProgress());
20032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
20042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
20062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
20072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
20092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
20102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize());
20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
20122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode());
20132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode());
20142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(55.f, host_->overscroll_delta_x());
20152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(5.f, host_->overscroll_delegate()->delta_x());
201658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  EXPECT_EQ(-5.f, host_->overscroll_delegate()->delta_y());
20172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send end event.
2019f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimulateGestureEvent(blink::WebInputEvent::GestureScrollEnd,
20202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
20212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
20222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
20232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
20242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->completed_mode());
20252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize());
20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, host_->GestureEventDebouncingQueueSize());
2027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->PostDelayedTask(
2028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FROM_HERE,
2029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::MessageLoop::QuitClosure(),
2030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TimeDelta::FromMilliseconds(10));
2031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->Run();
20322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
20332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
2034f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The scroll end event will have received a synthetic ack from the input
2035f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // router.
2036f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize());
20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventDebouncingQueueSize());
20382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2039f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendInputEventACK(blink::WebInputEvent::GestureScrollEnd,
20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
20412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
20422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize());
20432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventDebouncingQueueSize());
20442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start scrolling. Receive ACK as it being processed.
20462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
20472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
20482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
2049f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The scroll begin event will have received a synthetic ack from the input
2050f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // router.
2051f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize());
20522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
20532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollBegin,
20542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_CONSUMED);
20552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize());
20562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
20572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
20582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
20592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send update events.
20612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureScrollUpdateEvent(235, -5, 0);
20622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, host_->GestureEventLastQueueEventSize());
20632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventDebouncingQueueSize());
20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(host_->ScrollingInProgress());
20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
20662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
20672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
20682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
20692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
20712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize());
20732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
20742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode());
20752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode());
20762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(235.f, host_->overscroll_delta_x());
20772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(185.f, host_->overscroll_delegate()->delta_x());
207858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  EXPECT_EQ(-5.f, host_->overscroll_delegate()->delta_y());
20792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send end event.
2081f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimulateGestureEvent(blink::WebInputEvent::GestureScrollEnd,
20822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
20832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
20842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
20852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
20862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->completed_mode());
20872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize());
20882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, host_->GestureEventDebouncingQueueSize());
20892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->PostDelayedTask(
2091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FROM_HERE,
2092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::MessageLoop::QuitClosure(),
2093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TimeDelta::FromMilliseconds(10));
2094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->Run();
20952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
20962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
2097f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The scroll end event will have received a synthetic ack from the input
2098f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // router.
2099f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize());
21002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventDebouncingQueueSize());
21012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendInputEventACK(blink::WebInputEvent::GestureScrollEnd,
21032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
21042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
21052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventLastQueueEventSize());
21062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventDebouncingQueueSize());
21072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
21082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RenderWidgetHostTest, OverscrollDirectionChange) {
21102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->SetupForOverscrollControllerTest();
21112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->set_debounce_interval_time_ms(100);
21122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
21132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start scrolling. Receive ACK as it being processed.
21152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
21162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       WebGestureEvent::Touchscreen);
21172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
21182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
21192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollBegin,
21202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_CONSUMED);
21212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send update events and receive ack as not consumed.
21232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureScrollUpdateEvent(125, -5, 0);
21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, host_->GestureEventLastQueueEventSize());
21252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, host_->GestureEventDebouncingQueueSize());
21262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(host_->ScrollingInProgress());
21272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
21282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  process_->sink().ClearMessages();
21292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
21312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
21322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode());
21332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode());
21342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
21352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Send another update event, but in the reverse direction. The overscroll
21372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // controller will consume the event, and reset the overscroll mode.
21382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureScrollUpdateEvent(-260, 0, 0);
21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
21402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
21412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Since the overscroll mode has been reset, the next scroll update events
21432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // should reach the renderer.
21442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateGestureScrollUpdateEvent(-20, 0, 0);
21452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
21462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
21472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
21482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Tests that if a mouse-move event completes the overscroll gesture, future
2150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// move events do reach the renderer.
2151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(RenderWidgetHostTest, OverscrollMouseMoveCompletion) {
2152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  host_->SetupForOverscrollControllerTest();
2153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  host_->DisableGestureDebounce();
2154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  process_->sink().ClearMessages();
2155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  view_->set_bounds(gfx::Rect(0, 0, 400, 200));
2156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  view_->Show();
2157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
215858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(5, 0, 0, true);  // sent directly
215958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(-1, 0, 0, true);  // enqueued
2160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SimulateWheelEvent(-10, -3, 0, true);  // coalesced into previous event
2161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SimulateWheelEvent(-15, -1, 0, true);  // coalesced into previous event
2162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SimulateWheelEvent(-30, -3, 0, true);  // coalesced into previous event
2163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
2164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
2165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  process_->sink().ClearMessages();
2166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Receive ACK the first wheel event as not processed.
2168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
2169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
2171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
2172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
2173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  process_->sink().ClearMessages();
2174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Receive ACK for the second (coalesced) event as not processed. This will
2176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // start an overcroll gesture.
2177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
2178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_WEST, host_->overscroll_mode());
2180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_WEST, host_->overscroll_delegate()->current_mode());
2181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
2182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Send a mouse-move event. This should cancel the overscroll navigation
2184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // (since the amount overscrolled is not above the threshold), and so the
2185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // mouse-move should reach the renderer.
2186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SimulateMouseMove(5, 10, 0);
2187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
2188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->completed_mode());
2189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
2190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
2191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  process_->sink().ClearMessages();
2192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseMove,
2194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Moving the mouse more should continue to send the events to the renderer.
2197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SimulateMouseMove(5, 10, 0);
2198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseMove,
2199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
2201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  process_->sink().ClearMessages();
2202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Now try with gestures.
2204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
2205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       WebGestureEvent::Touchscreen);
2206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SimulateGestureScrollUpdateEvent(300, -5, 0);
2207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollBegin,
2208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_CONSUMED);
2209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
2210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode());
2212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode());
2213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  process_->sink().ClearMessages();
2214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Overscroll gesture is in progress. Send a mouse-move now. This should
2216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // complete the gesture (because the amount overscrolled is above the
2217d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // threshold).
2218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SimulateMouseMove(5, 10, 0);
2219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->completed_mode());
2220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
2221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
2222d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
2223d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  process_->sink().ClearMessages();
2224d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseMove,
2225d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
2228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       WebGestureEvent::Touchscreen);
2229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
2230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
2231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  process_->sink().ClearMessages();
2232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollEnd,
2233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Move mouse some more. The mouse-move events should reach the renderer.
2236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SimulateMouseMove(5, 10, 0);
2237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
2238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseMove,
2240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  process_->sink().ClearMessages();
2242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
2243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
22447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Tests that if a page scrolled, then the overscroll controller's states are
22457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// reset after the end of the scroll.
22467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(RenderWidgetHostTest, OverscrollStateResetsAfterScroll) {
22477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  host_->SetupForOverscrollControllerTest();
2248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  host_->DisableGestureDebounce();
22497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  process_->sink().ClearMessages();
22507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  view_->set_bounds(gfx::Rect(0, 0, 400, 200));
22517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  view_->Show();
22527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
22537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SimulateWheelEvent(0, 5, 0, true);  // sent directly
22547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SimulateWheelEvent(0, 30, 0, true);  // enqueued
22557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SimulateWheelEvent(0, 40, 0, true);  // coalesced into previous event
22567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SimulateWheelEvent(0, 10, 0, true);  // coalesced into previous event
22577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
22587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
22597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  process_->sink().ClearMessages();
22607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
22617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // The first wheel event is consumed. Dispatches the queued wheel event.
22627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
22637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_CONSUMED);
22647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(host_->ScrollStateIsContentScrolling());
22657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
22667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  process_->sink().ClearMessages();
22677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
22687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // The second wheel event is consumed.
22697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
22707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_CONSUMED);
22717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(host_->ScrollStateIsContentScrolling());
22727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
22737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Touchpad scroll can end with a zero-velocity fling. But it is not
22747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // dispatched, but it should still reset the overscroll controller state.
22757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SimulateGestureFlingStartEvent(0.f, 0.f, WebGestureEvent::Touchpad);
22767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(host_->ScrollStateIsUnknown());
22777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
22787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
227958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(-5, 0, 0, true);  // sent directly
228058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(-60, 0, 0, true);  // enqueued
228158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  SimulateWheelEvent(-100, 0, 0, true);  // coalesced into previous event
22827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
22837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(host_->ScrollStateIsUnknown());
22847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  process_->sink().ClearMessages();
22857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
22867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // The first wheel scroll did not scroll content. Overscroll should not start
22877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // yet, since enough hasn't been scrolled.
22887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
22897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
22907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(host_->ScrollStateIsUnknown());
22917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(1U, process_->sink().message_count());
22927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  process_->sink().ClearMessages();
22937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
22947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SendInputEventACK(WebInputEvent::MouseWheel,
22957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
22967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_WEST, host_->overscroll_mode());
22977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(host_->ScrollStateIsOverscrolling());
22987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
22997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
23007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SimulateGestureFlingStartEvent(0.f, 0.f, WebGestureEvent::Touchpad);
23017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
23027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_WEST, host_->overscroll_delegate()->completed_mode());
23037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(host_->ScrollStateIsUnknown());
23047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
23057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  process_->sink().ClearMessages();
23067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
23077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
23087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(RenderWidgetHostTest, OverscrollResetsOnBlur) {
23097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  host_->SetupForOverscrollControllerTest();
23107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  process_->sink().ClearMessages();
23117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  view_->set_bounds(gfx::Rect(0, 0, 400, 200));
23127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  view_->Show();
23137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
23147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Start an overscroll with gesture scroll. In the middle of the scroll, blur
23157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // the host.
23167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
23177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       WebGestureEvent::Touchscreen);
23187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SimulateGestureScrollUpdateEvent(300, -5, 0);
23197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollBegin,
23207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_CONSUMED);
23217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
23227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
23237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode());
23247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode());
23257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
23267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  host_->Blur();
23277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode());
23287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
23297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->completed_mode());
23307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_x());
23317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(0.f, host_->overscroll_delegate()->delta_y());
23327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  process_->sink().ClearMessages();
23337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
23347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
23357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       WebGestureEvent::Touchscreen);
23367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(0U, process_->sink().message_count());
23377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
23387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Start a scroll gesture again. This should correctly start the overscroll
23397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // after the threshold.
23407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
23417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       WebGestureEvent::Touchscreen);
23427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SimulateGestureScrollUpdateEvent(300, -5, 0);
23437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SendInputEventACK(WebInputEvent::GestureScrollUpdate,
23447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
23457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_mode());
23467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->current_mode());
23477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->completed_mode());
23487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
23497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
23507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       WebGestureEvent::Touchscreen);
23517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode());
23527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(OVERSCROLL_EAST, host_->overscroll_delegate()->completed_mode());
23537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  process_->sink().ClearMessages();
23547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
23557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
23562385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#define TEST_InputRouterRoutes_NOARGS(INPUTMSG) \
23572385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  TEST_F(RenderWidgetHostTest, InputRouterRoutes##INPUTMSG) { \
23582385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    host_->SetupForInputRouterTest(); \
23592385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    host_->INPUTMSG(); \
23602385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    EXPECT_TRUE(host_->mock_input_router()->send_event_called_); \
23612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
23622385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
23632385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_InputRouterRoutes_NOARGS(Undo);
23642385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_InputRouterRoutes_NOARGS(Redo);
23652385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_InputRouterRoutes_NOARGS(Cut);
23662385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_InputRouterRoutes_NOARGS(Copy);
23672385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#if defined(OS_MACOSX)
23682385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_InputRouterRoutes_NOARGS(CopyToFindPboard);
23692385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#endif
23702385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_InputRouterRoutes_NOARGS(Paste);
23712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_InputRouterRoutes_NOARGS(PasteAndMatchStyle);
23722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_InputRouterRoutes_NOARGS(Delete);
23732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_InputRouterRoutes_NOARGS(SelectAll);
23742385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_InputRouterRoutes_NOARGS(Unselect);
23752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_InputRouterRoutes_NOARGS(Focus);
23762385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_InputRouterRoutes_NOARGS(Blur);
23772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_InputRouterRoutes_NOARGS(LostCapture);
23782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
23792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#undef TEST_InputRouterRoutes_NOARGS
23802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
23812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_F(RenderWidgetHostTest, InputRouterRoutesReplace) {
23822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  host_->SetupForInputRouterTest();
2383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  host_->Replace(base::string16());
23842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_TRUE(host_->mock_input_router()->send_event_called_);
23852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
23862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
23872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_F(RenderWidgetHostTest, InputRouterRoutesReplaceMisspelling) {
23882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  host_->SetupForInputRouterTest();
2389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  host_->ReplaceMisspelling(base::string16());
23902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_TRUE(host_->mock_input_router()->send_event_called_);
23912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
23922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
23932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_F(RenderWidgetHostTest, IgnoreInputEvent) {
23942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  host_->SetupForInputRouterTest();
23952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
23962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  host_->SetIgnoreInputEvents(true);
23972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
23982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  SimulateKeyboardEvent(WebInputEvent::RawKeyDown);
23992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_FALSE(host_->mock_input_router()->sent_keyboard_event_);
24002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  SimulateMouseEvent(WebInputEvent::MouseMove);
24022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_FALSE(host_->mock_input_router()->sent_mouse_event_);
24032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  SimulateWheelEvent(0, 100, 0, true);
24052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_FALSE(host_->mock_input_router()->sent_wheel_event_);
24062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
24082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                       WebGestureEvent::Touchscreen);
24092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_FALSE(host_->mock_input_router()->sent_gesture_event_);
24102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  PressTouchPoint(100, 100);
24122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  SendTouchEvent();
24132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_FALSE(host_->mock_input_router()->send_touch_event_not_cancelled_);
24142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
24152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_F(RenderWidgetHostTest, KeyboardListenerIgnoresEvent) {
24172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  host_->SetupForInputRouterTest();
2418424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  host_->AddKeyPressEventCallback(
2419424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      base::Bind(&RenderWidgetHostTest::KeyPressEventCallback,
2420424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                 base::Unretained(this)));
2421424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  handle_key_press_event_ = false;
24222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  SimulateKeyboardEvent(WebInputEvent::RawKeyDown);
24232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_TRUE(host_->mock_input_router()->sent_keyboard_event_);
24252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
24262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_F(RenderWidgetHostTest, KeyboardListenerSuppressFollowingEvents) {
24282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  host_->SetupForInputRouterTest();
24292385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
2430424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  host_->AddKeyPressEventCallback(
2431424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      base::Bind(&RenderWidgetHostTest::KeyPressEventCallback,
2432424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                 base::Unretained(this)));
24332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
2434424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // The callback handles the first event
2435424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  handle_key_press_event_ = true;
24362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  SimulateKeyboardEvent(WebInputEvent::RawKeyDown);
24372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_FALSE(host_->mock_input_router()->sent_keyboard_event_);
24392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // Following Char events should be suppressed
2441424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  handle_key_press_event_ = false;
24422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  SimulateKeyboardEvent(WebInputEvent::Char);
24432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_FALSE(host_->mock_input_router()->sent_keyboard_event_);
24442385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  SimulateKeyboardEvent(WebInputEvent::Char);
24452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_FALSE(host_->mock_input_router()->sent_keyboard_event_);
24462385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  // Sending RawKeyDown event should stop suppression
24482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  SimulateKeyboardEvent(WebInputEvent::RawKeyDown);
24492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_TRUE(host_->mock_input_router()->sent_keyboard_event_);
24502385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  host_->mock_input_router()->sent_keyboard_event_ = false;
24522385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  SimulateKeyboardEvent(WebInputEvent::Char);
24532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_TRUE(host_->mock_input_router()->sent_keyboard_event_);
2454424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
2455424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2456424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(RenderWidgetHostTest, MouseEventCallbackCanHandleEvent) {
2457424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  host_->SetupForInputRouterTest();
2458424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2459424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  host_->AddMouseEventCallback(
2460424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      base::Bind(&RenderWidgetHostTest::MouseEventCallback,
2461424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                 base::Unretained(this)));
2462424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2463424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  handle_mouse_event_ = true;
2464424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SimulateMouseEvent(WebInputEvent::MouseDown);
2465424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2466424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_FALSE(host_->mock_input_router()->sent_mouse_event_);
2467424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2468424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  handle_mouse_event_ = false;
2469424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SimulateMouseEvent(WebInputEvent::MouseDown);
24702385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
2471424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(host_->mock_input_router()->sent_mouse_event_);
24722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
24732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24742385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_F(RenderWidgetHostTest, InputRouterReceivesHandleInputEvent_ACK) {
24752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  host_->SetupForInputRouterTest();
24762385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  SendInputEventACK(WebInputEvent::RawKeyDown,
24782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                    INPUT_EVENT_ACK_STATE_CONSUMED);
24792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_TRUE(host_->mock_input_router()->message_received_);
24812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
24822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_F(RenderWidgetHostTest, InputRouterReceivesMoveCaret_ACK) {
24842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  host_->SetupForInputRouterTest();
24852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  host_->OnMessageReceived(ViewHostMsg_MoveCaret_ACK(0));
24872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_TRUE(host_->mock_input_router()->message_received_);
24892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
24902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_F(RenderWidgetHostTest, InputRouterReceivesSelectRange_ACK) {
24922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  host_->SetupForInputRouterTest();
24932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  host_->OnMessageReceived(ViewHostMsg_SelectRange_ACK(0));
24952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_TRUE(host_->mock_input_router()->message_received_);
24972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
24982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
24992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_F(RenderWidgetHostTest, InputRouterReceivesHasTouchEventHandlers) {
25002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  host_->SetupForInputRouterTest();
25012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
25022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  host_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true));
25032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
25042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  EXPECT_TRUE(host_->mock_input_router()->message_received_);
25052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
25062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
2508