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

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: Rebase. Address comments. 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 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 return 0; 300 return 0;
301 return (m_timeline->effectiveTime() - m_startTime) * m_playbackRate; 301 return (m_timeline->effectiveTime() - m_startTime) * m_playbackRate;
302 } 302 }
303 303
304 void AnimationPlayer::setCurrentTime(double newCurrentTime) 304 void AnimationPlayer::setCurrentTime(double newCurrentTime)
305 { 305 {
306 if (!std::isfinite(newCurrentTime)) 306 if (!std::isfinite(newCurrentTime))
307 return; 307 return;
308 308
309 setCompositorPending(); 309 setCompositorPending();
310 310 m_currentTimePending = false;
311 // Setting current time while pending forces a start time.
312 if (m_currentTimePending) {
313 m_startTime = 0;
314 m_currentTimePending = false;
315 }
316
317 setCurrentTimeInternal(newCurrentTime / 1000, TimingUpdateOnDemand); 311 setCurrentTimeInternal(newCurrentTime / 1000, TimingUpdateOnDemand);
318 } 312 }
319 313
320 void AnimationPlayer::setStartTime(double startTime) 314 void AnimationPlayer::setStartTime(double startTime)
321 { 315 {
322 if (m_paused) // FIXME: Should this throw an exception? 316 if (m_paused || m_idle)
323 return; 317 return;
324 if (!std::isfinite(startTime)) 318 if (!std::isfinite(startTime))
325 return; 319 return;
326 if (startTime == m_startTime) 320 if (startTime == m_startTime)
327 return; 321 return;
328 322
329 setCompositorPending(); 323 setCompositorPending();
330 m_currentTimePending = false; 324 m_currentTimePending = false;
331 setStartTimeInternal(startTime / 1000); 325 setStartTimeInternal(startTime / 1000);
332 } 326 }
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
465 m_finished = false; 459 m_finished = false;
466 } 460 }
467 461
468 void AnimationPlayer::reverse() 462 void AnimationPlayer::reverse()
469 { 463 {
470 if (!m_playbackRate) { 464 if (!m_playbackRate) {
471 return; 465 return;
472 } 466 }
473 467
474 uncancel(); 468 uncancel();
475
476 if (m_content) {
477 if (m_playbackRate > 0 && currentTimeInternal() > sourceEnd()) {
478 setCurrentTimeInternal(sourceEnd(), TimingUpdateOnDemand);
479 ASSERT(finished());
480 } else if (m_playbackRate < 0 && currentTimeInternal() < 0) {
481 setCurrentTimeInternal(0, TimingUpdateOnDemand);
482 ASSERT(finished());
483 }
484 }
485 setPlaybackRate(-m_playbackRate); 469 setPlaybackRate(-m_playbackRate);
486 unpauseInternal(); 470 play();
487 } 471 }
488 472
489 void AnimationPlayer::finish(ExceptionState& exceptionState) 473 void AnimationPlayer::finish(ExceptionState& exceptionState)
490 { 474 {
491 if (!m_playbackRate) { 475 if (!m_playbackRate || m_idle) {
492 return; 476 return;
493 } 477 }
494 if (m_playbackRate > 0 && sourceEnd() == std::numeric_limits<double>::infini ty()) { 478 if (m_playbackRate > 0 && sourceEnd() == std::numeric_limits<double>::infini ty()) {
495 exceptionState.throwDOMException(InvalidStateError, "AnimationPlayer has source content whose end time is infinity."); 479 exceptionState.throwDOMException(InvalidStateError, "AnimationPlayer has source content whose end time is infinity.");
496 return; 480 return;
497 } 481 }
498 if (playing()) { 482 if (playing()) {
499 setCompositorPending(); 483 setCompositorPending();
500 } 484 }
501 485
502 uncancel(); 486 uncancel();
503 m_startTime = 0;
504 487
505 if (m_playbackRate < 0) { 488 double newCurrentTime = m_playbackRate < 0 ? 0 : sourceEnd();
506 setCurrentTimeInternal(0, TimingUpdateOnDemand); 489 setCurrentTimeInternal(newCurrentTime, TimingUpdateOnDemand);
507 } else { 490 if (!paused()) {
508 setCurrentTimeInternal(sourceEnd(), TimingUpdateOnDemand); 491 m_startTime = calculateStartTime(newCurrentTime);
509 } 492 }
493
494 m_currentTimePending = false;
510 ASSERT(finished()); 495 ASSERT(finished());
511 } 496 }
512 497
513 const AtomicString& AnimationPlayer::interfaceName() const 498 const AtomicString& AnimationPlayer::interfaceName() const
514 { 499 {
515 return EventTargetNames::AnimationPlayer; 500 return EventTargetNames::AnimationPlayer;
516 } 501 }
517 502
518 ExecutionContext* AnimationPlayer::executionContext() const 503 ExecutionContext* AnimationPlayer::executionContext() const
519 { 504 {
(...skipping 19 matching lines...) Expand all
539 } 524 }
540 525
541 void AnimationPlayer::setPlaybackRate(double playbackRate) 526 void AnimationPlayer::setPlaybackRate(double playbackRate)
542 { 527 {
543 if (!std::isfinite(playbackRate)) 528 if (!std::isfinite(playbackRate))
544 return; 529 return;
545 if (playbackRate == m_playbackRate) 530 if (playbackRate == m_playbackRate)
546 return; 531 return;
547 532
548 setCompositorPending(); 533 setCompositorPending();
549 if (!finished() && !paused()) 534 if (!finished() && !paused() && hasStartTime())
550 m_currentTimePending = true; 535 m_currentTimePending = true;
551 536
552 double storedCurrentTime = currentTimeInternal(); 537 double storedCurrentTime = currentTimeInternal();
553 if ((m_playbackRate < 0 && playbackRate >= 0) || (m_playbackRate > 0 && play backRate <= 0)) 538 if ((m_playbackRate < 0 && playbackRate >= 0) || (m_playbackRate > 0 && play backRate <= 0))
554 m_finished = false; 539 m_finished = false;
555 540
556 m_playbackRate = playbackRate; 541 m_playbackRate = playbackRate;
557 m_startTime = std::numeric_limits<double>::quiet_NaN(); 542 m_startTime = std::numeric_limits<double>::quiet_NaN();
558 setCurrentTimeInternal(storedCurrentTime, TimingUpdateOnDemand); 543 setCurrentTimeInternal(storedCurrentTime, TimingUpdateOnDemand);
559 } 544 }
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
656 return m_content->timeToForwardsEffectChange() / m_playbackRate; 641 return m_content->timeToForwardsEffectChange() / m_playbackRate;
657 return m_content->timeToReverseEffectChange() / -m_playbackRate; 642 return m_content->timeToReverseEffectChange() / -m_playbackRate;
658 } 643 }
659 644
660 void AnimationPlayer::cancel() 645 void AnimationPlayer::cancel()
661 { 646 {
662 m_holdTime = currentTimeInternal(); 647 m_holdTime = currentTimeInternal();
663 m_held = true; 648 m_held = true;
664 m_idle = true; 649 m_idle = true;
665 m_startTime = nullValue(); 650 m_startTime = nullValue();
651 m_currentTimePending = false;
666 setCompositorPending(); 652 setCompositorPending();
667 } 653 }
668 654
669 #if !ENABLE(OILPAN) 655 #if !ENABLE(OILPAN)
670 bool AnimationPlayer::canFree() const 656 bool AnimationPlayer::canFree() const
671 { 657 {
672 ASSERT(m_content); 658 ASSERT(m_content);
673 return hasOneRef() && m_content->isAnimation() && m_content->hasOneRef(); 659 return hasOneRef() && m_content->isAnimation() && m_content->hasOneRef();
674 } 660 }
675 #endif 661 #endif
(...skipping 17 matching lines...) Expand all
693 679
694 void AnimationPlayer::trace(Visitor* visitor) 680 void AnimationPlayer::trace(Visitor* visitor)
695 { 681 {
696 visitor->trace(m_content); 682 visitor->trace(m_content);
697 visitor->trace(m_timeline); 683 visitor->trace(m_timeline);
698 visitor->trace(m_pendingFinishedEvent); 684 visitor->trace(m_pendingFinishedEvent);
699 EventTargetWithInlineData::trace(visitor); 685 EventTargetWithInlineData::trace(visitor);
700 } 686 }
701 687
702 } // namespace 688 } // namespace
OLDNEW
« no previous file with comments | « LayoutTests/web-animations-api/player-state-changes.html ('k') | Source/core/animation/AnimationPlayerTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698