| Index: third_party/WebKit/Source/core/animation/TimingInput.cpp
|
| diff --git a/third_party/WebKit/Source/core/animation/TimingInput.cpp b/third_party/WebKit/Source/core/animation/TimingInput.cpp
|
| index 84f837f22892bd8531a5356988543b8128e8c4a6..e8f197e2f1a884ccb0fb265d13875a5b08ecaceb 100644
|
| --- a/third_party/WebKit/Source/core/animation/TimingInput.cpp
|
| +++ b/third_party/WebKit/Source/core/animation/TimingInput.cpp
|
| @@ -41,28 +41,48 @@ void TimingInput::setFillMode(Timing& timing, const String& fillMode)
|
| }
|
| }
|
|
|
| -void TimingInput::setIterationStart(Timing& timing, double iterationStart)
|
| +bool TimingInput::setIterationStart(Timing& timing, double iterationStart, ExceptionState& exceptionState)
|
| {
|
| - if (std::isfinite(iterationStart))
|
| - timing.iterationStart = std::max<double>(iterationStart, 0);
|
| - else
|
| - timing.iterationStart = Timing::defaults().iterationStart;
|
| + ASSERT(std::isfinite(iterationStart));
|
| + if (std::isnan(iterationStart) || iterationStart < 0) {
|
| + exceptionState.throwTypeError("iterationStart must be non-negative.");
|
| + return false;
|
| + }
|
| + timing.iterationStart = iterationStart;
|
| + return true;
|
| }
|
|
|
| -void TimingInput::setIterationCount(Timing& timing, double iterationCount)
|
| +bool TimingInput::setIterationCount(Timing& timing, double iterationCount, ExceptionState& exceptionState)
|
| {
|
| - if (!std::isnan(iterationCount))
|
| - timing.iterationCount = std::max<double>(iterationCount, 0);
|
| - else
|
| - timing.iterationCount = Timing::defaults().iterationCount;
|
| + if (std::isnan(iterationCount) || iterationCount < 0) {
|
| + exceptionState.throwTypeError("iterationCount must be non-negative.");
|
| + return false;
|
| + }
|
| + timing.iterationCount = iterationCount;
|
| + return true;
|
| }
|
|
|
| -void TimingInput::setIterationDuration(Timing& timing, double iterationDuration)
|
| +bool TimingInput::setIterationDuration(Timing& timing, const UnrestrictedDoubleOrString& iterationDuration, ExceptionState& exceptionState)
|
| {
|
| - if (!std::isnan(iterationDuration) && iterationDuration >= 0)
|
| - timing.iterationDuration = iterationDuration / 1000;
|
| - else
|
| - timing.iterationDuration = Timing::defaults().iterationDuration;
|
| + static const char* errorMessage = "duration must be non-negative or auto.";
|
| +
|
| + if (iterationDuration.isUnrestrictedDouble()) {
|
| + double durationNumber = iterationDuration.getAsUnrestrictedDouble();
|
| + if (std::isnan(durationNumber) || durationNumber < 0) {
|
| + exceptionState.throwTypeError(errorMessage);
|
| + return false;
|
| + }
|
| + timing.iterationDuration = durationNumber / 1000;
|
| + return true;
|
| + }
|
| +
|
| + if (iterationDuration.getAsString() != "auto") {
|
| + exceptionState.throwTypeError(errorMessage);
|
| + return false;
|
| + }
|
| +
|
| + timing.iterationDuration = Timing::defaults().iterationDuration;
|
| + return true;
|
| }
|
|
|
| void TimingInput::setPlaybackRate(Timing& timing, double playbackRate)
|
| @@ -100,14 +120,19 @@ bool TimingInput::convert(const KeyframeEffectOptions& timingInput, Timing& timi
|
| setStartDelay(timingOutput, timingInput.delay());
|
| setEndDelay(timingOutput, timingInput.endDelay());
|
| setFillMode(timingOutput, timingInput.fill());
|
| - setIterationStart(timingOutput, timingInput.iterationStart());
|
| - setIterationCount(timingOutput, timingInput.iterations());
|
| - if (timingInput.duration().isUnrestrictedDouble())
|
| - setIterationDuration(timingOutput, timingInput.duration().getAsUnrestrictedDouble());
|
| - else
|
| - setIterationDuration(timingOutput, -1);
|
| +
|
| + if (!setIterationStart(timingOutput, timingInput.iterationStart(), exceptionState))
|
| + return false;
|
| +
|
| + if (!setIterationCount(timingOutput, timingInput.iterations(), exceptionState))
|
| + return false;
|
| +
|
| + if (!setIterationDuration(timingOutput, timingInput.duration(), exceptionState))
|
| + return false;
|
| +
|
| setPlaybackRate(timingOutput, timingInput.playbackRate());
|
| setPlaybackDirection(timingOutput, timingInput.direction());
|
| +
|
| if (!setTimingFunction(timingOutput, timingInput.easing(), document, exceptionState))
|
| return false;
|
|
|
| @@ -116,11 +141,10 @@ bool TimingInput::convert(const KeyframeEffectOptions& timingInput, Timing& timi
|
| return true;
|
| }
|
|
|
| -Timing TimingInput::convert(double duration)
|
| +bool TimingInput::convert(double duration, Timing& timingOutput, ExceptionState& exceptionState)
|
| {
|
| - Timing result;
|
| - setIterationDuration(result, duration);
|
| - return result;
|
| + ASSERT(timingOutput == Timing::defaults());
|
| + return setIterationDuration(timingOutput, UnrestrictedDoubleOrString::fromUnrestrictedDouble(duration), exceptionState);
|
| }
|
|
|
| } // namespace blink
|
|
|