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

Side by Side 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, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/animation/TimingInput.h" 5 #include "core/animation/TimingInput.h"
6 6
7 #include "bindings/core/v8/ExceptionState.h" 7 #include "bindings/core/v8/ExceptionState.h"
8 #include "core/animation/AnimationInputHelpers.h" 8 #include "core/animation/AnimationInputHelpers.h"
9 #include "core/animation/KeyframeEffectOptions.h" 9 #include "core/animation/KeyframeEffectOptions.h"
10 10
(...skipping 23 matching lines...) Expand all
34 timing.fillMode = Timing::FillModeBackwards; 34 timing.fillMode = Timing::FillModeBackwards;
35 } else if (fillMode == "both") { 35 } else if (fillMode == "both") {
36 timing.fillMode = Timing::FillModeBoth; 36 timing.fillMode = Timing::FillModeBoth;
37 } else if (fillMode == "forwards") { 37 } else if (fillMode == "forwards") {
38 timing.fillMode = Timing::FillModeForwards; 38 timing.fillMode = Timing::FillModeForwards;
39 } else { 39 } else {
40 timing.fillMode = Timing::defaults().fillMode; 40 timing.fillMode = Timing::defaults().fillMode;
41 } 41 }
42 } 42 }
43 43
44 void TimingInput::setIterationStart(Timing& timing, double iterationStart) 44 bool TimingInput::setIterationStart(Timing& timing, double iterationStart, Excep tionState& exceptionState)
45 { 45 {
46 if (std::isfinite(iterationStart)) 46 ASSERT(std::isfinite(iterationStart));
47 timing.iterationStart = std::max<double>(iterationStart, 0); 47 if (std::isnan(iterationStart) || iterationStart < 0) {
48 else 48 exceptionState.throwTypeError("iterationStart must be non-negative.");
49 timing.iterationStart = Timing::defaults().iterationStart; 49 return false;
50 }
51 timing.iterationStart = iterationStart;
52 return true;
50 } 53 }
51 54
52 void TimingInput::setIterationCount(Timing& timing, double iterationCount) 55 bool TimingInput::setIterationCount(Timing& timing, double iterationCount, Excep tionState& exceptionState)
53 { 56 {
54 if (!std::isnan(iterationCount)) 57 if (std::isnan(iterationCount) || iterationCount < 0) {
55 timing.iterationCount = std::max<double>(iterationCount, 0); 58 exceptionState.throwTypeError("iterationCount must be non-negative.");
56 else 59 return false;
57 timing.iterationCount = Timing::defaults().iterationCount; 60 }
61 timing.iterationCount = iterationCount;
62 return true;
58 } 63 }
59 64
60 void TimingInput::setIterationDuration(Timing& timing, double iterationDuration) 65 bool TimingInput::setIterationDuration(Timing& timing, const UnrestrictedDoubleO rString& iterationDuration, ExceptionState& exceptionState)
61 { 66 {
62 if (!std::isnan(iterationDuration) && iterationDuration >= 0) 67 static const char* errorMessage = "duration must be non-negative or auto.";
63 timing.iterationDuration = iterationDuration / 1000; 68
64 else 69 if (iterationDuration.isUnrestrictedDouble()) {
65 timing.iterationDuration = Timing::defaults().iterationDuration; 70 double durationNumber = iterationDuration.getAsUnrestrictedDouble();
71 if (std::isnan(durationNumber) || durationNumber < 0) {
72 exceptionState.throwTypeError(errorMessage);
73 return false;
74 }
75 timing.iterationDuration = durationNumber / 1000;
76 return true;
77 }
78
79 if (iterationDuration.getAsString() != "auto") {
80 exceptionState.throwTypeError(errorMessage);
81 return false;
82 }
83
84 timing.iterationDuration = Timing::defaults().iterationDuration;
85 return true;
66 } 86 }
67 87
68 void TimingInput::setPlaybackRate(Timing& timing, double playbackRate) 88 void TimingInput::setPlaybackRate(Timing& timing, double playbackRate)
69 { 89 {
70 if (std::isfinite(playbackRate)) 90 if (std::isfinite(playbackRate))
71 timing.playbackRate = playbackRate; 91 timing.playbackRate = playbackRate;
72 else 92 else
73 timing.playbackRate = Timing::defaults().playbackRate; 93 timing.playbackRate = Timing::defaults().playbackRate;
74 } 94 }
75 95
(...skipping 17 matching lines...) Expand all
93 return true; 113 return true;
94 } 114 }
95 return false; 115 return false;
96 } 116 }
97 117
98 bool TimingInput::convert(const KeyframeEffectOptions& timingInput, Timing& timi ngOutput, Document* document, ExceptionState& exceptionState) 118 bool TimingInput::convert(const KeyframeEffectOptions& timingInput, Timing& timi ngOutput, Document* document, ExceptionState& exceptionState)
99 { 119 {
100 setStartDelay(timingOutput, timingInput.delay()); 120 setStartDelay(timingOutput, timingInput.delay());
101 setEndDelay(timingOutput, timingInput.endDelay()); 121 setEndDelay(timingOutput, timingInput.endDelay());
102 setFillMode(timingOutput, timingInput.fill()); 122 setFillMode(timingOutput, timingInput.fill());
103 setIterationStart(timingOutput, timingInput.iterationStart()); 123
104 setIterationCount(timingOutput, timingInput.iterations()); 124 if (!setIterationStart(timingOutput, timingInput.iterationStart(), exception State))
105 if (timingInput.duration().isUnrestrictedDouble()) 125 return false;
106 setIterationDuration(timingOutput, timingInput.duration().getAsUnrestric tedDouble()); 126
107 else 127 if (!setIterationCount(timingOutput, timingInput.iterations(), exceptionStat e))
108 setIterationDuration(timingOutput, -1); 128 return false;
129
130 if (!setIterationDuration(timingOutput, timingInput.duration(), exceptionSta te))
131 return false;
132
109 setPlaybackRate(timingOutput, timingInput.playbackRate()); 133 setPlaybackRate(timingOutput, timingInput.playbackRate());
110 setPlaybackDirection(timingOutput, timingInput.direction()); 134 setPlaybackDirection(timingOutput, timingInput.direction());
135
111 if (!setTimingFunction(timingOutput, timingInput.easing(), document, excepti onState)) 136 if (!setTimingFunction(timingOutput, timingInput.easing(), document, excepti onState))
112 return false; 137 return false;
113 138
114 timingOutput.assertValid(); 139 timingOutput.assertValid();
115 140
116 return true; 141 return true;
117 } 142 }
118 143
119 Timing TimingInput::convert(double duration) 144 bool TimingInput::convert(double duration, Timing& timingOutput, ExceptionState& exceptionState)
120 { 145 {
121 Timing result; 146 ASSERT(timingOutput == Timing::defaults());
122 setIterationDuration(result, duration); 147 return setIterationDuration(timingOutput, UnrestrictedDoubleOrString::fromUn restrictedDouble(duration), exceptionState);
123 return result;
124 } 148 }
125 149
126 } // namespace blink 150 } // namespace blink
OLDNEW
« 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