Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(116)

Side by Side Diff: Source/core/animation/AnimationPlayer.cpp

Issue 555063002: Web Animations: Add tests for player state transitions and fix discovered issues (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 if (m_currentTimePending) { 298 if (m_currentTimePending) {
299 m_startTime = 0; 299 m_startTime = 0;
300 m_currentTimePending = false; 300 m_currentTimePending = false;
301 } 301 }
302 302
303 setCurrentTimeInternal(newCurrentTime / 1000, TimingUpdateOnDemand); 303 setCurrentTimeInternal(newCurrentTime / 1000, TimingUpdateOnDemand);
304 } 304 }
305 305
306 void AnimationPlayer::setStartTime(double startTime) 306 void AnimationPlayer::setStartTime(double startTime)
307 { 307 {
308 if (m_paused) // FIXME: Should this throw an exception? 308 if (m_paused || m_idle)
309 return; 309 return;
310 if (!std::isfinite(startTime)) 310 if (!std::isfinite(startTime))
311 return; 311 return;
312 if (startTime == m_startTime) 312 if (startTime == m_startTime)
313 return; 313 return;
314 314
315 setCompositorPending(); 315 setCompositorPending();
316 m_currentTimePending = false; 316 m_currentTimePending = false;
317 setStartTimeInternal(startTime / 1000); 317 setStartTimeInternal(startTime / 1000);
318 } 318 }
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 m_finished = false; 451 m_finished = false;
452 } 452 }
453 453
454 void AnimationPlayer::reverse() 454 void AnimationPlayer::reverse()
455 { 455 {
456 if (!m_playbackRate) { 456 if (!m_playbackRate) {
457 return; 457 return;
458 } 458 }
459 459
460 uncancel(); 460 uncancel();
461
462 if (m_content) {
463 if (m_playbackRate > 0 && currentTimeInternal() > sourceEnd()) {
464 setCurrentTimeInternal(sourceEnd(), TimingUpdateOnDemand);
465 ASSERT(finished());
466 } else if (m_playbackRate < 0 && currentTimeInternal() < 0) {
467 setCurrentTimeInternal(0, TimingUpdateOnDemand);
468 ASSERT(finished());
469 }
470 }
471 setPlaybackRate(-m_playbackRate); 461 setPlaybackRate(-m_playbackRate);
472 unpauseInternal(); 462 play();
473 } 463 }
474 464
475 void AnimationPlayer::finish(ExceptionState& exceptionState) 465 void AnimationPlayer::finish(ExceptionState& exceptionState)
476 { 466 {
477 if (!m_playbackRate) { 467 if (!m_playbackRate) {
478 return; 468 return;
479 } 469 }
480 if (m_playbackRate > 0 && sourceEnd() == std::numeric_limits<double>::infini ty()) { 470 if (m_playbackRate > 0 && sourceEnd() == std::numeric_limits<double>::infini ty()) {
481 exceptionState.throwDOMException(InvalidStateError, "AnimationPlayer has source content whose end time is infinity."); 471 exceptionState.throwDOMException(InvalidStateError, "AnimationPlayer has source content whose end time is infinity.");
482 return; 472 return;
483 } 473 }
484 if (playing()) { 474 if (playing()) {
485 setCompositorPending(); 475 setCompositorPending();
486 } 476 }
487 477
488 uncancel(); 478 uncancel();
489 m_startTime = 0;
490 479
491 if (m_playbackRate < 0) { 480 double newCurrentTime = m_playbackRate < 0 ? 0 : sourceEnd();
492 setCurrentTimeInternal(0, TimingUpdateOnDemand); 481 setCurrentTimeInternal(newCurrentTime, TimingUpdateOnDemand);
493 } else { 482 if (!paused()) {
494 setCurrentTimeInternal(sourceEnd(), TimingUpdateOnDemand); 483 m_startTime = calculateStartTime(newCurrentTime);
495 } 484 }
485
486 m_currentTimePending = false;
496 ASSERT(finished()); 487 ASSERT(finished());
497 } 488 }
498 489
499 const AtomicString& AnimationPlayer::interfaceName() const 490 const AtomicString& AnimationPlayer::interfaceName() const
500 { 491 {
501 return EventTargetNames::AnimationPlayer; 492 return EventTargetNames::AnimationPlayer;
502 } 493 }
503 494
504 ExecutionContext* AnimationPlayer::executionContext() const 495 ExecutionContext* AnimationPlayer::executionContext() const
505 { 496 {
(...skipping 19 matching lines...) Expand all
525 } 516 }
526 517
527 void AnimationPlayer::setPlaybackRate(double playbackRate) 518 void AnimationPlayer::setPlaybackRate(double playbackRate)
528 { 519 {
529 if (!std::isfinite(playbackRate)) 520 if (!std::isfinite(playbackRate))
530 return; 521 return;
531 if (playbackRate == m_playbackRate) 522 if (playbackRate == m_playbackRate)
532 return; 523 return;
533 524
534 setCompositorPending(); 525 setCompositorPending();
535 if (!finished() && !paused()) 526 if (!finished() && !paused() && hasStartTime())
536 m_currentTimePending = true; 527 m_currentTimePending = true;
537 528
538 double storedCurrentTime = currentTimeInternal(); 529 double storedCurrentTime = currentTimeInternal();
539 if ((m_playbackRate < 0 && playbackRate >= 0) || (m_playbackRate > 0 && play backRate <= 0)) 530 if ((m_playbackRate < 0 && playbackRate >= 0) || (m_playbackRate > 0 && play backRate <= 0))
540 m_finished = false; 531 m_finished = false;
541 532
542 m_playbackRate = playbackRate; 533 m_playbackRate = playbackRate;
543 m_startTime = std::numeric_limits<double>::quiet_NaN(); 534 m_startTime = std::numeric_limits<double>::quiet_NaN();
544 setCurrentTimeInternal(storedCurrentTime, TimingUpdateOnDemand); 535 setCurrentTimeInternal(storedCurrentTime, TimingUpdateOnDemand);
545 } 536 }
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 return m_content->timeToForwardsEffectChange() / m_playbackRate; 633 return m_content->timeToForwardsEffectChange() / m_playbackRate;
643 return m_content->timeToReverseEffectChange() / -m_playbackRate; 634 return m_content->timeToReverseEffectChange() / -m_playbackRate;
644 } 635 }
645 636
646 void AnimationPlayer::cancel() 637 void AnimationPlayer::cancel()
647 { 638 {
648 m_holdTime = currentTimeInternal(); 639 m_holdTime = currentTimeInternal();
649 m_held = true; 640 m_held = true;
650 m_idle = true; 641 m_idle = true;
651 m_startTime = nullValue(); 642 m_startTime = nullValue();
643 m_currentTimePending = false;
652 setCompositorPending(); 644 setCompositorPending();
653 } 645 }
654 646
655 #if !ENABLE(OILPAN) 647 #if !ENABLE(OILPAN)
656 bool AnimationPlayer::canFree() const 648 bool AnimationPlayer::canFree() const
657 { 649 {
658 ASSERT(m_content); 650 ASSERT(m_content);
659 return hasOneRef() && m_content->isAnimation() && m_content->hasOneRef(); 651 return hasOneRef() && m_content->isAnimation() && m_content->hasOneRef();
660 } 652 }
661 #endif 653 #endif
(...skipping 17 matching lines...) Expand all
679 671
680 void AnimationPlayer::trace(Visitor* visitor) 672 void AnimationPlayer::trace(Visitor* visitor)
681 { 673 {
682 visitor->trace(m_content); 674 visitor->trace(m_content);
683 visitor->trace(m_timeline); 675 visitor->trace(m_timeline);
684 visitor->trace(m_pendingFinishedEvent); 676 visitor->trace(m_pendingFinishedEvent);
685 EventTargetWithInlineData::trace(visitor); 677 EventTargetWithInlineData::trace(visitor);
686 } 678 }
687 679
688 } // namespace 680 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698