Remove LayerScrollOffsetDelegate, make all input paths go thru proxy.

This removes the cc::LayerScrollOffsetDelegate interface, moving it
into the InputHandlerClient interface.

It also removes the pointer to cc::LayerTreeHostImpl (as a
cc::InputHandler*) from the WebView embedder code. Instead make the
WebView code always go through the SynchronousInputHandlerProxy (which
is the InputHandlerProxy) to talk to the compositor about input-related
things.

R=boliu, [email protected]
BUG=531746
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel

Review URL: https://codereview.chromium.org/1353013002

Cr-Commit-Position: refs/heads/master@{#350056}
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 0be5ac0..36e7bdd 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -185,7 +185,6 @@
       scroll_affects_scroll_handler_(false),
       scroll_layer_id_when_mouse_over_scrollbar_(0),
       tile_priorities_dirty_(false),
-      root_layer_scroll_offset_delegate_(nullptr),
       settings_(settings),
       visible_(true),
       cached_managed_memory_policy_(
@@ -425,8 +424,9 @@
   AnimateScrollbars(monotonic_time);
   AnimateTopControls(monotonic_time);
 
-  // Animating stuff can change the root scroll offset, so inform the delegate.
-  NotifyRootLayerScrollOffsetDelegate();
+  // Animating stuff can change the root scroll offset, so inform the
+  // synchronous input handler.
+  UpdateRootLayerStateForSynchronousInputHandler();
 }
 
 bool LayerTreeHostImpl::PrepareTiles() {
@@ -1929,8 +1929,9 @@
         pending_page_scale_animation->scale,
         pending_page_scale_animation->duration);
   }
-  // Activation can change the root scroll offset, so inform the delegate.
-  NotifyRootLayerScrollOffsetDelegate();
+  // Activation can change the root scroll offset, so inform the synchronous
+  // input handler.
+  UpdateRootLayerStateForSynchronousInputHandler();
 }
 
 void LayerTreeHostImpl::SetVisible(bool visible) {
@@ -2714,8 +2715,9 @@
   scroll_result.accumulated_root_overscroll = accumulated_root_overscroll_;
   scroll_result.unused_scroll_delta = unused_root_delta;
 
-  // Scrolling can change the root scroll offset, so inform the delegate.
-  NotifyRootLayerScrollOffsetDelegate();
+  // Scrolling can change the root scroll offset, so inform the synchronous
+  // input handler.
+  UpdateRootLayerStateForSynchronousInputHandler();
 
   return scroll_result;
 }
@@ -2762,20 +2764,17 @@
   return false;
 }
 
