summaryrefslogtreecommitdiffstats
path: root/layout/style/nsTransitionManager.h
diff options
context:
space:
mode:
Diffstat (limited to 'layout/style/nsTransitionManager.h')
-rw-r--r--layout/style/nsTransitionManager.h18
1 files changed, 17 insertions, 1 deletions
diff --git a/layout/style/nsTransitionManager.h b/layout/style/nsTransitionManager.h
index 56ec61572..80042adcd 100644
--- a/layout/style/nsTransitionManager.h
+++ b/layout/style/nsTransitionManager.h
@@ -162,6 +162,18 @@ public:
Animation::CancelFromStyle();
+ // The above call to Animation::CancelFromStyle may cause a transitioncancel
+ // event to be queued. However, it will also remove the transition from its
+ // timeline. If this transition was the last animation attached to
+ // the timeline, the timeline will stop observing the refresh driver and
+ // there may be no subsequent tick fro dispatching animation events.
+ //
+ // To ensure the cancel event is dispatched we tell the timeline it needs to
+ // observe the refresh driver for at least one more tick.
+ if (mTimeline) {
+ mTimeline->NotifyAnimationUpdated(*this);
+ }
+
// It is important we do this *after* calling CancelFromStyle().
// This is because CancelFromStyle() will end up posting a restyle and
// that restyle should target the *transitions* level of the cascade.
@@ -214,6 +226,10 @@ public:
const TimeDuration& aStartTime,
double aPlaybackRate);
+ void MaybeQueueCancelEvent(StickyTimeDuration aActiveTime) override {
+ QueueEvents(aActiveTime);
+ }
+
protected:
virtual ~CSSTransition()
{
@@ -225,7 +241,7 @@ protected:
void UpdateTiming(SeekFlag aSeekFlag,
SyncNotifyFlag aSyncNotifyFlag) override;
- void QueueEvents();
+ void QueueEvents(StickyTimeDuration activeTime = StickyTimeDuration());
// The (pseudo-)element whose computed transition-property refers to this
// transition (if any).