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

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

Issue 534193002: Web-Animations: Implement idle state for AnimationPlayers. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
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
« no previous file with comments | « Source/core/animation/AnimationPlayer.h ('k') | Source/core/animation/AnimationPlayerTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 { 45 {
46 static unsigned next = 0; 46 static unsigned next = 0;
47 return ++next; 47 return ++next;
48 } 48 }
49 49
50 } 50 }
51 51
52 PassRefPtrWillBeRawPtr<AnimationPlayer> AnimationPlayer::create(ExecutionContext * executionContext, AnimationTimeline& timeline, AnimationNode* content) 52 PassRefPtrWillBeRawPtr<AnimationPlayer> AnimationPlayer::create(ExecutionContext * executionContext, AnimationTimeline& timeline, AnimationNode* content)
53 { 53 {
54 RefPtrWillBeRawPtr<AnimationPlayer> player = adoptRefWillBeNoop(new Animatio nPlayer(executionContext, timeline, content)); 54 RefPtrWillBeRawPtr<AnimationPlayer> player = adoptRefWillBeNoop(new Animatio nPlayer(executionContext, timeline, content));
55 player->uncancel();
55 timeline.document()->compositorPendingAnimations().add(player.get()); 56 timeline.document()->compositorPendingAnimations().add(player.get());
56 player->suspendIfNeeded(); 57 player->suspendIfNeeded();
57 return player.release(); 58 return player.release();
58 } 59 }
59 60
60 AnimationPlayer::AnimationPlayer(ExecutionContext* executionContext, AnimationTi meline& timeline, AnimationNode* content) 61 AnimationPlayer::AnimationPlayer(ExecutionContext* executionContext, AnimationTi meline& timeline, AnimationNode* content)
61 : ActiveDOMObject(executionContext) 62 : ActiveDOMObject(executionContext)
62 , m_playbackRate(1) 63 , m_playbackRate(1)
63 , m_startTime(nullValue()) 64 , m_startTime(nullValue())
64 , m_holdTime(0) 65 , m_holdTime(0)
65 , m_sequenceNumber(nextSequenceNumber()) 66 , m_sequenceNumber(nextSequenceNumber())
66 , m_content(content) 67 , m_content(content)
67 , m_timeline(&timeline) 68 , m_timeline(&timeline)
68 , m_paused(false) 69 , m_paused(false)
69 , m_held(true) 70 , m_held(true)
70 , m_isPausedForTesting(false) 71 , m_isPausedForTesting(false)
71 , m_outdated(true) 72 , m_outdated(true)
72 , m_finished(false) 73 , m_finished(true)
73 , m_compositorState(nullptr) 74 , m_compositorState(nullptr)
74 , m_compositorPending(true) 75 , m_compositorPending(true)
75 , m_currentTimePending(false) 76 , m_currentTimePending(false)
77 , m_idle(true)
76 { 78 {
77 ScriptWrappable::init(this); 79 ScriptWrappable::init(this);
78 if (m_content) { 80 if (m_content) {
79 if (m_content->player()) 81 if (m_content->player()) {
80 m_content->player()->cancel(); 82 m_content->player()->cancel();
83 m_content->player()->setSource(0);
84 }
81 m_content->attach(this); 85 m_content->attach(this);
82 } 86 }
83 } 87 }
84 88
85 AnimationPlayer::~AnimationPlayer() 89 AnimationPlayer::~AnimationPlayer()
86 { 90 {
87 #if !ENABLE(OILPAN) 91 #if !ENABLE(OILPAN)
88 if (m_content) 92 if (m_content)
89 m_content->detach(); 93 m_content->detach();
90 if (m_timeline) 94 if (m_timeline)
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 m_holdTime = m_playbackRate < 0 ? 0 : sourceEnd(); 148 m_holdTime = m_playbackRate < 0 ? 0 : sourceEnd();
145 } 149 }
146 150
147 double AnimationPlayer::startTime() const 151 double AnimationPlayer::startTime() const
148 { 152 {
149 return m_startTime * 1000; 153 return m_startTime * 1000;
150 } 154 }
151 155
152 double AnimationPlayer::currentTime() 156 double AnimationPlayer::currentTime()
153 { 157 {
154 if (m_currentTimePending) 158 if (m_currentTimePending || m_idle)
155 return std::numeric_limits<double>::quiet_NaN(); 159 return std::numeric_limits<double>::quiet_NaN();
156 return currentTimeInternal() * 1000; 160 return currentTimeInternal() * 1000;
157 } 161 }
158 162
159 double AnimationPlayer::currentTimeInternal() 163 double AnimationPlayer::currentTimeInternal()
160 { 164 {
161 updateCurrentTimingState(TimingUpdateOnDemand); 165 updateCurrentTimingState(TimingUpdateOnDemand);
162 if (m_held) 166 if (m_held)
163 return m_holdTime; 167 return m_holdTime;
164 return calculateCurrentTime(); 168 return calculateCurrentTime();
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 return; 356 return;
353 357
354 setCompositorPending(true); 358 setCompositorPending(true);
355 359
356 double storedCurrentTime = currentTimeInternal(); 360 double storedCurrentTime = currentTimeInternal();
357 if (m_content) 361 if (m_content)
358 m_content->detach(); 362 m_content->detach();
359 m_content = newSource; 363 m_content = newSource;
360 if (newSource) { 364 if (newSource) {
361 // FIXME: This logic needs to be updated once groups are implemented 365 // FIXME: This logic needs to be updated once groups are implemented
362 if (newSource->player()) 366 if (newSource->player()) {
363 newSource->player()->cancel(); 367 newSource->player()->cancel();
368 newSource->player()->setSource(0);
369 }
364 newSource->attach(this); 370 newSource->attach(this);
365 setOutdated(); 371 setOutdated();
366 } 372 }
367 setCurrentTimeInternal(storedCurrentTime, TimingUpdateOnDemand); 373 setCurrentTimeInternal(storedCurrentTime, TimingUpdateOnDemand);
368 } 374 }
369 375
370 String AnimationPlayer::playState() 376 String AnimationPlayer::playState()
371 { 377 {
372 switch (playStateInternal()) { 378 switch (playStateInternal()) {
373 case Idle: 379 case Idle:
374 return "idle"; 380 return "idle";
375 case Pending: 381 case Pending:
376 return "pending"; 382 return "pending";
377 case Running: 383 case Running:
378 return "running"; 384 return "running";
379 case Paused: 385 case Paused:
380 return "paused"; 386 return "paused";
381 case Finished: 387 case Finished:
382 return "finished"; 388 return "finished";
383 default: 389 default:
384 ASSERT_NOT_REACHED(); 390 ASSERT_NOT_REACHED();
385 return ""; 391 return "";
386 } 392 }
387 } 393 }
388 394
389 AnimationPlayer::AnimationPlayState AnimationPlayer::playStateInternal() 395 AnimationPlayer::AnimationPlayState AnimationPlayer::playStateInternal()
390 { 396 {
391 // FIXME(shanestephens): Add clause for in-idle-state here. 397 if (m_idle)
398 return Idle;
392 if (m_currentTimePending || (isNull(m_startTime) && !m_paused && m_playbackR ate != 0)) 399 if (m_currentTimePending || (isNull(m_startTime) && !m_paused && m_playbackR ate != 0))
393 return Pending; 400 return Pending;
394 // FIXME(shanestephens): Add idle handling here.
395 if (m_paused) 401 if (m_paused)
396 return Paused; 402 return Paused;
397 if (finished()) 403 if (finished())
398 return Finished; 404 return Finished;
399 return Running; 405 return Running;
400 } 406 }
401 407
402 void AnimationPlayer::pause() 408 void AnimationPlayer::pause()
403 { 409 {
404 if (m_paused) 410 if (m_paused)
(...skipping 22 matching lines...) Expand all
427 m_paused = false; 433 m_paused = false;
428 setCurrentTimeInternal(currentTimeInternal(), TimingUpdateOnDemand); 434 setCurrentTimeInternal(currentTimeInternal(), TimingUpdateOnDemand);
429 } 435 }
430 436
431 void AnimationPlayer::play() 437 void AnimationPlayer::play()
432 { 438 {
433 if (!playing()) 439 if (!playing())
434 m_startTime = nullValue(); 440 m_startTime = nullValue();
435 441
436 setCompositorPending(); 442 setCompositorPending();
443 uncancel();
437 unpauseInternal(); 444 unpauseInternal();
438 if (!m_content) 445 if (!m_content)
439 return; 446 return;
440 double currentTime = this->currentTimeInternal(); 447 double currentTime = this->currentTimeInternal();
441 if (m_playbackRate > 0 && (currentTime < 0 || currentTime >= sourceEnd())) 448 if (m_playbackRate > 0 && (currentTime < 0 || currentTime >= sourceEnd()))
442 setCurrentTimeInternal(0, TimingUpdateOnDemand); 449 setCurrentTimeInternal(0, TimingUpdateOnDemand);
443 else if (m_playbackRate < 0 && (currentTime <= 0 || currentTime > sourceEnd( ))) 450 else if (m_playbackRate < 0 && (currentTime <= 0 || currentTime > sourceEnd( )))
444 setCurrentTimeInternal(sourceEnd(), TimingUpdateOnDemand); 451 setCurrentTimeInternal(sourceEnd(), TimingUpdateOnDemand);
445 m_finished = false; 452 m_finished = false;
446 } 453 }
447 454
448 void AnimationPlayer::reverse() 455 void AnimationPlayer::reverse()
449 { 456 {
450 if (!m_playbackRate) { 457 if (!m_playbackRate) {
451 return; 458 return;
452 } 459 }
460
461 uncancel();
462
453 if (m_content) { 463 if (m_content) {
454 if (m_playbackRate > 0 && currentTimeInternal() > sourceEnd()) { 464 if (m_playbackRate > 0 && currentTimeInternal() > sourceEnd()) {
455 setCurrentTimeInternal(sourceEnd(), TimingUpdateOnDemand); 465 setCurrentTimeInternal(sourceEnd(), TimingUpdateOnDemand);
456 ASSERT(finished()); 466 ASSERT(finished());
457 } else if (m_playbackRate < 0 && currentTimeInternal() < 0) { 467 } else if (m_playbackRate < 0 && currentTimeInternal() < 0) {
458 setCurrentTimeInternal(0, TimingUpdateOnDemand); 468 setCurrentTimeInternal(0, TimingUpdateOnDemand);
459 ASSERT(finished()); 469 ASSERT(finished());
460 } 470 }
461 } 471 }
462 setPlaybackRate(-m_playbackRate); 472 setPlaybackRate(-m_playbackRate);
463 unpauseInternal(); 473 unpauseInternal();
464 } 474 }
465 475
466 void AnimationPlayer::finish(ExceptionState& exceptionState) 476 void AnimationPlayer::finish(ExceptionState& exceptionState)
467 { 477 {
468 if (!m_playbackRate) { 478 if (!m_playbackRate) {
469 return; 479 return;
470 } 480 }
471 if (m_playbackRate > 0 && sourceEnd() == std::numeric_limits<double>::infini ty()) { 481 if (m_playbackRate > 0 && sourceEnd() == std::numeric_limits<double>::infini ty()) {
472 exceptionState.throwDOMException(InvalidStateError, "AnimationPlayer has source content whose end time is infinity."); 482 exceptionState.throwDOMException(InvalidStateError, "AnimationPlayer has source content whose end time is infinity.");
473 return; 483 return;
474 } 484 }
475 if (playing()) { 485 if (playing()) {
476 setCompositorPending(); 486 setCompositorPending();
477 } 487 }
488
489 uncancel();
490 m_startTime = 0;
491
478 if (m_playbackRate < 0) { 492 if (m_playbackRate < 0) {
479 setCurrentTimeInternal(0, TimingUpdateOnDemand); 493 setCurrentTimeInternal(0, TimingUpdateOnDemand);
480 } else { 494 } else {
481 setCurrentTimeInternal(sourceEnd(), TimingUpdateOnDemand); 495 setCurrentTimeInternal(sourceEnd(), TimingUpdateOnDemand);
482 } 496 }
483 ASSERT(finished()); 497 ASSERT(finished());
484 } 498 }
485 499
486 const AtomicString& AnimationPlayer::interfaceName() const 500 const AtomicString& AnimationPlayer::interfaceName() const
487 { 501 {
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
589 } 603 }
590 604
591 bool AnimationPlayer::update(TimingUpdateReason reason) 605 bool AnimationPlayer::update(TimingUpdateReason reason)
592 { 606 {
593 if (!m_timeline) 607 if (!m_timeline)
594 return false; 608 return false;
595 609
596 updateCurrentTimingState(reason); 610 updateCurrentTimingState(reason);
597 m_outdated = false; 611 m_outdated = false;
598 612
599 if (m_content) { 613 if (m_content && !m_idle) {
600 double inheritedTime = isNull(m_timeline->currentTimeInternal()) ? nullV alue() : currentTimeInternal(); 614 double inheritedTime = isNull(m_timeline->currentTimeInternal()) ? nullV alue() : currentTimeInternal();
601 m_content->updateInheritedTime(inheritedTime, reason); 615 m_content->updateInheritedTime(inheritedTime, reason);
602 } 616 }
603 617
604 if (finished() && !m_finished) { 618 if ((m_idle || finished()) && !m_finished) {
605 if (reason == TimingUpdateForAnimationFrame && hasStartTime()) { 619 if (reason == TimingUpdateForAnimationFrame && (m_idle || hasStartTime() )) {
606 const AtomicString& eventType = EventTypeNames::finish; 620 const AtomicString& eventType = EventTypeNames::finish;
607 if (executionContext() && hasEventListeners(eventType)) { 621 if (executionContext() && hasEventListeners(eventType)) {
608 m_pendingFinishedEvent = AnimationPlayerEvent::create(eventType, currentTime(), timeline()->currentTime()); 622 m_pendingFinishedEvent = AnimationPlayerEvent::create(eventType, currentTime(), timeline()->currentTime());
609 m_pendingFinishedEvent->setTarget(this); 623 m_pendingFinishedEvent->setTarget(this);
610 m_pendingFinishedEvent->setCurrentTarget(this); 624 m_pendingFinishedEvent->setCurrentTarget(this);
611 m_timeline->document()->enqueueAnimationFrameEvent(m_pendingFini shedEvent); 625 m_timeline->document()->enqueueAnimationFrameEvent(m_pendingFini shedEvent);
612 } 626 }
613 m_finished = true; 627 m_finished = true;
614 } 628 }
615 } 629 }
616 ASSERT(!m_outdated); 630 ASSERT(!m_outdated);
617 return !m_finished || !finished(); 631 return !m_finished;
618 } 632 }
619 633
620 double AnimationPlayer::timeToEffectChange() 634 double AnimationPlayer::timeToEffectChange()
621 { 635 {
622 ASSERT(!m_outdated); 636 ASSERT(!m_outdated);
623 if (m_held || !hasStartTime()) 637 if (m_held || !hasStartTime())
624 return std::numeric_limits<double>::infinity(); 638 return std::numeric_limits<double>::infinity();
625 if (!m_content) 639 if (!m_content)
626 return -currentTimeInternal() / m_playbackRate; 640 return -currentTimeInternal() / m_playbackRate;
627 if (m_playbackRate > 0) 641 if (m_playbackRate > 0)
628 return m_content->timeToForwardsEffectChange() / m_playbackRate; 642 return m_content->timeToForwardsEffectChange() / m_playbackRate;
629 return m_content->timeToReverseEffectChange() / -m_playbackRate; 643 return m_content->timeToReverseEffectChange() / -m_playbackRate;
630 } 644 }
631 645
632 void AnimationPlayer::cancel() 646 void AnimationPlayer::cancel()
633 { 647 {
634 setSource(0); 648 m_idle = true;
649 m_startTime = nullValue();
650 setCompositorPending();
635 } 651 }
636 652
637 #if !ENABLE(OILPAN) 653 #if !ENABLE(OILPAN)
638 bool AnimationPlayer::canFree() const 654 bool AnimationPlayer::canFree() const
639 { 655 {
640 ASSERT(m_content); 656 ASSERT(m_content);
641 return hasOneRef() && m_content->isAnimation() && m_content->hasOneRef(); 657 return hasOneRef() && m_content->isAnimation() && m_content->hasOneRef();
642 } 658 }
643 #endif 659 #endif
644 660
(...skipping 16 matching lines...) Expand all
661 677
662 void AnimationPlayer::trace(Visitor* visitor) 678 void AnimationPlayer::trace(Visitor* visitor)
663 { 679 {
664 visitor->trace(m_content); 680 visitor->trace(m_content);
665 visitor->trace(m_timeline); 681 visitor->trace(m_timeline);
666 visitor->trace(m_pendingFinishedEvent); 682 visitor->trace(m_pendingFinishedEvent);
667 EventTargetWithInlineData::trace(visitor); 683 EventTargetWithInlineData::trace(visitor);
668 } 684 }
669 685
670 } // namespace 686 } // namespace
OLDNEW
« no previous file with comments | « Source/core/animation/AnimationPlayer.h ('k') | Source/core/animation/AnimationPlayerTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698