Index: cc/trees/layer_tree_host_unittest_animation.cc |
diff --git a/cc/trees/layer_tree_host_unittest_animation.cc b/cc/trees/layer_tree_host_unittest_animation.cc |
index ccad25333badf94a0c0d22764fcf49199555aa4a..70e2a9ec6d876540fa8a28f74e50788f8d752a96 100644 |
--- a/cc/trees/layer_tree_host_unittest_animation.cc |
+++ b/cc/trees/layer_tree_host_unittest_animation.cc |
@@ -104,9 +104,8 @@ class LayerTreeHostAnimationTestSetNeedsAnimateInsideAnimationCallback |
int num_animates_; |
}; |
-// Temporarily suppressed per crbug.com/280706. |
-//MULTI_THREAD_TEST_F( |
-// LayerTreeHostAnimationTestSetNeedsAnimateInsideAnimationCallback); |
+MULTI_THREAD_TEST_F( |
+ LayerTreeHostAnimationTestSetNeedsAnimateInsideAnimationCallback); |
// Add a layer animation and confirm that |
// LayerTreeHostImpl::updateAnimationState does get called and continues to |
@@ -294,6 +293,136 @@ class LayerTreeHostAnimationTestTickAnimationWhileBackgrounded |
SINGLE_AND_MULTI_THREAD_TEST_F( |
LayerTreeHostAnimationTestTickAnimationWhileBackgrounded); |
+// Ensures that animations do not tick when we are backgrounded and |
+// and we have an empty active tree. |
+class LayerTreeHostAnimationTestNoBackgroundTickingWithoutActiveTree |
+ : public LayerTreeHostAnimationTest { |
+ protected: |
+ LayerTreeHostAnimationTestNoBackgroundTickingWithoutActiveTree() |
+ : active_tree_was_animated_(false) {} |
+ |
+ virtual base::TimeDelta LowFrequencyAnimationInterval() const OVERRIDE { |
+ return base::TimeDelta::FromMilliseconds(4); |
+ } |
+ |
+ virtual void BeginTest() OVERRIDE { |
+ PostAddAnimationToMainThread(layer_tree_host()->root_layer()); |
+ } |
+ |
+ virtual void NotifyAnimationFinished(double time) OVERRIDE { |
+ // Replace animated commits with an empty tree. |
+ layer_tree_host()->SetRootLayer(make_scoped_refptr<Layer>(NULL)); |
+ } |
+ |
+ virtual void DidCommit() OVERRIDE { |
+ // This alternates setting an empty tree and a non-empty tree with an |
+ // animation. |
+ switch (layer_tree_host()->source_frame_number()) { |
+ case 1: |
+ // Wait for NotifyAnimationFinished to commit an empty tree. |
+ break; |
+ case 2: |
+ SetupTree(); |
+ AddOpacityTransitionToLayer( |
+ layer_tree_host()->root_layer(), 0.000001, 0, 0.5, true); |
+ break; |
+ case 3: |
+ // Wait for NotifyAnimationFinished to commit an empty tree. |
+ break; |
+ case 4: |
+ EndTest(); |
+ break; |
+ } |
+ } |
+ |
+ virtual void BeginCommitOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { |
+ // At the start of every commit, block activations and make sure |
+ // we are backgrounded. |
+ host_impl->BlockNotifyReadyToActivateForTesting(true); |
+ PostSetVisibleToMainThread(false); |
+ } |
+ |
+ virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { |
+ if (!host_impl->settings().impl_side_painting) { |
+ // There are no activations to block if we're not impl-side-painting, |
+ // so just advance the test immediately. |
+ if (host_impl->active_tree()->source_frame_number() < 3) |
+ UnblockActivations(host_impl); |
+ return; |
+ } |
+ |
+ // We block activation for several ticks to make sure that, even though |
+ // there is a pending tree with animations, we still do not background |
+ // tick if the active tree is empty. |
+ if (host_impl->pending_tree()->source_frame_number() < 3) { |
+ base::MessageLoopProxy::current()->PostDelayedTask( |
+ FROM_HERE, |
+ base::Bind( |
+ &LayerTreeHostAnimationTestNoBackgroundTickingWithoutActiveTree:: |
+ UnblockActivations, |
+ base::Unretained(this), |
+ host_impl), |
+ 4 * LowFrequencyAnimationInterval()); |
+ } |
+ } |
+ |
+ virtual void UnblockActivations(LayerTreeHostImpl* host_impl) { |
+ host_impl->BlockNotifyReadyToActivateForTesting(false); |
+ } |
+ |
+ virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { |
+ active_tree_was_animated_ = false; |
+ |
+ // Verify that commits are actually alternating with empty / non-empty |
+ // trees. |
+ switch (host_impl->active_tree()->source_frame_number()) { |
+ case 0: |
+ case 2: |
+ EXPECT_TRUE(host_impl->active_tree()->root_layer()); |
+ break; |
+ case 1: |
+ case 3: |
+ EXPECT_FALSE(host_impl->active_tree()->root_layer()); |
+ break; |
+ } |
+ |
+ if (host_impl->active_tree()->source_frame_number() < 3) { |
+ // Initiate the next commit after a delay to give us a chance to |
+ // background tick if the active tree isn't empty. |
+ base::MessageLoopProxy::current()->PostDelayedTask( |
+ FROM_HERE, |
+ base::Bind( |
+ &LayerTreeHostAnimationTestNoBackgroundTickingWithoutActiveTree:: |
+ InitiateNextCommit, |
+ base::Unretained(this), |
+ host_impl), |
+ 4 * LowFrequencyAnimationInterval()); |
+ } |
+ } |
+ |
+ virtual void WillAnimateLayers(LayerTreeHostImpl* host_impl, |
+ base::TimeTicks monotonic_time) OVERRIDE { |
+ EXPECT_TRUE(host_impl->active_tree()->root_layer()); |
+ active_tree_was_animated_ = true; |
+ } |
+ |
+ void InitiateNextCommit(LayerTreeHostImpl* host_impl) { |
+ // Verify that we actually animated when we should have. |
+ bool has_active_tree = host_impl->active_tree()->root_layer(); |
+ EXPECT_EQ(has_active_tree, active_tree_was_animated_); |
+ |
+ // The next commit is blocked until we become visible again. |
+ PostSetVisibleToMainThread(true); |
+ } |
+ |
+ virtual void AfterTest() OVERRIDE {} |
+ |
+ bool active_tree_was_animated_; |
+}; |
+ |
+SINGLE_AND_MULTI_THREAD_TEST_F( |
+ LayerTreeHostAnimationTestNoBackgroundTickingWithoutActiveTree); |
+ |
// Ensure that an animation's timing function is respected. |
class LayerTreeHostAnimationTestAddAnimationWithTimingFunction |
: public LayerTreeHostAnimationTest { |