Index: cc/animation/layer_animation_controller.cc |
diff --git a/cc/animation/layer_animation_controller.cc b/cc/animation/layer_animation_controller.cc |
index acc16d3116423495f328adb52ceba01741277792..556c9c27d35dd866c7b1485169e97eb15126024f 100644 |
--- a/cc/animation/layer_animation_controller.cc |
+++ b/cc/animation/layer_animation_controller.cc |
@@ -92,6 +92,15 @@ void LayerAnimationController::RemoveAnimation( |
UpdateActivation(NormalActivation); |
} |
+void LayerAnimationController::AbortAnimations( |
+ Animation::TargetProperty target_property) { |
+ for (size_t i = 0; i < active_animations_.size(); ++i) { |
+ if (active_animations_[i]->target_property() == target_property && |
+ !active_animations_[i]->is_finished()) |
+ active_animations_[i]->SetRunState(Animation::Aborted, last_tick_time_); |
+ } |
+} |
+ |
// Ensures that the list of active animations on the main thread and the impl |
// thread are kept in sync. |
void LayerAnimationController::PushAnimationUpdatesTo( |
@@ -316,6 +325,17 @@ void LayerAnimationController::NotifyAnimationFinished( |
} |
} |
+void LayerAnimationController::NotifyAnimationAborted( |
+ const AnimationEvent& event) { |
+ for (size_t i = 0; i < active_animations_.size(); ++i) { |
+ if (active_animations_[i]->group() == event.group_id && |
+ active_animations_[i]->target_property() == event.target_property) { |
+ active_animations_[i]->SetRunState(Animation::Aborted, |
+ event.monotonic_time); |
+ } |
+ } |
+} |
+ |
void LayerAnimationController::NotifyAnimationPropertyUpdate( |
const AnimationEvent& event) { |
switch (event.target_property) { |
@@ -545,6 +565,7 @@ void LayerAnimationController::PromoteStartedAnimations( |
void LayerAnimationController::MarkFinishedAnimations(double monotonic_time) { |
for (size_t i = 0; i < active_animations_.size(); ++i) { |
if (active_animations_[i]->IsFinishedAt(monotonic_time) && |
+ active_animations_[i]->run_state() != Animation::Aborted && |
active_animations_[i]->run_state() != Animation::WaitingForDeletion) |
active_animations_[i]->SetRunState(Animation::Finished, monotonic_time); |
} |
@@ -586,6 +607,21 @@ void LayerAnimationController::MarkAnimationsForDeletion( |
// have received a finished event before marking them for deletion. |
for (size_t i = 0; i < active_animations_.size(); i++) { |
int group_id = active_animations_[i]->group(); |
+ if (active_animations_[i]->run_state() == Animation::Aborted) { |
+ if (events && !active_animations_[i]->is_impl_only()) { |
+ AnimationEvent aborted_event( |
+ AnimationEvent::Aborted, |
+ id_, |
+ group_id, |
+ active_animations_[i]->target_property(), |
+ monotonic_time); |
+ events->push_back(aborted_event); |
+ } |
+ active_animations_[i]->SetRunState(Animation::WaitingForDeletion, |
+ monotonic_time); |
+ continue; |
+ } |
+ |
bool all_anims_with_same_id_are_finished = false; |
// Since deleting an animation on the main thread leads to its deletion |
@@ -595,9 +631,8 @@ void LayerAnimationController::MarkAnimationsForDeletion( |
events || active_animations_[i]->received_finished_event(); |
// If an animation is finished, and not already marked for deletion, |
// find out if all other animations in the same group are also finished. |
- if (active_animations_[i]->run_state() == Animation::Aborted || |
- (active_animations_[i]->run_state() == Animation::Finished && |
- animation_i_will_send_or_has_received_finish_event)) { |
+ if (active_animations_[i]->run_state() == Animation::Finished && |
+ animation_i_will_send_or_has_received_finish_event) { |
all_anims_with_same_id_are_finished = true; |
for (size_t j = 0; j < active_animations_.size(); ++j) { |
bool animation_j_will_send_or_has_received_finish_event = |
@@ -616,7 +651,8 @@ void LayerAnimationController::MarkAnimationsForDeletion( |
// group_id (and send along animation finished notifications, if |
// necessary). |
for (size_t j = i; j < active_animations_.size(); j++) { |
- if (group_id == active_animations_[j]->group()) { |
+ if (active_animations_[j]->group() == group_id && |
+ active_animations_[j]->run_state() != Animation::Aborted) { |
if (events) { |
AnimationEvent finished_event( |
AnimationEvent::Finished, |