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"