123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695 |
- // 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 <memory>
- #include "base/bind.h"
- #include "base/memory/raw_ptr.h"
- #include "testing/gtest/include/gtest/gtest.h"
- #include "ui/compositor/layer_animation_sequence.h"
- #include "ui/compositor/test/layer_animation_observer_test_api.h"
- namespace ui {
- namespace test {
- // Simple class that tracks whether callbacks were invoked and when.
- class TestCallbacks {
- public:
- TestCallbacks();
- TestCallbacks(const TestCallbacks&) = delete;
- TestCallbacks& operator=(const TestCallbacks&) = delete;
- virtual ~TestCallbacks();
- void ResetCallbackObservations();
- void set_should_delete_observer_on_animations_ended(
- bool should_delete_observer_on_animations_ended) {
- should_delete_observer_on_animations_ended_ =
- should_delete_observer_on_animations_ended;
- }
- bool animations_started() const { return animations_started_; }
- bool animations_ended() const { return animations_ended_; }
- virtual void AnimationsStarted(const CallbackLayerAnimationObserver&);
- virtual bool AnimationsEnded(const CallbackLayerAnimationObserver&);
- testing::AssertionResult StartedEpochIsBeforeEndedEpoch();
- private:
- // Monotonic counter that tracks the next time snapshot.
- int next_epoch_ = 0;
- // Is true when AnimationsStarted() has been called.
- bool animations_started_ = false;
- // Relative time snapshot of when AnimationsStarted() was last called.
- int animations_started_epoch_ = -1;
- // Is true when AnimationsEnded() has been called.
- bool animations_ended_ = false;
- // Relative time snapshot of when AnimationsEnded() was last called.
- int animations_ended_epoch_ = -1;
- // The return value for AnimationsEnded().
- bool should_delete_observer_on_animations_ended_ = false;
- };
- TestCallbacks::TestCallbacks() {}
- TestCallbacks::~TestCallbacks() {}
- void TestCallbacks::ResetCallbackObservations() {
- next_epoch_ = 0;
- animations_started_ = false;
- animations_started_epoch_ = -1;
- animations_ended_ = false;
- animations_ended_epoch_ = -1;
- should_delete_observer_on_animations_ended_ = false;
- }
- void TestCallbacks::AnimationsStarted(const CallbackLayerAnimationObserver&) {
- animations_started_ = true;
- animations_started_epoch_ = next_epoch_++;
- }
- bool TestCallbacks::AnimationsEnded(const CallbackLayerAnimationObserver&) {
- animations_ended_ = true;
- animations_ended_epoch_ = next_epoch_++;
- return should_delete_observer_on_animations_ended_;
- }
- testing::AssertionResult TestCallbacks::StartedEpochIsBeforeEndedEpoch() {
- if (animations_started_epoch_ < animations_ended_epoch_) {
- return testing::AssertionSuccess();
- } else {
- return testing::AssertionFailure()
- << "The started epoch=" << animations_started_epoch_
- << " is NOT before the ended epoch=" << animations_ended_epoch_;
- }
- }
- // A child of TestCallbacks that can explicitly delete a
- // CallbackLayerAnimationObserver in the AnimationsStarted() or
- // AnimationsEnded() callback.
- class TestCallbacksThatExplicitlyDeletesObserver : public TestCallbacks {
- public:
- TestCallbacksThatExplicitlyDeletesObserver();
- TestCallbacksThatExplicitlyDeletesObserver(
- const TestCallbacksThatExplicitlyDeletesObserver&) = delete;
- TestCallbacksThatExplicitlyDeletesObserver& operator=(
- const TestCallbacksThatExplicitlyDeletesObserver&) = delete;
- void set_observer_to_delete_in_animation_started(
- CallbackLayerAnimationObserver* observer) {
- observer_to_delete_in_animation_started_ = observer;
- }
- void set_observer_to_delete_in_animation_ended(
- CallbackLayerAnimationObserver* observer) {
- observer_to_delete_in_animation_ended_ = observer;
- }
- // TestCallbacks:
- void AnimationsStarted(
- const CallbackLayerAnimationObserver& observer) override;
- bool AnimationsEnded(const CallbackLayerAnimationObserver& observer) override;
- private:
- // The observer to delete, if non-NULL, in AnimationsStarted().
- raw_ptr<CallbackLayerAnimationObserver>
- observer_to_delete_in_animation_started_ = nullptr;
- // The observer to delete, if non-NULL, in AnimationsEnded().
- raw_ptr<CallbackLayerAnimationObserver>
- observer_to_delete_in_animation_ended_ = nullptr;
- };
- TestCallbacksThatExplicitlyDeletesObserver::
- TestCallbacksThatExplicitlyDeletesObserver() {}
- void TestCallbacksThatExplicitlyDeletesObserver::AnimationsStarted(
- const CallbackLayerAnimationObserver& observer) {
- if (observer_to_delete_in_animation_started_)
- delete observer_to_delete_in_animation_started_;
- TestCallbacks::AnimationsStarted(observer);
- }
- bool TestCallbacksThatExplicitlyDeletesObserver::AnimationsEnded(
- const CallbackLayerAnimationObserver& observer) {
- if (observer_to_delete_in_animation_ended_)
- delete observer_to_delete_in_animation_ended_;
- return TestCallbacks::AnimationsEnded(observer);
- }
- // A test specific CallbackLayerAnimationObserver that will set a bool when
- // destroyed.
- class TestCallbackLayerAnimationObserver
- : public CallbackLayerAnimationObserver {
- public:
- TestCallbackLayerAnimationObserver(
- AnimationStartedCallback animation_started_callback,
- AnimationEndedCallback animation_ended_callback,
- bool* destroyed);
- TestCallbackLayerAnimationObserver(
- AnimationStartedCallback animation_started_callback,
- bool should_delete_observer,
- bool* destroyed);
- TestCallbackLayerAnimationObserver(
- AnimationEndedCallback animation_ended_callback,
- bool* destroyed);
- TestCallbackLayerAnimationObserver(
- const TestCallbackLayerAnimationObserver&) = delete;
- TestCallbackLayerAnimationObserver& operator=(
- const TestCallbackLayerAnimationObserver&) = delete;
- ~TestCallbackLayerAnimationObserver() override;
- private:
- raw_ptr<bool> destroyed_;
- };
- TestCallbackLayerAnimationObserver::TestCallbackLayerAnimationObserver(
- AnimationStartedCallback animation_started_callback,
- AnimationEndedCallback animation_ended_callback,
- bool* destroyed)
- : CallbackLayerAnimationObserver(animation_started_callback,
- animation_ended_callback),
- destroyed_(destroyed) {
- if (destroyed_)
- (*destroyed_) = false;
- }
- TestCallbackLayerAnimationObserver::TestCallbackLayerAnimationObserver(
- AnimationStartedCallback animation_started_callback,
- bool should_delete_observer,
- bool* destroyed)
- : CallbackLayerAnimationObserver(animation_started_callback,
- should_delete_observer),
- destroyed_(destroyed) {
- if (destroyed_)
- (*destroyed_) = false;
- }
- TestCallbackLayerAnimationObserver::TestCallbackLayerAnimationObserver(
- AnimationEndedCallback animation_ended_callback,
- bool* destroyed)
- : CallbackLayerAnimationObserver(animation_ended_callback),
- destroyed_(destroyed) {
- if (destroyed_)
- (*destroyed_) = false;
- }
- TestCallbackLayerAnimationObserver::~TestCallbackLayerAnimationObserver() {
- if (destroyed_)
- (*destroyed_) = true;
- }
- class CallbackLayerAnimationObserverTest : public testing::Test {
- public:
- CallbackLayerAnimationObserverTest();
- CallbackLayerAnimationObserverTest(
- const CallbackLayerAnimationObserverTest&) = delete;
- CallbackLayerAnimationObserverTest& operator=(
- const CallbackLayerAnimationObserverTest&) = delete;
- ~CallbackLayerAnimationObserverTest() override;
- protected:
- // Creates a LayerAnimationSequence. The lifetime of the sequence will be
- // managed by this.
- LayerAnimationSequence* CreateLayerAnimationSequence();
- std::unique_ptr<TestCallbacks> callbacks_;
- std::unique_ptr<CallbackLayerAnimationObserver> observer_;
- std::unique_ptr<LayerAnimationObserverTestApi> observer_test_api_;
- // List of managaged sequences created by CreateLayerAnimationSequence() that
- // need to be destroyed.
- std::vector<std::unique_ptr<LayerAnimationSequence>> sequences_;
- };
- CallbackLayerAnimationObserverTest::CallbackLayerAnimationObserverTest()
- : callbacks_(new TestCallbacks()),
- observer_(new CallbackLayerAnimationObserver(
- base::BindRepeating(&TestCallbacks::AnimationsStarted,
- base::Unretained(callbacks_.get())),
- base::BindRepeating(&TestCallbacks::AnimationsEnded,
- base::Unretained(callbacks_.get())))),
- observer_test_api_(new LayerAnimationObserverTestApi(observer_.get())) {}
- CallbackLayerAnimationObserverTest::~CallbackLayerAnimationObserverTest() {
- observer_test_api_.reset();
- // The |observer_| will detach from all attached sequences upon destruction so
- // we need to explicitly delete the |observer_| before the |sequences_| and
- // |callbacks_|.
- observer_.reset();
- }
- LayerAnimationSequence*
- CallbackLayerAnimationObserverTest::CreateLayerAnimationSequence() {
- sequences_.emplace_back(new LayerAnimationSequence);
- return sequences_.back().get();
- }
- class CallbackLayerAnimationObserverTestOverwrite
- : public CallbackLayerAnimationObserverTest {
- public:
- CallbackLayerAnimationObserverTestOverwrite();
- CallbackLayerAnimationObserverTestOverwrite(
- const CallbackLayerAnimationObserverTestOverwrite&) = delete;
- CallbackLayerAnimationObserverTestOverwrite& operator=(
- const CallbackLayerAnimationObserverTestOverwrite&) = delete;
- protected:
- void AnimationStarted(const CallbackLayerAnimationObserver& observer);
- std::unique_ptr<CallbackLayerAnimationObserver> CreateAnimationObserver();
- };
- CallbackLayerAnimationObserverTestOverwrite::
- CallbackLayerAnimationObserverTestOverwrite() {
- observer_ = CreateAnimationObserver();
- observer_test_api_ =
- std::make_unique<LayerAnimationObserverTestApi>(observer_.get());
- }
- void CallbackLayerAnimationObserverTestOverwrite::AnimationStarted(
- const CallbackLayerAnimationObserver& observer) {
- observer_->OnLayerAnimationAborted(sequences_.front().get());
- observer_test_api_.reset();
- // Replace the current observer with a new observer so that the destructor
- // gets called on the current observer.
- observer_ = CreateAnimationObserver();
- }
- std::unique_ptr<CallbackLayerAnimationObserver>
- CallbackLayerAnimationObserverTestOverwrite::CreateAnimationObserver() {
- return std::make_unique<CallbackLayerAnimationObserver>(
- base::BindRepeating(
- &CallbackLayerAnimationObserverTestOverwrite::AnimationStarted,
- base::Unretained(this)),
- base::BindRepeating([](const CallbackLayerAnimationObserver& observer) {
- return false;
- }));
- }
- TEST(CallbackLayerAnimationObserverDestructionTest, VerifyFalseAutoDelete) {
- TestCallbacks callbacks;
- callbacks.set_should_delete_observer_on_animations_ended(false);
- bool is_destroyed = false;
- TestCallbackLayerAnimationObserver* observer =
- new TestCallbackLayerAnimationObserver(
- base::BindRepeating(&TestCallbacks::AnimationsStarted,
- base::Unretained(&callbacks)),
- false, &is_destroyed);
- observer->SetActive();
- EXPECT_FALSE(is_destroyed);
- delete observer;
- }
- TEST(CallbackLayerAnimationObserverDestructionTest, VerifyTrueAutoDelete) {
- TestCallbacks callbacks;
- callbacks.set_should_delete_observer_on_animations_ended(false);
- bool is_destroyed = false;
- TestCallbackLayerAnimationObserver* observer =
- new TestCallbackLayerAnimationObserver(
- base::BindRepeating(&TestCallbacks::AnimationsStarted,
- base::Unretained(&callbacks)),
- true, &is_destroyed);
- observer->SetActive();
- EXPECT_TRUE(is_destroyed);
- }
- TEST(CallbackLayerAnimationObserverDestructionTest,
- AnimationEndedReturnsFalse) {
- TestCallbacks callbacks;
- callbacks.set_should_delete_observer_on_animations_ended(false);
- bool is_destroyed = false;
- TestCallbackLayerAnimationObserver* observer =
- new TestCallbackLayerAnimationObserver(
- base::BindRepeating(&TestCallbacks::AnimationsStarted,
- base::Unretained(&callbacks)),
- base::BindRepeating(&TestCallbacks::AnimationsEnded,
- base::Unretained(&callbacks)),
- &is_destroyed);
- observer->SetActive();
- EXPECT_FALSE(is_destroyed);
- delete observer;
- }
- TEST(CallbackLayerAnimationObserverDestructionTest, AnimationEndedReturnsTrue) {
- TestCallbacks callbacks;
- callbacks.set_should_delete_observer_on_animations_ended(true);
- bool is_destroyed = false;
- TestCallbackLayerAnimationObserver* observer =
- new TestCallbackLayerAnimationObserver(
- base::BindRepeating(&TestCallbacks::AnimationsStarted,
- base::Unretained(&callbacks)),
- base::BindRepeating(&TestCallbacks::AnimationsEnded,
- base::Unretained(&callbacks)),
- &is_destroyed);
- observer->SetActive();
- EXPECT_TRUE(is_destroyed);
- }
- // Verifies that there are not heap-use-after-free errors when an observer has
- // its animation aborted and it gets destroyed due to a
- // unique_ptr<CallbackLayerAnimationObserver> being assigned a new value.
- TEST_F(CallbackLayerAnimationObserverTestOverwrite,
- VerifyOverwriteOnAnimationStart) {
- LayerAnimationSequence* sequence_1 = CreateLayerAnimationSequence();
- LayerAnimationSequence* sequence_2 = CreateLayerAnimationSequence();
- observer_test_api_->AttachedToSequence(sequence_1);
- observer_test_api_->AttachedToSequence(sequence_2);
- observer_->OnLayerAnimationStarted(sequence_1);
- observer_->OnLayerAnimationStarted(sequence_2);
- observer_->OnLayerAnimationEnded(sequence_1);
- observer_->SetActive();
- EXPECT_FALSE(observer_->active());
- }
- TEST_F(CallbackLayerAnimationObserverTest, VerifyInitialState) {
- EXPECT_FALSE(observer_->active());
- EXPECT_EQ(0, observer_->aborted_count());
- EXPECT_EQ(0, observer_->successful_count());
- EXPECT_FALSE(callbacks_->animations_started());
- EXPECT_FALSE(callbacks_->animations_ended());
- }
- // Verifies that the CallbackLayerAnimationObserver is robust to explicit
- // deletes caused as a side effect of calling the AnimationsStartedCallback()
- // when there are no animation sequences attached. This test also guards against
- // heap-use-after-free errors.
- TEST_F(
- CallbackLayerAnimationObserverTest,
- ExplicitlyDeleteObserverInAnimationStartedCallbackWithNoSequencesAttached) {
- TestCallbacksThatExplicitlyDeletesObserver callbacks;
- callbacks.set_should_delete_observer_on_animations_ended(true);
- bool is_destroyed = false;
- TestCallbackLayerAnimationObserver* observer =
- new TestCallbackLayerAnimationObserver(
- base::BindRepeating(&TestCallbacks::AnimationsStarted,
- base::Unretained(&callbacks)),
- base::BindRepeating(&TestCallbacks::AnimationsEnded,
- base::Unretained(&callbacks)),
- &is_destroyed);
- callbacks.set_observer_to_delete_in_animation_started(observer);
- observer->SetActive();
- EXPECT_TRUE(is_destroyed);
- }
- // Verifies that the CallbackLayerAnimationObserver is robust to explicit
- // deletes caused as a side effect of calling the AnimationsStartedCallback()
- // when there are some animation sequences attached. This test also guards
- // against heap-use-after-free errors.
- TEST_F(
- CallbackLayerAnimationObserverTest,
- ExplicitlyDeleteObserverInAnimationStartedCallbackWithSomeSequencesAttached) {
- LayerAnimationSequence* sequence_1 = CreateLayerAnimationSequence();
- LayerAnimationSequence* sequence_2 = CreateLayerAnimationSequence();
- TestCallbacksThatExplicitlyDeletesObserver callbacks;
- callbacks.set_should_delete_observer_on_animations_ended(true);
- bool is_destroyed = false;
- TestCallbackLayerAnimationObserver* observer =
- new TestCallbackLayerAnimationObserver(
- base::BindRepeating(&TestCallbacks::AnimationsStarted,
- base::Unretained(&callbacks)),
- base::BindRepeating(&TestCallbacks::AnimationsEnded,
- base::Unretained(&callbacks)),
- &is_destroyed);
- observer_test_api_->AttachedToSequence(sequence_1);
- observer_test_api_->AttachedToSequence(sequence_2);
- observer_->OnLayerAnimationStarted(sequence_1);
- observer_->OnLayerAnimationStarted(sequence_2);
- callbacks.set_observer_to_delete_in_animation_started(observer);
- observer->SetActive();
- EXPECT_TRUE(is_destroyed);
- }
- // Verifies that a 'true' return value for AnimationEndedCallback is ignored if
- // the CallbackLayerAnimationObserver is explicitly deleted as a side effect of
- // calling the AnimationEndedCallback. This test also guards against
- // heap-use-after-free errors.
- TEST_F(CallbackLayerAnimationObserverTest,
- IgnoreTrueReturnValueForAnimationEndedCallbackIfExplicitlyDeleted) {
- TestCallbacksThatExplicitlyDeletesObserver callbacks;
- callbacks.set_should_delete_observer_on_animations_ended(true);
- bool is_destroyed = false;
- TestCallbackLayerAnimationObserver* observer =
- new TestCallbackLayerAnimationObserver(
- base::BindRepeating(&TestCallbacks::AnimationsStarted,
- base::Unretained(&callbacks)),
- base::BindRepeating(&TestCallbacks::AnimationsEnded,
- base::Unretained(&callbacks)),
- &is_destroyed);
- callbacks.set_observer_to_delete_in_animation_ended(observer);
- observer->SetActive();
- EXPECT_TRUE(is_destroyed);
- }
- TEST_F(CallbackLayerAnimationObserverTest,
- SetActiveWhenNoSequencesWereAttached) {
- observer_->SetActive();
- EXPECT_FALSE(observer_->active());
- EXPECT_TRUE(callbacks_->animations_started());
- EXPECT_TRUE(callbacks_->animations_ended());
- EXPECT_TRUE(callbacks_->StartedEpochIsBeforeEndedEpoch());
- }
- TEST_F(CallbackLayerAnimationObserverTest,
- SetActiveWhenAllSequencesAreAttachedButNoneWereStarted) {
- LayerAnimationSequence* sequence_1 = CreateLayerAnimationSequence();
- LayerAnimationSequence* sequence_2 = CreateLayerAnimationSequence();
- observer_test_api_->AttachedToSequence(sequence_1);
- observer_test_api_->AttachedToSequence(sequence_2);
- observer_->SetActive();
- EXPECT_TRUE(observer_->active());
- EXPECT_FALSE(callbacks_->animations_started());
- EXPECT_FALSE(callbacks_->animations_ended());
- }
- TEST_F(CallbackLayerAnimationObserverTest,
- SetActiveWhenAllSequencesAreAttachedAndOnlySomeWereStarted) {
- LayerAnimationSequence* sequence_1 = CreateLayerAnimationSequence();
- LayerAnimationSequence* sequence_2 = CreateLayerAnimationSequence();
- observer_test_api_->AttachedToSequence(sequence_1);
- observer_test_api_->AttachedToSequence(sequence_2);
- observer_->OnLayerAnimationStarted(sequence_1);
- observer_->SetActive();
- EXPECT_TRUE(observer_->active());
- EXPECT_FALSE(callbacks_->animations_started());
- EXPECT_FALSE(callbacks_->animations_ended());
- }
- TEST_F(CallbackLayerAnimationObserverTest,
- SetActiveWhenAllSequencesAreAttachedAndOnlySomeWereCompleted) {
- LayerAnimationSequence* sequence_1 = CreateLayerAnimationSequence();
- LayerAnimationSequence* sequence_2 = CreateLayerAnimationSequence();
- observer_test_api_->AttachedToSequence(sequence_1);
- observer_test_api_->AttachedToSequence(sequence_2);
- observer_->OnLayerAnimationStarted(sequence_1);
- observer_->OnLayerAnimationEnded(sequence_1);
- observer_->SetActive();
- EXPECT_TRUE(observer_->active());
- EXPECT_FALSE(callbacks_->animations_started());
- EXPECT_FALSE(callbacks_->animations_ended());
- }
- TEST_F(CallbackLayerAnimationObserverTest,
- SetActiveAfterAllSequencesWereStartedButNoneWereCompleted) {
- LayerAnimationSequence* sequence_1 = CreateLayerAnimationSequence();
- LayerAnimationSequence* sequence_2 = CreateLayerAnimationSequence();
- observer_test_api_->AttachedToSequence(sequence_1);
- observer_test_api_->AttachedToSequence(sequence_2);
- observer_->OnLayerAnimationStarted(sequence_1);
- observer_->OnLayerAnimationStarted(sequence_2);
- observer_->SetActive();
- EXPECT_TRUE(observer_->active());
- EXPECT_TRUE(callbacks_->animations_started());
- EXPECT_FALSE(callbacks_->animations_ended());
- }
- TEST_F(CallbackLayerAnimationObserverTest,
- SetActiveWhenAllSequencesAreStartedAndOnlySomeWereCompleted) {
- LayerAnimationSequence* sequence_1 = CreateLayerAnimationSequence();
- LayerAnimationSequence* sequence_2 = CreateLayerAnimationSequence();
- observer_test_api_->AttachedToSequence(sequence_1);
- observer_test_api_->AttachedToSequence(sequence_2);
- observer_->OnLayerAnimationStarted(sequence_1);
- observer_->OnLayerAnimationStarted(sequence_2);
- observer_->OnLayerAnimationEnded(sequence_1);
- observer_->SetActive();
- EXPECT_TRUE(observer_->active());
- EXPECT_TRUE(callbacks_->animations_started());
- EXPECT_FALSE(callbacks_->animations_ended());
- }
- TEST_F(CallbackLayerAnimationObserverTest,
- SetActiveWhenAllSequencesWereCompleted) {
- LayerAnimationSequence* sequence_1 = CreateLayerAnimationSequence();
- LayerAnimationSequence* sequence_2 = CreateLayerAnimationSequence();
- observer_test_api_->AttachedToSequence(sequence_1);
- observer_test_api_->AttachedToSequence(sequence_2);
- observer_->OnLayerAnimationStarted(sequence_1);
- observer_->OnLayerAnimationStarted(sequence_2);
- observer_->OnLayerAnimationEnded(sequence_1);
- observer_->OnLayerAnimationEnded(sequence_2);
- observer_->SetActive();
- EXPECT_FALSE(observer_->active());
- EXPECT_TRUE(callbacks_->animations_started());
- EXPECT_TRUE(callbacks_->animations_ended());
- }
- TEST_F(CallbackLayerAnimationObserverTest,
- SetActiveAgainAfterAllSequencesWereCompleted) {
- LayerAnimationSequence* sequence_1 = CreateLayerAnimationSequence();
- LayerAnimationSequence* sequence_2 = CreateLayerAnimationSequence();
- LayerAnimationSequence* sequence_3 = CreateLayerAnimationSequence();
- LayerAnimationSequence* sequence_4 = CreateLayerAnimationSequence();
- observer_test_api_->AttachedToSequence(sequence_1);
- observer_test_api_->AttachedToSequence(sequence_2);
- observer_->OnLayerAnimationStarted(sequence_1);
- observer_->OnLayerAnimationStarted(sequence_2);
- observer_->OnLayerAnimationEnded(sequence_1);
- observer_->OnLayerAnimationEnded(sequence_2);
- observer_->SetActive();
- EXPECT_FALSE(observer_->active());
- observer_test_api_->AttachedToSequence(sequence_3);
- observer_test_api_->AttachedToSequence(sequence_4);
- callbacks_->ResetCallbackObservations();
- observer_->SetActive();
- EXPECT_TRUE(observer_->active());
- EXPECT_FALSE(callbacks_->animations_started());
- EXPECT_FALSE(callbacks_->animations_ended());
- EXPECT_EQ(2, observer_->successful_count());
- observer_->OnLayerAnimationStarted(sequence_3);
- observer_->OnLayerAnimationStarted(sequence_4);
- EXPECT_TRUE(observer_->active());
- EXPECT_TRUE(callbacks_->animations_started());
- EXPECT_FALSE(callbacks_->animations_ended());
- EXPECT_EQ(2, observer_->successful_count());
- observer_->OnLayerAnimationEnded(sequence_3);
- observer_->OnLayerAnimationEnded(sequence_4);
- EXPECT_FALSE(observer_->active());
- EXPECT_TRUE(callbacks_->animations_started());
- EXPECT_TRUE(callbacks_->animations_ended());
- EXPECT_EQ(4, observer_->successful_count());
- }
- TEST_F(CallbackLayerAnimationObserverTest, DetachBeforeActive) {
- LayerAnimationSequence* sequence_1 = CreateLayerAnimationSequence();
- LayerAnimationSequence* sequence_2 = CreateLayerAnimationSequence();
- observer_test_api_->AttachedToSequence(sequence_1);
- observer_test_api_->AttachedToSequence(sequence_2);
- observer_->OnLayerAnimationStarted(sequence_1);
- observer_->OnLayerAnimationEnded(sequence_1);
- observer_test_api_->DetachedFromSequence(sequence_1, true);
- observer_test_api_->DetachedFromSequence(sequence_2, true);
- observer_->SetActive();
- EXPECT_FALSE(observer_->active());
- EXPECT_TRUE(callbacks_->animations_started());
- EXPECT_TRUE(callbacks_->animations_ended());
- }
- TEST_F(CallbackLayerAnimationObserverTest, DetachAfterActive) {
- LayerAnimationSequence* sequence_1 = CreateLayerAnimationSequence();
- LayerAnimationSequence* sequence_2 = CreateLayerAnimationSequence();
- observer_test_api_->AttachedToSequence(sequence_1);
- observer_test_api_->AttachedToSequence(sequence_2);
- observer_->SetActive();
- observer_->OnLayerAnimationStarted(sequence_1);
- observer_->OnLayerAnimationEnded(sequence_1);
- observer_test_api_->DetachedFromSequence(sequence_1, true);
- observer_test_api_->DetachedFromSequence(sequence_2, true);
- EXPECT_FALSE(observer_->active());
- EXPECT_TRUE(callbacks_->animations_started());
- EXPECT_TRUE(callbacks_->animations_ended());
- }
- } // namespace test
- } // namespace ui
|