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

Unified Diff: third_party/WebKit/Source/core/animation/TimingInput.cpp

Issue 1906463002: Web Animations: Throw TypeErrors for invalid timing parameters (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix unit tests Created 4 years, 8 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 side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « third_party/WebKit/Source/core/animation/TimingInput.h ('k') | third_party/WebKit/Source/core/animation/TimingInputTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698