| Index: cc/trees/layer_tree_host_impl_unittest.cc
|
| diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
|
| index 097244c2a980fda58114932a747aacdb276f16ed..1f1cedc2d09833fb7b4cc21ea2e76f47a725da09 100644
|
| --- a/cc/trees/layer_tree_host_impl_unittest.cc
|
| +++ b/cc/trees/layer_tree_host_impl_unittest.cc
|
| @@ -129,7 +129,7 @@ class LayerTreeHostImplTest : public testing::Test,
|
| virtual bool IsInsideDraw() OVERRIDE { return false; }
|
| virtual void RenewTreePriority() OVERRIDE {}
|
| virtual void RequestScrollbarAnimationOnImplThread(base::TimeDelta delay)
|
| - OVERRIDE {}
|
| + OVERRIDE { requested_scrollbar_animation_delay_ = delay; }
|
| virtual void DidActivatePendingTree() OVERRIDE {}
|
|
|
| void set_reduce_memory_result(bool reduce_memory_result) {
|
| @@ -284,6 +284,7 @@ class LayerTreeHostImplTest : public testing::Test,
|
| bool did_request_redraw_;
|
| bool did_upload_visible_tile_;
|
| bool reduce_memory_result_;
|
| + base::TimeDelta requested_scrollbar_animation_delay_;
|
| };
|
|
|
| class TestWebGraphicsContext3DMakeCurrentFails
|
| @@ -989,6 +990,130 @@ TEST_F(LayerTreeHostImplTest, PageScaleAnimationNoOp) {
|
| }
|
| }
|
|
|
| +class LayerTreeHostImplOverridePhysicalTime : public LayerTreeHostImpl {
|
| + public:
|
| + LayerTreeHostImplOverridePhysicalTime(
|
| + const LayerTreeSettings& settings,
|
| + LayerTreeHostImplClient* client,
|
| + Proxy* proxy,
|
| + RenderingStatsInstrumentation* rendering_stats_instrumentation)
|
| + : LayerTreeHostImpl(settings,
|
| + client,
|
| + proxy,
|
| + rendering_stats_instrumentation) {}
|
| +
|
| +
|
| + virtual base::TimeTicks CurrentPhysicalTimeTicks() const OVERRIDE {
|
| + return fake_current_physical_time_;
|
| + }
|
| +
|
| + void SetCurrentPhysicalTimeTicksForTest(base::TimeTicks fake_now) {
|
| + fake_current_physical_time_ = fake_now;
|
| + }
|
| +
|
| + private:
|
| + base::TimeTicks fake_current_physical_time_;
|
| +};
|
| +
|
| +TEST_F(LayerTreeHostImplTest, ScrollbarLinearFadeScheduling) {
|
| + LayerTreeSettings settings;
|
| + settings.use_linear_fade_scrollbar_animator = true;
|
| + settings.scrollbar_linear_fade_delay_ms = 20;
|
| + settings.scrollbar_linear_fade_length_ms = 20;
|
| +
|
| + LayerTreeHostImplOverridePhysicalTime* host_impl_override_time =
|
| + new LayerTreeHostImplOverridePhysicalTime(
|
| + settings, this, &proxy_, &stats_instrumentation_);
|
| + host_impl_ = make_scoped_ptr<LayerTreeHostImpl>(host_impl_override_time);
|
| + host_impl_->InitializeRenderer(CreateOutputSurface());
|
| + host_impl_->SetViewportSize(gfx::Size(10, 10));
|
| +
|
| + gfx::Size content_size(100, 100);
|
| + scoped_ptr<LayerImpl> root =
|
| + LayerImpl::Create(host_impl_->active_tree(), 1);
|
| + root->SetBounds(content_size);
|
| + root->SetContentBounds(content_size);
|
| +
|
| + scoped_ptr<LayerImpl> scroll =
|
| + LayerImpl::Create(host_impl_->active_tree(), 2);
|
| + scroll->SetScrollable(true);
|
| + scroll->SetScrollOffset(gfx::Vector2d());
|
| + scroll->SetMaxScrollOffset(gfx::Vector2d(content_size.width(),
|
| + content_size.height()));
|
| + scroll->SetBounds(content_size);
|
| + scroll->SetContentBounds(content_size);
|
| +
|
| + scoped_ptr<LayerImpl> contents =
|
| + LayerImpl::Create(host_impl_->active_tree(), 3);
|
| + contents->SetDrawsContent(true);
|
| + contents->SetBounds(content_size);
|
| + contents->SetContentBounds(content_size);
|
| +
|
| + scoped_ptr<ScrollbarLayerImpl> scrollbar = ScrollbarLayerImpl::Create(
|
| + host_impl_->active_tree(),
|
| + 4,
|
| + VERTICAL);
|
| + scroll->SetVerticalScrollbarLayer(scrollbar.get());
|
| +
|
| + scroll->AddChild(contents.Pass());
|
| + root->AddChild(scroll.Pass());
|
| + root->AddChild(scrollbar.PassAs<LayerImpl>());
|
| +
|
| + host_impl_->active_tree()->SetRootLayer(root.Pass());
|
| + host_impl_->active_tree()->DidBecomeActive();
|
| + InitializeRendererAndDrawFrame();
|
| +
|
| + base::TimeTicks fake_now = base::TimeTicks::Now();
|
| + host_impl_override_time->SetCurrentPhysicalTimeTicksForTest(fake_now);
|
| +
|
| + // If no scroll happened recently, StartScrollbarAnimation should have no
|
| + // effect.
|
| + host_impl_->StartScrollbarAnimation();
|
| + EXPECT_EQ(base::TimeDelta(), requested_scrollbar_animation_delay_);
|
| + EXPECT_FALSE(did_request_redraw_);
|
| +
|
| + // After a scroll, a fade animation should be scheduled about 20ms from now.
|
| + host_impl_->ScrollBegin(gfx::Point(), InputHandler::Wheel);
|
| + host_impl_->ScrollEnd();
|
| + host_impl_->StartScrollbarAnimation();
|
| + EXPECT_LT(base::TimeDelta::FromMilliseconds(19),
|
| + requested_scrollbar_animation_delay_);
|
| + EXPECT_FALSE(did_request_redraw_);
|
| + requested_scrollbar_animation_delay_ = base::TimeDelta();
|
| +
|
| + // After the fade begins, we should start getting redraws instead of a
|
| + // scheduled animation.
|
| + fake_now += base::TimeDelta::FromMilliseconds(25);
|
| + host_impl_override_time->SetCurrentPhysicalTimeTicksForTest(fake_now);
|
| + host_impl_->StartScrollbarAnimation();
|
| + EXPECT_EQ(base::TimeDelta(), requested_scrollbar_animation_delay_);
|
| + EXPECT_TRUE(did_request_redraw_);
|
| + did_request_redraw_ = false;
|
| +
|
| + // If no scroll happened recently, StartScrollbarAnimation should have no
|
| + // effect.
|
| + fake_now += base::TimeDelta::FromMilliseconds(25);
|
| + host_impl_override_time->SetCurrentPhysicalTimeTicksForTest(fake_now);
|
| + host_impl_->StartScrollbarAnimation();
|
| + EXPECT_EQ(base::TimeDelta(), requested_scrollbar_animation_delay_);
|
| + EXPECT_FALSE(did_request_redraw_);
|
| +
|
| + // Setting the scroll offset outside a scroll should also cause the scrollbar
|
| + // to appear and to schedule a fade.
|
| + host_impl_->RootScrollLayer()->SetScrollOffset(gfx::Vector2d(5, 5));
|
| + host_impl_->StartScrollbarAnimation();
|
| + EXPECT_LT(base::TimeDelta::FromMilliseconds(19),
|
| + requested_scrollbar_animation_delay_);
|
| + EXPECT_FALSE(did_request_redraw_);
|
| + requested_scrollbar_animation_delay_ = base::TimeDelta();
|
| +
|
| + // None of the above should have called CurrentFrameTimeTicks, so if we call
|
| + // it now we should get the current time.
|
| + fake_now += base::TimeDelta::FromMilliseconds(10);
|
| + host_impl_override_time->SetCurrentPhysicalTimeTicksForTest(fake_now);
|
| + EXPECT_EQ(fake_now, host_impl_->CurrentFrameTimeTicks());
|
| +}
|
| +
|
| TEST_F(LayerTreeHostImplTest, CompositorFrameMetadata) {
|
| SetupScrollAndContentsLayers(gfx::Size(100, 100));
|
| host_impl_->SetViewportSize(gfx::Size(50, 50));
|
|
|