layer_animation_sequence.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef UI_COMPOSITOR_LAYER_ANIMATION_SEQUENCE_H_
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define UI_COMPOSITOR_LAYER_ANIMATION_SEQUENCE_H_
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <vector>
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/gtest_prod_util.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/linked_ptr.h"
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/weak_ptr.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/observer_list.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/time/time.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/compositor/compositor_export.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/compositor/layer_animation_element.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace ui {
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class LayerAnimationDelegate;
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass LayerAnimationObserver;
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Contains a collection of layer animation elements to be played one after
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// another. Although it has a similar interface to LayerAnimationElement, it is
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// not a LayerAnimationElement (i.e., it is not permitted to have a sequence in
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// a sequence). Sequences own their elements, and sequences are themselves owned
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// by a LayerAnimator.
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TODO(vollick) Create a 'blended' sequence for transitioning between
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// sequences.
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TODO(vollick) Eventually, the LayerAnimator will switch to a model where new
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// work is scheduled rather than calling methods directly. This should make it
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// impossible for temporary pointers to running animations to go stale. When
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// this happens, there will be no need for LayerAnimationSequences to support
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// weak pointers.
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class COMPOSITOR_EXPORT LayerAnimationSequence
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : public base::SupportsWeakPtr<LayerAnimationSequence> {
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  LayerAnimationSequence();
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Takes ownership of the given element and adds it to the sequence.
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit LayerAnimationSequence(LayerAnimationElement* element);
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual ~LayerAnimationSequence();
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Sets the start time for the animation. This must be called before the
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // first call to {Start, IsFinished}. Once the animation is finished, this
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // must be called again in order to restart the animation.
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void set_start_time(base::TimeTicks start_time) { start_time_ = start_time; }
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::TimeTicks start_time() const { return start_time_; }
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Sets a flag indicating that this sequence will start together with other
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // sequences, and at least one of the sequences in this group has a threaded
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // first element.
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void set_waiting_for_group_start(bool waiting) {
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    waiting_for_group_start_ = waiting;
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool waiting_for_group_start() { return waiting_for_group_start_; }
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This must be called before the first call to Progress. If starting the
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // animation involves dispatching to another thread, then this will proceed
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // with that dispatch, ultimately resulting in the animation getting an
61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // effective start time (the time the animation starts on the other thread).
62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void Start(LayerAnimationDelegate* delegate);
63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Updates the delegate to the appropriate value for |now|. Requests a
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // redraw if it is required.
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Progress(base::TimeTicks now, LayerAnimationDelegate* delegate);
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns true if calling Progress now, with the given time, will finish
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // the animation.
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool IsFinished(base::TimeTicks time);
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Updates the delegate to the end of the animation; if this sequence is
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // cyclic, updates the delegate to the end of one cycle of the sequence.
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void ProgressToEnd(LayerAnimationDelegate* delegate);
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Sets the target value to the value that would have been set had
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // the sequence completed. Does nothing if the sequence is cyclic.
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void GetTargetValue(LayerAnimationElement::TargetValue* target) const;
795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Aborts the given animation.
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Abort(LayerAnimationDelegate* delegate);
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // All properties modified by the sequence.
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  LayerAnimationElement::AnimatableProperties properties() const {
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return properties_;
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Adds an element to the sequence. The sequences takes ownership of this
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // element.
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void AddElement(LayerAnimationElement* element);
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Sequences can be looped indefinitely.
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void set_is_cyclic(bool is_cyclic) { is_cyclic_ = is_cyclic; }
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool is_cyclic() const { return is_cyclic_; }
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Returns true if this sequence has at least one element conflicting with a
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // property in |other|.
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool HasConflictingProperty(
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      LayerAnimationElement::AnimatableProperties other) const;
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns true if the first element animates on the compositor thread.
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool IsFirstElementThreaded() const;
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Used to identify groups of sequences that are supposed to start together.
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Once started, used to identify the sequence that owns a particular
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // threaded animation.
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int animation_group_id() const { return animation_group_id_; }
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void set_animation_group_id(int id) { animation_group_id_ = id; }
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // These functions are used for adding or removing observers from the observer
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // list. The observers are notified when animations end.
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void AddObserver(LayerAnimationObserver* observer);
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void RemoveObserver(LayerAnimationObserver* observer);
11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Called when a threaded animation is actually started.
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnThreadedAnimationStarted(const cc::AnimationEvent& event);
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Called when the animator schedules this sequence.
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnScheduled();
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Called when the animator is destroyed.
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnAnimatorDestroyed();
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The last_progressed_fraction of the element most recently progressed by
125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // by this sequence. Returns 0.0 if no elements have been progressed.
126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  double last_progressed_fraction() const { return last_progressed_fraction_; }
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  size_t size() const;
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  LayerAnimationElement* FirstElement() const;
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  friend class LayerAnimatorTestController;
134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  typedef std::vector<linked_ptr<LayerAnimationElement> > Elements;
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(LayerAnimatorTest,
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           ObserverReleasedBeforeAnimationSequenceEnds);
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Notifies the observers that this sequence has been scheduled.
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void NotifyScheduled();
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Notifies the observers that this sequence has ended.
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void NotifyEnded();
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Notifies the observers that this sequence has been aborted.
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void NotifyAborted();
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The currently animating element.
150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  LayerAnimationElement* CurrentElement() const;
151a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The union of all the properties modified by all elements in the sequence.
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  LayerAnimationElement::AnimatableProperties properties_;
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The elements in the sequence.
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Elements elements_;
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // True if the sequence should be looped forever.
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool is_cyclic_;
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // These are used when animating to efficiently find the next element.
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  size_t last_element_;
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::TimeTicks last_start_;
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The start time of the current run of the sequence.
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::TimeTicks start_time_;
167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // True if this sequence will start together with other sequences, and at
169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // least one of the sequences in this group has a threaded first element.
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool waiting_for_group_start_;
171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Identifies groups of sequences that are supposed to start together.
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Also used to identify the owner of a particular threaded animation; any
174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // in-progress threaded animation owned by this sequence will have this
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // group id.
176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int animation_group_id_;
177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // These parties are notified when layer animations end.
179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ObserverList<LayerAnimationObserver> observers_;
180a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
181a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Tracks the last_progressed_fraction() of the most recently progressed
182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // element.
183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  double last_progressed_fraction_;
184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::WeakPtrFactory<LayerAnimationSequence> weak_ptr_factory_;
186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(LayerAnimationSequence);
188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace ui
191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif  // UI_COMPOSITOR_LAYER_ANIMATION_SEQUENCE_H_
193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch