Commit 55aa8afe authored by Stephen McGruer's avatar Stephen McGruer Committed by Commit Bot

Web Animations: give ComputedEffectTiming::endTime a lower bound of 0

The spec defined the calculation clearly, but we had missed the
lower bound:

https://drafts.csswg.org/web-animations-1/#end-time

Bug: 827623
Change-Id: If7ae487d0be09753b2357f1379a2f225a7861bae
Reviewed-on: https://chromium-review.googlesource.com/989428Reviewed-by: default avatarXida Chen <xidachen@chromium.org>
Commit-Queue: Stephen McGruer <smcgruer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#547685}
parent 9a549511
This is a testharness.js-based test.
PASS values of getComputedTiming() when a KeyframeEffect is constructed without any KeyframeEffectOptions object
PASS values of getComputedTiming() when a KeyframeEffect is constructed by an empty KeyframeEffectOptions object
PASS values of getComputedTiming() when a KeyframeEffect is constructed by a normal KeyframeEffectOptions object
PASS values of getComputedTiming() when a KeyframeEffect is constructed by a double value
PASS values of getComputedTiming() when a KeyframeEffect is constructed by +Infinity
PASS values of getComputedTiming() when a KeyframeEffect is constructed by an Infinity duration
PASS values of getComputedTiming() when a KeyframeEffect is constructed by an auto duration
PASS values of getComputedTiming() when a KeyframeEffect is constructed by an Infinity iterations
PASS values of getComputedTiming() when a KeyframeEffect is constructed by an auto fill
PASS values of getComputedTiming() when a KeyframeEffect is constructed by a forwards fill
PASS getComputedTiming().activeDuration for an empty KeyframeEffectOptions object
PASS getComputedTiming().activeDuration for a non-zero duration and default iteration count
PASS getComputedTiming().activeDuration for a non-zero duration and integral iteration count
PASS getComputedTiming().activeDuration for a non-zero duration and fractional iteration count
PASS getComputedTiming().activeDuration for an non-zero duration and infinite iteration count
PASS getComputedTiming().activeDuration for an non-zero duration and zero iteration count
PASS getComputedTiming().activeDuration for a zero duration and default iteration count
PASS getComputedTiming().activeDuration for a zero duration and fractional iteration count
PASS getComputedTiming().activeDuration for a zero duration and infinite iteration count
PASS getComputedTiming().activeDuration for a zero duration and zero iteration count
PASS getComputedTiming().activeDuration for an infinite duration and default iteration count
PASS getComputedTiming().activeDuration for an infinite duration and zero iteration count
PASS getComputedTiming().activeDuration for an infinite duration and fractional iteration count
PASS getComputedTiming().activeDuration for an infinite duration and infinite iteration count
PASS getComputedTiming().endTime for an empty KeyframeEffectOptions object
PASS getComputedTiming().endTime for a non-zero duration and default iteration count
PASS getComputedTiming().endTime for a non-zero duration and non-default iteration count
PASS getComputedTiming().endTime for a non-zero duration and non-zero delay
PASS getComputedTiming().endTime for a non-zero duration, non-zero delay and non-default iteration
PASS getComputedTiming().endTime for an infinite iteration count
PASS getComputedTiming().endTime for an infinite duration
PASS getComputedTiming().endTime for an infinite duration and delay
PASS getComputedTiming().endTime for an infinite duration and negative delay
PASS getComputedTiming().endTime for an non-zero duration and negative delay
FAIL getComputedTiming().endTime for an non-zero duration and negative delay greater than active duration assert_equals: expected 0 but got -1000
FAIL getComputedTiming().endTime for a zero duration and negative delay assert_equals: expected 0 but got -1000
Harness: the test ran to completion.
...@@ -85,6 +85,13 @@ double AnimationEffect::ActiveDurationInternal() const { ...@@ -85,6 +85,13 @@ double AnimationEffect::ActiveDurationInternal() const {
return result; return result;
} }
double AnimationEffect::EndTimeInternal() const {
// Per the spec, the end time has a lower bound of 0.0:
// https://drafts.csswg.org/web-animations-1/#end-time
return std::max(
timing_.start_delay + ActiveDurationInternal() + timing_.end_delay, 0.0);
}
void AnimationEffect::UpdateSpecifiedTiming(const Timing& timing) { void AnimationEffect::UpdateSpecifiedTiming(const Timing& timing) {
// FIXME: Test whether the timing is actually different? // FIXME: Test whether the timing is actually different?
timing_ = timing; timing_ = timing;
......
...@@ -108,10 +108,7 @@ class CORE_EXPORT AnimationEffect : public ScriptWrappable { ...@@ -108,10 +108,7 @@ class CORE_EXPORT AnimationEffect : public ScriptWrappable {
double IterationDuration() const; double IterationDuration() const;
double ActiveDurationInternal() const; double ActiveDurationInternal() const;
double EndTimeInternal() const { double EndTimeInternal() const;
return SpecifiedTiming().start_delay + ActiveDurationInternal() +
SpecifiedTiming().end_delay;
}
const Timing& SpecifiedTiming() const { return timing_; } const Timing& SpecifiedTiming() const { return timing_; }
virtual AnimationEffectTimingReadOnly* timing(); virtual AnimationEffectTimingReadOnly* timing();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment