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