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 483c2a7045ebfccf303f80fdc2b5389e11d45312..db6f3c9361f60791142e53d40f87b50d56261983 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_); |
@@ -576,8 +546,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); |
@@ -595,8 +564,7 @@ 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_); |
} |
} |
@@ -644,10 +612,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()); |
@@ -655,7 +624,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()); |
@@ -664,16 +634,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_; |
@@ -691,34 +659,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(); |
} |
@@ -733,12 +690,11 @@ class ThreadCheckingInputHandlerClient : public InputHandlerClient { |
public: |
ThreadCheckingInputHandlerClient(base::SingleThreadTaskRunner* runner, |
bool* received_stop_flinging) |
- : task_runner_(runner) , |
- received_stop_flinging_(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"; |
+ virtual void WillShutdown() OVERRIDE { |
+ if (!received_stop_flinging_) |
+ ADD_FAILURE() << "WillShutdown() called before fling stopped"; |
} |
virtual void Animate(base::TimeTicks time) OVERRIDE { |
@@ -757,41 +713,34 @@ 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, |
+ ThreadCheckingInputHandlerClient* client) { |
+ input_handler->BindToClient(client); |
+} |
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; |
+ ThreadCheckingInputHandlerClient input_handler_client( |
+ 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::Unretained(&input_handler_client))); |
+ |
layer_tree_host->DidStopFlinging(); |
layer_tree_host.reset(); |
impl_thread.Stop(); |