| Index: ui/compositor/callback_layer_animation_observer.cc
|
| diff --git a/ui/compositor/callback_layer_animation_observer.cc b/ui/compositor/callback_layer_animation_observer.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..305bce6a700ee1f78dd7bcc8f896a90ded07b1df
|
| --- /dev/null
|
| +++ b/ui/compositor/callback_layer_animation_observer.cc
|
| @@ -0,0 +1,115 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "ui/compositor/callback_layer_animation_observer.h"
|
| +
|
| +#include "ui/compositor/layer_animation_sequence.h"
|
| +
|
| +namespace ui {
|
| +
|
| +CallbackLayerAnimationObserver::CallbackLayerAnimationObserver(
|
| + AnimationStartedCallback animation_started_callback,
|
| + AnimationEndedCallback animation_ended_callback)
|
| + : active_(false),
|
| + attached_sequence_count_(0),
|
| + detached_sequence_count_(0),
|
| + started_count_(0),
|
| + aborted_count_(0),
|
| + successful_count_(0),
|
| + animation_started_callback_(animation_started_callback),
|
| + animation_ended_callback_(animation_ended_callback),
|
| + destroyed_(nullptr) {}
|
| +
|
| +CallbackLayerAnimationObserver::~CallbackLayerAnimationObserver() {
|
| + if (destroyed_)
|
| + *destroyed_ = true;
|
| +}
|
| +
|
| +void CallbackLayerAnimationObserver::SetActive() {
|
| + active_ = true;
|
| +
|
| + bool destroyed = false;
|
| + destroyed_ = &destroyed;
|
| +
|
| + CheckAllSequencesStarted();
|
| +
|
| + if (destroyed)
|
| + return;
|
| + destroyed_ = nullptr;
|
| +
|
| + CheckAllSequencesCompleted();
|
| +}
|
| +
|
| +void CallbackLayerAnimationObserver::OnLayerAnimationStarted(
|
| + ui::LayerAnimationSequence* sequence) {
|
| + CHECK_LT(started_count_, attached_sequence_count_);
|
| + ++started_count_;
|
| + CheckAllSequencesStarted();
|
| +}
|
| +
|
| +void CallbackLayerAnimationObserver::OnLayerAnimationEnded(
|
| + ui::LayerAnimationSequence* sequence) {
|
| + CHECK_LT(GetNumSequencesCompleted(), attached_sequence_count_);
|
| + ++successful_count_;
|
| + CheckAllSequencesCompleted();
|
| +}
|
| +
|
| +void CallbackLayerAnimationObserver::OnLayerAnimationAborted(
|
| + ui::LayerAnimationSequence* sequence) {
|
| + CHECK_LT(GetNumSequencesCompleted(), attached_sequence_count_);
|
| + ++aborted_count_;
|
| + CheckAllSequencesCompleted();
|
| +}
|
| +
|
| +void CallbackLayerAnimationObserver::OnLayerAnimationScheduled(
|
| + ui::LayerAnimationSequence* sequence) {}
|
| +
|
| +bool CallbackLayerAnimationObserver::RequiresNotificationWhenAnimatorDestroyed()
|
| + const {
|
| + return true;
|
| +}
|
| +
|
| +void CallbackLayerAnimationObserver::OnAttachedToSequence(
|
| + ui::LayerAnimationSequence* sequence) {
|
| + ++attached_sequence_count_;
|
| +}
|
| +
|
| +void CallbackLayerAnimationObserver::OnDetachedFromSequence(
|
| + ui::LayerAnimationSequence* sequence) {
|
| + CHECK_LT(detached_sequence_count_, attached_sequence_count_);
|
| + ++detached_sequence_count_;
|
| +}
|
| +
|
| +int CallbackLayerAnimationObserver::GetNumSequencesCompleted() {
|
| + return aborted_count_ + successful_count_;
|
| +}
|
| +
|
| +void CallbackLayerAnimationObserver::CheckAllSequencesStarted() {
|
| + if (active_ && attached_sequence_count_ == started_count_)
|
| + animation_started_callback_.Run(*this);
|
| +}
|
| +
|
| +void CallbackLayerAnimationObserver::CheckAllSequencesCompleted() {
|
| + if (active_ && GetNumSequencesCompleted() == attached_sequence_count_) {
|
| + active_ = false;
|
| + bool destroyed = false;
|
| + destroyed_ = &destroyed;
|
| +
|
| + bool should_delete = animation_ended_callback_.Run(*this);
|
| +
|
| + if (destroyed) {
|
| + if (should_delete)
|
| + LOG(WARNING) << "CallbackLayerAnimationObserver was explicitly "
|
| + "destroyed AND was requested to be destroyed via the "
|
| + "AnimationEndedCallback's return value.";
|
| + return;
|
| + }
|
| + destroyed_ = nullptr;
|
| +
|
| + if (should_delete)
|
| + delete this;
|
| + }
|
| +}
|
| +
|
| +} // namespace ui
|
|
|