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 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 class LayerTreeHostAnimationTestTickAnimationWhileBackgrounded | 257 class LayerTreeHostAnimationTestTickAnimationWhileBackgrounded |
258 : public LayerTreeHostAnimationTest { | 258 : public LayerTreeHostAnimationTest { |
259 public: | 259 public: |
260 LayerTreeHostAnimationTestTickAnimationWhileBackgrounded() | 260 LayerTreeHostAnimationTestTickAnimationWhileBackgrounded() |
261 : num_animates_(0) {} | 261 : num_animates_(0) {} |
262 | 262 |
263 virtual void BeginTest() OVERRIDE { | 263 virtual void BeginTest() OVERRIDE { |
264 PostAddAnimationToMainThread(layer_tree_host()->root_layer()); | 264 PostAddAnimationToMainThread(layer_tree_host()->root_layer()); |
265 } | 265 } |
266 | 266 |
| 267 virtual void DidCommit() OVERRIDE { |
| 268 layer_tree_host()->SetVisible(false); |
| 269 } |
| 270 |
267 // Use WillAnimateLayers to set visible false before the animation runs and | 271 // Use WillAnimateLayers to set visible false before the animation runs and |
268 // causes a commit, so we block the second visible animate in single-thread | 272 // causes a commit, so we block the second visible animate in single-thread |
269 // mode. | 273 // mode. |
270 virtual void WillAnimateLayers( | 274 virtual void WillAnimateLayers( |
271 LayerTreeHostImpl* host_impl, | 275 LayerTreeHostImpl* host_impl, |
272 base::TimeTicks monotonic_time) OVERRIDE { | 276 base::TimeTicks monotonic_time) OVERRIDE { |
273 if (num_animates_ < 2) { | 277 TRACE_EVENT0("cc", __PRETTY_FUNCTION__); |
274 if (!num_animates_) { | 278 if (num_animates_ < 3) { |
275 // We have a long animation running. It should continue to tick even | |
276 // if we are not visible. | |
277 PostSetVisibleToMainThread(false); | |
278 } | |
279 num_animates_++; | 279 num_animates_++; |
280 return; | 280 return; |
281 } | 281 } |
282 EndTest(); | 282 EndTest(); |
283 } | 283 } |
284 | 284 |
285 virtual void AfterTest() OVERRIDE {} | 285 virtual void AfterTest() OVERRIDE {} |
286 | 286 |
287 private: | 287 private: |
288 int num_animates_; | 288 int num_animates_; |
(...skipping 15 matching lines...) Expand all Loading... |
304 layer_tree_host()->root_layer()->AddChild(content_); | 304 layer_tree_host()->root_layer()->AddChild(content_); |
305 } | 305 } |
306 | 306 |
307 virtual void BeginTest() OVERRIDE { | 307 virtual void BeginTest() OVERRIDE { |
308 PostAddAnimationToMainThread(content_.get()); | 308 PostAddAnimationToMainThread(content_.get()); |
309 } | 309 } |
310 | 310 |
311 virtual void AnimateLayers( | 311 virtual void AnimateLayers( |
312 LayerTreeHostImpl* host_impl, | 312 LayerTreeHostImpl* host_impl, |
313 base::TimeTicks monotonic_time) OVERRIDE { | 313 base::TimeTicks monotonic_time) OVERRIDE { |
| 314 if (!layer_tree_host()->root_layer()) |
| 315 return; |
314 LayerAnimationController* controller = | 316 LayerAnimationController* controller = |
315 layer_tree_host()->root_layer()->children()[0]-> | 317 layer_tree_host()->root_layer()->children()[0]-> |
316 layer_animation_controller(); | 318 layer_animation_controller(); |
317 Animation* animation = | 319 Animation* animation = |
318 controller->GetAnimation(Animation::Opacity); | 320 controller->GetAnimation(Animation::Opacity); |
319 if (!animation) | 321 if (!animation) |
320 return; | 322 return; |
321 | 323 |
322 const FloatAnimationCurve* curve = | 324 const FloatAnimationCurve* curve = |
323 animation->curve()->ToFloatAnimationCurve(); | 325 animation->curve()->ToFloatAnimationCurve(); |
324 float start_opacity = curve->GetValue(0.0); | 326 float start_opacity = curve->GetValue(0.0); |
325 float end_opacity = curve->GetValue(curve->Duration()); | 327 float end_opacity = curve->GetValue(curve->Duration()); |
326 float linearly_interpolated_opacity = | 328 float linearly_interpolated_opacity = |
327 0.25f * end_opacity + 0.75f * start_opacity; | 329 0.25f * end_opacity + 0.75f * start_opacity; |
328 double time = curve->Duration() * 0.25; | 330 double time = curve->Duration() * 0.25; |
329 // If the linear timing function associated with this animation was not | 331 // If the linear timing function associated with this animation was not |
330 // picked up, then the linearly interpolated opacity would be different | 332 // picked up, then the linearly interpolated opacity would be different |
331 // because of the default ease timing function. | 333 // because of the default ease timing function. |
332 EXPECT_FLOAT_EQ(linearly_interpolated_opacity, curve->GetValue(time)); | 334 EXPECT_FLOAT_EQ(linearly_interpolated_opacity, curve->GetValue(time)); |
333 | 335 |
| 336 if (!host_impl->active_tree()->root_layer()) |
| 337 return; |
334 LayerAnimationController* controller_impl = | 338 LayerAnimationController* controller_impl = |
335 host_impl->active_tree()->root_layer()->children()[0]-> | 339 host_impl->active_tree()->root_layer()->children()[0]-> |
336 layer_animation_controller(); | 340 layer_animation_controller(); |
337 Animation* animation_impl = | 341 Animation* animation_impl = |
338 controller_impl->GetAnimation(Animation::Opacity); | 342 controller_impl->GetAnimation(Animation::Opacity); |
339 | 343 |
340 controller->RemoveAnimation(animation->id()); | 344 controller->RemoveAnimation(animation->id()); |
341 controller_impl->RemoveAnimation(animation_impl->id()); | 345 controller_impl->RemoveAnimation(animation_impl->id()); |
342 EndTest(); | 346 EndTest(); |
343 } | 347 } |
344 | 348 |
345 virtual void AfterTest() OVERRIDE {} | 349 virtual void AfterTest() OVERRIDE {} |
346 | 350 |
347 FakeContentLayerClient client_; | 351 FakeContentLayerClient client_; |
348 scoped_refptr<FakeContentLayer> content_; | 352 scoped_refptr<FakeContentLayer> content_; |
349 }; | 353 }; |
350 | 354 |
351 SINGLE_AND_MULTI_THREAD_TEST_F( | 355 SINGLE_AND_MULTI_THREAD_TEST_F( |
352 LayerTreeHostAnimationTestAddAnimationWithTimingFunction); | 356 LayerTreeHostAnimationTestAddAnimationWithTimingFunction); |
353 | 357 |
354 // Ensures that main thread animations have their start times synchronized with | 358 // Ensures that main thread animations have their start times synchronized with |
355 // impl thread animations. | 359 // impl thread animations. |
356 class LayerTreeHostAnimationTestSynchronizeAnimationStartTimes | 360 class LayerTreeHostAnimationTestSynchronizeAnimationStartTimes |
357 : public LayerTreeHostAnimationTest { | 361 : public LayerTreeHostAnimationTest { |
358 public: | 362 public: |
359 LayerTreeHostAnimationTestSynchronizeAnimationStartTimes() | 363 LayerTreeHostAnimationTestSynchronizeAnimationStartTimes() |
360 : main_start_time_(-1.0), | 364 : test_is_setup_(false), |
| 365 main_start_time_(-1.0), |
361 impl_start_time_(-1.0) {} | 366 impl_start_time_(-1.0) {} |
362 | 367 |
363 virtual void SetupTree() OVERRIDE { | 368 virtual void SetupTree() OVERRIDE { |
364 LayerTreeHostAnimationTest::SetupTree(); | 369 LayerTreeHostAnimationTest::SetupTree(); |
365 content_ = FakeContentLayer::Create(&client_); | 370 content_ = FakeContentLayer::Create(&client_); |
366 content_->SetBounds(gfx::Size(4, 4)); | 371 content_->SetBounds(gfx::Size(4, 4)); |
367 content_->set_layer_animation_delegate(this); | 372 content_->set_layer_animation_delegate(this); |
368 layer_tree_host()->root_layer()->AddChild(content_); | 373 layer_tree_host()->root_layer()->AddChild(content_); |
| 374 test_is_setup_ = true; |
369 } | 375 } |
370 | 376 |
371 virtual void BeginTest() OVERRIDE { | 377 virtual void BeginTest() OVERRIDE { |
372 PostAddAnimationToMainThread(content_.get()); | 378 PostAddAnimationToMainThread(content_.get()); |
373 } | 379 } |
374 | 380 |
375 virtual void notifyAnimationStarted(double time) OVERRIDE { | 381 virtual void notifyAnimationStarted(double time) OVERRIDE { |
376 LayerAnimationController* controller = | 382 LayerAnimationController* controller = |
377 layer_tree_host()->root_layer()->children()[0]-> | 383 layer_tree_host()->root_layer()->children()[0]-> |
378 layer_animation_controller(); | 384 layer_animation_controller(); |
379 Animation* animation = | 385 Animation* animation = |
380 controller->GetAnimation(Animation::Opacity); | 386 controller->GetAnimation(Animation::Opacity); |
381 main_start_time_ = animation->start_time(); | 387 main_start_time_ = animation->start_time(); |
382 controller->RemoveAnimation(animation->id()); | 388 controller->RemoveAnimation(animation->id()); |
383 | 389 |
384 if (impl_start_time_ > 0.0) | 390 if (impl_start_time_ > 0.0) |
385 EndTest(); | 391 EndTest(); |
386 } | 392 } |
387 | 393 |
388 virtual void UpdateAnimationState( | 394 virtual void UpdateAnimationState( |
389 LayerTreeHostImpl* impl_host, | 395 LayerTreeHostImpl* impl_host, |
390 bool has_unfinished_animation) OVERRIDE { | 396 bool has_unfinished_animation) OVERRIDE { |
| 397 if (!test_is_setup_ || !impl_host->active_tree()->root_layer()) |
| 398 return; |
| 399 |
391 LayerAnimationController* controller = | 400 LayerAnimationController* controller = |
392 impl_host->active_tree()->root_layer()->children()[0]-> | 401 impl_host->active_tree()->root_layer()->children()[0]-> |
393 layer_animation_controller(); | 402 layer_animation_controller(); |
394 Animation* animation = | 403 Animation* animation = |
395 controller->GetAnimation(Animation::Opacity); | 404 controller->GetAnimation(Animation::Opacity); |
396 if (!animation) | 405 if (!animation) |
397 return; | 406 return; |
398 | 407 |
399 impl_start_time_ = animation->start_time(); | 408 impl_start_time_ = animation->start_time(); |
400 controller->RemoveAnimation(animation->id()); | 409 controller->RemoveAnimation(animation->id()); |
401 | 410 |
402 if (main_start_time_ > 0.0) | 411 if (main_start_time_ > 0.0) |
403 EndTest(); | 412 EndTest(); |
404 } | 413 } |
405 | 414 |
406 virtual void AfterTest() OVERRIDE { | 415 virtual void AfterTest() OVERRIDE { |
407 EXPECT_FLOAT_EQ(impl_start_time_, main_start_time_); | 416 EXPECT_FLOAT_EQ(impl_start_time_, main_start_time_); |
408 } | 417 } |
409 | 418 |
410 private: | 419 private: |
| 420 bool test_is_setup_; |
411 double main_start_time_; | 421 double main_start_time_; |
412 double impl_start_time_; | 422 double impl_start_time_; |
413 FakeContentLayerClient client_; | 423 FakeContentLayerClient client_; |
414 scoped_refptr<FakeContentLayer> content_; | 424 scoped_refptr<FakeContentLayer> content_; |
415 }; | 425 }; |
416 | 426 |
417 SINGLE_AND_MULTI_THREAD_TEST_F( | 427 SINGLE_AND_MULTI_THREAD_TEST_F( |
418 LayerTreeHostAnimationTestSynchronizeAnimationStartTimes); | 428 LayerTreeHostAnimationTestSynchronizeAnimationStartTimes); |
419 | 429 |
420 // Ensures that notify animation finished is called. | 430 // Ensures that notify animation finished is called. |
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
803 int finished_times_; | 813 int finished_times_; |
804 FakeContentLayerClient client_; | 814 FakeContentLayerClient client_; |
805 scoped_refptr<FakeContentLayer> content_; | 815 scoped_refptr<FakeContentLayer> content_; |
806 }; | 816 }; |
807 | 817 |
808 MULTI_THREAD_TEST_F( | 818 MULTI_THREAD_TEST_F( |
809 LayerTreeHostAnimationTestCheckerboardDoesntStartAnimations); | 819 LayerTreeHostAnimationTestCheckerboardDoesntStartAnimations); |
810 | 820 |
811 } // namespace | 821 } // namespace |
812 } // namespace cc | 822 } // namespace cc |
OLD | NEW |