Home | History | Annotate | Download | only in renderer_host
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "content/browser/renderer_host/smooth_scroll_gesture_controller.h"
      6 
      7 #include "base/debug/trace_event.h"
      8 #include "base/message_loop/message_loop.h"
      9 #include "content/common/view_messages.h"
     10 #include "content/port/browser/render_widget_host_view_port.h"
     11 #include "content/port/browser/smooth_scroll_gesture.h"
     12 #include "content/public/browser/render_widget_host.h"
     13 
     14 namespace content {
     15 
     16 namespace {
     17 
     18 // How many milliseconds apart synthetic scroll messages should be sent.
     19 const int kSyntheticScrollMessageIntervalMs = 7;
     20 
     21 }  // namespace
     22 
     23 SmoothScrollGestureController::SmoothScrollGestureController()
     24     : rwh_(NULL) {
     25 }
     26 
     27 SmoothScrollGestureController::~SmoothScrollGestureController() {
     28 }
     29 
     30 void SmoothScrollGestureController::BeginSmoothScroll(
     31     RenderWidgetHostViewPort* view,
     32     const ViewHostMsg_BeginSmoothScroll_Params& params) {
     33   if (pending_smooth_scroll_gesture_.get())
     34     return;
     35 
     36   rwh_ = view->GetRenderWidgetHost();
     37   pending_smooth_scroll_gesture_ = view->CreateSmoothScrollGesture(
     38       params.scroll_down,
     39       params.pixels_to_scroll,
     40       params.mouse_event_x,
     41       params.mouse_event_y);
     42 
     43   timer_.Start(FROM_HERE, GetSyntheticScrollMessageInterval(), this,
     44                &SmoothScrollGestureController::OnTimer);
     45 }
     46 
     47 base::TimeDelta
     48     SmoothScrollGestureController::GetSyntheticScrollMessageInterval() const {
     49   return base::TimeDelta::FromMilliseconds(kSyntheticScrollMessageIntervalMs);
     50 }
     51 
     52 void SmoothScrollGestureController::OnTimer() {
     53   base::TimeTicks now = base::TimeTicks::Now();
     54   if (!pending_smooth_scroll_gesture_->ForwardInputEvents(now, rwh_)) {
     55     timer_.Stop();
     56     pending_smooth_scroll_gesture_ = NULL;
     57     rwh_->Send(new ViewMsg_SmoothScrollCompleted(rwh_->GetRoutingID()));
     58   }
     59 }
     60 
     61 }  // namespace content
     62