12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CONTENT_BROWSER_RENDERER_HOST_OVERSCROLL_CONTROLLER_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CONTENT_BROWSER_RENDERER_HOST_OVERSCROLL_CONTROLLER_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h" 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace ui { 13b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)struct LatencyInfo; 14b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 15b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class RenderWidgetHostViewAuraOverscrollTest; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class OverscrollControllerDelegate; 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// Indicates the direction that the scroll is heading in relative to the screen, 22bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// with the top being NORTH. 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum OverscrollMode { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OVERSCROLL_NONE, 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OVERSCROLL_NORTH, 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OVERSCROLL_SOUTH, 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OVERSCROLL_WEST, 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OVERSCROLL_EAST, 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OVERSCROLL_COUNT 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// When a page is scrolled beyond the scrollable region, it will trigger an 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// overscroll gesture. This controller receives the events that are dispatched 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to the renderer, and the ACKs of events, and updates the overscroll gesture 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// status accordingly. 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class OverscrollController { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OverscrollController(); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~OverscrollController(); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This must be called when dispatching any event from the 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // RenderWidgetHostView so that the state of the overscroll gesture can be 4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // updated properly. Returns true if the event was handled, in which case 4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // further processing should cease. 4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool WillHandleEvent(const blink::WebInputEvent& event); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This must be called when the ACK for any event comes in. This updates the 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // overscroll gesture status as appropriate. 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void ReceivedEventACK(const blink::WebInputEvent& event, bool processed); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // This must be called when a gesture event is filtered out and not sent to 527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the renderer. 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void DiscardingGestureEvent(const blink::WebGestureEvent& event); 547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollMode overscroll_mode() const { return overscroll_mode_; } 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_delegate(OverscrollControllerDelegate* delegate) { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_ = delegate; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Resets internal states. 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Reset(); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Cancels any in-progress overscroll (and calls OnOverscrollModeChange on the 657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // delegate if necessary), and resets internal states. 667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void Cancel(); 677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) friend class RenderWidgetHostViewAuraOverscrollTest; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Different scrolling states. 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) enum ScrollState { 7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) STATE_UNKNOWN, 7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) STATE_PENDING, 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) STATE_CONTENT_SCROLLING, 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) STATE_OVERSCROLLING, 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }; 7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true if the event indicates that the in-progress overscroll gesture 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // can now be completed. 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool DispatchEventCompletesAction( 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebInputEvent& event) const; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true to indicate that dispatching the event should reset the 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // overscroll gesture status. 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool DispatchEventResetsState(const blink::WebInputEvent& event) const; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Processes an event to update the internal state for overscroll. Returns 89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // true if the state is updated, false otherwise. 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool ProcessEventForOverscroll(const blink::WebInputEvent& event); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Processes horizontal overscroll. This can update both the overscroll mode 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and the over scroll amount (i.e. |overscroll_mode_|, |overscroll_delta_x_| 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and |overscroll_delta_y_|). 95424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void ProcessOverscroll(float delta_x, 96424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) float delta_y, 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebInputEvent::Type event_type); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Completes the desired action from the current gesture. 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CompleteAction(); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets the overscroll mode (and triggers callback in the delegate when 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // appropriate). 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetOverscrollMode(OverscrollMode new_mode); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The current state of overscroll gesture. 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollMode overscroll_mode_; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Used to keep track of the scrolling state. 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // If scrolling starts, and some scroll events are consumed at the beginning 11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // of the scroll (i.e. some content on the web-page was scrolled), then do not 11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // process any of the subsequent scroll events for generating overscroll 11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // gestures. 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ScrollState scroll_state_; 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The amount of overscroll in progress. These values are invalid when 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |overscroll_mode_| is set to OVERSCROLL_NONE. 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float overscroll_delta_x_; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float overscroll_delta_y_; 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The delegate that receives the overscroll updates. The delegate is not 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // owned by this controller. 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollControllerDelegate* delegate_; 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OverscrollController); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CONTENT_BROWSER_RENDERER_HOST_OVERSCROLL_CONTROLLER_H_ 131