| 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/V8BindingForTesting.h" | 7 #include "bindings/core/v8/V8BindingForTesting.h" |
| 8 #include "bindings/core/v8/V8KeyframeEffectOptions.h" | 8 #include "bindings/core/v8/V8KeyframeEffectOptions.h" |
| 9 #include "core/animation/AnimationEffectTiming.h" | 9 #include "core/animation/AnimationEffectTiming.h" |
| 10 #include "core/animation/AnimationTestHelper.h" | 10 #include "core/animation/AnimationTestHelper.h" |
| 11 #include "core/testing/DummyPageHolder.h" | 11 #include "core/testing/DummyPageHolder.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 13 #include <v8.h> | 13 #include <v8.h> |
| 14 | 14 |
| 15 namespace blink { | 15 namespace blink { |
| 16 | 16 |
| 17 class AnimationTimingInputTest : public ::testing::Test { | 17 class AnimationTimingInputTest : public ::testing::Test { |
| 18 protected: | 18 protected: |
| 19 AnimationTimingInputTest() | 19 AnimationTimingInputTest() |
| 20 : m_isolate(v8::Isolate::GetCurrent()) | 20 : m_isolate(v8::Isolate::GetCurrent()) |
| 21 , m_scope(m_isolate) | 21 , m_scope(m_isolate) |
| 22 { | 22 { |
| 23 } | 23 } |
| 24 | 24 |
| 25 Timing applyTimingInputNumber(String timingProperty, double timingPropertyVa
lue, bool& timingConversionSuccess) | 25 Timing applyTimingInputNumber(String timingProperty, double timingPropertyVa
lue, bool& timingConversionSuccess) |
| 26 { | 26 { |
| 27 v8::Local<v8::Object> timingInput = v8::Object::New(m_isolate); | 27 v8::Local<v8::Object> timingInput = v8::Object::New(m_isolate); |
| 28 setV8ObjectPropertyAsNumber(m_isolate, timingInput, timingProperty, timi
ngPropertyValue); | 28 setV8ObjectPropertyAsNumber(m_isolate, timingInput, timingProperty, timi
ngPropertyValue); |
| 29 KeyframeEffectOptions timingInputDictionary; | 29 KeyframeEffectOptions timingInputDictionary; |
| 30 TrackExceptionState exceptionState; |
| 30 V8KeyframeEffectOptions::toImpl(m_isolate, timingInput, timingInputDicti
onary, exceptionState); | 31 V8KeyframeEffectOptions::toImpl(m_isolate, timingInput, timingInputDicti
onary, exceptionState); |
| 31 Timing result; | 32 Timing result; |
| 32 timingConversionSuccess = TimingInput::convert(timingInputDictionary, re
sult, nullptr, exceptionState); | 33 timingConversionSuccess = TimingInput::convert(timingInputDictionary, re
sult, nullptr, exceptionState) && !exceptionState.hadException(); |
| 33 return result; | 34 return result; |
| 34 } | 35 } |
| 35 | 36 |
| 36 Timing applyTimingInputString(String timingProperty, String timingPropertyVa
lue, bool& timingConversionSuccess) | 37 Timing applyTimingInputString(String timingProperty, String timingPropertyVa
lue, bool& timingConversionSuccess) |
| 37 { | 38 { |
| 38 v8::Local<v8::Object> timingInput = v8::Object::New(m_isolate); | 39 v8::Local<v8::Object> timingInput = v8::Object::New(m_isolate); |
| 39 setV8ObjectPropertyAsString(m_isolate, timingInput, timingProperty, timi
ngPropertyValue); | 40 setV8ObjectPropertyAsString(m_isolate, timingInput, timingProperty, timi
ngPropertyValue); |
| 40 KeyframeEffectOptions timingInputDictionary; | 41 KeyframeEffectOptions timingInputDictionary; |
| 42 TrackExceptionState exceptionState; |
| 41 V8KeyframeEffectOptions::toImpl(m_isolate, timingInput, timingInputDicti
onary, exceptionState); | 43 V8KeyframeEffectOptions::toImpl(m_isolate, timingInput, timingInputDicti
onary, exceptionState); |
| 42 Timing result; | 44 Timing result; |
| 43 timingConversionSuccess = TimingInput::convert(timingInputDictionary, re
sult, nullptr, exceptionState); | 45 timingConversionSuccess = TimingInput::convert(timingInputDictionary, re
sult, nullptr, exceptionState) && !exceptionState.hadException(); |
| 44 return result; | 46 return result; |
| 45 } | 47 } |
| 46 | 48 |
| 47 v8::Isolate* m_isolate; | 49 v8::Isolate* m_isolate; |
| 48 TrackExceptionState exceptionState; | |
| 49 | 50 |
| 50 private: | 51 private: |
| 51 V8TestingScope m_scope; | 52 V8TestingScope m_scope; |
| 52 }; | 53 }; |
| 53 | 54 |
| 54 TEST_F(AnimationTimingInputTest, TimingInputStartDelay) | 55 TEST_F(AnimationTimingInputTest, TimingInputStartDelay) |
| 55 { | 56 { |
| 56 bool ignoredSuccess; | 57 bool ignoredSuccess; |
| 57 EXPECT_EQ(1.1, applyTimingInputNumber("delay", 1100, ignoredSuccess).startDe
lay); | 58 EXPECT_EQ(1.1, applyTimingInputNumber("delay", 1100, ignoredSuccess).startDe
lay); |
| 58 EXPECT_EQ(-1, applyTimingInputNumber("delay", -1000, ignoredSuccess).startDe
lay); | 59 EXPECT_EQ(-1, applyTimingInputNumber("delay", -1000, ignoredSuccess).startDe
lay); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 81 EXPECT_EQ(Timing::FillModeNone, applyTimingInputString("fill", "none", ignor
edSuccess).fillMode); | 82 EXPECT_EQ(Timing::FillModeNone, applyTimingInputString("fill", "none", ignor
edSuccess).fillMode); |
| 82 EXPECT_EQ(Timing::FillModeBackwards, applyTimingInputString("fill", "backwar
ds", ignoredSuccess).fillMode); | 83 EXPECT_EQ(Timing::FillModeBackwards, applyTimingInputString("fill", "backwar
ds", ignoredSuccess).fillMode); |
| 83 EXPECT_EQ(Timing::FillModeBoth, applyTimingInputString("fill", "both", ignor
edSuccess).fillMode); | 84 EXPECT_EQ(Timing::FillModeBoth, applyTimingInputString("fill", "both", ignor
edSuccess).fillMode); |
| 84 EXPECT_EQ(defaultFillMode, applyTimingInputString("fill", "everything!", ign
oredSuccess).fillMode); | 85 EXPECT_EQ(defaultFillMode, applyTimingInputString("fill", "everything!", ign
oredSuccess).fillMode); |
| 85 EXPECT_EQ(defaultFillMode, applyTimingInputString("fill", "backwardsandforwa
rds", ignoredSuccess).fillMode); | 86 EXPECT_EQ(defaultFillMode, applyTimingInputString("fill", "backwardsandforwa
rds", ignoredSuccess).fillMode); |
| 86 EXPECT_EQ(defaultFillMode, applyTimingInputNumber("fill", 2, ignoredSuccess)
.fillMode); | 87 EXPECT_EQ(defaultFillMode, applyTimingInputNumber("fill", 2, ignoredSuccess)
.fillMode); |
| 87 } | 88 } |
| 88 | 89 |
| 89 TEST_F(AnimationTimingInputTest, TimingInputIterationStart) | 90 TEST_F(AnimationTimingInputTest, TimingInputIterationStart) |
| 90 { | 91 { |
| 91 bool ignoredSuccess; | 92 bool success; |
| 92 EXPECT_EQ(1.1, applyTimingInputNumber("iterationStart", 1.1, ignoredSuccess)
.iterationStart); | 93 EXPECT_EQ(1.1, applyTimingInputNumber("iterationStart", 1.1, success).iterat
ionStart); |
| 93 EXPECT_EQ(0, applyTimingInputNumber("iterationStart", -1, ignoredSuccess).it
erationStart); | 94 EXPECT_TRUE(success); |
| 94 EXPECT_EQ(0, applyTimingInputString("iterationStart", "Infinity", ignoredSuc
cess).iterationStart); | 95 |
| 95 EXPECT_EQ(0, applyTimingInputString("iterationStart", "-Infinity", ignoredSu
ccess).iterationStart); | 96 applyTimingInputNumber("iterationStart", -1, success); |
| 96 EXPECT_EQ(0, applyTimingInputString("iterationStart", "NaN", ignoredSuccess)
.iterationStart); | 97 EXPECT_FALSE(success); |
| 97 EXPECT_EQ(0, applyTimingInputString("iterationStart", "rubbish", ignoredSucc
ess).iterationStart); | 98 |
| 99 applyTimingInputString("iterationStart", "Infinity", success); |
| 100 EXPECT_FALSE(success); |
| 101 |
| 102 applyTimingInputString("iterationStart", "-Infinity", success); |
| 103 EXPECT_FALSE(success); |
| 104 |
| 105 applyTimingInputString("iterationStart", "NaN", success); |
| 106 EXPECT_FALSE(success); |
| 107 |
| 108 applyTimingInputString("iterationStart", "rubbish", success); |
| 109 EXPECT_FALSE(success); |
| 98 } | 110 } |
| 99 | 111 |
| 100 TEST_F(AnimationTimingInputTest, TimingInputIterationCount) | 112 TEST_F(AnimationTimingInputTest, TimingInputIterationCount) |
| 101 { | 113 { |
| 102 bool ignoredSuccess; | 114 bool success; |
| 103 EXPECT_EQ(2.1, applyTimingInputNumber("iterations", 2.1, ignoredSuccess).ite
rationCount); | 115 EXPECT_EQ(2.1, applyTimingInputNumber("iterations", 2.1, success).iterationC
ount); |
| 104 EXPECT_EQ(0, applyTimingInputNumber("iterations", -1, ignoredSuccess).iterat
ionCount); | 116 EXPECT_TRUE(success); |
| 105 | 117 |
| 106 Timing timing = applyTimingInputString("iterations", "Infinity", ignoredSucc
ess); | 118 Timing timing = applyTimingInputString("iterations", "Infinity", success); |
| 119 EXPECT_TRUE(success); |
| 107 EXPECT_TRUE(std::isinf(timing.iterationCount)); | 120 EXPECT_TRUE(std::isinf(timing.iterationCount)); |
| 108 EXPECT_GT(timing.iterationCount, 0); | 121 EXPECT_GT(timing.iterationCount, 0); |
| 109 | 122 |
| 110 EXPECT_EQ(0, applyTimingInputString("iterations", "-Infinity", ignoredSucces
s).iterationCount); | 123 applyTimingInputNumber("iterations", -1, success); |
| 111 EXPECT_EQ(1, applyTimingInputString("iterations", "NaN", ignoredSuccess).ite
rationCount); | 124 EXPECT_FALSE(success); |
| 112 EXPECT_EQ(1, applyTimingInputString("iterations", "rubbish", ignoredSuccess)
.iterationCount); | 125 |
| 126 applyTimingInputString("iterations", "-Infinity", success); |
| 127 EXPECT_FALSE(success); |
| 128 |
| 129 applyTimingInputString("iterations", "NaN", success); |
| 130 EXPECT_FALSE(success); |
| 131 |
| 132 applyTimingInputString("iterations", "rubbish", success); |
| 133 EXPECT_FALSE(success); |
| 113 } | 134 } |
| 114 | 135 |
| 115 TEST_F(AnimationTimingInputTest, TimingInputIterationDuration) | 136 TEST_F(AnimationTimingInputTest, TimingInputIterationDuration) |
| 116 { | 137 { |
| 117 bool ignoredSuccess; | 138 bool success; |
| 118 EXPECT_EQ(1.1, applyTimingInputNumber("duration", 1100, ignoredSuccess).iter
ationDuration); | 139 EXPECT_EQ(1.1, applyTimingInputNumber("duration", 1100, success).iterationDu
ration); |
| 119 EXPECT_TRUE(std::isnan(applyTimingInputNumber("duration", -1000, ignoredSucc
ess).iterationDuration)); | 140 EXPECT_TRUE(success); |
| 120 EXPECT_TRUE(std::isnan(applyTimingInputString("duration", "1000", ignoredSuc
cess).iterationDuration)); | |
| 121 | 141 |
| 122 Timing timing = applyTimingInputNumber("duration", std::numeric_limits<doubl
e>::infinity(), ignoredSuccess); | 142 Timing timing = applyTimingInputNumber("duration", std::numeric_limits<doubl
e>::infinity(), success); |
| 143 EXPECT_TRUE(success); |
| 123 EXPECT_TRUE(std::isinf(timing.iterationDuration)); | 144 EXPECT_TRUE(std::isinf(timing.iterationDuration)); |
| 124 EXPECT_GT(timing.iterationDuration, 0); | 145 EXPECT_GT(timing.iterationDuration, 0); |
| 125 | 146 |
| 126 EXPECT_TRUE(std::isnan(applyTimingInputString("duration", "-Infinity", ignor
edSuccess).iterationDuration)); | 147 EXPECT_TRUE(std::isnan(applyTimingInputString("duration", "auto", success).i
terationDuration)); |
| 127 EXPECT_TRUE(std::isnan(applyTimingInputString("duration", "NaN", ignoredSucc
ess).iterationDuration)); | 148 EXPECT_TRUE(success); |
| 128 EXPECT_TRUE(std::isnan(applyTimingInputString("duration", "auto", ignoredSuc
cess).iterationDuration)); | 149 |
| 129 EXPECT_TRUE(std::isnan(applyTimingInputString("duration", "rubbish", ignored
Success).iterationDuration)); | 150 applyTimingInputString("duration", "1000", success); |
| 151 EXPECT_FALSE(success); |
| 152 |
| 153 applyTimingInputNumber("duration", -1000, success); |
| 154 EXPECT_FALSE(success); |
| 155 |
| 156 applyTimingInputString("duration", "-Infinity", success); |
| 157 EXPECT_FALSE(success); |
| 158 |
| 159 applyTimingInputString("duration", "NaN", success); |
| 160 EXPECT_FALSE(success); |
| 161 |
| 162 applyTimingInputString("duration", "rubbish", success); |
| 163 EXPECT_FALSE(success); |
| 130 } | 164 } |
| 131 | 165 |
| 132 TEST_F(AnimationTimingInputTest, TimingInputPlaybackRate) | 166 TEST_F(AnimationTimingInputTest, TimingInputPlaybackRate) |
| 133 { | 167 { |
| 134 bool ignoredSuccess; | 168 bool ignoredSuccess; |
| 135 EXPECT_EQ(2.1, applyTimingInputNumber("playbackRate", 2.1, ignoredSuccess).p
laybackRate); | 169 EXPECT_EQ(2.1, applyTimingInputNumber("playbackRate", 2.1, ignoredSuccess).p
laybackRate); |
| 136 EXPECT_EQ(-1, applyTimingInputNumber("playbackRate", -1, ignoredSuccess).pla
ybackRate); | 170 EXPECT_EQ(-1, applyTimingInputNumber("playbackRate", -1, ignoredSuccess).pla
ybackRate); |
| 137 EXPECT_EQ(1, applyTimingInputString("playbackRate", "Infinity", ignoredSucce
ss).playbackRate); | 171 EXPECT_EQ(1, applyTimingInputString("playbackRate", "Infinity", ignoredSucce
ss).playbackRate); |
| 138 EXPECT_EQ(1, applyTimingInputString("playbackRate", "-Infinity", ignoredSucc
ess).playbackRate); | 172 EXPECT_EQ(1, applyTimingInputString("playbackRate", "-Infinity", ignoredSucc
ess).playbackRate); |
| 139 EXPECT_EQ(1, applyTimingInputString("playbackRate", "NaN", ignoredSuccess).p
laybackRate); | 173 EXPECT_EQ(1, applyTimingInputString("playbackRate", "NaN", ignoredSuccess).p
laybackRate); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 applyTimingInputString("easing", "rubbish", success); | 226 applyTimingInputString("easing", "rubbish", success); |
| 193 EXPECT_FALSE(success); | 227 EXPECT_FALSE(success); |
| 194 applyTimingInputNumber("easing", 2, success); | 228 applyTimingInputNumber("easing", 2, success); |
| 195 EXPECT_FALSE(success); | 229 EXPECT_FALSE(success); |
| 196 applyTimingInputString("easing", "initial", success); | 230 applyTimingInputString("easing", "initial", success); |
| 197 EXPECT_FALSE(success); | 231 EXPECT_FALSE(success); |
| 198 } | 232 } |
| 199 | 233 |
| 200 TEST_F(AnimationTimingInputTest, TimingInputEmpty) | 234 TEST_F(AnimationTimingInputTest, TimingInputEmpty) |
| 201 { | 235 { |
| 236 TrackExceptionState exceptionState; |
| 202 Timing controlTiming; | 237 Timing controlTiming; |
| 203 Timing updatedTiming; | 238 Timing updatedTiming; |
| 204 bool success = TimingInput::convert(KeyframeEffectOptions(), updatedTiming,
nullptr, exceptionState); | 239 bool success = TimingInput::convert(KeyframeEffectOptions(), updatedTiming,
nullptr, exceptionState); |
| 205 EXPECT_TRUE(success); | 240 EXPECT_TRUE(success); |
| 241 EXPECT_FALSE(exceptionState.hadException()); |
| 206 | 242 |
| 207 EXPECT_EQ(controlTiming.startDelay, updatedTiming.startDelay); | 243 EXPECT_EQ(controlTiming.startDelay, updatedTiming.startDelay); |
| 208 EXPECT_EQ(controlTiming.fillMode, updatedTiming.fillMode); | 244 EXPECT_EQ(controlTiming.fillMode, updatedTiming.fillMode); |
| 209 EXPECT_EQ(controlTiming.iterationStart, updatedTiming.iterationStart); | 245 EXPECT_EQ(controlTiming.iterationStart, updatedTiming.iterationStart); |
| 210 EXPECT_EQ(controlTiming.iterationCount, updatedTiming.iterationCount); | 246 EXPECT_EQ(controlTiming.iterationCount, updatedTiming.iterationCount); |
| 211 EXPECT_TRUE(std::isnan(updatedTiming.iterationDuration)); | 247 EXPECT_TRUE(std::isnan(updatedTiming.iterationDuration)); |
| 212 EXPECT_EQ(controlTiming.playbackRate, updatedTiming.playbackRate); | 248 EXPECT_EQ(controlTiming.playbackRate, updatedTiming.playbackRate); |
| 213 EXPECT_EQ(controlTiming.direction, updatedTiming.direction); | 249 EXPECT_EQ(controlTiming.direction, updatedTiming.direction); |
| 214 EXPECT_EQ(*controlTiming.timingFunction, *updatedTiming.timingFunction); | 250 EXPECT_EQ(*controlTiming.timingFunction, *updatedTiming.timingFunction); |
| 215 } | 251 } |
| 216 | 252 |
| 217 } // namespace blink | 253 } // namespace blink |
| OLD | NEW |