Chromium Code Reviews| Index: cc/trees/layer_tree_host_unittest_scroll.cc |
| diff --git a/cc/trees/layer_tree_host_unittest_scroll.cc b/cc/trees/layer_tree_host_unittest_scroll.cc |
| index d433c424463e12fd7a226eb2a913d3a0c3f91c91..87d0fd5d5e40abc1428e4f1e542411e022044e13 100644 |
| --- a/cc/trees/layer_tree_host_unittest_scroll.cc |
| +++ b/cc/trees/layer_tree_host_unittest_scroll.cc |
| @@ -4,6 +4,7 @@ |
| #include "cc/trees/layer_tree_host.h" |
| +#include "base/memory/weak_ptr.h" |
| #include "cc/base/thread_impl.h" |
| #include "cc/layers/content_layer.h" |
| #include "cc/layers/layer.h" |
| @@ -29,8 +30,7 @@ class LayerTreeHostScrollTestScrollSimple : public LayerTreeHostScrollTest { |
| : initial_scroll_(10, 20), |
| second_scroll_(40, 5), |
| scroll_amount_(2, -1), |
| - num_scrolls_(0) { |
| - } |
| + num_scrolls_(0) {} |
| virtual void BeginTest() OVERRIDE { |
| layer_tree_host()->root_layer()->SetScrollable(true); |
| @@ -72,16 +72,14 @@ class LayerTreeHostScrollTestScrollSimple : public LayerTreeHostScrollTest { |
| } |
| } |
| - virtual void ApplyScrollAndScale( |
| - gfx::Vector2d scroll_delta, float scale) OVERRIDE { |
| + virtual void ApplyScrollAndScale(gfx::Vector2d scroll_delta, float scale) |
| + OVERRIDE { |
| gfx::Vector2d offset = layer_tree_host()->root_layer()->scroll_offset(); |
| layer_tree_host()->root_layer()->SetScrollOffset(offset + scroll_delta); |
| num_scrolls_++; |
| } |
| - virtual void AfterTest() OVERRIDE { |
| - EXPECT_EQ(1, num_scrolls_); |
| - } |
| + virtual void AfterTest() OVERRIDE { EXPECT_EQ(1, num_scrolls_); } |
| private: |
| gfx::Vector2d initial_scroll_; |
| @@ -96,10 +94,7 @@ class LayerTreeHostScrollTestScrollMultipleRedraw |
| : public LayerTreeHostScrollTest { |
| public: |
| LayerTreeHostScrollTestScrollMultipleRedraw() |
| - : initial_scroll_(40, 10), |
| - scroll_amount_(-3, 17), |
| - num_scrolls_(0) { |
| - } |
| + : initial_scroll_(40, 10), scroll_amount_(-3, 17), num_scrolls_(0) {} |
| virtual void BeginTest() OVERRIDE { |
| layer_tree_host()->root_layer()->SetScrollable(true); |
| @@ -114,13 +109,11 @@ class LayerTreeHostScrollTestScrollMultipleRedraw |
| EXPECT_VECTOR_EQ(root->scroll_offset(), initial_scroll_); |
| break; |
| case 1: |
| - EXPECT_VECTOR_EQ( |
| - root->scroll_offset(), |
| - initial_scroll_ + scroll_amount_ + scroll_amount_); |
| + EXPECT_VECTOR_EQ(root->scroll_offset(), |
| + initial_scroll_ + scroll_amount_ + scroll_amount_); |
| case 2: |
| - EXPECT_VECTOR_EQ( |
| - root->scroll_offset(), |
| - initial_scroll_ + scroll_amount_ + scroll_amount_); |
| + EXPECT_VECTOR_EQ(root->scroll_offset(), |
| + initial_scroll_ + scroll_amount_ + scroll_amount_); |
| break; |
| } |
| } |
| @@ -152,23 +145,21 @@ class LayerTreeHostScrollTestScrollMultipleRedraw |
| // Third or later draw after second commit. |
| EXPECT_GE(impl->SourceAnimationFrameNumber(), 3); |
| EXPECT_VECTOR_EQ(root->ScrollDelta(), gfx::Vector2d()); |
| - EXPECT_VECTOR_EQ( |
| - root->scroll_offset(), |
| - initial_scroll_ + scroll_amount_ + scroll_amount_); |
| + EXPECT_VECTOR_EQ(root->scroll_offset(), |
| + initial_scroll_ + scroll_amount_ + scroll_amount_); |
| EndTest(); |
| } |
| } |
| - virtual void ApplyScrollAndScale( |
| - gfx::Vector2d scroll_delta, float scale) OVERRIDE { |
| + virtual void ApplyScrollAndScale(gfx::Vector2d scroll_delta, float scale) |
| + OVERRIDE { |
| gfx::Vector2d offset = layer_tree_host()->root_layer()->scroll_offset(); |
| layer_tree_host()->root_layer()->SetScrollOffset(offset + scroll_delta); |
| num_scrolls_++; |
| } |
| - virtual void AfterTest() OVERRIDE { |
| - EXPECT_EQ(1, num_scrolls_); |
| - } |
| + virtual void AfterTest() OVERRIDE { EXPECT_EQ(1, num_scrolls_); } |
| + |
| private: |
| gfx::Vector2d initial_scroll_; |
| gfx::Vector2d scroll_amount_; |
| @@ -179,9 +170,7 @@ MULTI_THREAD_TEST_F(LayerTreeHostScrollTestScrollMultipleRedraw); |
| class LayerTreeHostScrollTestFractionalScroll : public LayerTreeHostScrollTest { |
| public: |
| - LayerTreeHostScrollTestFractionalScroll() |
| - : scroll_amount_(1.75, 0) { |
| - } |
| + LayerTreeHostScrollTestFractionalScroll() : scroll_amount_(1.75, 0) {} |
| virtual void BeginTest() OVERRIDE { |
| layer_tree_host()->root_layer()->SetScrollable(true); |
| @@ -201,12 +190,10 @@ class LayerTreeHostScrollTestFractionalScroll : public LayerTreeHostScrollTest { |
| PostSetNeedsCommitToMainThread(); |
| break; |
| case 1: |
| - EXPECT_VECTOR_EQ( |
| - root->scroll_offset(), |
| - gfx::ToFlooredVector2d(scroll_amount_)); |
| - EXPECT_VECTOR_EQ( |
| - root->ScrollDelta(), |
| - gfx::Vector2dF(fmod(scroll_amount_.x(), 1.0f), 0.0f)); |
| + EXPECT_VECTOR_EQ(root->scroll_offset(), |
| + gfx::ToFlooredVector2d(scroll_amount_)); |
| + EXPECT_VECTOR_EQ(root->ScrollDelta(), |
| + gfx::Vector2dF(fmod(scroll_amount_.x(), 1.0f), 0.0f)); |
| PostSetNeedsCommitToMainThread(); |
| break; |
| case 2: |
| @@ -222,8 +209,8 @@ class LayerTreeHostScrollTestFractionalScroll : public LayerTreeHostScrollTest { |
| root->ScrollBy(scroll_amount_); |
| } |
| - virtual void ApplyScrollAndScale( |
| - gfx::Vector2d scroll_delta, float scale) OVERRIDE { |
| + virtual void ApplyScrollAndScale(gfx::Vector2d scroll_delta, float scale) |
| + OVERRIDE { |
| gfx::Vector2d offset = layer_tree_host()->root_layer()->scroll_offset(); |
| layer_tree_host()->root_layer()->SetScrollOffset(offset + scroll_delta); |
| } |
| @@ -244,8 +231,7 @@ class LayerTreeHostScrollTestCaseWithChild |
| : initial_offset_(10, 20), |
| javascript_scroll_(40, 5), |
| scroll_amount_(2, -1), |
| - num_scrolls_(0) { |
| - } |
| + num_scrolls_(0) {} |
| virtual void SetupTree() OVERRIDE { |
| layer_tree_host()->SetDeviceScaleFactor(device_scale_factor_); |
| @@ -293,43 +279,38 @@ class LayerTreeHostScrollTestCaseWithChild |
| LayerTreeHostScrollTest::SetupTree(); |
| } |
| - virtual void BeginTest() OVERRIDE { |
| - PostSetNeedsCommitToMainThread(); |
| - } |
| + virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } |
| virtual void didScroll() OVERRIDE { |
| final_scroll_offset_ = expected_scroll_layer_->scroll_offset(); |
| } |
| - virtual void ApplyScrollAndScale( |
| - gfx::Vector2d scroll_delta, float scale) OVERRIDE { |
| + virtual void ApplyScrollAndScale(gfx::Vector2d scroll_delta, float scale) |
| + OVERRIDE { |
| gfx::Vector2d offset = root_scroll_layer_->scroll_offset(); |
| root_scroll_layer_->SetScrollOffset(offset + scroll_delta); |
| num_scrolls_++; |
| } |
| virtual void Layout() OVERRIDE { |
| - EXPECT_VECTOR_EQ( |
| - gfx::Vector2d(), expected_no_scroll_layer_->scroll_offset()); |
| + EXPECT_VECTOR_EQ(gfx::Vector2d(), |
| + expected_no_scroll_layer_->scroll_offset()); |
| switch (layer_tree_host()->commit_number()) { |
| case 0: |
| - EXPECT_VECTOR_EQ( |
| - initial_offset_, |
| - expected_scroll_layer_->scroll_offset()); |
| + EXPECT_VECTOR_EQ(initial_offset_, |
| + expected_scroll_layer_->scroll_offset()); |
| break; |
| case 1: |
| - EXPECT_VECTOR_EQ( |
| - initial_offset_ + scroll_amount_, |
| - expected_scroll_layer_->scroll_offset()); |
| + EXPECT_VECTOR_EQ(initial_offset_ + scroll_amount_, |
| + expected_scroll_layer_->scroll_offset()); |
| // Pretend like Javascript updated the scroll position itself. |
| expected_scroll_layer_->SetScrollOffset(javascript_scroll_); |
| break; |
| case 2: |
| - EXPECT_VECTOR_EQ( |
| - javascript_scroll_ + scroll_amount_, |
| - expected_scroll_layer_->scroll_offset()); |
| + EXPECT_VECTOR_EQ(javascript_scroll_ + scroll_amount_, |
| + expected_scroll_layer_->scroll_offset()); |
| break; |
| } |
| } |
| @@ -350,16 +331,14 @@ class LayerTreeHostScrollTestCaseWithChild |
| } |
| EXPECT_VECTOR_EQ(gfx::Vector2d(), root_impl->ScrollDelta()); |
| - EXPECT_VECTOR_EQ( |
| - gfx::Vector2d(), |
| - expected_no_scroll_layer_impl->ScrollDelta()); |
| + EXPECT_VECTOR_EQ(gfx::Vector2d(), |
| + expected_no_scroll_layer_impl->ScrollDelta()); |
| // Ensure device scale factor is affecting the layers. |
| gfx::Size expected_content_bounds = gfx::ToCeiledSize( |
| gfx::ScaleSize(root_scroll_layer_impl->bounds(), device_scale_factor_)); |
| - EXPECT_SIZE_EQ( |
| - expected_content_bounds, |
| - root_scroll_layer_->content_bounds()); |
| + EXPECT_SIZE_EQ(expected_content_bounds, |
| + root_scroll_layer_->content_bounds()); |
| expected_content_bounds = gfx::ToCeiledSize( |
| gfx::ScaleSize(child_layer_impl->bounds(), device_scale_factor_)); |
| @@ -369,51 +348,43 @@ class LayerTreeHostScrollTestCaseWithChild |
| case 0: { |
| // Gesture scroll on impl thread. |
| InputHandler::ScrollStatus status = impl->ScrollBegin( |
| - gfx::ToCeiledPoint( |
| - expected_scroll_layer_impl->position() + |
| - gfx::Vector2dF(0.5f, 0.5f)), |
| + gfx::ToCeiledPoint(expected_scroll_layer_impl->position() + |
| + gfx::Vector2dF(0.5f, 0.5f)), |
| InputHandler::Gesture); |
| EXPECT_EQ(InputHandler::ScrollStarted, status); |
| impl->ScrollBy(gfx::Point(), scroll_amount_); |
| impl->ScrollEnd(); |
| // Check the scroll is applied as a delta. |
| - EXPECT_VECTOR_EQ( |
| - initial_offset_, |
| - expected_scroll_layer_impl->scroll_offset()); |
| - EXPECT_VECTOR_EQ( |
| - scroll_amount_, |
| - expected_scroll_layer_impl->ScrollDelta()); |
| + EXPECT_VECTOR_EQ(initial_offset_, |
| + expected_scroll_layer_impl->scroll_offset()); |
| + EXPECT_VECTOR_EQ(scroll_amount_, |
| + expected_scroll_layer_impl->ScrollDelta()); |
| break; |
| } |
| case 1: { |
| // Wheel scroll on impl thread. |
| InputHandler::ScrollStatus status = impl->ScrollBegin( |
| - gfx::ToCeiledPoint( |
| - expected_scroll_layer_impl->position() + |
| - gfx::Vector2dF(0.5f, 0.5f)), |
| + gfx::ToCeiledPoint(expected_scroll_layer_impl->position() + |
| + gfx::Vector2dF(0.5f, 0.5f)), |
| InputHandler::Wheel); |
| EXPECT_EQ(InputHandler::ScrollStarted, status); |
| impl->ScrollBy(gfx::Point(), scroll_amount_); |
| impl->ScrollEnd(); |
| // Check the scroll is applied as a delta. |
| - EXPECT_VECTOR_EQ( |
| - javascript_scroll_, |
| - expected_scroll_layer_impl->scroll_offset()); |
| - EXPECT_VECTOR_EQ( |
| - scroll_amount_, |
| - expected_scroll_layer_impl->ScrollDelta()); |
| + EXPECT_VECTOR_EQ(javascript_scroll_, |
| + expected_scroll_layer_impl->scroll_offset()); |
| + EXPECT_VECTOR_EQ(scroll_amount_, |
| + expected_scroll_layer_impl->ScrollDelta()); |
| break; |
| } |
| case 2: |
| - EXPECT_VECTOR_EQ( |
| - javascript_scroll_ + scroll_amount_, |
| - expected_scroll_layer_impl->scroll_offset()); |
| - EXPECT_VECTOR_EQ( |
| - gfx::Vector2d(), |
| - expected_scroll_layer_impl->ScrollDelta()); |
| + EXPECT_VECTOR_EQ(javascript_scroll_ + scroll_amount_, |
| + expected_scroll_layer_impl->scroll_offset()); |
| + EXPECT_VECTOR_EQ(gfx::Vector2d(), |
| + expected_scroll_layer_impl->ScrollDelta()); |
| EndTest(); |
| break; |
| @@ -423,9 +394,8 @@ class LayerTreeHostScrollTestCaseWithChild |
| virtual void AfterTest() OVERRIDE { |
| if (scroll_child_layer_) { |
| EXPECT_EQ(0, num_scrolls_); |
| - EXPECT_VECTOR_EQ( |
| - javascript_scroll_ + scroll_amount_, |
| - final_scroll_offset_); |
| + EXPECT_VECTOR_EQ(javascript_scroll_ + scroll_amount_, |
| + final_scroll_offset_); |
| } else { |
| EXPECT_EQ(2, num_scrolls_); |
| EXPECT_VECTOR_EQ(gfx::Vector2d(), final_scroll_offset_); |
| @@ -510,8 +480,7 @@ class ImplSidePaintingScrollTestSimple : public ImplSidePaintingScrollTest { |
| impl_thread_scroll1_(2, -1), |
| impl_thread_scroll2_(-3, 10), |
| num_scrolls_(0), |
| - can_activate_(true) { |
| - } |
| + can_activate_(true) {} |
| virtual void BeginTest() OVERRIDE { |
| layer_tree_host()->root_layer()->SetScrollable(true); |
| @@ -529,15 +498,12 @@ class ImplSidePaintingScrollTestSimple : public ImplSidePaintingScrollTest { |
| // Pretend like Javascript updated the scroll position itself with a |
| // change of main_thread_scroll. |
| - root->SetScrollOffset(initial_scroll_ + |
| - main_thread_scroll_ + |
| + root->SetScrollOffset(initial_scroll_ + main_thread_scroll_ + |
| impl_thread_scroll1_); |
| } |
| } |
| - virtual bool CanActivatePendingTree() OVERRIDE { |
| - return can_activate_; |
| - } |
| + virtual bool CanActivatePendingTree() OVERRIDE { return can_activate_; } |
| virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { |
| // We force a second draw here of the first commit before activating |
| @@ -578,10 +544,11 @@ class ImplSidePaintingScrollTestSimple : public ImplSidePaintingScrollTest { |
| root->ScrollBy(impl_thread_scroll2_); |
| EXPECT_VECTOR_EQ(root->scroll_offset(), initial_scroll_); |
| EXPECT_VECTOR_EQ(root->ScrollDelta(), |
| - impl_thread_scroll1_ + impl_thread_scroll2_); |
| + impl_thread_scroll1_ + impl_thread_scroll2_); |
| EXPECT_VECTOR_EQ(root->sent_scroll_delta(), impl_thread_scroll1_); |
| - EXPECT_VECTOR_EQ(pending_root->scroll_offset(), |
| + EXPECT_VECTOR_EQ( |
| + pending_root->scroll_offset(), |
| initial_scroll_ + main_thread_scroll_ + impl_thread_scroll1_); |
| EXPECT_VECTOR_EQ(pending_root->ScrollDelta(), impl_thread_scroll2_); |
| EXPECT_VECTOR_EQ(pending_root->sent_scroll_delta(), gfx::Vector2d()); |
| @@ -589,7 +556,8 @@ class ImplSidePaintingScrollTestSimple : public ImplSidePaintingScrollTest { |
| break; |
| case 1: |
| EXPECT_FALSE(impl->pending_tree()); |
| - EXPECT_VECTOR_EQ(root->scroll_offset(), |
| + EXPECT_VECTOR_EQ( |
| + root->scroll_offset(), |
| initial_scroll_ + main_thread_scroll_ + impl_thread_scroll1_); |
| EXPECT_VECTOR_EQ(root->ScrollDelta(), impl_thread_scroll2_); |
| EXPECT_VECTOR_EQ(root->sent_scroll_delta(), gfx::Vector2d()); |
| @@ -598,16 +566,14 @@ class ImplSidePaintingScrollTestSimple : public ImplSidePaintingScrollTest { |
| } |
| } |
| - virtual void ApplyScrollAndScale( |
| - gfx::Vector2d scroll_delta, float scale) OVERRIDE { |
| + virtual void ApplyScrollAndScale(gfx::Vector2d scroll_delta, float scale) |
| + OVERRIDE { |
| gfx::Vector2d offset = layer_tree_host()->root_layer()->scroll_offset(); |
| layer_tree_host()->root_layer()->SetScrollOffset(offset + scroll_delta); |
| num_scrolls_++; |
| } |
| - virtual void AfterTest() OVERRIDE { |
| - EXPECT_EQ(1, num_scrolls_); |
| - } |
| + virtual void AfterTest() OVERRIDE { EXPECT_EQ(1, num_scrolls_); } |
| private: |
| gfx::Vector2d initial_scroll_; |
| @@ -625,34 +591,23 @@ class LayerTreeHostScrollTestScrollZeroMaxScrollOffset |
| public: |
| LayerTreeHostScrollTestScrollZeroMaxScrollOffset() {} |
| - virtual void BeginTest() OVERRIDE { |
| - PostSetNeedsCommitToMainThread(); |
| - } |
| + virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } |
| virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { |
| LayerImpl* root = impl->active_tree()->root_layer(); |
| root->SetScrollable(true); |
| root->SetMaxScrollOffset(gfx::Vector2d(100, 100)); |
| - EXPECT_EQ( |
| - InputHandler::ScrollStarted, |
| - root->TryScroll( |
| - gfx::PointF(0.0f, 1.0f), |
| - InputHandler::Gesture)); |
| + EXPECT_EQ(InputHandler::ScrollStarted, |
| + root->TryScroll(gfx::PointF(0.0f, 1.0f), InputHandler::Gesture)); |
| root->SetMaxScrollOffset(gfx::Vector2d(0, 0)); |
| - EXPECT_EQ( |
| - InputHandler::ScrollIgnored, |
| - root->TryScroll( |
| - gfx::PointF(0.0f, 1.0f), |
| - InputHandler::Gesture)); |
| + EXPECT_EQ(InputHandler::ScrollIgnored, |
| + root->TryScroll(gfx::PointF(0.0f, 1.0f), InputHandler::Gesture)); |
| root->SetMaxScrollOffset(gfx::Vector2d(-100, -100)); |
| - EXPECT_EQ( |
| - InputHandler::ScrollIgnored, |
| - root->TryScroll( |
| - gfx::PointF(0.0f, 1.0f), |
| - InputHandler::Gesture)); |
| + EXPECT_EQ(InputHandler::ScrollIgnored, |
| + root->TryScroll(gfx::PointF(0.0f, 1.0f), InputHandler::Gesture)); |
| EndTest(); |
| } |
| @@ -667,13 +622,7 @@ class ThreadCheckingInputHandlerClient : public InputHandlerClient { |
| public: |
| ThreadCheckingInputHandlerClient(base::SingleThreadTaskRunner* runner, |
| bool* received_stop_flinging) |
| - : task_runner_(runner) , |
| - received_stop_flinging_(received_stop_flinging) {} |
| - |
| - virtual void BindToHandler(InputHandler* handler) OVERRIDE { |
| - if (!task_runner_->BelongsToCurrentThread()) |
| - ADD_FAILURE() << "BindToClient called on wrong thread"; |
| - } |
| + : task_runner_(runner), received_stop_flinging_(received_stop_flinging) {} |
| virtual void Animate(base::TimeTicks time) OVERRIDE { |
| if (!task_runner_->BelongsToCurrentThread()) |
| @@ -691,41 +640,35 @@ class ThreadCheckingInputHandlerClient : public InputHandlerClient { |
| bool* received_stop_flinging_; |
| }; |
| -class ThreadCheckingFakeLayerTreeHostClient : public FakeLayerTreeHostClient { |
| - public: |
| - ThreadCheckingFakeLayerTreeHostClient( |
| - base::SingleThreadTaskRunner* task_runner, |
| - bool* received_stop_flinging) |
| - : FakeLayerTreeHostClient(DIRECT_3D) , |
| - task_runner_(task_runner), |
| - received_stop_flinging_(received_stop_flinging) {} |
| - |
| - virtual scoped_ptr<InputHandlerClient> CreateInputHandlerClient() OVERRIDE { |
| - return scoped_ptr<InputHandlerClient>(new ThreadCheckingInputHandlerClient( |
| - task_runner_, received_stop_flinging_)).Pass(); |
| - } |
| - |
| - private: |
| - base::SingleThreadTaskRunner* task_runner_; |
| - bool* received_stop_flinging_; |
| -}; |
| +void BindInputHandlerOnCompositorThread( |
| + const base::WeakPtr<InputHandler>& input_handler, |
| + scoped_ptr<ThreadCheckingInputHandlerClient> client) { |
| + input_handler->BindToClient(client.release()); |
| +} |
| TEST(LayerTreeHostFlingTest, DidStopFlingingThread) { |
| base::Thread impl_thread("cc"); |
| impl_thread.Start(); |
| - scoped_ptr<cc::Thread> impl_ccthread = |
| - cc::ThreadImpl::CreateForDifferentThread( |
| - impl_thread.message_loop_proxy()); |
| + scoped_ptr<Thread> impl_ccthread = |
| + ThreadImpl::CreateForDifferentThread(impl_thread.message_loop_proxy()); |
| bool received_stop_flinging = false; |
| - ThreadCheckingFakeLayerTreeHostClient client( |
| - impl_thread.message_loop_proxy().get(), |
| - &received_stop_flinging); |
| LayerTreeSettings settings; |
| + scoped_ptr<ThreadCheckingInputHandlerClient> input_handler_client( |
| + new ThreadCheckingInputHandlerClient( |
| + impl_thread.message_loop_proxy().get(), &received_stop_flinging)); |
| + FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); |
| + |
| scoped_ptr<LayerTreeHost> layer_tree_host = |
| LayerTreeHost::Create(&client, settings, impl_ccthread.Pass()); |
| + impl_thread.message_loop_proxy() |
| + ->PostTask(FROM_HERE, |
| + base::Bind(&BindInputHandlerOnCompositorThread, |
| + layer_tree_host->GetInputHandler(), |
| + base::Passed(input_handler_client.Pass()))); |
|
danakj
2013/05/06 16:33:39
nit: base::Passed(&input_handler_client)
|
| + |
| layer_tree_host->DidStopFlinging(); |
| layer_tree_host.reset(); |
| impl_thread.Stop(); |