OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "ui/compositor/layer_animation_sequence.h" | 5 #include "ui/compositor/layer_animation_sequence.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
11 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
12 #include "ui/compositor/layer_animation_delegate.h" | 12 #include "ui/compositor/layer_animation_delegate.h" |
13 #include "ui/compositor/layer_animation_element.h" | 13 #include "ui/compositor/layer_animation_element.h" |
14 #include "ui/compositor/test/test_layer_animation_delegate.h" | 14 #include "ui/compositor/test/test_layer_animation_delegate.h" |
15 #include "ui/compositor/test/test_layer_animation_observer.h" | 15 #include "ui/compositor/test/test_layer_animation_observer.h" |
16 #include "ui/compositor/test/test_utils.h" | 16 #include "ui/compositor/test/test_utils.h" |
| 17 #include "ui/gfx/frame_time.h" |
17 #include "ui/gfx/rect.h" | 18 #include "ui/gfx/rect.h" |
18 #include "ui/gfx/transform.h" | 19 #include "ui/gfx/transform.h" |
19 | 20 |
20 namespace ui { | 21 namespace ui { |
21 | 22 |
22 namespace { | 23 namespace { |
23 | 24 |
24 // Check that the sequence behaves sanely when it contains no elements. | 25 // Check that the sequence behaves sanely when it contains no elements. |
25 TEST(LayerAnimationSequenceTest, NoElement) { | 26 TEST(LayerAnimationSequenceTest, NoElement) { |
26 LayerAnimationSequence sequence; | 27 LayerAnimationSequence sequence; |
27 base::TimeTicks start_time; | 28 gfx::FrameTime start_time; |
28 start_time += base::TimeDelta::FromSeconds(1); | 29 start_time += base::TimeDelta::FromSeconds(1); |
29 sequence.set_start_time(start_time); | 30 sequence.set_start_time(start_time); |
30 EXPECT_TRUE(sequence.IsFinished(start_time)); | 31 EXPECT_TRUE(sequence.IsFinished(start_time)); |
31 EXPECT_TRUE(sequence.properties().size() == 0); | 32 EXPECT_TRUE(sequence.properties().size() == 0); |
32 LayerAnimationElement::AnimatableProperties properties; | 33 LayerAnimationElement::AnimatableProperties properties; |
33 EXPECT_FALSE(sequence.HasConflictingProperty(properties)); | 34 EXPECT_FALSE(sequence.HasConflictingProperty(properties)); |
34 } | 35 } |
35 | 36 |
36 // Check that the sequences progresses the delegate as expected when it contains | 37 // Check that the sequences progresses the delegate as expected when it contains |
37 // a single non-threaded element. | 38 // a single non-threaded element. |
38 TEST(LayerAnimationSequenceTest, SingleElement) { | 39 TEST(LayerAnimationSequenceTest, SingleElement) { |
39 LayerAnimationSequence sequence; | 40 LayerAnimationSequence sequence; |
40 TestLayerAnimationDelegate delegate; | 41 TestLayerAnimationDelegate delegate; |
41 float start = 0.0f; | 42 float start = 0.0f; |
42 float middle = 0.5f; | 43 float middle = 0.5f; |
43 float target = 1.0f; | 44 float target = 1.0f; |
44 base::TimeTicks start_time; | 45 gfx::FrameTime start_time; |
45 base::TimeDelta delta = base::TimeDelta::FromSeconds(1); | 46 base::TimeDelta delta = base::TimeDelta::FromSeconds(1); |
46 sequence.AddElement( | 47 sequence.AddElement( |
47 LayerAnimationElement::CreateBrightnessElement(target, delta)); | 48 LayerAnimationElement::CreateBrightnessElement(target, delta)); |
48 | 49 |
49 for (int i = 0; i < 2; ++i) { | 50 for (int i = 0; i < 2; ++i) { |
50 start_time += delta; | 51 start_time += delta; |
51 sequence.set_start_time(start_time); | 52 sequence.set_start_time(start_time); |
52 delegate.SetBrightnessFromAnimation(start); | 53 delegate.SetBrightnessFromAnimation(start); |
53 sequence.Start(&delegate); | 54 sequence.Start(&delegate); |
54 sequence.Progress(start_time, &delegate); | 55 sequence.Progress(start_time, &delegate); |
(...skipping 13 matching lines...) Expand all Loading... |
68 } | 69 } |
69 | 70 |
70 // Check that the sequences progresses the delegate as expected when it contains | 71 // Check that the sequences progresses the delegate as expected when it contains |
71 // a single threaded element. | 72 // a single threaded element. |
72 TEST(LayerAnimationSequenceTest, SingleThreadedElement) { | 73 TEST(LayerAnimationSequenceTest, SingleThreadedElement) { |
73 LayerAnimationSequence sequence; | 74 LayerAnimationSequence sequence; |
74 TestLayerAnimationDelegate delegate; | 75 TestLayerAnimationDelegate delegate; |
75 float start = 0.0f; | 76 float start = 0.0f; |
76 float middle = 0.5f; | 77 float middle = 0.5f; |
77 float target = 1.0f; | 78 float target = 1.0f; |
78 base::TimeTicks start_time; | 79 gfx::FrameTime start_time; |
79 base::TimeTicks effective_start; | 80 gfx::FrameTime effective_start; |
80 base::TimeDelta delta = base::TimeDelta::FromSeconds(1); | 81 base::TimeDelta delta = base::TimeDelta::FromSeconds(1); |
81 sequence.AddElement( | 82 sequence.AddElement( |
82 LayerAnimationElement::CreateOpacityElement(target, delta)); | 83 LayerAnimationElement::CreateOpacityElement(target, delta)); |
83 | 84 |
84 for (int i = 0; i < 2; ++i) { | 85 for (int i = 0; i < 2; ++i) { |
85 int starting_group_id = 1; | 86 int starting_group_id = 1; |
86 sequence.set_animation_group_id(starting_group_id); | 87 sequence.set_animation_group_id(starting_group_id); |
87 start_time = effective_start + delta; | 88 start_time = effective_start + delta; |
88 sequence.set_start_time(start_time); | 89 sequence.set_start_time(start_time); |
89 delegate.SetOpacityFromAnimation(start); | 90 delegate.SetOpacityFromAnimation(start); |
90 sequence.Start(&delegate); | 91 sequence.Start(&delegate); |
91 sequence.Progress(start_time, &delegate); | 92 sequence.Progress(start_time, &delegate); |
92 EXPECT_FLOAT_EQ(start, sequence.last_progressed_fraction()); | 93 EXPECT_FLOAT_EQ(start, sequence.last_progressed_fraction()); |
93 effective_start = start_time + delta; | 94 effective_start = start_time + delta; |
94 sequence.OnThreadedAnimationStarted(cc::AnimationEvent( | 95 sequence.OnThreadedAnimationStarted(cc::AnimationEvent( |
95 cc::AnimationEvent::Started, | 96 cc::AnimationEvent::Started, |
96 0, | 97 0, |
97 sequence.animation_group_id(), | 98 sequence.animation_group_id(), |
98 cc::Animation::Opacity, | 99 cc::Animation::Opacity, |
99 (effective_start - base::TimeTicks()).InSecondsF())); | 100 (effective_start - gfx::FrameTime()).InSecondsF())); |
100 sequence.Progress(effective_start + delta/2, &delegate); | 101 sequence.Progress(effective_start + delta/2, &delegate); |
101 EXPECT_FLOAT_EQ(middle, sequence.last_progressed_fraction()); | 102 EXPECT_FLOAT_EQ(middle, sequence.last_progressed_fraction()); |
102 EXPECT_TRUE(sequence.IsFinished(effective_start + delta)); | 103 EXPECT_TRUE(sequence.IsFinished(effective_start + delta)); |
103 sequence.Progress(effective_start + delta, &delegate); | 104 sequence.Progress(effective_start + delta, &delegate); |
104 EXPECT_FLOAT_EQ(target, sequence.last_progressed_fraction()); | 105 EXPECT_FLOAT_EQ(target, sequence.last_progressed_fraction()); |
105 EXPECT_FLOAT_EQ(target, delegate.GetOpacityForAnimation()); | 106 EXPECT_FLOAT_EQ(target, delegate.GetOpacityForAnimation()); |
106 } | 107 } |
107 | 108 |
108 EXPECT_TRUE(sequence.properties().size() == 1); | 109 EXPECT_TRUE(sequence.properties().size() == 1); |
109 EXPECT_TRUE(sequence.properties().find(LayerAnimationElement::OPACITY) != | 110 EXPECT_TRUE(sequence.properties().find(LayerAnimationElement::OPACITY) != |
110 sequence.properties().end()); | 111 sequence.properties().end()); |
111 } | 112 } |
112 | 113 |
113 // Check that the sequences progresses the delegate as expected when it contains | 114 // Check that the sequences progresses the delegate as expected when it contains |
114 // multiple elements. Note, see the layer animator tests for cyclic sequences. | 115 // multiple elements. Note, see the layer animator tests for cyclic sequences. |
115 TEST(LayerAnimationSequenceTest, MultipleElement) { | 116 TEST(LayerAnimationSequenceTest, MultipleElement) { |
116 LayerAnimationSequence sequence; | 117 LayerAnimationSequence sequence; |
117 TestLayerAnimationDelegate delegate; | 118 TestLayerAnimationDelegate delegate; |
118 float start_opacity = 0.0f; | 119 float start_opacity = 0.0f; |
119 float target_opacity = 1.0f; | 120 float target_opacity = 1.0f; |
120 base::TimeTicks start_time; | 121 gfx::FrameTime start_time; |
121 base::TimeTicks opacity_effective_start; | 122 gfx::FrameTime opacity_effective_start; |
122 base::TimeTicks transform_effective_start; | 123 gfx::FrameTime transform_effective_start; |
123 base::TimeDelta delta = base::TimeDelta::FromSeconds(1); | 124 base::TimeDelta delta = base::TimeDelta::FromSeconds(1); |
124 sequence.AddElement( | 125 sequence.AddElement( |
125 LayerAnimationElement::CreateOpacityElement(target_opacity, delta)); | 126 LayerAnimationElement::CreateOpacityElement(target_opacity, delta)); |
126 | 127 |
127 // Pause bounds for a second. | 128 // Pause bounds for a second. |
128 LayerAnimationElement::AnimatableProperties properties; | 129 LayerAnimationElement::AnimatableProperties properties; |
129 properties.insert(LayerAnimationElement::BOUNDS); | 130 properties.insert(LayerAnimationElement::BOUNDS); |
130 | 131 |
131 sequence.AddElement( | 132 sequence.AddElement( |
132 LayerAnimationElement::CreatePauseElement(properties, delta)); | 133 LayerAnimationElement::CreatePauseElement(properties, delta)); |
(...skipping 16 matching lines...) Expand all Loading... |
149 sequence.Start(&delegate); | 150 sequence.Start(&delegate); |
150 sequence.Progress(start_time, &delegate); | 151 sequence.Progress(start_time, &delegate); |
151 EXPECT_FLOAT_EQ(0.0, sequence.last_progressed_fraction()); | 152 EXPECT_FLOAT_EQ(0.0, sequence.last_progressed_fraction()); |
152 opacity_effective_start = start_time + delta; | 153 opacity_effective_start = start_time + delta; |
153 EXPECT_EQ(starting_group_id, sequence.animation_group_id()); | 154 EXPECT_EQ(starting_group_id, sequence.animation_group_id()); |
154 sequence.OnThreadedAnimationStarted(cc::AnimationEvent( | 155 sequence.OnThreadedAnimationStarted(cc::AnimationEvent( |
155 cc::AnimationEvent::Started, | 156 cc::AnimationEvent::Started, |
156 0, | 157 0, |
157 sequence.animation_group_id(), | 158 sequence.animation_group_id(), |
158 cc::Animation::Opacity, | 159 cc::Animation::Opacity, |
159 (opacity_effective_start - base::TimeTicks()).InSecondsF())); | 160 (opacity_effective_start - gfx::FrameTime()).InSecondsF())); |
160 sequence.Progress(opacity_effective_start + delta/2, &delegate); | 161 sequence.Progress(opacity_effective_start + delta/2, &delegate); |
161 EXPECT_FLOAT_EQ(0.5, sequence.last_progressed_fraction()); | 162 EXPECT_FLOAT_EQ(0.5, sequence.last_progressed_fraction()); |
162 sequence.Progress(opacity_effective_start + delta, &delegate); | 163 sequence.Progress(opacity_effective_start + delta, &delegate); |
163 EXPECT_FLOAT_EQ(target_opacity, delegate.GetOpacityForAnimation()); | 164 EXPECT_FLOAT_EQ(target_opacity, delegate.GetOpacityForAnimation()); |
164 | 165 |
165 // Now at the start of the pause. | 166 // Now at the start of the pause. |
166 EXPECT_FLOAT_EQ(0.0, sequence.last_progressed_fraction()); | 167 EXPECT_FLOAT_EQ(0.0, sequence.last_progressed_fraction()); |
167 TestLayerAnimationDelegate copy = delegate; | 168 TestLayerAnimationDelegate copy = delegate; |
168 | 169 |
169 // In the middle of the pause -- nothing should have changed. | 170 // In the middle of the pause -- nothing should have changed. |
(...skipping 10 matching lines...) Expand all Loading... |
180 CheckApproximatelyEqual(start_transform, | 181 CheckApproximatelyEqual(start_transform, |
181 delegate.GetTransformForAnimation()); | 182 delegate.GetTransformForAnimation()); |
182 EXPECT_FLOAT_EQ(0.0, sequence.last_progressed_fraction()); | 183 EXPECT_FLOAT_EQ(0.0, sequence.last_progressed_fraction()); |
183 transform_effective_start = opacity_effective_start + 3 * delta; | 184 transform_effective_start = opacity_effective_start + 3 * delta; |
184 EXPECT_NE(starting_group_id, sequence.animation_group_id()); | 185 EXPECT_NE(starting_group_id, sequence.animation_group_id()); |
185 sequence.OnThreadedAnimationStarted(cc::AnimationEvent( | 186 sequence.OnThreadedAnimationStarted(cc::AnimationEvent( |
186 cc::AnimationEvent::Started, | 187 cc::AnimationEvent::Started, |
187 0, | 188 0, |
188 sequence.animation_group_id(), | 189 sequence.animation_group_id(), |
189 cc::Animation::Transform, | 190 cc::Animation::Transform, |
190 (transform_effective_start - base::TimeTicks()).InSecondsF())); | 191 (transform_effective_start - gfx::FrameTime()).InSecondsF())); |
191 sequence.Progress(transform_effective_start + delta/2, &delegate); | 192 sequence.Progress(transform_effective_start + delta/2, &delegate); |
192 EXPECT_FLOAT_EQ(0.5, sequence.last_progressed_fraction()); | 193 EXPECT_FLOAT_EQ(0.5, sequence.last_progressed_fraction()); |
193 EXPECT_TRUE(sequence.IsFinished(transform_effective_start + delta)); | 194 EXPECT_TRUE(sequence.IsFinished(transform_effective_start + delta)); |
194 sequence.Progress(transform_effective_start + delta, &delegate); | 195 sequence.Progress(transform_effective_start + delta, &delegate); |
195 CheckApproximatelyEqual(target_transform, | 196 CheckApproximatelyEqual(target_transform, |
196 delegate.GetTransformForAnimation()); | 197 delegate.GetTransformForAnimation()); |
197 } | 198 } |
198 | 199 |
199 EXPECT_TRUE(sequence.properties().size() == 3); | 200 EXPECT_TRUE(sequence.properties().size() == 3); |
200 EXPECT_TRUE(sequence.properties().find(LayerAnimationElement::OPACITY) != | 201 EXPECT_TRUE(sequence.properties().find(LayerAnimationElement::OPACITY) != |
201 sequence.properties().end()); | 202 sequence.properties().end()); |
202 EXPECT_TRUE(sequence.properties().find(LayerAnimationElement::TRANSFORM) != | 203 EXPECT_TRUE(sequence.properties().find(LayerAnimationElement::TRANSFORM) != |
203 sequence.properties().end()); | 204 sequence.properties().end()); |
204 EXPECT_TRUE(sequence.properties().find(LayerAnimationElement::BOUNDS) != | 205 EXPECT_TRUE(sequence.properties().find(LayerAnimationElement::BOUNDS) != |
205 sequence.properties().end()); | 206 sequence.properties().end()); |
206 } | 207 } |
207 | 208 |
208 // Check that a sequence can still be aborted if it has cycled many times. | 209 // Check that a sequence can still be aborted if it has cycled many times. |
209 TEST(LayerAnimationSequenceTest, AbortingCyclicSequence) { | 210 TEST(LayerAnimationSequenceTest, AbortingCyclicSequence) { |
210 LayerAnimationSequence sequence; | 211 LayerAnimationSequence sequence; |
211 TestLayerAnimationDelegate delegate; | 212 TestLayerAnimationDelegate delegate; |
212 float start_brightness = 0.0f; | 213 float start_brightness = 0.0f; |
213 float target_brightness = 1.0f; | 214 float target_brightness = 1.0f; |
214 base::TimeTicks start_time; | 215 gfx::FrameTime start_time; |
215 base::TimeDelta delta = base::TimeDelta::FromSeconds(1); | 216 base::TimeDelta delta = base::TimeDelta::FromSeconds(1); |
216 sequence.AddElement( | 217 sequence.AddElement( |
217 LayerAnimationElement::CreateBrightnessElement(target_brightness, delta)); | 218 LayerAnimationElement::CreateBrightnessElement(target_brightness, delta)); |
218 | 219 |
219 sequence.AddElement( | 220 sequence.AddElement( |
220 LayerAnimationElement::CreateBrightnessElement(start_brightness, delta)); | 221 LayerAnimationElement::CreateBrightnessElement(start_brightness, delta)); |
221 | 222 |
222 sequence.set_is_cyclic(true); | 223 sequence.set_is_cyclic(true); |
223 | 224 |
224 delegate.SetBrightnessFromAnimation(start_brightness); | 225 delegate.SetBrightnessFromAnimation(start_brightness); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 sequence.GetTargetValue(&target_value); | 257 sequence.GetTargetValue(&target_value); |
257 EXPECT_FLOAT_EQ(target_opacity, target_value.opacity); | 258 EXPECT_FLOAT_EQ(target_opacity, target_value.opacity); |
258 | 259 |
259 sequence.set_is_cyclic(true); | 260 sequence.set_is_cyclic(true); |
260 target_value.opacity = start_opacity; | 261 target_value.opacity = start_opacity; |
261 sequence.GetTargetValue(&target_value); | 262 sequence.GetTargetValue(&target_value); |
262 EXPECT_FLOAT_EQ(start_opacity, target_value.opacity); | 263 EXPECT_FLOAT_EQ(start_opacity, target_value.opacity); |
263 } | 264 } |
264 | 265 |
265 TEST(LayerAnimationSequenceTest, AddObserver) { | 266 TEST(LayerAnimationSequenceTest, AddObserver) { |
266 base::TimeTicks start_time; | 267 gfx::FrameTime start_time; |
267 base::TimeDelta delta = base::TimeDelta::FromSeconds(1); | 268 base::TimeDelta delta = base::TimeDelta::FromSeconds(1); |
268 LayerAnimationSequence sequence; | 269 LayerAnimationSequence sequence; |
269 sequence.AddElement( | 270 sequence.AddElement( |
270 LayerAnimationElement::CreateBrightnessElement(1.0f, delta)); | 271 LayerAnimationElement::CreateBrightnessElement(1.0f, delta)); |
271 for (int i = 0; i < 2; ++i) { | 272 for (int i = 0; i < 2; ++i) { |
272 start_time += delta; | 273 start_time += delta; |
273 sequence.set_start_time(start_time); | 274 sequence.set_start_time(start_time); |
274 TestLayerAnimationObserver observer; | 275 TestLayerAnimationObserver observer; |
275 TestLayerAnimationDelegate delegate; | 276 TestLayerAnimationDelegate delegate; |
276 sequence.AddObserver(&observer); | 277 sequence.AddObserver(&observer); |
277 EXPECT_TRUE(!observer.last_ended_sequence()); | 278 EXPECT_TRUE(!observer.last_ended_sequence()); |
278 sequence.Progress(start_time + delta, &delegate); | 279 sequence.Progress(start_time + delta, &delegate); |
279 EXPECT_EQ(observer.last_ended_sequence(), &sequence); | 280 EXPECT_EQ(observer.last_ended_sequence(), &sequence); |
280 sequence.RemoveObserver(&observer); | 281 sequence.RemoveObserver(&observer); |
281 } | 282 } |
282 } | 283 } |
283 | 284 |
284 } // namespace | 285 } // namespace |
285 | 286 |
286 } // namespace ui | 287 } // namespace ui |
OLD | NEW |