Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 = -1; | |
|
suzyh_UTC10 (ex-contributor)
2016/04/20 21:54:12
The existing TimingInput::setIterationDuration sug
alancutter (OOO until 2018)
2016/04/21 08:33:07
auto represents the intrinsic duration which for W
| |
| 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 Loading... | |
| 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 return setIterationDuration(timingOutput, UnrestrictedDoubleOrString::fromUn restrictedDouble(duration), exceptionState); |
|
suzyh_UTC10 (ex-contributor)
2016/04/20 21:54:11
What should the behaviour be if the caller passes
alancutter (OOO until 2018)
2016/04/21 08:33:07
Good consideration, if only one could conveniently
| |
| 122 setIterationDuration(result, duration); | |
| 123 return result; | |
| 124 } | 147 } |
| 125 | 148 |
| 126 } // namespace blink | 149 } // namespace blink |
| OLD | NEW |