OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/trees/layer_tree_host.h" | 5 #include "cc/trees/layer_tree_host.h" |
6 | 6 |
7 #include "cc/animation/animation_curve.h" | 7 #include "cc/animation/animation_curve.h" |
8 #include "cc/animation/layer_animation_controller.h" | 8 #include "cc/animation/layer_animation_controller.h" |
9 #include "cc/animation/timing_function.h" | 9 #include "cc/animation/timing_function.h" |
10 #include "cc/layers/layer.h" | 10 #include "cc/layers/layer.h" |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 } | 97 } |
98 EndTest(); | 98 EndTest(); |
99 } | 99 } |
100 | 100 |
101 virtual void AfterTest() OVERRIDE {} | 101 virtual void AfterTest() OVERRIDE {} |
102 | 102 |
103 private: | 103 private: |
104 int num_animates_; | 104 int num_animates_; |
105 }; | 105 }; |
106 | 106 |
107 // Temporarily suppressed per crbug.com/280706. | 107 MULTI_THREAD_TEST_F( |
108 //MULTI_THREAD_TEST_F( | 108 LayerTreeHostAnimationTestSetNeedsAnimateInsideAnimationCallback); |
109 // LayerTreeHostAnimationTestSetNeedsAnimateInsideAnimationCallback); | |
110 | 109 |
111 // Add a layer animation and confirm that | 110 // Add a layer animation and confirm that |
112 // LayerTreeHostImpl::updateAnimationState does get called and continues to | 111 // LayerTreeHostImpl::updateAnimationState does get called and continues to |
113 // get called. | 112 // get called. |
114 class LayerTreeHostAnimationTestAddAnimation | 113 class LayerTreeHostAnimationTestAddAnimation |
115 : public LayerTreeHostAnimationTest { | 114 : public LayerTreeHostAnimationTest { |
116 public: | 115 public: |
117 LayerTreeHostAnimationTestAddAnimation() | 116 LayerTreeHostAnimationTestAddAnimation() |
118 : num_animates_(0), | 117 : num_animates_(0), |
119 received_animation_started_notification_(false), | 118 received_animation_started_notification_(false), |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 | 286 |
288 virtual void AfterTest() OVERRIDE {} | 287 virtual void AfterTest() OVERRIDE {} |
289 | 288 |
290 private: | 289 private: |
291 int num_animates_; | 290 int num_animates_; |
292 }; | 291 }; |
293 | 292 |
294 SINGLE_AND_MULTI_THREAD_TEST_F( | 293 SINGLE_AND_MULTI_THREAD_TEST_F( |
295 LayerTreeHostAnimationTestTickAnimationWhileBackgrounded); | 294 LayerTreeHostAnimationTestTickAnimationWhileBackgrounded); |
296 | 295 |
| 296 // Ensures that animations do not tick when we are backgrounded and |
| 297 // and we have an empty active tree. |
| 298 class LayerTreeHostAnimationTestNoBackgroundTickingWithoutActiveTree |
| 299 : public LayerTreeHostAnimationTest { |
| 300 protected: |
| 301 LayerTreeHostAnimationTestNoBackgroundTickingWithoutActiveTree() |
| 302 : active_tree_was_animated_(false) {} |
| 303 |
| 304 virtual base::TimeDelta LowFrequencyAnimationInterval() const OVERRIDE { |
| 305 return base::TimeDelta::FromMilliseconds(4); |
| 306 } |
| 307 |
| 308 virtual void BeginTest() OVERRIDE { |
| 309 PostAddAnimationToMainThread(layer_tree_host()->root_layer()); |
| 310 } |
| 311 |
| 312 virtual void NotifyAnimationFinished(double time) OVERRIDE { |
| 313 // Replace animated commits with an empty tree. |
| 314 layer_tree_host()->SetRootLayer(make_scoped_refptr<Layer>(NULL)); |
| 315 } |
| 316 |
| 317 virtual void DidCommit() OVERRIDE { |
| 318 // This alternates setting an empty tree and a non-empty tree with an |
| 319 // animation. |
| 320 switch (layer_tree_host()->source_frame_number()) { |
| 321 case 1: |
| 322 // Wait for NotifyAnimationFinished to commit an empty tree. |
| 323 break; |
| 324 case 2: |
| 325 SetupTree(); |
| 326 AddOpacityTransitionToLayer( |
| 327 layer_tree_host()->root_layer(), 0.000001, 0, 0.5, true); |
| 328 break; |
| 329 case 3: |
| 330 // Wait for NotifyAnimationFinished to commit an empty tree. |
| 331 break; |
| 332 case 4: |
| 333 EndTest(); |
| 334 break; |
| 335 } |
| 336 } |
| 337 |
| 338 virtual void BeginCommitOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { |
| 339 // At the start of every commit, block activations and make sure |
| 340 // we are backgrounded. |
| 341 host_impl->BlockNotifyReadyToActivateForTesting(true); |
| 342 PostSetVisibleToMainThread(false); |
| 343 } |
| 344 |
| 345 virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { |
| 346 if (!host_impl->settings().impl_side_painting) { |
| 347 // There are no activations to block if we're not impl-side-painting, |
| 348 // so just advance the test immediately. |
| 349 if (host_impl->active_tree()->source_frame_number() < 3) |
| 350 UnblockActivations(host_impl); |
| 351 return; |
| 352 } |
| 353 |
| 354 // We block activation for several ticks to make sure that, even though |
| 355 // there is a pending tree with animations, we still do not background |
| 356 // tick if the active tree is empty. |
| 357 if (host_impl->pending_tree()->source_frame_number() < 3) { |
| 358 base::MessageLoopProxy::current()->PostDelayedTask( |
| 359 FROM_HERE, |
| 360 base::Bind( |
| 361 &LayerTreeHostAnimationTestNoBackgroundTickingWithoutActiveTree:: |
| 362 UnblockActivations, |
| 363 base::Unretained(this), |
| 364 host_impl), |
| 365 4 * LowFrequencyAnimationInterval()); |
| 366 } |
| 367 } |
| 368 |
| 369 virtual void UnblockActivations(LayerTreeHostImpl* host_impl) { |
| 370 host_impl->BlockNotifyReadyToActivateForTesting(false); |
| 371 } |
| 372 |
| 373 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { |
| 374 active_tree_was_animated_ = false; |
| 375 |
| 376 // Verify that commits are actually alternating with empty / non-empty |
| 377 // trees. |
| 378 switch (host_impl->active_tree()->source_frame_number()) { |
| 379 case 0: |
| 380 case 2: |
| 381 EXPECT_TRUE(host_impl->active_tree()->root_layer()); |
| 382 break; |
| 383 case 1: |
| 384 case 3: |
| 385 EXPECT_FALSE(host_impl->active_tree()->root_layer()); |
| 386 break; |
| 387 } |
| 388 |
| 389 if (host_impl->active_tree()->source_frame_number() < 3) { |
| 390 // Initiate the next commit after a delay to give us a chance to |
| 391 // background tick if the active tree isn't empty. |
| 392 base::MessageLoopProxy::current()->PostDelayedTask( |
| 393 FROM_HERE, |
| 394 base::Bind( |
| 395 &LayerTreeHostAnimationTestNoBackgroundTickingWithoutActiveTree:: |
| 396 InitiateNextCommit, |
| 397 base::Unretained(this), |
| 398 host_impl), |
| 399 4 * LowFrequencyAnimationInterval()); |
| 400 } |
| 401 } |
| 402 |
| 403 virtual void WillAnimateLayers(LayerTreeHostImpl* host_impl, |
| 404 base::TimeTicks monotonic_time) OVERRIDE { |
| 405 EXPECT_TRUE(host_impl->active_tree()->root_layer()); |
| 406 active_tree_was_animated_ = true; |
| 407 } |
| 408 |
| 409 void InitiateNextCommit(LayerTreeHostImpl* host_impl) { |
| 410 // Verify that we actually animated when we should have. |
| 411 bool has_active_tree = host_impl->active_tree()->root_layer(); |
| 412 EXPECT_EQ(has_active_tree, active_tree_was_animated_); |
| 413 |
| 414 // The next commit is blocked until we become visible again. |
| 415 PostSetVisibleToMainThread(true); |
| 416 } |
| 417 |
| 418 virtual void AfterTest() OVERRIDE {} |
| 419 |
| 420 bool active_tree_was_animated_; |
| 421 }; |
| 422 |
| 423 SINGLE_AND_MULTI_THREAD_TEST_F( |
| 424 LayerTreeHostAnimationTestNoBackgroundTickingWithoutActiveTree); |
| 425 |
297 // Ensure that an animation's timing function is respected. | 426 // Ensure that an animation's timing function is respected. |
298 class LayerTreeHostAnimationTestAddAnimationWithTimingFunction | 427 class LayerTreeHostAnimationTestAddAnimationWithTimingFunction |
299 : public LayerTreeHostAnimationTest { | 428 : public LayerTreeHostAnimationTest { |
300 public: | 429 public: |
301 LayerTreeHostAnimationTestAddAnimationWithTimingFunction() {} | 430 LayerTreeHostAnimationTestAddAnimationWithTimingFunction() {} |
302 | 431 |
303 virtual void SetupTree() OVERRIDE { | 432 virtual void SetupTree() OVERRIDE { |
304 LayerTreeHostAnimationTest::SetupTree(); | 433 LayerTreeHostAnimationTest::SetupTree(); |
305 content_ = FakeContentLayer::Create(&client_); | 434 content_ = FakeContentLayer::Create(&client_); |
306 content_->SetBounds(gfx::Size(4, 4)); | 435 content_->SetBounds(gfx::Size(4, 4)); |
(...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
798 int finished_times_; | 927 int finished_times_; |
799 FakeContentLayerClient client_; | 928 FakeContentLayerClient client_; |
800 scoped_refptr<FakeContentLayer> content_; | 929 scoped_refptr<FakeContentLayer> content_; |
801 }; | 930 }; |
802 | 931 |
803 MULTI_THREAD_TEST_F( | 932 MULTI_THREAD_TEST_F( |
804 LayerTreeHostAnimationTestCheckerboardDoesntStartAnimations); | 933 LayerTreeHostAnimationTestCheckerboardDoesntStartAnimations); |
805 | 934 |
806 } // namespace | 935 } // namespace |
807 } // namespace cc | 936 } // namespace cc |
OLD | NEW |