| 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/V8KeyframeAnimationOptions.h" |
| 8 #include "bindings/core/v8/V8KeyframeEffectOptions.h" | 9 #include "bindings/core/v8/V8KeyframeEffectOptions.h" |
| 9 #include "core/animation/AnimationEffectTiming.h" | 10 #include "core/animation/AnimationEffectTiming.h" |
| 10 #include "core/animation/AnimationTestHelper.h" | 11 #include "core/animation/AnimationTestHelper.h" |
| 11 #include "core/testing/DummyPageHolder.h" | 12 #include "core/testing/DummyPageHolder.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 13 #include "v8/include/v8.h" | 14 #include "v8/include/v8.h" |
| 14 | 15 |
| 15 namespace blink { | 16 namespace blink { |
| 16 | 17 |
| 17 Timing ApplyTimingInputNumber(v8::Isolate* isolate, | 18 Timing ApplyTimingInputNumber(v8::Isolate* isolate, |
| 18 String timing_property, | 19 String timing_property, |
| 19 double timing_property_value, | 20 double timing_property_value, |
| 20 bool& timing_conversion_success) { | 21 bool& timing_conversion_success, |
| 22 bool is_keyframeeffectoptions = true) { |
| 21 v8::Local<v8::Object> timing_input = v8::Object::New(isolate); | 23 v8::Local<v8::Object> timing_input = v8::Object::New(isolate); |
| 22 SetV8ObjectPropertyAsNumber(isolate, timing_input, timing_property, | 24 SetV8ObjectPropertyAsNumber(isolate, timing_input, timing_property, |
| 23 timing_property_value); | 25 timing_property_value); |
| 24 KeyframeEffectOptions timing_input_dictionary; | |
| 25 DummyExceptionStateForTesting exception_state; | 26 DummyExceptionStateForTesting exception_state; |
| 26 V8KeyframeEffectOptions::toImpl(isolate, timing_input, | |
| 27 timing_input_dictionary, exception_state); | |
| 28 Timing result; | 27 Timing result; |
| 29 timing_conversion_success = | 28 if (is_keyframeeffectoptions) { |
| 30 TimingInput::Convert(timing_input_dictionary, result, nullptr, | 29 KeyframeEffectOptions timing_input_dictionary; |
| 31 exception_state) && | 30 V8KeyframeEffectOptions::toImpl(isolate, timing_input, |
| 32 !exception_state.HadException(); | 31 timing_input_dictionary, exception_state); |
| 32 timing_conversion_success = |
| 33 TimingInput::Convert(timing_input_dictionary, result, nullptr, |
| 34 exception_state) && |
| 35 !exception_state.HadException(); |
| 36 } else { |
| 37 KeyframeAnimationOptions timing_input_dictionary; |
| 38 V8KeyframeAnimationOptions::toImpl( |
| 39 isolate, timing_input, timing_input_dictionary, exception_state); |
| 40 timing_conversion_success = |
| 41 TimingInput::Convert(timing_input_dictionary, result, nullptr, |
| 42 exception_state) && |
| 43 !exception_state.HadException(); |
| 44 } |
| 33 return result; | 45 return result; |
| 34 } | 46 } |
| 35 | 47 |
| 36 Timing ApplyTimingInputString(v8::Isolate* isolate, | 48 Timing ApplyTimingInputString(v8::Isolate* isolate, |
| 37 String timing_property, | 49 String timing_property, |
| 38 String timing_property_value, | 50 String timing_property_value, |
| 39 bool& timing_conversion_success) { | 51 bool& timing_conversion_success, |
| 52 bool is_keyframeeffectoptions = true) { |
| 40 v8::Local<v8::Object> timing_input = v8::Object::New(isolate); | 53 v8::Local<v8::Object> timing_input = v8::Object::New(isolate); |
| 41 SetV8ObjectPropertyAsString(isolate, timing_input, timing_property, | 54 SetV8ObjectPropertyAsString(isolate, timing_input, timing_property, |
| 42 timing_property_value); | 55 timing_property_value); |
| 43 KeyframeEffectOptions timing_input_dictionary; | 56 |
| 44 DummyExceptionStateForTesting exception_state; | 57 DummyExceptionStateForTesting exception_state; |
| 45 V8KeyframeEffectOptions::toImpl(isolate, timing_input, | |
| 46 timing_input_dictionary, exception_state); | |
| 47 Timing result; | 58 Timing result; |
| 48 timing_conversion_success = | 59 if (is_keyframeeffectoptions) { |
| 49 TimingInput::Convert(timing_input_dictionary, result, nullptr, | 60 KeyframeEffectOptions timing_input_dictionary; |
| 50 exception_state) && | 61 V8KeyframeEffectOptions::toImpl(isolate, timing_input, |
| 51 !exception_state.HadException(); | 62 timing_input_dictionary, exception_state); |
| 63 timing_conversion_success = |
| 64 TimingInput::Convert(timing_input_dictionary, result, nullptr, |
| 65 exception_state) && |
| 66 !exception_state.HadException(); |
| 67 } else { |
| 68 KeyframeAnimationOptions timing_input_dictionary; |
| 69 V8KeyframeAnimationOptions::toImpl( |
| 70 isolate, timing_input, timing_input_dictionary, exception_state); |
| 71 timing_conversion_success = |
| 72 TimingInput::Convert(timing_input_dictionary, result, nullptr, |
| 73 exception_state) && |
| 74 !exception_state.HadException(); |
| 75 } |
| 52 return result; | 76 return result; |
| 53 } | 77 } |
| 54 | 78 |
| 55 TEST(AnimationTimingInputTest, TimingInputStartDelay) { | 79 TEST(AnimationTimingInputTest, TimingInputStartDelay) { |
| 56 V8TestingScope scope; | 80 V8TestingScope scope; |
| 57 bool ignored_success; | 81 bool ignored_success; |
| 58 EXPECT_EQ(1.1, ApplyTimingInputNumber(scope.GetIsolate(), "delay", 1100, | 82 EXPECT_EQ(1.1, ApplyTimingInputNumber(scope.GetIsolate(), "delay", 1100, |
| 59 ignored_success) | 83 ignored_success) |
| 60 .start_delay); | 84 .start_delay); |
| 61 EXPECT_EQ(-1, ApplyTimingInputNumber(scope.GetIsolate(), "delay", -1000, | 85 EXPECT_EQ(-1, ApplyTimingInputNumber(scope.GetIsolate(), "delay", -1000, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 74 ignored_success) | 98 ignored_success) |
| 75 .start_delay); | 99 .start_delay); |
| 76 EXPECT_EQ(0, ApplyTimingInputString(scope.GetIsolate(), "delay", "NaN", | 100 EXPECT_EQ(0, ApplyTimingInputString(scope.GetIsolate(), "delay", "NaN", |
| 77 ignored_success) | 101 ignored_success) |
| 78 .start_delay); | 102 .start_delay); |
| 79 EXPECT_EQ(0, ApplyTimingInputString(scope.GetIsolate(), "delay", "rubbish", | 103 EXPECT_EQ(0, ApplyTimingInputString(scope.GetIsolate(), "delay", "rubbish", |
| 80 ignored_success) | 104 ignored_success) |
| 81 .start_delay); | 105 .start_delay); |
| 82 } | 106 } |
| 83 | 107 |
| 108 TEST(AnimationTimingInputTest, TimingInputStartDelayKeyframeAnimationOptions) { |
| 109 V8TestingScope scope; |
| 110 bool ignored_success; |
| 111 EXPECT_EQ(1.1, ApplyTimingInputNumber(scope.GetIsolate(), "delay", 1100, |
| 112 ignored_success, false) |
| 113 .start_delay); |
| 114 EXPECT_EQ(-1, ApplyTimingInputNumber(scope.GetIsolate(), "delay", -1000, |
| 115 ignored_success, false) |
| 116 .start_delay); |
| 117 EXPECT_EQ(1, ApplyTimingInputString(scope.GetIsolate(), "delay", "1000", |
| 118 ignored_success, false) |
| 119 .start_delay); |
| 120 EXPECT_EQ(0, ApplyTimingInputString(scope.GetIsolate(), "delay", "1s", |
| 121 ignored_success, false) |
| 122 .start_delay); |
| 123 EXPECT_EQ(0, ApplyTimingInputString(scope.GetIsolate(), "delay", "Infinity", |
| 124 ignored_success, false) |
| 125 .start_delay); |
| 126 EXPECT_EQ(0, ApplyTimingInputString(scope.GetIsolate(), "delay", "-Infinity", |
| 127 ignored_success, false) |
| 128 .start_delay); |
| 129 EXPECT_EQ(0, ApplyTimingInputString(scope.GetIsolate(), "delay", "NaN", |
| 130 ignored_success, false) |
| 131 .start_delay); |
| 132 EXPECT_EQ(0, ApplyTimingInputString(scope.GetIsolate(), "delay", "rubbish", |
| 133 ignored_success, false) |
| 134 .start_delay); |
| 135 } |
| 136 |
| 84 TEST(AnimationTimingInputTest, TimingInputEndDelay) { | 137 TEST(AnimationTimingInputTest, TimingInputEndDelay) { |
| 85 V8TestingScope scope; | 138 V8TestingScope scope; |
| 86 bool ignored_success; | 139 bool ignored_success; |
| 87 EXPECT_EQ(10, ApplyTimingInputNumber(scope.GetIsolate(), "endDelay", 10000, | 140 EXPECT_EQ(10, ApplyTimingInputNumber(scope.GetIsolate(), "endDelay", 10000, |
| 88 ignored_success) | 141 ignored_success) |
| 89 .end_delay); | 142 .end_delay); |
| 90 EXPECT_EQ(-2.5, ApplyTimingInputNumber(scope.GetIsolate(), "endDelay", -2500, | 143 EXPECT_EQ(-2.5, ApplyTimingInputNumber(scope.GetIsolate(), "endDelay", -2500, |
| 91 ignored_success) | 144 ignored_success) |
| 92 .end_delay); | 145 .end_delay); |
| 93 } | 146 } |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 EXPECT_EQ(control_timing.start_delay, updated_timing.start_delay); | 421 EXPECT_EQ(control_timing.start_delay, updated_timing.start_delay); |
| 369 EXPECT_EQ(control_timing.fill_mode, updated_timing.fill_mode); | 422 EXPECT_EQ(control_timing.fill_mode, updated_timing.fill_mode); |
| 370 EXPECT_EQ(control_timing.iteration_start, updated_timing.iteration_start); | 423 EXPECT_EQ(control_timing.iteration_start, updated_timing.iteration_start); |
| 371 EXPECT_EQ(control_timing.iteration_count, updated_timing.iteration_count); | 424 EXPECT_EQ(control_timing.iteration_count, updated_timing.iteration_count); |
| 372 EXPECT_TRUE(std::isnan(updated_timing.iteration_duration)); | 425 EXPECT_TRUE(std::isnan(updated_timing.iteration_duration)); |
| 373 EXPECT_EQ(control_timing.playback_rate, updated_timing.playback_rate); | 426 EXPECT_EQ(control_timing.playback_rate, updated_timing.playback_rate); |
| 374 EXPECT_EQ(control_timing.direction, updated_timing.direction); | 427 EXPECT_EQ(control_timing.direction, updated_timing.direction); |
| 375 EXPECT_EQ(*control_timing.timing_function, *updated_timing.timing_function); | 428 EXPECT_EQ(*control_timing.timing_function, *updated_timing.timing_function); |
| 376 } | 429 } |
| 377 | 430 |
| 431 TEST(AnimationTimingInputTest, TimingInputEmptyKeyframeAnimationOptions) { |
| 432 DummyExceptionStateForTesting exception_state; |
| 433 Timing control_timing; |
| 434 Timing updated_timing; |
| 435 bool success = TimingInput::Convert(KeyframeAnimationOptions(), |
| 436 updated_timing, nullptr, exception_state); |
| 437 EXPECT_TRUE(success); |
| 438 EXPECT_FALSE(exception_state.HadException()); |
| 439 |
| 440 EXPECT_EQ(control_timing.start_delay, updated_timing.start_delay); |
| 441 EXPECT_EQ(control_timing.fill_mode, updated_timing.fill_mode); |
| 442 EXPECT_EQ(control_timing.iteration_start, updated_timing.iteration_start); |
| 443 EXPECT_EQ(control_timing.iteration_count, updated_timing.iteration_count); |
| 444 EXPECT_TRUE(std::isnan(updated_timing.iteration_duration)); |
| 445 EXPECT_EQ(control_timing.playback_rate, updated_timing.playback_rate); |
| 446 EXPECT_EQ(control_timing.direction, updated_timing.direction); |
| 447 EXPECT_EQ(*control_timing.timing_function, *updated_timing.timing_function); |
| 448 } |
| 449 |
| 378 } // namespace blink | 450 } // namespace blink |
| OLD | NEW |