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

Side by Side Diff: ui/compositor/layer_animator.h

Issue 10919195: LayerAnimator must be prepared for its owning layer's deletion whenever it notifies observers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixing the unit tests. Created 8 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « ui/compositor/layer_animation_sequence.cc ('k') | ui/compositor/layer_animator.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #ifndef UI_COMPOSITOR_LAYER_ANIMATOR_H_ 5 #ifndef UI_COMPOSITOR_LAYER_ANIMATOR_H_
6 #define UI_COMPOSITOR_LAYER_ANIMATOR_H_ 6 #define UI_COMPOSITOR_LAYER_ANIMATOR_H_
7 7
8 #include <deque> 8 #include <deque>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 16 matching lines...) Expand all
27 class Layer; 27 class Layer;
28 class LayerAnimationSequence; 28 class LayerAnimationSequence;
29 class LayerAnimationDelegate; 29 class LayerAnimationDelegate;
30 class LayerAnimationObserver; 30 class LayerAnimationObserver;
31 class ScopedLayerAnimationSettings; 31 class ScopedLayerAnimationSettings;
32 class Transform; 32 class Transform;
33 33
34 // When a property of layer needs to be changed it is set by way of 34 // When a property of layer needs to be changed it is set by way of
35 // LayerAnimator. This enables LayerAnimator to animate property changes. 35 // LayerAnimator. This enables LayerAnimator to animate property changes.
36 // NB: during many tests, set_disable_animations_for_test is used and causes 36 // NB: during many tests, set_disable_animations_for_test is used and causes
37 // all animations to complete immediately. 37 // all animations to complete immediately. The layer animation is ref counted
38 class COMPOSITOR_EXPORT LayerAnimator : public AnimationContainerElement { 38 // so that if its owning layer is deleted (and the owning layer is only other
39 // class that should ever hold a ref ptr to a LayerAnimator), the animator can
40 // ensure that it is not disposed of until it finishes executing. It does this
41 // by holding a reference to itself for the duration of methods for which it
42 // must guarantee that |this| is valid.
43 class COMPOSITOR_EXPORT LayerAnimator
44 : public AnimationContainerElement, public base::RefCounted<LayerAnimator> {
39 public: 45 public:
40 enum PreemptionStrategy { 46 enum PreemptionStrategy {
41 IMMEDIATELY_SET_NEW_TARGET, 47 IMMEDIATELY_SET_NEW_TARGET,
42 IMMEDIATELY_ANIMATE_TO_NEW_TARGET, 48 IMMEDIATELY_ANIMATE_TO_NEW_TARGET,
43 ENQUEUE_NEW_ANIMATION, 49 ENQUEUE_NEW_ANIMATION,
44 REPLACE_QUEUED_ANIMATIONS, 50 REPLACE_QUEUED_ANIMATIONS,
45 BLEND_WITH_CURRENT_ANIMATION 51 BLEND_WITH_CURRENT_ANIMATION
46 }; 52 };
47 53
48 explicit LayerAnimator(base::TimeDelta transition_duration); 54 explicit LayerAnimator(base::TimeDelta transition_duration);
49 virtual ~LayerAnimator();
50 55
51 // No implicit animations when properties are set. 56 // No implicit animations when properties are set.
52 static LayerAnimator* CreateDefaultAnimator(); 57 static LayerAnimator* CreateDefaultAnimator();
53 58
54 // Implicitly animates when properties are set. 59 // Implicitly animates when properties are set.
55 static LayerAnimator* CreateImplicitAnimator(); 60 static LayerAnimator* CreateImplicitAnimator();
56 61
57 // Sets the transform on the delegate. May cause an implicit animation. 62 // Sets the transform on the delegate. May cause an implicit animation.
58 virtual void SetTransform(const Transform& transform); 63 virtual void SetTransform(const Transform& transform);
59 Transform GetTargetTransform() const; 64 Transform GetTargetTransform() const;
(...skipping 12 matching lines...) Expand all
72 77
73 // Sets the brightness on the delegate. May cause an implicit animation. 78 // Sets the brightness on the delegate. May cause an implicit animation.
74 virtual void SetBrightness(float brightness); 79 virtual void SetBrightness(float brightness);
75 float GetTargetBrightness() const; 80 float GetTargetBrightness() const;
76 81
77 // Sets the grayscale on the delegate. May cause an implicit animation. 82 // Sets the grayscale on the delegate. May cause an implicit animation.
78 virtual void SetGrayscale(float grayscale); 83 virtual void SetGrayscale(float grayscale);
79 float GetTargetGrayscale() const; 84 float GetTargetGrayscale() const;
80 85
81 // Sets the layer animation delegate the animator is associated with. The 86 // Sets the layer animation delegate the animator is associated with. The
82 // animator does not own the delegate. 87 // animator does not own the delegate. The layer animator expects a non-NULL
88 // delegate for most of its operations, so do not call any methods without
89 // a valid delegate installed.
83 void SetDelegate(LayerAnimationDelegate* delegate); 90 void SetDelegate(LayerAnimationDelegate* delegate);
84 91
85 // Sets the animation preemption strategy. This determines the behaviour if 92 // Sets the animation preemption strategy. This determines the behaviour if
86 // a property is set during an animation. The default is 93 // a property is set during an animation. The default is
87 // IMMEDIATELY_SET_NEW_TARGET (see ImmediatelySetNewTarget below). 94 // IMMEDIATELY_SET_NEW_TARGET (see ImmediatelySetNewTarget below).
88 void set_preemption_strategy(PreemptionStrategy strategy) { 95 void set_preemption_strategy(PreemptionStrategy strategy) {
89 preemption_strategy_ = strategy; 96 preemption_strategy_ = strategy;
90 } 97 }
91 98
92 PreemptionStrategy preemption_strategy() const { 99 PreemptionStrategy preemption_strategy() const {
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 // When set to true, all animations complete immediately. 174 // When set to true, all animations complete immediately.
168 static void set_disable_animations_for_test(bool disable_animations) { 175 static void set_disable_animations_for_test(bool disable_animations) {
169 disable_animations_for_test_ = disable_animations; 176 disable_animations_for_test_ = disable_animations;
170 } 177 }
171 178
172 static bool disable_animations_for_test() { 179 static bool disable_animations_for_test() {
173 return disable_animations_for_test_; 180 return disable_animations_for_test_;
174 } 181 }
175 182
176 protected: 183 protected:
184 virtual ~LayerAnimator();
185
177 LayerAnimationDelegate* delegate() { return delegate_; } 186 LayerAnimationDelegate* delegate() { return delegate_; }
178 const LayerAnimationDelegate* delegate() const { return delegate_; } 187 const LayerAnimationDelegate* delegate() const { return delegate_; }
179 188
180 // Virtual for testing. 189 // Virtual for testing.
181 virtual bool ProgressAnimation(LayerAnimationSequence* sequence, 190 virtual void ProgressAnimation(LayerAnimationSequence* sequence,
182 base::TimeDelta delta); 191 base::TimeDelta delta);
183 192
184 // Returns true if the sequence is owned by this animator. 193 // Returns true if the sequence is owned by this animator.
185 bool HasAnimation(LayerAnimationSequence* sequence) const; 194 bool HasAnimation(LayerAnimationSequence* sequence) const;
186 195
187 private: 196 private:
197 friend class base::RefCounted<LayerAnimator>;
188 friend class ScopedLayerAnimationSettings; 198 friend class ScopedLayerAnimationSettings;
189 199
190 class DestroyedTracker;
191
192 // Used by FinishAnimation() to indicate if this has been destroyed.
193 enum DestroyedType {
194 DESTROYED,
195 NOT_DESTROYED,
196 };
197
198 // We need to keep track of the start time of every running animation. 200 // We need to keep track of the start time of every running animation.
199 struct RunningAnimation { 201 struct RunningAnimation {
200 RunningAnimation(LayerAnimationSequence* sequence, 202 RunningAnimation(LayerAnimationSequence* sequence,
201 base::TimeTicks start_time) 203 base::TimeTicks start_time)
202 : sequence(sequence), 204 : sequence(sequence),
203 start_time(start_time) { 205 start_time(start_time) {
204 } 206 }
205 LayerAnimationSequence* sequence; 207 LayerAnimationSequence* sequence;
206 base::TimeTicks start_time; 208 base::TimeTicks start_time;
207 }; 209 };
208 210
209 typedef std::vector<RunningAnimation> RunningAnimations; 211 typedef std::vector<RunningAnimation> RunningAnimations;
210 typedef std::deque<linked_ptr<LayerAnimationSequence> > AnimationQueue; 212 typedef std::deque<linked_ptr<LayerAnimationSequence> > AnimationQueue;
211 213
212 // Implementation of AnimationContainerElement 214 // Implementation of AnimationContainerElement
213 virtual void SetStartTime(base::TimeTicks start_time) OVERRIDE; 215 virtual void SetStartTime(base::TimeTicks start_time) OVERRIDE;
214 virtual void Step(base::TimeTicks time_now) OVERRIDE; 216 virtual void Step(base::TimeTicks time_now) OVERRIDE;
215 virtual base::TimeDelta GetTimerInterval() const OVERRIDE; 217 virtual base::TimeDelta GetTimerInterval() const OVERRIDE;
216 218
217 // Starts or stops stepping depending on whether thare are running animations. 219 // Starts or stops stepping depending on whether thare are running animations.
218 void UpdateAnimationState(); 220 void UpdateAnimationState();
219 221
220 // Removes the sequences from both the running animations and the queue. 222 // Removes the sequences from both the running animations and the queue.
221 // Returns a pointer to the removed animation, if any. NOTE: the caller is 223 // Returns a pointer to the removed animation, if any. NOTE: the caller is
222 // responsible for deleting the returned pointer. 224 // responsible for deleting the returned pointer.
223 LayerAnimationSequence* RemoveAnimation( 225 LayerAnimationSequence* RemoveAnimation(
224 LayerAnimationSequence* sequence) WARN_UNUSED_RESULT; 226 LayerAnimationSequence* sequence) WARN_UNUSED_RESULT;
225 227
226 // Progresses to the end of the sequence before removing it. 228 // Progresses to the end of the sequence before removing it.
227 DestroyedType FinishAnimation( 229 void FinishAnimation(LayerAnimationSequence* sequence);
228 LayerAnimationSequence* sequence) WARN_UNUSED_RESULT;
229 230
230 // Finishes any running animation with zero duration. 231 // Finishes any running animation with zero duration.
231 void FinishAnyAnimationWithZeroDuration(); 232 void FinishAnyAnimationWithZeroDuration();
232 233
233 // Clears the running animations and the queue. No sequences are progressed. 234 // Clears the running animations and the queue. No sequences are progressed.
234 void ClearAnimations(); 235 void ClearAnimations();
235 236
236 // Returns the running animation animating the given property, if any. 237 // Returns the running animation animating the given property, if any.
237 RunningAnimation* GetRunningAnimation( 238 RunningAnimation* GetRunningAnimation(
238 LayerAnimationElement::AnimatableProperty property); 239 LayerAnimationElement::AnimatableProperty property);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 void GetTargetValue(LayerAnimationElement::TargetValue* target) const; 276 void GetTargetValue(LayerAnimationElement::TargetValue* target) const;
276 277
277 // Called whenever an animation is added to the animation queue. Either by 278 // Called whenever an animation is added to the animation queue. Either by
278 // starting the animation or adding to the queue. 279 // starting the animation or adding to the queue.
279 void OnScheduled(LayerAnimationSequence* sequence); 280 void OnScheduled(LayerAnimationSequence* sequence);
280 281
281 // Returns the default length of animations, including adjustment for slow 282 // Returns the default length of animations, including adjustment for slow
282 // animation mode if set. 283 // animation mode if set.
283 base::TimeDelta GetTransitionDuration() const; 284 base::TimeDelta GetTransitionDuration() const;
284 285
286 // Clears the animation queues and notifies any running animations that they
287 // have been aborted.
288 void ClearAnimationsInternal();
289
285 // This is the queue of animations to run. 290 // This is the queue of animations to run.
286 AnimationQueue animation_queue_; 291 AnimationQueue animation_queue_;
287 292
288 // The target of all layer animations. 293 // The target of all layer animations.
289 LayerAnimationDelegate* delegate_; 294 LayerAnimationDelegate* delegate_;
290 295
291 // The currently running animations. 296 // The currently running animations.
292 RunningAnimations running_animations_; 297 RunningAnimations running_animations_;
293 298
294 // Determines how animations are replaced. 299 // Determines how animations are replaced.
(...skipping 21 matching lines...) Expand all
316 // Slows down all animations for visual debugging. 321 // Slows down all animations for visual debugging.
317 static bool slow_animation_mode_; 322 static bool slow_animation_mode_;
318 323
319 // Amount to slow animations for debugging. 324 // Amount to slow animations for debugging.
320 static int slow_animation_scale_factor_; 325 static int slow_animation_scale_factor_;
321 326
322 // Observers are notified when layer animations end, are scheduled or are 327 // Observers are notified when layer animations end, are scheduled or are
323 // aborted. 328 // aborted.
324 ObserverList<LayerAnimationObserver> observers_; 329 ObserverList<LayerAnimationObserver> observers_;
325 330
326 scoped_refptr<DestroyedTracker> destroyed_tracker_;
327
328 DISALLOW_COPY_AND_ASSIGN(LayerAnimator); 331 DISALLOW_COPY_AND_ASSIGN(LayerAnimator);
329 }; 332 };
330 333
331 } // namespace ui 334 } // namespace ui
332 335
333 #endif // UI_COMPOSITOR_LAYER_ANIMATOR_H_ 336 #endif // UI_COMPOSITOR_LAYER_ANIMATOR_H_
OLDNEW
« no previous file with comments | « ui/compositor/layer_animation_sequence.cc ('k') | ui/compositor/layer_animator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698