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 |
deleted file mode 100644 |
index be972e9406e7de12ac7f7d9f453d3677e716f3fe..0000000000000000000000000000000000000000 |
--- a/cc/trees/layer_tree_host_unittest_scroll.cc |
+++ /dev/null |
@@ -1,1239 +0,0 @@ |
-// Copyright 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "cc/trees/layer_tree_host.h" |
- |
-#include "base/memory/weak_ptr.h" |
-#include "cc/layers/layer.h" |
-#include "cc/layers/layer_impl.h" |
-#include "cc/layers/picture_layer.h" |
-#include "cc/scheduler/begin_frame_source.h" |
-#include "cc/test/fake_content_layer_client.h" |
-#include "cc/test/fake_layer_tree_host_client.h" |
-#include "cc/test/fake_picture_layer.h" |
-#include "cc/test/fake_picture_layer_impl.h" |
-#include "cc/test/geometry_test_utils.h" |
-#include "cc/test/layer_tree_test.h" |
-#include "cc/test/test_shared_bitmap_manager.h" |
-#include "cc/trees/layer_tree_impl.h" |
-#include "ui/gfx/geometry/point_conversions.h" |
-#include "ui/gfx/geometry/size_conversions.h" |
-#include "ui/gfx/geometry/vector2d_conversions.h" |
- |
-namespace cc { |
-namespace { |
- |
-class LayerTreeHostScrollTest : public LayerTreeTest {}; |
- |
-class LayerTreeHostScrollTestScrollSimple : public LayerTreeHostScrollTest { |
- public: |
- LayerTreeHostScrollTestScrollSimple() |
- : initial_scroll_(10, 20), |
- second_scroll_(40, 5), |
- scroll_amount_(2, -1), |
- num_scrolls_(0) {} |
- |
- void BeginTest() override { |
- Layer* root_layer = layer_tree_host()->root_layer(); |
- scoped_refptr<Layer> scroll_layer = Layer::Create(); |
- root_layer->AddChild(scroll_layer); |
- // Create an effective max_scroll_offset of (100, 100). |
- scroll_layer->SetBounds(gfx::Size(root_layer->bounds().width() + 100, |
- root_layer->bounds().height() + 100)); |
- scroll_layer->SetIsDrawable(true); |
- scroll_layer->SetIsContainerForFixedPositionLayers(true); |
- scroll_layer->SetScrollClipLayerId(root_layer->id()); |
- scroll_layer->SetScrollOffset(initial_scroll_); |
- layer_tree_host()->RegisterViewportLayers(NULL, root_layer, scroll_layer, |
- NULL); |
- PostSetNeedsCommitToMainThread(); |
- } |
- |
- void Layout() override { |
- Layer* root = layer_tree_host()->root_layer(); |
- Layer* scroll_layer = root->children()[0].get(); |
- if (!layer_tree_host()->source_frame_number()) { |
- EXPECT_VECTOR_EQ(initial_scroll_, scroll_layer->scroll_offset()); |
- } else { |
- EXPECT_VECTOR_EQ(gfx::ScrollOffsetWithDelta(initial_scroll_, |
- scroll_amount_), |
- scroll_layer->scroll_offset()); |
- |
- // Pretend like Javascript updated the scroll position itself. |
- scroll_layer->SetScrollOffset(second_scroll_); |
- } |
- } |
- |
- void DrawLayersOnThread(LayerTreeHostImpl* impl) override { |
- LayerImpl* root = impl->active_tree()->root_layer(); |
- LayerImpl* scroll_layer = root->children()[0]; |
- EXPECT_VECTOR_EQ(gfx::Vector2d(), scroll_layer->ScrollDelta()); |
- |
- scroll_layer->SetScrollClipLayer(root->id()); |
- scroll_layer->SetBounds( |
- gfx::Size(root->bounds().width() + 100, root->bounds().height() + 100)); |
- scroll_layer->ScrollBy(scroll_amount_); |
- |
- switch (impl->active_tree()->source_frame_number()) { |
- case 0: |
- EXPECT_VECTOR_EQ(initial_scroll_, scroll_layer->BaseScrollOffset()); |
- EXPECT_VECTOR_EQ(scroll_amount_, scroll_layer->ScrollDelta()); |
- PostSetNeedsCommitToMainThread(); |
- break; |
- case 1: |
- EXPECT_VECTOR_EQ(scroll_layer->BaseScrollOffset(), second_scroll_); |
- EXPECT_VECTOR_EQ(scroll_layer->ScrollDelta(), scroll_amount_); |
- EndTest(); |
- break; |
- } |
- } |
- |
- void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta, |
- float scale, |
- float top_controls_delta) override { |
- num_scrolls_++; |
- } |
- |
- void AfterTest() override { EXPECT_EQ(1, num_scrolls_); } |
- |
- private: |
- gfx::ScrollOffset initial_scroll_; |
- gfx::ScrollOffset second_scroll_; |
- gfx::Vector2dF scroll_amount_; |
- int num_scrolls_; |
-}; |
- |
-MULTI_THREAD_TEST_F(LayerTreeHostScrollTestScrollSimple); |
- |
-class LayerTreeHostScrollTestScrollMultipleRedraw |
- : public LayerTreeHostScrollTest { |
- public: |
- LayerTreeHostScrollTestScrollMultipleRedraw() |
- : initial_scroll_(40, 10), scroll_amount_(-3, 17), num_scrolls_(0) {} |
- |
- void BeginTest() override { |
- Layer* root_layer = layer_tree_host()->root_layer(); |
- scroll_layer_ = Layer::Create(); |
- root_layer->AddChild(scroll_layer_); |
- // Create an effective max_scroll_offset of (100, 100). |
- scroll_layer_->SetBounds(gfx::Size(root_layer->bounds().width() + 100, |
- root_layer->bounds().height() + 100)); |
- scroll_layer_->SetIsDrawable(true); |
- scroll_layer_->SetIsContainerForFixedPositionLayers(true); |
- scroll_layer_->SetScrollClipLayerId(root_layer->id()); |
- scroll_layer_->SetScrollOffset(initial_scroll_); |
- layer_tree_host()->RegisterViewportLayers(NULL, root_layer, scroll_layer_, |
- NULL); |
- PostSetNeedsCommitToMainThread(); |
- } |
- |
- void BeginCommitOnThread(LayerTreeHostImpl* impl) override { |
- switch (layer_tree_host()->source_frame_number()) { |
- case 0: |
- EXPECT_VECTOR_EQ(scroll_layer_->scroll_offset(), initial_scroll_); |
- break; |
- case 1: |
- EXPECT_VECTOR_EQ( |
- scroll_layer_->scroll_offset(), |
- gfx::ScrollOffsetWithDelta(initial_scroll_, |
- scroll_amount_ + scroll_amount_)); |
- case 2: |
- EXPECT_VECTOR_EQ( |
- scroll_layer_->scroll_offset(), |
- gfx::ScrollOffsetWithDelta(initial_scroll_, |
- scroll_amount_ + scroll_amount_)); |
- break; |
- } |
- } |
- |
- void DrawLayersOnThread(LayerTreeHostImpl* impl) override { |
- LayerImpl* scroll_layer = |
- impl->active_tree()->LayerById(scroll_layer_->id()); |
- if (impl->active_tree()->source_frame_number() == 0 && |
- impl->SourceAnimationFrameNumber() == 1) { |
- // First draw after first commit. |
- EXPECT_VECTOR_EQ(scroll_layer->ScrollDelta(), gfx::Vector2d()); |
- scroll_layer->ScrollBy(scroll_amount_); |
- EXPECT_VECTOR_EQ(scroll_layer->ScrollDelta(), scroll_amount_); |
- |
- EXPECT_VECTOR_EQ(scroll_layer->BaseScrollOffset(), initial_scroll_); |
- PostSetNeedsRedrawToMainThread(); |
- } else if (impl->active_tree()->source_frame_number() == 0 && |
- impl->SourceAnimationFrameNumber() == 2) { |
- // Second draw after first commit. |
- EXPECT_EQ(scroll_layer->ScrollDelta(), scroll_amount_); |
- scroll_layer->ScrollBy(scroll_amount_); |
- EXPECT_VECTOR_EQ(scroll_layer->ScrollDelta(), |
- scroll_amount_ + scroll_amount_); |
- |
- EXPECT_VECTOR_EQ(scroll_layer_->scroll_offset(), initial_scroll_); |
- PostSetNeedsCommitToMainThread(); |
- } else if (impl->active_tree()->source_frame_number() == 1) { |
- // Third or later draw after second commit. |
- EXPECT_GE(impl->SourceAnimationFrameNumber(), 3); |
- EXPECT_VECTOR_EQ(scroll_layer_->ScrollDelta(), gfx::Vector2d()); |
- EXPECT_VECTOR_EQ( |
- scroll_layer_->scroll_offset(), |
- gfx::ScrollOffsetWithDelta(initial_scroll_, |
- scroll_amount_ + scroll_amount_)); |
- EndTest(); |
- } |
- } |
- |
- void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta, |
- float scale, |
- float top_controls_delta) override { |
- num_scrolls_++; |
- } |
- |
- void AfterTest() override { EXPECT_EQ(1, num_scrolls_); } |
- |
- private: |
- gfx::ScrollOffset initial_scroll_; |
- gfx::Vector2dF scroll_amount_; |
- int num_scrolls_; |
- scoped_refptr<Layer> scroll_layer_; |
-}; |
- |
-MULTI_THREAD_TEST_F(LayerTreeHostScrollTestScrollMultipleRedraw); |
- |
-class LayerTreeHostScrollTestScrollAbortedCommit |
- : public LayerTreeHostScrollTest { |
- public: |
- LayerTreeHostScrollTestScrollAbortedCommit() |
- : initial_scroll_(50, 60), |
- impl_scroll_(-3, 2), |
- second_main_scroll_(14, -3), |
- impl_scale_(2.f), |
- num_will_begin_main_frames_(0), |
- num_did_begin_main_frames_(0), |
- num_will_commits_(0), |
- num_did_commits_(0), |
- num_impl_commits_(0), |
- num_impl_scrolls_(0) {} |
- |
- void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
- |
- void SetupTree() override { |
- LayerTreeHostScrollTest::SetupTree(); |
- Layer* root_layer = layer_tree_host()->root_layer(); |
- scoped_refptr<Layer> root_scroll_layer = Layer::Create(); |
- root_scroll_layer->SetScrollClipLayerId(root_layer->id()); |
- root_scroll_layer->SetScrollOffset(initial_scroll_); |
- root_scroll_layer->SetBounds(gfx::Size(200, 200)); |
- root_scroll_layer->SetIsDrawable(true); |
- root_scroll_layer->SetIsContainerForFixedPositionLayers(true); |
- root_layer->AddChild(root_scroll_layer); |
- |
- layer_tree_host()->RegisterViewportLayers(NULL, root_layer, |
- root_scroll_layer, NULL); |
- layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.01f, 100.f); |
- } |
- |
- void WillBeginMainFrame() override { |
- num_will_begin_main_frames_++; |
- Layer* root_scroll_layer = |
- layer_tree_host()->root_layer()->children()[0].get(); |
- switch (num_will_begin_main_frames_) { |
- case 1: |
- // This will not be aborted because of the initial prop changes. |
- EXPECT_EQ(0, num_impl_scrolls_); |
- EXPECT_EQ(0, layer_tree_host()->source_frame_number()); |
- EXPECT_VECTOR_EQ(root_scroll_layer->scroll_offset(), initial_scroll_); |
- EXPECT_EQ(1.f, layer_tree_host()->page_scale_factor()); |
- break; |
- case 2: |
- // This commit will be aborted, and another commit will be |
- // initiated from the redraw. |
- EXPECT_EQ(1, num_impl_scrolls_); |
- EXPECT_EQ(1, layer_tree_host()->source_frame_number()); |
- EXPECT_VECTOR_EQ( |
- root_scroll_layer->scroll_offset(), |
- gfx::ScrollOffsetWithDelta(initial_scroll_, impl_scroll_)); |
- EXPECT_EQ(impl_scale_, layer_tree_host()->page_scale_factor()); |
- PostSetNeedsRedrawToMainThread(); |
- break; |
- case 3: |
- // This commit will not be aborted because of the scroll change. |
- EXPECT_EQ(2, num_impl_scrolls_); |
- // The source frame number still increases even with the abort. |
- EXPECT_EQ(2, layer_tree_host()->source_frame_number()); |
- EXPECT_VECTOR_EQ( |
- root_scroll_layer->scroll_offset(), |
- gfx::ScrollOffsetWithDelta(initial_scroll_, |
- impl_scroll_ + impl_scroll_)); |
- EXPECT_EQ(impl_scale_ * impl_scale_, |
- layer_tree_host()->page_scale_factor()); |
- root_scroll_layer->SetScrollOffset(gfx::ScrollOffsetWithDelta( |
- root_scroll_layer->scroll_offset(), second_main_scroll_)); |
- break; |
- case 4: |
- // This commit will also be aborted. |
- EXPECT_EQ(3, num_impl_scrolls_); |
- EXPECT_EQ(3, layer_tree_host()->source_frame_number()); |
- gfx::Vector2dF delta = |
- impl_scroll_ + impl_scroll_ + impl_scroll_ + second_main_scroll_; |
- EXPECT_VECTOR_EQ(root_scroll_layer->scroll_offset(), |
- gfx::ScrollOffsetWithDelta(initial_scroll_, delta)); |
- |
- // End the test by drawing to verify this commit is also aborted. |
- PostSetNeedsRedrawToMainThread(); |
- break; |
- } |
- } |
- |
- void DidBeginMainFrame() override { num_did_begin_main_frames_++; } |
- |
- void WillCommit() override { num_will_commits_++; } |
- |
- void DidCommit() override { num_did_commits_++; } |
- |
- void BeginCommitOnThread(LayerTreeHostImpl* impl) override { |
- num_impl_commits_++; |
- } |
- |
- void DrawLayersOnThread(LayerTreeHostImpl* impl) override { |
- LayerImpl* root_scroll_layer = |
- impl->active_tree()->root_layer()->children()[0]; |
- |
- if (impl->active_tree()->source_frame_number() == 0 && |
- impl->SourceAnimationFrameNumber() == 1) { |
- // First draw |
- EXPECT_VECTOR_EQ(root_scroll_layer->ScrollDelta(), gfx::Vector2d()); |
- root_scroll_layer->ScrollBy(impl_scroll_); |
- EXPECT_VECTOR_EQ(root_scroll_layer->ScrollDelta(), impl_scroll_); |
- EXPECT_VECTOR_EQ(root_scroll_layer->BaseScrollOffset(), initial_scroll_); |
- |
- EXPECT_EQ(1.f, impl->active_tree()->page_scale_delta()); |
- EXPECT_EQ(1.f, impl->active_tree()->current_page_scale_factor()); |
- impl->SetPageScaleOnActiveTree(impl_scale_); |
- EXPECT_EQ(impl_scale_, impl->active_tree()->page_scale_delta()); |
- EXPECT_EQ(impl_scale_, impl->active_tree()->current_page_scale_factor()); |
- |
- // To simplify the testing flow, don't redraw here, just commit. |
- impl->SetNeedsCommit(); |
- } else if (impl->active_tree()->source_frame_number() == 0 && |
- impl->SourceAnimationFrameNumber() == 2) { |
- // Test a second draw after an aborted commit. |
- // The scroll/scale values should be baked into the offset/scale factor |
- // since the main thread consumed but aborted the begin frame. |
- EXPECT_VECTOR_EQ(root_scroll_layer->ScrollDelta(), gfx::Vector2d()); |
- root_scroll_layer->ScrollBy(impl_scroll_); |
- EXPECT_VECTOR_EQ(root_scroll_layer->ScrollDelta(), impl_scroll_); |
- EXPECT_VECTOR_EQ( |
- root_scroll_layer->BaseScrollOffset(), |
- gfx::ScrollOffsetWithDelta(initial_scroll_, impl_scroll_)); |
- |
- EXPECT_EQ(1.f, impl->active_tree()->page_scale_delta()); |
- EXPECT_EQ(impl_scale_, impl->active_tree()->current_page_scale_factor()); |
- impl->SetPageScaleOnActiveTree(impl_scale_ * impl_scale_); |
- EXPECT_EQ(impl_scale_, impl->active_tree()->page_scale_delta()); |
- EXPECT_EQ(impl_scale_ * impl_scale_, |
- impl->active_tree()->current_page_scale_factor()); |
- |
- impl->SetNeedsCommit(); |
- } else if (impl->active_tree()->source_frame_number() == 1) { |
- // Commit for source frame 1 is aborted. |
- NOTREACHED(); |
- } else if (impl->active_tree()->source_frame_number() == 2 && |
- impl->SourceAnimationFrameNumber() == 3) { |
- // Third draw after the second full commit. |
- EXPECT_EQ(root_scroll_layer->ScrollDelta(), gfx::Vector2d()); |
- root_scroll_layer->ScrollBy(impl_scroll_); |
- impl->SetNeedsCommit(); |
- EXPECT_VECTOR_EQ(root_scroll_layer->ScrollDelta(), impl_scroll_); |
- gfx::Vector2dF delta = impl_scroll_ + impl_scroll_ + second_main_scroll_; |
- EXPECT_VECTOR_EQ(root_scroll_layer->BaseScrollOffset(), |
- gfx::ScrollOffsetWithDelta(initial_scroll_, delta)); |
- } else if (impl->active_tree()->source_frame_number() == 2 && |
- impl->SourceAnimationFrameNumber() == 4) { |
- // Final draw after the second aborted commit. |
- EXPECT_VECTOR_EQ(root_scroll_layer->ScrollDelta(), gfx::Vector2d()); |
- gfx::Vector2dF delta = |
- impl_scroll_ + impl_scroll_ + impl_scroll_ + second_main_scroll_; |
- EXPECT_VECTOR_EQ(root_scroll_layer->BaseScrollOffset(), |
- gfx::ScrollOffsetWithDelta(initial_scroll_, delta)); |
- EndTest(); |
- } else { |
- // Commit for source frame 3 is aborted. |
- NOTREACHED(); |
- } |
- } |
- |
- void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta, |
- float scale, |
- float top_controls_delta) override { |
- num_impl_scrolls_++; |
- } |
- |
- void AfterTest() override { |
- EXPECT_EQ(3, num_impl_scrolls_); |
- // Verify that the embedder sees aborted commits as real commits. |
- EXPECT_EQ(4, num_will_begin_main_frames_); |
- EXPECT_EQ(4, num_did_begin_main_frames_); |
- EXPECT_EQ(4, num_will_commits_); |
- EXPECT_EQ(4, num_did_commits_); |
- // ...but the compositor thread only sees two real ones. |
- EXPECT_EQ(2, num_impl_commits_); |
- } |
- |
- private: |
- gfx::ScrollOffset initial_scroll_; |
- gfx::Vector2dF impl_scroll_; |
- gfx::Vector2dF second_main_scroll_; |
- float impl_scale_; |
- int num_will_begin_main_frames_; |
- int num_did_begin_main_frames_; |
- int num_will_commits_; |
- int num_did_commits_; |
- int num_impl_commits_; |
- int num_impl_scrolls_; |
-}; |
- |
-MULTI_THREAD_TEST_F(LayerTreeHostScrollTestScrollAbortedCommit); |
- |
-class LayerTreeHostScrollTestFractionalScroll : public LayerTreeHostScrollTest { |
- public: |
- LayerTreeHostScrollTestFractionalScroll() : scroll_amount_(1.75, 0) {} |
- |
- void SetupTree() override { |
- LayerTreeHostScrollTest::SetupTree(); |
- Layer* root_layer = layer_tree_host()->root_layer(); |
- scoped_refptr<Layer> root_scroll_layer = Layer::Create(); |
- root_scroll_layer->SetScrollClipLayerId(root_layer->id()); |
- root_scroll_layer->SetBounds( |
- gfx::Size(root_layer->bounds().width() + 100, |
- root_layer->bounds().height() + 100)); |
- root_scroll_layer->SetIsDrawable(true); |
- root_scroll_layer->SetIsContainerForFixedPositionLayers(true); |
- root_layer->AddChild(root_scroll_layer); |
- |
- layer_tree_host()->RegisterViewportLayers(NULL, root_layer, |
- root_scroll_layer, NULL); |
- layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.01f, 100.f); |
- } |
- |
- void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
- |
- void DrawLayersOnThread(LayerTreeHostImpl* impl) override { |
- LayerImpl* root = impl->active_tree()->root_layer(); |
- LayerImpl* scroll_layer = root->children()[0]; |
- |
- // Check that a fractional scroll delta is correctly accumulated over |
- // multiple commits. |
- switch (impl->active_tree()->source_frame_number()) { |
- case 0: |
- EXPECT_VECTOR_EQ(scroll_layer->BaseScrollOffset(), gfx::Vector2d(0, 0)); |
- EXPECT_VECTOR_EQ(scroll_layer->ScrollDelta(), gfx::Vector2d(0, 0)); |
- PostSetNeedsCommitToMainThread(); |
- break; |
- case 1: |
- EXPECT_VECTOR_EQ(scroll_layer->BaseScrollOffset(), |
- gfx::ToFlooredVector2d(scroll_amount_)); |
- EXPECT_VECTOR_EQ(scroll_layer->ScrollDelta(), |
- gfx::Vector2dF(fmod(scroll_amount_.x(), 1.0f), 0.0f)); |
- PostSetNeedsCommitToMainThread(); |
- break; |
- case 2: |
- EXPECT_VECTOR_EQ( |
- scroll_layer->BaseScrollOffset(), |
- gfx::ToFlooredVector2d(scroll_amount_ + scroll_amount_)); |
- EXPECT_VECTOR_EQ( |
- scroll_layer->ScrollDelta(), |
- gfx::Vector2dF(fmod(2.0f * scroll_amount_.x(), 1.0f), 0.0f)); |
- EndTest(); |
- break; |
- } |
- scroll_layer->ScrollBy(scroll_amount_); |
- } |
- |
- void AfterTest() override {} |
- |
- private: |
- gfx::Vector2dF scroll_amount_; |
-}; |
- |
-MULTI_THREAD_TEST_F(LayerTreeHostScrollTestFractionalScroll); |
- |
-class LayerTreeHostScrollTestCaseWithChild : public LayerTreeHostScrollTest { |
- public: |
- LayerTreeHostScrollTestCaseWithChild() |
- : initial_offset_(10, 20), |
- javascript_scroll_(40, 5), |
- scroll_amount_(2, -1), |
- num_scrolls_(0) {} |
- |
- void SetupTree() override { |
- layer_tree_host()->SetDeviceScaleFactor(device_scale_factor_); |
- |
- scoped_refptr<Layer> root_layer = Layer::Create(); |
- root_layer->SetBounds(gfx::Size(10, 10)); |
- |
- root_scroll_layer_ = FakePictureLayer::Create(&fake_content_layer_client_); |
- root_scroll_layer_->SetBounds(gfx::Size(110, 110)); |
- |
- root_scroll_layer_->SetPosition(gfx::Point()); |
- |
- root_scroll_layer_->SetIsDrawable(true); |
- root_scroll_layer_->SetScrollClipLayerId(root_layer->id()); |
- root_scroll_layer_->SetIsContainerForFixedPositionLayers(true); |
- root_layer->AddChild(root_scroll_layer_); |
- |
- child_layer_ = FakePictureLayer::Create(&fake_content_layer_client_); |
- child_layer_->set_did_scroll_callback( |
- base::Bind(&LayerTreeHostScrollTestCaseWithChild::DidScroll, |
- base::Unretained(this))); |
- child_layer_->SetBounds(gfx::Size(110, 110)); |
- |
- if (scroll_child_layer_) { |
- // Scrolls on the child layer will happen at 5, 5. If they are treated |
- // like device pixels, and device scale factor is 2, then they will |
- // be considered at 2.5, 2.5 in logical pixels, and will miss this layer. |
- child_layer_->SetPosition(gfx::Point(5, 5)); |
- } else { |
- // Adjust the child layer horizontally so that scrolls will never hit it. |
- child_layer_->SetPosition(gfx::Point(60, 5)); |
- } |
- |
- child_layer_->SetIsDrawable(true); |
- child_layer_->SetScrollClipLayerId(root_layer->id()); |
- child_layer_->SetBounds(root_scroll_layer_->bounds()); |
- root_scroll_layer_->AddChild(child_layer_); |
- |
- if (scroll_child_layer_) { |
- expected_scroll_layer_ = child_layer_; |
- expected_no_scroll_layer_ = root_scroll_layer_; |
- } else { |
- expected_scroll_layer_ = root_scroll_layer_; |
- expected_no_scroll_layer_ = child_layer_; |
- } |
- |
- expected_scroll_layer_->SetScrollOffset(initial_offset_); |
- |
- layer_tree_host()->SetRootLayer(root_layer); |
- layer_tree_host()->RegisterViewportLayers(NULL, root_layer, |
- root_scroll_layer_, NULL); |
- LayerTreeHostScrollTest::SetupTree(); |
- } |
- |
- void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
- |
- void WillCommit() override { |
- // Keep the test committing (otherwise the early out for no update |
- // will stall the test). |
- if (layer_tree_host()->source_frame_number() < 2) { |
- layer_tree_host()->SetNeedsCommit(); |
- } |
- } |
- |
- void DidScroll() { |
- final_scroll_offset_ = expected_scroll_layer_->scroll_offset(); |
- } |
- |
- void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta, |
- float scale, |
- float top_controls_delta) override { |
- num_scrolls_++; |
- } |
- |
- void Layout() override { |
- EXPECT_VECTOR_EQ(gfx::Vector2d(), |
- expected_no_scroll_layer_->scroll_offset()); |
- |
- switch (layer_tree_host()->source_frame_number()) { |
- case 0: |
- EXPECT_VECTOR_EQ(initial_offset_, |
- expected_scroll_layer_->scroll_offset()); |
- break; |
- case 1: |
- EXPECT_VECTOR_EQ( |
- gfx::ScrollOffsetWithDelta(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(gfx::ScrollOffsetWithDelta(javascript_scroll_, |
- scroll_amount_), |
- expected_scroll_layer_->scroll_offset()); |
- break; |
- } |
- } |
- |
- void DidActivateTreeOnThread(LayerTreeHostImpl* impl) override { |
- LayerImpl* root_impl = impl->active_tree()->root_layer(); |
- FakePictureLayerImpl* root_scroll_layer_impl = |
- static_cast<FakePictureLayerImpl*>(root_impl->children()[0]); |
- FakePictureLayerImpl* child_layer_impl = static_cast<FakePictureLayerImpl*>( |
- root_scroll_layer_impl->children()[0]); |
- |
- LayerImpl* expected_scroll_layer_impl = NULL; |
- LayerImpl* expected_no_scroll_layer_impl = NULL; |
- if (scroll_child_layer_) { |
- expected_scroll_layer_impl = child_layer_impl; |
- expected_no_scroll_layer_impl = root_scroll_layer_impl; |
- } else { |
- expected_scroll_layer_impl = root_scroll_layer_impl; |
- expected_no_scroll_layer_impl = child_layer_impl; |
- } |
- |
- EXPECT_VECTOR_EQ(gfx::Vector2d(), root_impl->ScrollDelta()); |
- EXPECT_VECTOR_EQ(gfx::Vector2d(), |
- expected_no_scroll_layer_impl->ScrollDelta()); |
- |
- // Ensure device scale factor matches the active tree. |
- EXPECT_EQ(device_scale_factor_, impl->active_tree()->device_scale_factor()); |
- switch (impl->active_tree()->source_frame_number()) { |
- 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)), |
- InputHandler::GESTURE); |
- EXPECT_EQ(InputHandler::SCROLL_STARTED, 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->BaseScrollOffset()); |
- 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)), |
- InputHandler::WHEEL); |
- EXPECT_EQ(InputHandler::SCROLL_STARTED, 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->BaseScrollOffset()); |
- EXPECT_VECTOR_EQ(scroll_amount_, |
- expected_scroll_layer_impl->ScrollDelta()); |
- break; |
- } |
- case 2: |
- |
- EXPECT_VECTOR_EQ( |
- gfx::ScrollOffsetWithDelta(javascript_scroll_, scroll_amount_), |
- expected_scroll_layer_impl->BaseScrollOffset()); |
- EXPECT_VECTOR_EQ(gfx::Vector2d(), |
- expected_scroll_layer_impl->ScrollDelta()); |
- |
- EndTest(); |
- break; |
- } |
- } |
- |
- void AfterTest() override { |
- if (scroll_child_layer_) { |
- EXPECT_EQ(0, num_scrolls_); |
- EXPECT_VECTOR_EQ(gfx::ScrollOffsetWithDelta(javascript_scroll_, |
- scroll_amount_), |
- final_scroll_offset_); |
- } else { |
- EXPECT_EQ(2, num_scrolls_); |
- EXPECT_VECTOR_EQ(gfx::ScrollOffset(), final_scroll_offset_); |
- } |
- } |
- |
- protected: |
- float device_scale_factor_; |
- bool scroll_child_layer_; |
- |
- gfx::ScrollOffset initial_offset_; |
- gfx::ScrollOffset javascript_scroll_; |
- gfx::Vector2d scroll_amount_; |
- int num_scrolls_; |
- gfx::ScrollOffset final_scroll_offset_; |
- |
- FakeContentLayerClient fake_content_layer_client_; |
- |
- scoped_refptr<Layer> root_scroll_layer_; |
- scoped_refptr<Layer> child_layer_; |
- scoped_refptr<Layer> expected_scroll_layer_; |
- scoped_refptr<Layer> expected_no_scroll_layer_; |
-}; |
- |
-TEST_F(LayerTreeHostScrollTestCaseWithChild, |
- DeviceScaleFactor1_ScrollChild_DirectRenderer) { |
- device_scale_factor_ = 1.f; |
- scroll_child_layer_ = true; |
- RunTest(true, false, true); |
-} |
- |
-TEST_F(LayerTreeHostScrollTestCaseWithChild, |
- DeviceScaleFactor1_ScrollChild_DelegatingRenderer) { |
- device_scale_factor_ = 1.f; |
- scroll_child_layer_ = true; |
- RunTest(true, true, true); |
-} |
- |
-TEST_F(LayerTreeHostScrollTestCaseWithChild, |
- DeviceScaleFactor15_ScrollChild_DirectRenderer) { |
- device_scale_factor_ = 1.5f; |
- scroll_child_layer_ = true; |
- RunTest(true, false, true); |
-} |
- |
-TEST_F(LayerTreeHostScrollTestCaseWithChild, |
- DeviceScaleFactor15_ScrollChild_DelegatingRenderer) { |
- device_scale_factor_ = 1.5f; |
- scroll_child_layer_ = true; |
- RunTest(true, true, true); |
-} |
- |
-TEST_F(LayerTreeHostScrollTestCaseWithChild, |
- DeviceScaleFactor2_ScrollChild_DirectRenderer) { |
- device_scale_factor_ = 2.f; |
- scroll_child_layer_ = true; |
- RunTest(true, false, true); |
-} |
- |
-TEST_F(LayerTreeHostScrollTestCaseWithChild, |
- DeviceScaleFactor2_ScrollChild_DelegatingRenderer) { |
- device_scale_factor_ = 2.f; |
- scroll_child_layer_ = true; |
- RunTest(true, true, true); |
-} |
- |
-TEST_F(LayerTreeHostScrollTestCaseWithChild, |
- DeviceScaleFactor1_ScrollRootScrollLayer_DirectRenderer) { |
- device_scale_factor_ = 1.f; |
- scroll_child_layer_ = false; |
- RunTest(true, false, true); |
-} |
- |
-TEST_F(LayerTreeHostScrollTestCaseWithChild, |
- DeviceScaleFactor1_ScrollRootScrollLayer_DelegatingRenderer) { |
- device_scale_factor_ = 1.f; |
- scroll_child_layer_ = false; |
- RunTest(true, true, true); |
-} |
- |
-TEST_F(LayerTreeHostScrollTestCaseWithChild, |
- DeviceScaleFactor15_ScrollRootScrollLayer_DirectRenderer) { |
- device_scale_factor_ = 1.5f; |
- scroll_child_layer_ = false; |
- RunTest(true, false, true); |
-} |
- |
-TEST_F(LayerTreeHostScrollTestCaseWithChild, |
- DeviceScaleFactor15_ScrollRootScrollLayer_DelegatingRenderer) { |
- device_scale_factor_ = 1.5f; |
- scroll_child_layer_ = false; |
- RunTest(true, true, true); |
-} |
- |
-TEST_F(LayerTreeHostScrollTestCaseWithChild, |
- DeviceScaleFactor2_ScrollRootScrollLayer_DirectRenderer) { |
- device_scale_factor_ = 2.f; |
- scroll_child_layer_ = false; |
- RunTest(true, false, true); |
-} |
- |
-TEST_F(LayerTreeHostScrollTestCaseWithChild, |
- DeviceScaleFactor2_ScrollRootScrollLayer_DelegatingRenderer) { |
- device_scale_factor_ = 2.f; |
- scroll_child_layer_ = false; |
- RunTest(true, true, true); |
-} |
- |
-class ImplSidePaintingScrollTest : public LayerTreeHostScrollTest { |
- public: |
- void InitializeSettings(LayerTreeSettings* settings) override { |
- settings->impl_side_painting = true; |
- } |
- |
- void DrawLayersOnThread(LayerTreeHostImpl* impl) override { |
- if (impl->pending_tree()) |
- impl->SetNeedsRedraw(); |
- } |
-}; |
- |
-class ImplSidePaintingScrollTestSimple : public ImplSidePaintingScrollTest { |
- public: |
- ImplSidePaintingScrollTestSimple() |
- : initial_scroll_(10, 20), |
- main_thread_scroll_(40, 5), |
- impl_thread_scroll1_(2, -1), |
- impl_thread_scroll2_(-3, 10), |
- num_scrolls_(0) {} |
- |
- void SetupTree() override { |
- LayerTreeHostScrollTest::SetupTree(); |
- Layer* root_layer = layer_tree_host()->root_layer(); |
- scoped_refptr<Layer> root_scroll_layer = Layer::Create(); |
- root_scroll_layer->SetScrollClipLayerId(root_layer->id()); |
- root_scroll_layer->SetScrollOffset(initial_scroll_); |
- root_scroll_layer->SetBounds( |
- gfx::Size(root_layer->bounds().width() + 100, |
- root_layer->bounds().height() + 100)); |
- root_scroll_layer->SetIsDrawable(true); |
- root_scroll_layer->SetIsContainerForFixedPositionLayers(true); |
- root_layer->AddChild(root_scroll_layer); |
- |
- layer_tree_host()->RegisterViewportLayers(NULL, root_layer, |
- root_scroll_layer, NULL); |
- layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.01f, 100.f); |
- } |
- |
- void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
- |
- void Layout() override { |
- Layer* root = layer_tree_host()->root_layer(); |
- Layer* scroll_layer = root->children()[0].get(); |
- if (!layer_tree_host()->source_frame_number()) { |
- EXPECT_VECTOR_EQ(scroll_layer->scroll_offset(), initial_scroll_); |
- } else { |
- EXPECT_VECTOR_EQ( |
- scroll_layer->scroll_offset(), |
- gfx::ScrollOffsetWithDelta(initial_scroll_, impl_thread_scroll1_)); |
- |
- // Pretend like Javascript updated the scroll position itself with a |
- // change of main_thread_scroll. |
- scroll_layer->SetScrollOffset( |
- gfx::ScrollOffsetWithDelta( |
- initial_scroll_, main_thread_scroll_ + impl_thread_scroll1_)); |
- } |
- } |
- |
- void CommitCompleteOnThread(LayerTreeHostImpl* impl) override { |
- // We force a second draw here of the first commit before activating |
- // the second commit. |
- if (impl->active_tree()->source_frame_number() == 0) |
- impl->SetNeedsRedraw(); |
- } |
- |
- void DrawLayersOnThread(LayerTreeHostImpl* impl) override { |
- ImplSidePaintingScrollTest::DrawLayersOnThread(impl); |
- |
- LayerImpl* root = impl->active_tree()->root_layer(); |
- LayerImpl* scroll_layer = root->children()[0]; |
- LayerImpl* pending_root = |
- impl->active_tree()->FindPendingTreeLayerById(root->id()); |
- |
- switch (impl->active_tree()->source_frame_number()) { |
- case 0: |
- if (!impl->pending_tree()) { |
- impl->BlockNotifyReadyToActivateForTesting(true); |
- EXPECT_VECTOR_EQ(scroll_layer->ScrollDelta(), gfx::Vector2d()); |
- scroll_layer->ScrollBy(impl_thread_scroll1_); |
- |
- EXPECT_VECTOR_EQ(scroll_layer->BaseScrollOffset(), initial_scroll_); |
- EXPECT_VECTOR_EQ(scroll_layer->ScrollDelta(), impl_thread_scroll1_); |
- PostSetNeedsCommitToMainThread(); |
- |
- // CommitCompleteOnThread will trigger this function again |
- // and cause us to take the else clause. |
- } else { |
- impl->BlockNotifyReadyToActivateForTesting(false); |
- ASSERT_TRUE(pending_root); |
- EXPECT_EQ(impl->pending_tree()->source_frame_number(), 1); |
- |
- scroll_layer->ScrollBy(impl_thread_scroll2_); |
- EXPECT_VECTOR_EQ(scroll_layer->BaseScrollOffset(), initial_scroll_); |
- EXPECT_VECTOR_EQ(scroll_layer->ScrollDelta(), |
- impl_thread_scroll1_ + impl_thread_scroll2_); |
- |
- LayerImpl* pending_scroll_layer = pending_root->children()[0]; |
- EXPECT_VECTOR_EQ( |
- pending_scroll_layer->BaseScrollOffset(), |
- gfx::ScrollOffsetWithDelta( |
- initial_scroll_, main_thread_scroll_ + impl_thread_scroll1_)); |
- EXPECT_VECTOR_EQ(pending_scroll_layer->ScrollDelta(), |
- impl_thread_scroll2_); |
- } |
- break; |
- case 1: |
- EXPECT_FALSE(impl->pending_tree()); |
- EXPECT_VECTOR_EQ( |
- scroll_layer->BaseScrollOffset(), |
- gfx::ScrollOffsetWithDelta( |
- initial_scroll_, main_thread_scroll_ + impl_thread_scroll1_)); |
- EXPECT_VECTOR_EQ(scroll_layer->ScrollDelta(), impl_thread_scroll2_); |
- EndTest(); |
- break; |
- } |
- } |
- |
- void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta, |
- float scale, |
- float top_controls_delta) override { |
- num_scrolls_++; |
- } |
- |
- void AfterTest() override { EXPECT_EQ(1, num_scrolls_); } |
- |
- private: |
- gfx::ScrollOffset initial_scroll_; |
- gfx::Vector2dF main_thread_scroll_; |
- gfx::Vector2dF impl_thread_scroll1_; |
- gfx::Vector2dF impl_thread_scroll2_; |
- int num_scrolls_; |
-}; |
- |
-MULTI_THREAD_TEST_F(ImplSidePaintingScrollTestSimple); |
- |
-// This test makes sure that layers pick up scrolls that occur between |
-// beginning a commit and finishing a commit (aka scroll deltas not |
-// included in sent scroll delta) still apply to layers that don't |
-// push properties. |
-class ImplSidePaintingScrollTestImplOnlyScroll |
- : public ImplSidePaintingScrollTest { |
- public: |
- ImplSidePaintingScrollTestImplOnlyScroll() |
- : initial_scroll_(20, 10), impl_thread_scroll_(-2, 3), impl_scale_(2.f) {} |
- |
- void SetupTree() override { |
- LayerTreeHostScrollTest::SetupTree(); |
- Layer* root_layer = layer_tree_host()->root_layer(); |
- scoped_refptr<Layer> root_scroll_layer = Layer::Create(); |
- root_scroll_layer->SetScrollClipLayerId(root_layer->id()); |
- root_scroll_layer->SetScrollOffset(initial_scroll_); |
- root_scroll_layer->SetBounds( |
- gfx::Size(root_layer->bounds().width() + 100, |
- root_layer->bounds().height() + 100)); |
- root_scroll_layer->SetIsDrawable(true); |
- root_scroll_layer->SetIsContainerForFixedPositionLayers(true); |
- root_layer->AddChild(root_scroll_layer); |
- |
- layer_tree_host()->RegisterViewportLayers(NULL, root_layer, |
- root_scroll_layer, NULL); |
- layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.01f, 100.f); |
- } |
- |
- void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
- |
- void WillCommit() override { |
- Layer* root = layer_tree_host()->root_layer(); |
- Layer* scroll_layer = root->children()[0].get(); |
- switch (layer_tree_host()->source_frame_number()) { |
- case 0: |
- EXPECT_TRUE(scroll_layer->needs_push_properties()); |
- break; |
- case 1: |
- // Even if this layer doesn't need push properties, it should |
- // still pick up scrolls that happen on the active layer during |
- // commit. |
- EXPECT_FALSE(scroll_layer->needs_push_properties()); |
- break; |
- } |
- } |
- |
- void BeginCommitOnThread(LayerTreeHostImpl* impl) override { |
- // Scroll after the 2nd commit has started. |
- if (impl->active_tree()->source_frame_number() == 0) { |
- LayerImpl* active_root = impl->active_tree()->root_layer(); |
- LayerImpl* active_scroll_layer = active_root->children()[0]; |
- ASSERT_TRUE(active_root); |
- ASSERT_TRUE(active_scroll_layer); |
- active_scroll_layer->ScrollBy(impl_thread_scroll_); |
- impl->SetPageScaleOnActiveTree(impl_scale_); |
- } |
- } |
- |
- void CommitCompleteOnThread(LayerTreeHostImpl* impl) override { |
- // We force a second draw here of the first commit before activating |
- // the second commit. |
- LayerImpl* active_root = impl->active_tree()->root_layer(); |
- LayerImpl* active_scroll_layer = |
- active_root ? active_root->children()[0] : NULL; |
- LayerImpl* pending_root = impl->pending_tree()->root_layer(); |
- LayerImpl* pending_scroll_layer = pending_root->children()[0]; |
- |
- ASSERT_TRUE(pending_root); |
- ASSERT_TRUE(pending_scroll_layer); |
- switch (impl->pending_tree()->source_frame_number()) { |
- case 0: |
- EXPECT_VECTOR_EQ(pending_scroll_layer->BaseScrollOffset(), |
- initial_scroll_); |
- EXPECT_VECTOR_EQ(pending_scroll_layer->ScrollDelta(), gfx::Vector2d()); |
- EXPECT_FALSE(active_root); |
- break; |
- case 1: |
- // Even though the scroll happened during the commit, both layers |
- // should have the appropriate scroll delta. |
- EXPECT_VECTOR_EQ(pending_scroll_layer->BaseScrollOffset(), |
- initial_scroll_); |
- EXPECT_VECTOR_EQ(pending_scroll_layer->ScrollDelta(), |
- impl_thread_scroll_); |
- ASSERT_TRUE(active_root); |
- EXPECT_VECTOR_EQ(active_scroll_layer->BaseScrollOffset(), |
- initial_scroll_); |
- EXPECT_VECTOR_EQ(active_scroll_layer->ScrollDelta(), |
- impl_thread_scroll_); |
- break; |
- case 2: |
- // On the next commit, this delta should have been sent and applied. |
- EXPECT_VECTOR_EQ( |
- pending_scroll_layer->BaseScrollOffset(), |
- gfx::ScrollOffsetWithDelta(initial_scroll_, impl_thread_scroll_)); |
- EXPECT_VECTOR_EQ(pending_scroll_layer->ScrollDelta(), gfx::Vector2d()); |
- break; |
- } |
- } |
- |
- void DrawLayersOnThread(LayerTreeHostImpl* impl) override { |
- ImplSidePaintingScrollTest::DrawLayersOnThread(impl); |
- |
- LayerImpl* root = impl->active_tree()->root_layer(); |
- LayerImpl* scroll_layer = root->children()[0]; |
- |
- switch (impl->active_tree()->source_frame_number()) { |
- case 0: |
- EXPECT_VECTOR_EQ(scroll_layer->BaseScrollOffset(), initial_scroll_); |
- EXPECT_VECTOR_EQ(scroll_layer->ScrollDelta(), gfx::Vector2d()); |
- EXPECT_EQ(1.f, impl->active_tree()->page_scale_delta()); |
- EXPECT_EQ(1.f, impl->active_tree()->current_page_scale_factor()); |
- PostSetNeedsCommitToMainThread(); |
- break; |
- case 1: |
- EXPECT_VECTOR_EQ(scroll_layer->BaseScrollOffset(), initial_scroll_); |
- EXPECT_VECTOR_EQ(scroll_layer->ScrollDelta(), impl_thread_scroll_); |
- EXPECT_EQ(impl_scale_, impl->active_tree()->page_scale_delta()); |
- EXPECT_EQ(impl_scale_, |
- impl->active_tree()->current_page_scale_factor()); |
- PostSetNeedsCommitToMainThread(); |
- break; |
- case 2: |
- EXPECT_EQ(1.f, impl->active_tree()->page_scale_delta()); |
- EXPECT_EQ(impl_scale_, |
- impl->active_tree()->current_page_scale_factor()); |
- EndTest(); |
- break; |
- } |
- } |
- |
- void AfterTest() override {} |
- |
- private: |
- gfx::ScrollOffset initial_scroll_; |
- gfx::Vector2dF impl_thread_scroll_; |
- float impl_scale_; |
-}; |
- |
-MULTI_THREAD_TEST_F(ImplSidePaintingScrollTestImplOnlyScroll); |
- |
-class LayerTreeHostScrollTestScrollZeroMaxScrollOffset |
- : public LayerTreeHostScrollTest { |
- public: |
- LayerTreeHostScrollTestScrollZeroMaxScrollOffset() {} |
- |
- void SetupTree() override { |
- LayerTreeTest::SetupTree(); |
- scoped_refptr<Layer> scroll_layer = Layer::Create(); |
- layer_tree_host()->root_layer()->AddChild(scroll_layer); |
- } |
- |
- void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
- |
- void DrawLayersOnThread(LayerTreeHostImpl* impl) override { |
- LayerImpl* root = impl->active_tree()->root_layer(); |
- LayerImpl* scroll_layer = root->children()[0]; |
- scroll_layer->SetScrollClipLayer(root->id()); |
- |
- // Set max_scroll_offset = (100, 100). |
- scroll_layer->SetBounds( |
- gfx::Size(root->bounds().width() + 100, root->bounds().height() + 100)); |
- EXPECT_EQ( |
- InputHandler::SCROLL_STARTED, |
- scroll_layer->TryScroll(gfx::PointF(0.0f, 1.0f), InputHandler::GESTURE, |
- SCROLL_BLOCKS_ON_NONE)); |
- |
- // Set max_scroll_offset = (0, 0). |
- scroll_layer->SetBounds(root->bounds()); |
- EXPECT_EQ( |
- InputHandler::SCROLL_IGNORED, |
- scroll_layer->TryScroll(gfx::PointF(0.0f, 1.0f), InputHandler::GESTURE, |
- SCROLL_BLOCKS_ON_NONE)); |
- |
- // Set max_scroll_offset = (-100, -100). |
- scroll_layer->SetBounds(gfx::Size()); |
- EXPECT_EQ( |
- InputHandler::SCROLL_IGNORED, |
- scroll_layer->TryScroll(gfx::PointF(0.0f, 1.0f), InputHandler::GESTURE, |
- SCROLL_BLOCKS_ON_NONE)); |
- |
- EndTest(); |
- } |
- |
- void AfterTest() override {} |
-}; |
- |
-SINGLE_AND_MULTI_THREAD_TEST_F( |
- LayerTreeHostScrollTestScrollZeroMaxScrollOffset); |
- |
-class ThreadCheckingInputHandlerClient : public InputHandlerClient { |
- public: |
- ThreadCheckingInputHandlerClient(base::SingleThreadTaskRunner* runner, |
- bool* received_stop_flinging) |
- : task_runner_(runner), received_stop_flinging_(received_stop_flinging) {} |
- |
- void WillShutdown() override { |
- if (!received_stop_flinging_) |
- ADD_FAILURE() << "WillShutdown() called before fling stopped"; |
- } |
- |
- void Animate(base::TimeTicks time) override { |
- if (!task_runner_->BelongsToCurrentThread()) |
- ADD_FAILURE() << "Animate called on wrong thread"; |
- } |
- |
- void MainThreadHasStoppedFlinging() override { |
- if (!task_runner_->BelongsToCurrentThread()) |
- ADD_FAILURE() << "MainThreadHasStoppedFlinging called on wrong thread"; |
- *received_stop_flinging_ = true; |
- } |
- |
- void ReconcileElasticOverscrollAndRootScroll() override { |
- if (!task_runner_->BelongsToCurrentThread()) { |
- ADD_FAILURE() << "ReconcileElasticOverscrollAndRootScroll called on " |
- << "wrong thread"; |
- } |
- } |
- |
- 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"); |
- ASSERT_TRUE(impl_thread.Start()); |
- |
- bool received_stop_flinging = false; |
- LayerTreeSettings settings; |
- |
- ThreadCheckingInputHandlerClient input_handler_client( |
- impl_thread.message_loop_proxy().get(), &received_stop_flinging); |
- FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); |
- |
- ASSERT_TRUE(impl_thread.message_loop_proxy().get()); |
- scoped_ptr<SharedBitmapManager> shared_bitmap_manager( |
- new TestSharedBitmapManager()); |
- scoped_ptr<LayerTreeHost> layer_tree_host = LayerTreeHost::CreateThreaded( |
- &client, shared_bitmap_manager.get(), NULL, NULL, settings, |
- base::MessageLoopProxy::current(), impl_thread.message_loop_proxy(), |
- nullptr); |
- |
- 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 = nullptr; |
- impl_thread.Stop(); |
- EXPECT_TRUE(received_stop_flinging); |
-} |
- |
-class LayerTreeHostScrollTestLayerStructureChange |
- : public LayerTreeHostScrollTest { |
- public: |
- LayerTreeHostScrollTestLayerStructureChange() |
- : scroll_destroy_whole_tree_(false) {} |
- |
- void SetupTree() override { |
- scoped_refptr<Layer> root_layer = Layer::Create(); |
- root_layer->SetBounds(gfx::Size(10, 10)); |
- |
- Layer* root_scroll_layer = |
- CreateScrollLayer(root_layer.get(), &root_scroll_layer_client_); |
- CreateScrollLayer(root_layer.get(), &sibling_scroll_layer_client_); |
- CreateScrollLayer(root_scroll_layer, &child_scroll_layer_client_); |
- |
- layer_tree_host()->SetRootLayer(root_layer); |
- LayerTreeHostScrollTest::SetupTree(); |
- } |
- |
- void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
- |
- void DrawLayersOnThread(LayerTreeHostImpl* impl) override { |
- LayerImpl* root = impl->active_tree()->root_layer(); |
- switch (impl->active_tree()->source_frame_number()) { |
- case 0: |
- root->child_at(0)->SetScrollDelta(gfx::Vector2dF(5, 5)); |
- root->child_at(0)->child_at(0)->SetScrollDelta(gfx::Vector2dF(5, 5)); |
- root->child_at(1)->SetScrollDelta(gfx::Vector2dF(5, 5)); |
- PostSetNeedsCommitToMainThread(); |
- break; |
- case 1: |
- EndTest(); |
- break; |
- } |
- } |
- |
- void AfterTest() override {} |
- |
- virtual void DidScroll(Layer* layer) { |
- if (scroll_destroy_whole_tree_) { |
- layer_tree_host()->SetRootLayer(NULL); |
- EndTest(); |
- return; |
- } |
- layer->RemoveFromParent(); |
- } |
- |
- protected: |
- class FakeLayerScrollClient { |
- public: |
- void DidScroll() { |
- owner_->DidScroll(layer_); |
- } |
- LayerTreeHostScrollTestLayerStructureChange* owner_; |
- Layer* layer_; |
- }; |
- |
- Layer* CreateScrollLayer(Layer* parent, FakeLayerScrollClient* client) { |
- scoped_refptr<PictureLayer> scroll_layer = |
- PictureLayer::Create(&fake_content_layer_client_); |
- scroll_layer->SetBounds(gfx::Size(110, 110)); |
- scroll_layer->SetPosition(gfx::Point(0, 0)); |
- scroll_layer->SetIsDrawable(true); |
- scroll_layer->SetScrollClipLayerId(parent->id()); |
- scroll_layer->SetBounds(gfx::Size(parent->bounds().width() + 100, |
- parent->bounds().height() + 100)); |
- scroll_layer->set_did_scroll_callback(base::Bind( |
- &FakeLayerScrollClient::DidScroll, base::Unretained(client))); |
- client->owner_ = this; |
- client->layer_ = scroll_layer.get(); |
- parent->AddChild(scroll_layer); |
- return scroll_layer.get(); |
- } |
- |
- FakeLayerScrollClient root_scroll_layer_client_; |
- FakeLayerScrollClient sibling_scroll_layer_client_; |
- FakeLayerScrollClient child_scroll_layer_client_; |
- |
- FakeContentLayerClient fake_content_layer_client_; |
- |
- bool scroll_destroy_whole_tree_; |
-}; |
- |
-TEST_F(LayerTreeHostScrollTestLayerStructureChange, ScrollDestroyLayer) { |
- RunTest(true, false, true); |
-} |
- |
-TEST_F(LayerTreeHostScrollTestLayerStructureChange, ScrollDestroyWholeTree) { |
- scroll_destroy_whole_tree_ = true; |
- RunTest(true, false, true); |
-} |
- |
-} // namespace |
-} // namespace cc |