Index: cc/animation/layer_animation_controller.cc |
diff --git a/cc/animation/layer_animation_controller.cc b/cc/animation/layer_animation_controller.cc |
index 4e85592303ea3007915d1f577edfe667a2f0277d..c942b02f9fd06de8a4ed81fac7dbe78f32cfcdd7 100644 |
--- a/cc/animation/layer_animation_controller.cc |
+++ b/cc/animation/layer_animation_controller.cc |
@@ -602,6 +602,9 @@ void LayerAnimationController::StartAnimations(base::TimeTicks monotonic_time) { |
// First collect running properties affecting each type of observer. |
TargetProperties blocked_properties_for_active_observers; |
TargetProperties blocked_properties_for_pending_observers; |
+ std::vector<size_t> animations_waiting_for_target; |
+ |
+ animations_waiting_for_target.reserve(animations_.size()); |
for (size_t i = 0; i < animations_.size(); ++i) { |
if (animations_[i]->run_state() == Animation::Starting || |
animations_[i]->run_state() == Animation::Running) { |
@@ -613,22 +616,31 @@ void LayerAnimationController::StartAnimations(base::TimeTicks monotonic_time) { |
blocked_properties_for_pending_observers.insert( |
animations_[i]->target_property()); |
} |
+ } else if (animations_[i]->run_state() == |
+ Animation::WaitingForTargetAvailability) { |
+ animations_waiting_for_target.push_back(i); |
} |
} |
- for (size_t i = 0; i < animations_.size(); ++i) { |
- if (animations_[i]->run_state() == |
- Animation::WaitingForTargetAvailability) { |
+ for (size_t i = 0; i < animations_waiting_for_target.size(); ++i) { |
// Collect all properties for animations with the same group id (they |
// should all also be in the list of animations). |
+ size_t animation_index = animations_waiting_for_target[i]; |
+ Animation* animation_waiting_for_target = animations_[animation_index]; |
+ // Check for the run state again even though the animation was waiting |
+ // for target because it might have changed the run state while handling |
+ // previous animation in this loop (if they belong to same group). |
+ if (animation_waiting_for_target->run_state() == |
+ Animation::WaitingForTargetAvailability) { |
TargetProperties enqueued_properties; |
bool affects_active_observers = |
- animations_[i]->affects_active_observers(); |
+ animation_waiting_for_target->affects_active_observers(); |
bool affects_pending_observers = |
- animations_[i]->affects_pending_observers(); |
- enqueued_properties.insert(animations_[i]->target_property()); |
- for (size_t j = i + 1; j < animations_.size(); ++j) { |
- if (animations_[i]->group() == animations_[j]->group()) { |
+ animation_waiting_for_target->affects_pending_observers(); |
+ enqueued_properties.insert( |
+ animation_waiting_for_target->target_property()); |
+ for (size_t j = animation_index + 1; j < animations_.size(); ++j) { |
+ if (animation_waiting_for_target->group() == animations_[j]->group()) { |
enqueued_properties.insert(animations_[j]->target_property()); |
affects_active_observers |= |
animations_[j]->affects_active_observers(); |
@@ -657,9 +669,11 @@ void LayerAnimationController::StartAnimations(base::TimeTicks monotonic_time) { |
// If the intersection is null, then we are free to start the animations |
// in the group. |
if (null_intersection) { |
- animations_[i]->SetRunState(Animation::Starting, monotonic_time); |
- for (size_t j = i + 1; j < animations_.size(); ++j) { |
- if (animations_[i]->group() == animations_[j]->group()) { |
+ animation_waiting_for_target->SetRunState(Animation::Starting, |
+ monotonic_time); |
+ for (size_t j = animation_index + 1; j < animations_.size(); ++j) { |
+ if (animation_waiting_for_target->group() == |
+ animations_[j]->group()) { |
animations_[j]->SetRunState(Animation::Starting, monotonic_time); |
} |
} |