Chromium Code Reviews| Index: cc/trees/layer_tree_host_unittest_proxy.cc |
| diff --git a/cc/trees/layer_tree_host_unittest_proxy.cc b/cc/trees/layer_tree_host_unittest_proxy.cc |
| index 8c3779bffecde06ef65268010e1b8ba1ec18f8cf..8b7a29ba6f746b862bba176f316eebeb892c1840 100644 |
| --- a/cc/trees/layer_tree_host_unittest_proxy.cc |
| +++ b/cc/trees/layer_tree_host_unittest_proxy.cc |
| @@ -10,406 +10,431 @@ |
| #include "cc/trees/proxy_impl.h" |
| #include "cc/trees/proxy_main.h" |
| -#define PROXY_MAIN_THREADED_TEST_F(TEST_FIXTURE_NAME) \ |
| - TEST_F(TEST_FIXTURE_NAME, MultiThread) { Run(true); } |
| - |
| -// Do common tests for single thread proxy and proxy main in threaded mode. |
| -// TODO(simonhong): Add SINGLE_THREAD_PROXY_TEST_F |
| -#define PROXY_TEST_SCHEDULED_ACTION(TEST_FIXTURE_NAME) \ |
| - PROXY_MAIN_THREADED_TEST_F(TEST_FIXTURE_NAME); |
| - |
| namespace cc { |
| -class ProxyTest : public LayerTreeTest { |
| - protected: |
| - ProxyTest() {} |
| - ~ProxyTest() override {} |
| - |
| - void Run(bool threaded) { |
| - // We don't need to care about delegating mode. |
| - bool delegating_renderer = true; |
| - |
| - CompositorMode mode = |
| - threaded ? CompositorMode::THREADED : CompositorMode::SINGLE_THREADED; |
| - RunTest(mode, delegating_renderer); |
| - } |
| - |
| - void BeginTest() override {} |
| - void AfterTest() override {} |
| - |
| - private: |
| - DISALLOW_COPY_AND_ASSIGN(ProxyTest); |
| -}; |
| - |
| -class ProxyTestScheduledActionsBasic : public ProxyTest { |
| +class LayerTreeHostProxyTest : public LayerTreeTest { |
| protected: |
| - void BeginTest() override { proxy()->SetNeedsCommit(); } |
| - |
| - void ScheduledActionBeginOutputSurfaceCreation() override { |
| - EXPECT_EQ(0, action_phase_++); |
| - } |
| - |
| - void ScheduledActionSendBeginMainFrame() override { |
| - EXPECT_EQ(1, action_phase_++); |
| + void SetupTree() override { |
| + update_check_layer_ = FakePictureLayer::Create(&client_); |
| + layer_tree_host()->SetRootLayer(update_check_layer_); |
| + LayerTreeTest::SetupTree(); |
| + client_.set_bounds(update_check_layer_->bounds()); |
| } |
| - void ScheduledActionCommit() override { EXPECT_EQ(2, action_phase_++); } |
| - |
| - void ScheduledActionDrawAndSwapIfPossible() override { |
| - EXPECT_EQ(3, action_phase_++); |
| - EndTest(); |
| + FakePictureLayer* update_check_layer() const { |
| + return update_check_layer_.get(); |
| } |
| - void AfterTest() override { EXPECT_EQ(4, action_phase_); } |
| - |
| - ProxyTestScheduledActionsBasic() : action_phase_(0) { |
| + ProxyMain* GetProxyMain() const { |
| + DCHECK(HasImplThread()); |
| + return static_cast<ProxyMain*>(proxy()); |
| } |
| - ~ProxyTestScheduledActionsBasic() override {} |
| private: |
| - int action_phase_; |
| - |
| - DISALLOW_COPY_AND_ASSIGN(ProxyTestScheduledActionsBasic); |
| -}; |
| - |
| -PROXY_TEST_SCHEDULED_ACTION(ProxyTestScheduledActionsBasic); |
| - |
| -class ProxyMainThreaded : public ProxyTest { |
| - protected: |
| - ProxyMainThreaded() |
| - : update_check_layer_(FakePictureLayer::Create(&client_)) {} |
| - ~ProxyMainThreaded() override {} |
| - |
| - void SetupTree() override { |
| - layer_tree_host()->SetRootLayer(update_check_layer_); |
| - ProxyTest::SetupTree(); |
| - client_.set_bounds(update_check_layer_->bounds()); |
| - } |
| - |
| - protected: |
| FakeContentLayerClient client_; |
| scoped_refptr<FakePictureLayer> update_check_layer_; |
| - |
| - private: |
| - DISALLOW_COPY_AND_ASSIGN(ProxyMainThreaded); |
| }; |
| -class ProxyMainThreadedSetNeedsCommit : public ProxyMainThreaded { |
| +class LayerTreeHostProxyTestSetNeedsCommit : public LayerTreeHostProxyTest { |
| protected: |
| - ProxyMainThreadedSetNeedsCommit() {} |
| - ~ProxyMainThreadedSetNeedsCommit() override {} |
| + LayerTreeHostProxyTestSetNeedsCommit() {} |
| + ~LayerTreeHostProxyTestSetNeedsCommit() override {} |
| void BeginTest() override { |
| EXPECT_EQ(ProxyMain::NO_PIPELINE_STAGE, |
| - GetProxyMainForTest()->max_requested_pipeline_stage()); |
| + GetProxyMain()->max_requested_pipeline_stage()); |
| proxy()->SetNeedsCommit(); |
| EXPECT_EQ(ProxyMain::COMMIT_PIPELINE_STAGE, |
| - GetProxyMainForTest()->max_requested_pipeline_stage()); |
| + GetProxyMain()->max_requested_pipeline_stage()); |
| } |
| void DidBeginMainFrame() override { |
| EXPECT_EQ(ProxyMain::NO_PIPELINE_STAGE, |
| - GetProxyMainForTest()->max_requested_pipeline_stage()); |
| + GetProxyMain()->max_requested_pipeline_stage()); |
| EXPECT_EQ(ProxyMain::NO_PIPELINE_STAGE, |
| - GetProxyMainForTest()->current_pipeline_stage()); |
| + GetProxyMain()->current_pipeline_stage()); |
| } |
| void DidCommit() override { |
| - EXPECT_EQ(1, update_check_layer_->update_count()); |
| + EXPECT_EQ(1, update_check_layer()->update_count()); |
| EXPECT_EQ(ProxyMain::NO_PIPELINE_STAGE, |
| - GetProxyMainForTest()->current_pipeline_stage()); |
| + GetProxyMain()->current_pipeline_stage()); |
| EndTest(); |
| } |
| + void AfterTest() override {} |
| + |
| private: |
| - DISALLOW_COPY_AND_ASSIGN(ProxyMainThreadedSetNeedsCommit); |
| + DISALLOW_COPY_AND_ASSIGN(LayerTreeHostProxyTestSetNeedsCommit); |
| }; |
| -PROXY_MAIN_THREADED_TEST_F(ProxyMainThreadedSetNeedsCommit); |
| +MULTI_THREAD_TEST_F(LayerTreeHostProxyTestSetNeedsCommit); |
| -class ProxyMainThreadedSetNeedsAnimate : public ProxyMainThreaded { |
| +class LayerTreeHostProxyTestSetNeedsAnimate : public LayerTreeHostProxyTest { |
| protected: |
| - ProxyMainThreadedSetNeedsAnimate() {} |
| - ~ProxyMainThreadedSetNeedsAnimate() override {} |
| + LayerTreeHostProxyTestSetNeedsAnimate() {} |
| + ~LayerTreeHostProxyTestSetNeedsAnimate() override {} |
| void BeginTest() override { |
| EXPECT_EQ(ProxyMain::NO_PIPELINE_STAGE, |
| - GetProxyMainForTest()->max_requested_pipeline_stage()); |
| + GetProxyMain()->max_requested_pipeline_stage()); |
| proxy()->SetNeedsAnimate(); |
| EXPECT_EQ(ProxyMain::ANIMATE_PIPELINE_STAGE, |
| - GetProxyMainForTest()->max_requested_pipeline_stage()); |
| + GetProxyMain()->max_requested_pipeline_stage()); |
| } |
| void DidBeginMainFrame() override { |
| EXPECT_EQ(ProxyMain::NO_PIPELINE_STAGE, |
| - GetProxyMainForTest()->max_requested_pipeline_stage()); |
| + GetProxyMain()->max_requested_pipeline_stage()); |
| EXPECT_EQ(ProxyMain::NO_PIPELINE_STAGE, |
| - GetProxyMainForTest()->current_pipeline_stage()); |
| + GetProxyMain()->current_pipeline_stage()); |
| } |
| void DidCommit() override { |
| - EXPECT_EQ(0, update_check_layer_->update_count()); |
| + EXPECT_EQ(0, update_check_layer()->update_count()); |
| EndTest(); |
| } |
| + void AfterTest() override {} |
| + |
| private: |
| - DISALLOW_COPY_AND_ASSIGN(ProxyMainThreadedSetNeedsAnimate); |
| + DISALLOW_COPY_AND_ASSIGN(LayerTreeHostProxyTestSetNeedsAnimate); |
| }; |
| -PROXY_MAIN_THREADED_TEST_F(ProxyMainThreadedSetNeedsAnimate); |
| +MULTI_THREAD_TEST_F(LayerTreeHostProxyTestSetNeedsAnimate); |
| -class ProxyMainThreadedSetNeedsUpdateLayers : public ProxyMainThreaded { |
| +class LayerTreeHostProxyTestSetNeedsUpdateLayers |
| + : public LayerTreeHostProxyTest { |
| protected: |
| - ProxyMainThreadedSetNeedsUpdateLayers() {} |
| - ~ProxyMainThreadedSetNeedsUpdateLayers() override {} |
| + LayerTreeHostProxyTestSetNeedsUpdateLayers() {} |
| + ~LayerTreeHostProxyTestSetNeedsUpdateLayers() override {} |
| void BeginTest() override { |
| EXPECT_EQ(ProxyMain::NO_PIPELINE_STAGE, |
| - GetProxyMainForTest()->max_requested_pipeline_stage()); |
| + GetProxyMain()->max_requested_pipeline_stage()); |
| proxy()->SetNeedsUpdateLayers(); |
| EXPECT_EQ(ProxyMain::UPDATE_LAYERS_PIPELINE_STAGE, |
| - GetProxyMainForTest()->max_requested_pipeline_stage()); |
| + GetProxyMain()->max_requested_pipeline_stage()); |
| } |
| void DidBeginMainFrame() override { |
| EXPECT_EQ(ProxyMain::NO_PIPELINE_STAGE, |
| - GetProxyMainForTest()->max_requested_pipeline_stage()); |
| + GetProxyMain()->max_requested_pipeline_stage()); |
| EXPECT_EQ(ProxyMain::NO_PIPELINE_STAGE, |
| - GetProxyMainForTest()->current_pipeline_stage()); |
| + GetProxyMain()->current_pipeline_stage()); |
| } |
| void DidCommit() override { |
| - EXPECT_EQ(1, update_check_layer_->update_count()); |
| + EXPECT_EQ(1, update_check_layer()->update_count()); |
| EndTest(); |
| } |
| + void AfterTest() override {} |
| + |
| private: |
| - DISALLOW_COPY_AND_ASSIGN(ProxyMainThreadedSetNeedsUpdateLayers); |
| + DISALLOW_COPY_AND_ASSIGN(LayerTreeHostProxyTestSetNeedsUpdateLayers); |
| }; |
| -PROXY_MAIN_THREADED_TEST_F(ProxyMainThreadedSetNeedsUpdateLayers); |
| +MULTI_THREAD_TEST_F(LayerTreeHostProxyTestSetNeedsUpdateLayers); |
| -class ProxyMainThreadedSetNeedsUpdateLayersWhileAnimating |
| - : public ProxyMainThreaded { |
| +class LayerTreeHostProxyTestSetNeedsUpdateLayersWhileAnimating |
| + : public LayerTreeHostProxyTest { |
| protected: |
| - ProxyMainThreadedSetNeedsUpdateLayersWhileAnimating() {} |
| - ~ProxyMainThreadedSetNeedsUpdateLayersWhileAnimating() override {} |
| + LayerTreeHostProxyTestSetNeedsUpdateLayersWhileAnimating() {} |
| + ~LayerTreeHostProxyTestSetNeedsUpdateLayersWhileAnimating() override {} |
| void BeginTest() override { proxy()->SetNeedsAnimate(); } |
| void WillBeginMainFrame() override { |
| EXPECT_EQ(ProxyMain::NO_PIPELINE_STAGE, |
| - GetProxyMainForTest()->max_requested_pipeline_stage()); |
| + GetProxyMain()->max_requested_pipeline_stage()); |
| EXPECT_EQ(ProxyMain::ANIMATE_PIPELINE_STAGE, |
| - GetProxyMainForTest()->current_pipeline_stage()); |
| + GetProxyMain()->current_pipeline_stage()); |
| EXPECT_EQ(ProxyMain::ANIMATE_PIPELINE_STAGE, |
| - GetProxyMainForTest()->final_pipeline_stage()); |
| + GetProxyMain()->final_pipeline_stage()); |
| proxy()->SetNeedsUpdateLayers(); |
| EXPECT_EQ(ProxyMain::NO_PIPELINE_STAGE, |
| - GetProxyMainForTest()->max_requested_pipeline_stage()); |
| + GetProxyMain()->max_requested_pipeline_stage()); |
| EXPECT_EQ(ProxyMain::UPDATE_LAYERS_PIPELINE_STAGE, |
| - GetProxyMainForTest()->final_pipeline_stage()); |
| + GetProxyMain()->final_pipeline_stage()); |
| } |
| void DidBeginMainFrame() override { |
| EXPECT_EQ(ProxyMain::NO_PIPELINE_STAGE, |
| - GetProxyMainForTest()->max_requested_pipeline_stage()); |
| + GetProxyMain()->max_requested_pipeline_stage()); |
| EXPECT_EQ(ProxyMain::NO_PIPELINE_STAGE, |
| - GetProxyMainForTest()->current_pipeline_stage()); |
| + GetProxyMain()->current_pipeline_stage()); |
| } |
| void DidCommit() override { |
| - EXPECT_EQ(1, update_check_layer_->update_count()); |
| + EXPECT_EQ(1, update_check_layer()->update_count()); |
| EndTest(); |
| } |
| + void AfterTest() override {} |
| + |
| private: |
| - DISALLOW_COPY_AND_ASSIGN(ProxyMainThreadedSetNeedsUpdateLayersWhileAnimating); |
| + DISALLOW_COPY_AND_ASSIGN( |
| + LayerTreeHostProxyTestSetNeedsUpdateLayersWhileAnimating); |
| }; |
| -PROXY_MAIN_THREADED_TEST_F(ProxyMainThreadedSetNeedsUpdateLayersWhileAnimating); |
| +MULTI_THREAD_TEST_F(LayerTreeHostProxyTestSetNeedsUpdateLayersWhileAnimating); |
| -class ProxyMainThreadedSetNeedsCommitWhileAnimating : public ProxyMainThreaded { |
| +class LayerTreeHostProxyTestSetNeedsCommitWhileAnimating |
| + : public LayerTreeHostProxyTest { |
| protected: |
| - ProxyMainThreadedSetNeedsCommitWhileAnimating() {} |
| - ~ProxyMainThreadedSetNeedsCommitWhileAnimating() override {} |
| + LayerTreeHostProxyTestSetNeedsCommitWhileAnimating() {} |
| + ~LayerTreeHostProxyTestSetNeedsCommitWhileAnimating() override {} |
| void BeginTest() override { proxy()->SetNeedsAnimate(); } |
| void WillBeginMainFrame() override { |
| EXPECT_EQ(ProxyMain::NO_PIPELINE_STAGE, |
| - GetProxyMainForTest()->max_requested_pipeline_stage()); |
| + GetProxyMain()->max_requested_pipeline_stage()); |
| EXPECT_EQ(ProxyMain::ANIMATE_PIPELINE_STAGE, |
| - GetProxyMainForTest()->current_pipeline_stage()); |
| + GetProxyMain()->current_pipeline_stage()); |
| EXPECT_EQ(ProxyMain::ANIMATE_PIPELINE_STAGE, |
| - GetProxyMainForTest()->final_pipeline_stage()); |
| + GetProxyMain()->final_pipeline_stage()); |
| proxy()->SetNeedsCommit(); |
| EXPECT_EQ(ProxyMain::NO_PIPELINE_STAGE, |
| - GetProxyMainForTest()->max_requested_pipeline_stage()); |
| + GetProxyMain()->max_requested_pipeline_stage()); |
| EXPECT_EQ(ProxyMain::COMMIT_PIPELINE_STAGE, |
| - GetProxyMainForTest()->final_pipeline_stage()); |
| + GetProxyMain()->final_pipeline_stage()); |
| } |
| void DidBeginMainFrame() override { |
| EXPECT_EQ(ProxyMain::NO_PIPELINE_STAGE, |
| - GetProxyMainForTest()->max_requested_pipeline_stage()); |
| + GetProxyMain()->max_requested_pipeline_stage()); |
| EXPECT_EQ(ProxyMain::NO_PIPELINE_STAGE, |
| - GetProxyMainForTest()->current_pipeline_stage()); |
| + GetProxyMain()->current_pipeline_stage()); |
| } |
| void DidCommit() override { |
| - EXPECT_EQ(1, update_check_layer_->update_count()); |
| + EXPECT_EQ(1, update_check_layer()->update_count()); |
| EndTest(); |
| } |
| + void AfterTest() override {} |
| + |
| private: |
| - DISALLOW_COPY_AND_ASSIGN(ProxyMainThreadedSetNeedsCommitWhileAnimating); |
| + DISALLOW_COPY_AND_ASSIGN(LayerTreeHostProxyTestSetNeedsCommitWhileAnimating); |
| }; |
| -PROXY_MAIN_THREADED_TEST_F(ProxyMainThreadedSetNeedsCommitWhileAnimating); |
| +MULTI_THREAD_TEST_F(LayerTreeHostProxyTestSetNeedsCommitWhileAnimating); |
| -class ProxyMainThreadedCommitWaitsForActivation : public ProxyMainThreaded { |
| +class LayerTreeHostProxyTestCommitWaitsForActivation |
| + : public LayerTreeHostProxyTest { |
| protected: |
| - ProxyMainThreadedCommitWaitsForActivation() : num_commits_(0) {} |
| - ~ProxyMainThreadedCommitWaitsForActivation() override {} |
| + LayerTreeHostProxyTestCommitWaitsForActivation() = default; |
| + |
| + void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
| - void BeginTest() override { proxy()->SetNeedsCommit(); } |
| + void BeginCommitOnThread(LayerTreeHostImpl* impl) override { |
| + LOG(ERROR) << "BeginCommitOnThread " |
| + << impl->sync_tree()->source_frame_number(); |
| - void ScheduledActionCommit() override { |
| - switch (num_commits_) { |
| - case 0: |
| - // Set next commit waits for activation and start another commit. |
| - PostNextCommitWaitsForActivationToMainThread(); |
| - PostSetNeedsCommitToMainThread(); |
| + if (impl->sync_tree()->source_frame_number() < 0) |
| + return; // The initial commit, don't do anything here. |
| + |
| + // The main thread will request a commit, and may request that it does |
| + // not complete before activating. So make activation take a long time, to |
| + // verify that we waited. |
| + impl->BlockNotifyReadyToActivateForTesting(true); |
| + { |
| + base::AutoLock hold(activate_blocked_lock_); |
| + activate_blocked_ = true; |
| + } |
| + switch (impl->sync_tree()->source_frame_number()) { |
| + case 0: { |
| + // This is for case 1 in DidCommit. |
| + auto unblock = base::Bind( |
| + &LayerTreeHostProxyTestCommitWaitsForActivation::UnblockActivation, |
| + base::Unretained(this), impl); |
| + ImplThreadTaskRunner()->PostDelayedTask( |
| + FROM_HERE, unblock, |
| + // Use a delay to allow the main frame to start if it would. This |
| + // should cause failures (or flakiness) if we fail to wait for the |
| + // activation before starting the main frame. |
| + base::TimeDelta::FromMilliseconds(16 * 4)); |
| break; |
| + } |
| case 1: |
| - PostSetNeedsCommitToMainThread(); |
| + // This is for case 2 in DidCommit. |
| + // Here we don't ever unblock activation. Since the commit hasn't |
| + // requested to wait, we can verify that activation is blocked when the |
| + // commit completes (case 3 in DidCommit). |
| break; |
| } |
| - num_commits_++; |
| } |
| - void WillActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { |
| - CompletionEvent* activation_completion_event = |
| - GetProxyImplForTest()->ActivationCompletionEventForTesting(); |
| - switch (num_commits_) { |
| + void DidCommit() override { |
| + LOG(ERROR) << "DidCommit " << layer_tree_host()->source_frame_number(); |
|
enne (OOO)
2016/07/18 21:48:02
<_< here and elsewhere
danakj
2016/07/18 23:20:10
Woops.
|
| + switch (layer_tree_host()->source_frame_number()) { |
| case 1: |
| - EXPECT_FALSE(activation_completion_event); |
| + // Request a new commit, but DidCommit will be delayed until activation |
| + // completes. |
| + layer_tree_host()->SetNextCommitWaitsForActivation(); |
| + layer_tree_host()->SetNeedsCommit(); |
| break; |
| - case 2: |
| - EXPECT_TRUE(activation_completion_event); |
| - EXPECT_FALSE(activation_completion_event->IsSignaled()); |
| + case 2: { |
| + base::AutoLock hold(activate_blocked_lock_); |
| + EXPECT_FALSE(activate_blocked_); |
| + } |
| + // Request a new commit, but DidCommit will not be delayed. |
| + layer_tree_host()->SetNeedsCommit(); |
| break; |
| - case 3: |
| - EXPECT_FALSE(activation_completion_event); |
| + case 3: { |
| + base::AutoLock hold(activate_blocked_lock_); |
| + EXPECT_TRUE(activate_blocked_); |
| + } |
| + // This commit completed before unblocking activation. |
| EndTest(); |
| break; |
| } |
| } |
| - void AfterTest() override { |
| - // It is safe to read num_commits_ on the main thread now since AfterTest() |
| - // runs after the LayerTreeHost is destroyed and the impl thread tear down |
| - // is finished. |
| - EXPECT_EQ(3, num_commits_); |
| + void UnblockActivation(LayerTreeHostImpl* impl) { |
| + LOG(ERROR) << "Unblocked"; |
| + { |
| + base::AutoLock hold(activate_blocked_lock_); |
| + activate_blocked_ = false; |
| + } |
| + impl->BlockNotifyReadyToActivateForTesting(false); |
| } |
| + void AfterTest() override {} |
| + |
| private: |
| - int num_commits_; |
| + base::Lock activate_blocked_lock_; |
| + bool activate_blocked_ = false; |
| - DISALLOW_COPY_AND_ASSIGN(ProxyMainThreadedCommitWaitsForActivation); |
| + DISALLOW_COPY_AND_ASSIGN(LayerTreeHostProxyTestCommitWaitsForActivation); |
| }; |
| -PROXY_MAIN_THREADED_TEST_F(ProxyMainThreadedCommitWaitsForActivation); |
| +MULTI_THREAD_TEST_F(LayerTreeHostProxyTestCommitWaitsForActivation); |
| // Test for a corner case of main frame before activation (MFBA) and commit |
| // waits for activation. If a commit (with wait for activation flag set) |
| // is ready before the activation for a previous commit then the activation |
| // should not signal the completion event of the second commit. |
| -class ProxyMainThreadedCommitWaitsForActivationMFBA : public ProxyMainThreaded { |
| +class LayerTreeHostProxyTestCommitWaitsForActivationMFBA |
| + : public LayerTreeHostProxyTest { |
| protected: |
| - ProxyMainThreadedCommitWaitsForActivationMFBA() : num_commits_(0) {} |
| - ~ProxyMainThreadedCommitWaitsForActivationMFBA() override {} |
| + LayerTreeHostProxyTestCommitWaitsForActivationMFBA() = default; |
| void InitializeSettings(LayerTreeSettings* settings) override { |
| settings->main_frame_before_activation_enabled = true; |
| - ProxyMainThreaded::InitializeSettings(settings); |
| + LayerTreeHostProxyTest::InitializeSettings(settings); |
| } |
| - void BeginTest() override { proxy()->SetNeedsCommit(); } |
| + void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
| + |
| + void BeginCommitOnThread(LayerTreeHostImpl* impl) override { |
| + LOG(ERROR) << "BeginCommitOnThread " |
| + << impl->sync_tree()->source_frame_number(); |
| + } |
| - // This is called right before NotifyReadyToCommit. |
| - void StartCommitOnImpl() override { |
| - switch (num_commits_) { |
| - case 0: |
| - // Block activation until next commit is ready. |
| - GetProxyImplForTest()->BlockNotifyReadyToActivateForTesting(true); |
| + void BeginMainFrameCompletedOnThread(LayerTreeHostImpl* impl) override { |
| + LOG(ERROR) << "BeginMainFrameCompletedOnThread " |
| + << impl->sync_tree()->source_frame_number(); |
| + switch (impl->sync_tree()->source_frame_number()) { |
| + case -1: |
| + // Block the activation of the initial commit until the second main |
| + // frame is ready. |
| + impl->BlockNotifyReadyToActivateForTesting(true); |
| break; |
| - case 1: |
| - // Unblock activation of first commit after second commit is ready. |
| - ImplThreadTaskRunner()->PostTask( |
| - FROM_HERE, |
| - base::Bind(&ProxyImplForTest::BlockNotifyReadyToActivateForTesting, |
| - base::Unretained(GetProxyImplForTest()), false)); |
| + case 0: { |
| + // This is the main frame with SetNextCommitWaitsForActivation(). |
| + // Activation is currently blocked for the previous main frame (from the |
| + // case above). We unblock activate to allow this main frame to commit. |
| + auto unblock = |
| + base::Bind(&LayerTreeHostImpl::BlockNotifyReadyToActivateForTesting, |
| + base::Unretained(impl), false); |
| + // Post the unblock instead of doing it immediately so that the main |
| + // frame is fully processed by the compositor thread, and it has a full |
| + // opportunity to wrongly unblock the main thread. |
| + ImplThreadTaskRunner()->PostTask(FROM_HERE, unblock); |
| + // Once activation completes, we'll begin the commit for frame 1. |
| break; |
| + } |
| } |
| } |
| - void ScheduledActionCommit() override { |
| - switch (num_commits_) { |
| - case 0: |
| - // Set next commit waits for activation and start another commit. |
| - PostNextCommitWaitsForActivationToMainThread(); |
| - PostSetNeedsCommitToMainThread(); |
| - break; |
| - case 1: |
| - PostSetNeedsCommitToMainThread(); |
| - break; |
| + void DidActivateTreeOnThread(LayerTreeHostImpl* impl) override { |
| + LOG(ERROR) << "DidActivateTreeOnThread " |
| + << impl->active_tree()->source_frame_number(); |
| + |
| + if (impl->active_tree()->source_frame_number() == 0) { |
| + // The main thread requests a commit does not complete before activating. |
| + // So make activation take a long time, to verify that we waited. |
| + impl->BlockNotifyReadyToActivateForTesting(true); |
| + { |
| + base::AutoLock hold(activate_blocked_lock_); |
| + // Record that we've blocked activation for this frame of interest. |
| + activate_blocked_ = true; |
| + } |
| + // Then unblock activation eventually to complete the test. We use a |
| + // delay to allow the main frame to start if it would. This should cause |
| + // failures (or flakiness) if we fail to wait for the activation before |
| + // starting the main frame. |
| + auto unblock = |
| + base::Bind(&LayerTreeHostProxyTestCommitWaitsForActivationMFBA:: |
| + UnblockActivation, |
| + base::Unretained(this), impl); |
| + ImplThreadTaskRunner()->PostDelayedTask( |
| + FROM_HERE, unblock, base::TimeDelta::FromMilliseconds(16 * 4)); |
| } |
| - num_commits_++; |
| } |
| - void WillActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { |
| - CompletionEvent* activation_completion_event = |
| - GetProxyImplForTest()->ActivationCompletionEventForTesting(); |
| - switch (num_commits_) { |
| + void DidCommit() override { |
| + LOG(ERROR) << "DidCommit " << layer_tree_host()->source_frame_number(); |
| + switch (layer_tree_host()->source_frame_number()) { |
| case 1: |
| - EXPECT_FALSE(activation_completion_event); |
| + // Request a new commit, but DidCommit will be delayed until activation |
| + // completes. |
| + layer_tree_host()->SetNextCommitWaitsForActivation(); |
| + layer_tree_host()->SetNeedsCommit(); |
| break; |
| case 2: |
| - EXPECT_TRUE(activation_completion_event); |
| - EXPECT_FALSE(activation_completion_event->IsSignaled()); |
| - break; |
| - case 3: |
| - EXPECT_FALSE(activation_completion_event); |
| + // This DidCommit should not happen until activation is done for the |
| + // frame. |
| + { |
| + base::AutoLock hold(activate_blocked_lock_); |
| + EXPECT_FALSE(activate_blocked_); |
| + } |
| EndTest(); |
| break; |
| } |
| } |
| - void AfterTest() override { |
| - // It is safe to read num_commits_ on the main thread now since AfterTest() |
| - // runs after the LayerTreeHost is destroyed and the impl thread tear down |
| - // is finished. |
| - EXPECT_EQ(3, num_commits_); |
| + void UnblockActivation(LayerTreeHostImpl* impl) { |
| + LOG(ERROR) << "Unblocked"; |
| + { |
| + base::AutoLock hold(activate_blocked_lock_); |
| + activate_blocked_ = false; |
| + } |
| + impl->BlockNotifyReadyToActivateForTesting(false); |
| } |
| + void AfterTest() override {} |
| + |
| private: |
| - int num_commits_; |
| + base::Lock activate_blocked_lock_; |
| + bool activate_blocked_ = false; |
| - DISALLOW_COPY_AND_ASSIGN(ProxyMainThreadedCommitWaitsForActivationMFBA); |
| + DISALLOW_COPY_AND_ASSIGN(LayerTreeHostProxyTestCommitWaitsForActivationMFBA); |
| }; |
| -PROXY_MAIN_THREADED_TEST_F(ProxyMainThreadedCommitWaitsForActivationMFBA); |
| +MULTI_THREAD_TEST_F(LayerTreeHostProxyTestCommitWaitsForActivationMFBA); |
| } // namespace cc |