summaryrefslogtreecommitdiff
path: root/layout
diff options
context:
space:
mode:
authorjanekptacijarabaci <janekptacijarabaci@seznam.cz>2018-03-14 09:16:03 +0100
committerjanekptacijarabaci <janekptacijarabaci@seznam.cz>2018-03-14 09:16:03 +0100
commit34ef9d4683b3e81b8df1be1a9c38eae331e8c398 (patch)
tree2536466cf07202d6502938eb004d9c2f672def84 /layout
parent4644a03770ef95fd3acbaa205fae339b3a99f599 (diff)
downloaduxp-34ef9d4683b3e81b8df1be1a9c38eae331e8c398.tar.gz
Bug 1264125: Call the queueing events when canceling transition via Style or Script
Issue #55
Diffstat (limited to 'layout')
-rw-r--r--layout/style/nsTransitionManager.cpp9
-rw-r--r--layout/style/nsTransitionManager.h18
2 files changed, 20 insertions, 7 deletions
diff --git a/layout/style/nsTransitionManager.cpp b/layout/style/nsTransitionManager.cpp
index 4a5ecdef6d..da12a0ecdb 100644
--- a/layout/style/nsTransitionManager.cpp
+++ b/layout/style/nsTransitionManager.cpp
@@ -180,7 +180,7 @@ CSSTransition::UpdateTiming(SeekFlag aSeekFlag, SyncNotifyFlag aSyncNotifyFlag)
}
void
-CSSTransition::QueueEvents()
+CSSTransition::QueueEvents(StickyTimeDuration aActiveTime)
{
if (!mEffect ||
!mOwningElement.IsSet()) {
@@ -230,12 +230,9 @@ CSSTransition::QueueEvents()
// Handle cancel events firts
if (mPreviousTransitionPhase != TransitionPhase::Idle &&
currentPhase == TransitionPhase::Idle) {
- // FIXME: bug 1264125: We will need to get active time when cancelling
- // the transition.
- StickyTimeDuration activeTime(0);
- TimeStamp activeTimeStamp = ElapsedTimeToTimeStamp(activeTime);
+ TimeStamp activeTimeStamp = ElapsedTimeToTimeStamp(aActiveTime);
events.AppendElement(TransitionEventParams{ eTransitionCancel,
- activeTime,
+ aActiveTime,
activeTimeStamp });
}
diff --git a/layout/style/nsTransitionManager.h b/layout/style/nsTransitionManager.h
index 56ec61572b..80042adcdf 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).