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(¶ms); 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(¶ms); 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(¶ms); 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(¶ms); 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(¶ms); 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(¶ms); 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