-void LayerTreeHostImpl::SetRootLayerScrollOffsetDelegate(
-      LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) {
-  root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate;
-  // When first set, clobber the delegate's scroll offset with compositor's.
-  NotifyRootLayerScrollOffsetDelegate();
+void LayerTreeHostImpl::RequestUpdateForSynchronousInputHandler() {
+  UpdateRootLayerStateForSynchronousInputHandler();
 }
 
-void LayerTreeHostImpl::OnRootLayerDelegatedScrollOffsetChanged(
+void LayerTreeHostImpl::SetSynchronousInputHandlerRootScrollOffset(
     const gfx::ScrollOffset& root_offset) {
   active_tree_->DistributeRootScrollOffset(root_offset);
   client_->SetNeedsCommitOnImplThread();
-  // After applying the delegate's scroll offset, tell it what we ended up with.
-  DCHECK(root_layer_scroll_offset_delegate_);
-  NotifyRootLayerScrollOffsetDelegate();
+  // After applying the synchronous input handler's scroll offset, tell it what
+  // we ended up with.
+  UpdateRootLayerStateForSynchronousInputHandler();
   // No need to SetNeedsRedraw, this is for WebView and every frame has redraw
   // requested by the WebView embedder already.
 }
@@ -2914,8 +2913,9 @@
   client_->SetNeedsCommitOnImplThread();
   SetNeedsRedraw();
   client_->RenewTreePriority();
-  // Pinching can change the root scroll offset, so inform the delegate.
-  NotifyRootLayerScrollOffsetDelegate();
+  // Pinching can change the root scroll offset, so inform the synchronous input
+  // handler.
+  UpdateRootLayerStateForSynchronousInputHandler();
 }
 
 void LayerTreeHostImpl::PinchGestureEnd() {
@@ -3391,10 +3391,10 @@
     (*it)->OnForwardScrollUpdateToMainThreadOnImpl();
 }
 
-void LayerTreeHostImpl::NotifyRootLayerScrollOffsetDelegate() {
-  if (!root_layer_scroll_offset_delegate_)
+void LayerTreeHostImpl::UpdateRootLayerStateForSynchronousInputHandler() {
+  if (!input_handler_client_)
     return;
-  root_layer_scroll_offset_delegate_->UpdateRootLayerState(
+  input_handler_client_->UpdateRootLayerStateForSynchronousInputHandler(
       active_tree_->TotalScrollOffset(), active_tree_->TotalMaxScrollOffset(),
       active_tree_->ScrollableSize(), active_tree_->current_page_scale_factor(),
       active_tree_->min_page_scale_factor(),
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index 358b88d..f3d4a67 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -21,7 +21,6 @@
 #include "cc/debug/frame_timing_tracker.h"
 #include "cc/debug/micro_benchmark_controller_impl.h"
 #include "cc/input/input_handler.h"
-#include "cc/input/layer_scroll_offset_delegate.h"
 #include "cc/input/top_controls_manager_client.h"
 #include "cc/layers/layer_lists.h"
 #include "cc/layers/render_pass_sink.h"
@@ -173,9 +172,8 @@
       const gfx::Vector2dF& scroll_delta) override;
   bool ScrollVerticallyByPage(const gfx::Point& viewport_point,
                               ScrollDirection direction) override;
-  void SetRootLayerScrollOffsetDelegate(
-      LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) override;
-  void OnRootLayerDelegatedScrollOffsetChanged(
+  void RequestUpdateForSynchronousInputHandler() override;
+  void SetSynchronousInputHandlerRootScrollOffset(
       const gfx::ScrollOffset& root_offset) override;
   void ScrollEnd() override;
   InputHandler::ScrollStatus FlingScrollBegin() override;
@@ -674,7 +672,8 @@
 
   void NotifySwapPromiseMonitorsOfSetNeedsRedraw();
   void NotifySwapPromiseMonitorsOfForwardingToMainThread();
-  void NotifyRootLayerScrollOffsetDelegate();
+
+  void UpdateRootLayerStateForSynchronousInputHandler();
 
   void ScrollAnimationCreate(LayerImpl* layer_impl,
                              const gfx::ScrollOffset& target_offset,
@@ -737,9 +736,6 @@
 
   bool tile_priorities_dirty_;
 
-  // The optional delegate for the root layer scroll offset.
-  LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate_;
-
   const LayerTreeSettings settings_;
   LayerTreeDebugState debug_state_;
   bool visible_;
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index eeaf88f..9921731 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -4557,21 +4557,26 @@
             inner_viewport_scroll_layer->MaxScrollOffset());
 }
 
-class TestScrollOffsetDelegate : public LayerScrollOffsetDelegate {
+class TestInputHandlerClient : public InputHandlerClient {
  public:
-  TestScrollOffsetDelegate()
+  TestInputHandlerClient()
       : page_scale_factor_(0.f),
         min_page_scale_factor_(-1.f),
         max_page_scale_factor_(-1.f) {}
+  ~TestInputHandlerClient() override {}
 
-  ~TestScrollOffsetDelegate() override {}
-
-  void UpdateRootLayerState(const gfx::ScrollOffset& total_scroll_offset,
-                            const gfx::ScrollOffset& max_scroll_offset,
-                            const gfx::SizeF& scrollable_size,
-                            float page_scale_factor,
-                            float min_page_scale_factor,
-                            float max_page_scale_factor) override {
+  // InputHandlerClient implementation.
+  void WillShutdown() override {}
+  void Animate(base::TimeTicks time) override {}
+  void MainThreadHasStoppedFlinging() override {}
+  void ReconcileElasticOverscrollAndRootScroll() override {}
+  void UpdateRootLayerStateForSynchronousInputHandler(
+      const gfx::ScrollOffset& total_scroll_offset,
+      const gfx::ScrollOffset& max_scroll_offset,
+      const gfx::SizeF& scrollable_size,
+      float page_scale_factor,
+      float min_page_scale_factor,
+      float max_page_scale_factor) override {
     DCHECK(total_scroll_offset.x() <= max_scroll_offset.x());
     DCHECK(total_scroll_offset.y() <= max_scroll_offset.y());
     last_set_scroll_offset_ = total_scroll_offset;
@@ -4616,51 +4621,56 @@
 };
 
 TEST_F(LayerTreeHostImplTest, RootLayerScrollOffsetDelegation) {
-  TestScrollOffsetDelegate scroll_delegate;
+  TestInputHandlerClient scroll_watcher;
   host_impl_->SetViewportSize(gfx::Size(10, 20));
   LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(100, 100));
   LayerImpl* clip_layer = scroll_layer->parent()->parent();
   clip_layer->SetBounds(gfx::Size(10, 20));
 
-  // Setting the delegate results in the current scroll offset being set.
+  host_impl_->BindToClient(&scroll_watcher);
+
   gfx::Vector2dF initial_scroll_delta(10.f, 10.f);
   scroll_layer->PushScrollOffsetFromMainThread(gfx::ScrollOffset());
   scroll_layer->SetScrollDelta(initial_scroll_delta);
-  host_impl_->SetRootLayerScrollOffsetDelegate(&scroll_delegate);
-  EXPECT_EQ(initial_scroll_delta.ToString(),
-            scroll_delegate.last_set_scroll_offset().ToString());
+
+  EXPECT_EQ(gfx::ScrollOffset(), scroll_watcher.last_set_scroll_offset());
+
+  // Requesting an update results in the current scroll offset being set.
+  host_impl_->RequestUpdateForSynchronousInputHandler();
+  EXPECT_EQ(gfx::ScrollOffset(initial_scroll_delta),
+            scroll_watcher.last_set_scroll_offset());
 
   // Setting the delegate results in the scrollable_size, max_scroll_offset,
   // page_scale_factor and {min|max}_page_scale_factor being set.
-  EXPECT_EQ(gfx::SizeF(100, 100), scroll_delegate.scrollable_size());
-  EXPECT_EQ(gfx::ScrollOffset(90, 80), scroll_delegate.max_scroll_offset());
-  EXPECT_EQ(1.f, scroll_delegate.page_scale_factor());
-  EXPECT_EQ(1.f, scroll_delegate.min_page_scale_factor());
-  EXPECT_EQ(1.f, scroll_delegate.max_page_scale_factor());
+  EXPECT_EQ(gfx::SizeF(100, 100), scroll_watcher.scrollable_size());
+  EXPECT_EQ(gfx::ScrollOffset(90, 80), scroll_watcher.max_scroll_offset());
+  EXPECT_EQ(1.f, scroll_watcher.page_scale_factor());
+  EXPECT_EQ(1.f, scroll_watcher.min_page_scale_factor());
+  EXPECT_EQ(1.f, scroll_watcher.max_page_scale_factor());
 
   // Put a page scale on the tree.
   host_impl_->active_tree()->PushPageScaleFromMainThread(2.f, 0.5f, 4.f);
-  EXPECT_EQ(1.f, scroll_delegate.page_scale_factor());
-  EXPECT_EQ(1.f, scroll_delegate.min_page_scale_factor());
-  EXPECT_EQ(1.f, scroll_delegate.max_page_scale_factor());
+  EXPECT_EQ(1.f, scroll_watcher.page_scale_factor());
+  EXPECT_EQ(1.f, scroll_watcher.min_page_scale_factor());
+  EXPECT_EQ(1.f, scroll_watcher.max_page_scale_factor());
   // Activation will update the delegate.
   host_impl_->ActivateSyncTree();
-  EXPECT_EQ(2.f, scroll_delegate.page_scale_factor());
-  EXPECT_EQ(.5f, scroll_delegate.min_page_scale_factor());
-  EXPECT_EQ(4.f, scroll_delegate.max_page_scale_factor());
+  EXPECT_EQ(2.f, scroll_watcher.page_scale_factor());
+  EXPECT_EQ(.5f, scroll_watcher.min_page_scale_factor());
+  EXPECT_EQ(4.f, scroll_watcher.max_page_scale_factor());
 
   // Reset the page scale for the rest of the test.
   host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, 0.5f, 4.f);
-  EXPECT_EQ(2.f, scroll_delegate.page_scale_factor());
-  EXPECT_EQ(.5f, scroll_delegate.min_page_scale_factor());
-  EXPECT_EQ(4.f, scroll_delegate.max_page_scale_factor());
+  EXPECT_EQ(2.f, scroll_watcher.page_scale_factor());
+  EXPECT_EQ(.5f, scroll_watcher.min_page_scale_factor());
+  EXPECT_EQ(4.f, scroll_watcher.max_page_scale_factor());
 
   // Animating page scale can change the root offset, so it should update the
   // delegate.
   host_impl_->Animate();
-  EXPECT_EQ(1.f, scroll_delegate.page_scale_factor());
-  EXPECT_EQ(.5f, scroll_delegate.min_page_scale_factor());
-  EXPECT_EQ(4.f, scroll_delegate.max_page_scale_factor());
+  EXPECT_EQ(1.f, scroll_watcher.page_scale_factor());
+  EXPECT_EQ(.5f, scroll_watcher.min_page_scale_factor());
+  EXPECT_EQ(4.f, scroll_watcher.max_page_scale_factor());
 
   // The pinch gesture doesn't put the delegate into a state where the scroll
   // offset is outside of the scroll range.  (this is verified by DCHECKs in the
@@ -4678,19 +4688,19 @@
 
   EXPECT_EQ(InputHandler::SCROLL_STARTED,
             host_impl_->ScrollBegin(gfx::Point(), InputHandler::GESTURE));
-  host_impl_->OnRootLayerDelegatedScrollOffsetChanged(current_offset);
+  host_impl_->SetSynchronousInputHandlerRootScrollOffset(current_offset);
 
   host_impl_->ScrollBy(gfx::Point(), scroll_delta);
   EXPECT_EQ(ScrollOffsetWithDelta(current_offset, scroll_delta),
-            scroll_delegate.last_set_scroll_offset());
+            scroll_watcher.last_set_scroll_offset());
 
   current_offset = gfx::ScrollOffset(42.f, 41.f);
-  host_impl_->OnRootLayerDelegatedScrollOffsetChanged(current_offset);
+  host_impl_->SetSynchronousInputHandlerRootScrollOffset(current_offset);
   host_impl_->ScrollBy(gfx::Point(), scroll_delta);
   EXPECT_EQ(current_offset + gfx::ScrollOffset(scroll_delta),
-            scroll_delegate.last_set_scroll_offset());
+            scroll_watcher.last_set_scroll_offset());
   host_impl_->ScrollEnd();
-  host_impl_->OnRootLayerDelegatedScrollOffsetChanged(gfx::ScrollOffset());
+  host_impl_->SetSynchronousInputHandlerRootScrollOffset(gfx::ScrollOffset());
 
   // Forces a full tree synchronization and ensures that the scroll delegate
   // sees the correct size of the new tree.
@@ -4699,16 +4709,10 @@
   host_impl_->pending_tree()->PushPageScaleFromMainThread(1.f, 1.f, 1.f);
   CreateScrollAndContentsLayers(host_impl_->pending_tree(), new_size);
   host_impl_->ActivateSyncTree();
-  EXPECT_EQ(new_size, scroll_delegate.scrollable_size());
+  EXPECT_EQ(new_size, scroll_watcher.scrollable_size());
 
-  // Un-setting the delegate should propagate the delegate's current offset to
-  // the root scrollable layer.
-  current_offset = gfx::ScrollOffset(13.f, 12.f);
-  host_impl_->OnRootLayerDelegatedScrollOffsetChanged(current_offset);
-  host_impl_->SetRootLayerScrollOffsetDelegate(NULL);
-
-  EXPECT_EQ(current_offset.ToString(),
-            scroll_layer->CurrentScrollOffset().ToString());
+  // Tear down the LayerTreeHostImpl before the InputHandlerClient.
+  host_impl_.reset();
 }
 
 void CheckLayerScrollDelta(LayerImpl* layer, gfx::Vector2dF scroll_delta) {
@@ -4723,12 +4727,10 @@
 
 TEST_F(LayerTreeHostImplTest,
        ExternalRootLayerScrollOffsetDelegationReflectedInNextDraw) {
-  TestScrollOffsetDelegate scroll_delegate;
   host_impl_->SetViewportSize(gfx::Size(10, 20));
   LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(100, 100));
   LayerImpl* clip_layer = scroll_layer->parent()->parent();
   clip_layer->SetBounds(gfx::Size(10, 20));
-  host_impl_->SetRootLayerScrollOffsetDelegate(&scroll_delegate);
 
   // Draw first frame to clear any pending draws and check scroll.
   DrawFrame();
@@ -4737,7 +4739,7 @@
 
   // Set external scroll delta on delegate and notify LayerTreeHost.
   gfx::ScrollOffset scroll_offset(10.f, 10.f);
-  host_impl_->OnRootLayerDelegatedScrollOffsetChanged(scroll_offset);
+  host_impl_->SetSynchronousInputHandlerRootScrollOffset(scroll_offset);
 
   // Check scroll delta reflected in layer.
   LayerTreeHostImpl::FrameData frame;
@@ -4746,8 +4748,6 @@
   host_impl_->DidDrawAllLayers(frame);
   EXPECT_FALSE(frame.has_no_damage);
   CheckLayerScrollDelta(scroll_layer, ScrollOffsetToVector2dF(scroll_offset));
-
-  host_impl_->SetRootLayerScrollOffsetDelegate(NULL);
 }
 
 TEST_F(LayerTreeHostImplTest, OverscrollRoot) {
@@ -7698,9 +7698,6 @@
 
   SetupVirtualViewportLayers(content_size, outer_viewport, inner_viewport);
 
-  TestScrollOffsetDelegate scroll_delegate;
-  host_impl_->SetRootLayerScrollOffsetDelegate(&scroll_delegate);
-
   LayerImpl* outer_scroll = host_impl_->OuterViewportScrollLayer();
   LayerImpl* inner_scroll = host_impl_->InnerViewportScrollLayer();
   DrawFrame();
@@ -7712,7 +7709,7 @@
 
     gfx::ScrollOffset current_offset(70.f, 100.f);
 
-    host_impl_->OnRootLayerDelegatedScrollOffsetChanged(current_offset);
+    host_impl_->SetSynchronousInputHandlerRootScrollOffset(current_offset);
     EXPECT_EQ(gfx::ScrollOffset(25.f, 40.f), inner_scroll->MaxScrollOffset());
     EXPECT_EQ(gfx::ScrollOffset(50.f, 80.f), outer_scroll->MaxScrollOffset());
 
diff --git a/cc/trees/layer_tree_host_unittest_scroll.cc b/cc/trees/layer_tree_host_unittest_scroll.cc
index 484b4a2e..79fde4f2 100644
--- a/cc/trees/layer_tree_host_unittest_scroll.cc
+++ b/cc/trees/layer_tree_host_unittest_scroll.cc
@@ -1066,6 +1066,19 @@
     }
   }
 
+  void UpdateRootLayerStateForSynchronousInputHandler(
+      const gfx::ScrollOffset& total_scroll_offset,
+      const gfx::ScrollOffset& max_scroll_offset,
+      const gfx::SizeF& scrollable_size,
+      float page_scale_factor,
+      float min_page_scale_factor,
+      float max_page_scale_factor) override {
+    if (!task_runner_->BelongsToCurrentThread()) {
+      ADD_FAILURE() << "UpdateRootLayerStateForSynchronousInputHandler called "
+                    << " on wrong thread";
+    }
+  }
+
  private:
   base::SingleThreadTaskRunner* task_runner_;
   bool* received_stop_flinging_;
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index 00db0a64..61a64d634 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -19,7 +19,6 @@
 #include "cc/base/synced_property.h"
 #include "cc/debug/devtools_instrumentation.h"
 #include "cc/debug/traced_value.h"
-#include "cc/input/layer_scroll_offset_delegate.h"
 #include "cc/input/page_scale_animation.h"
 #include "cc/layers/heads_up_display_layer_impl.h"
 #include "cc/layers/layer.h"