Index: cc/trees/layer_tree_host_unittest.cc |
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc |
index 51ea3d91a69aba3cdad2746c61acb6849d9c2e2f..98ac5a11d6efbd35f41f8c9a17d9403d535f2ad6 100644 |
--- a/cc/trees/layer_tree_host_unittest.cc |
+++ b/cc/trees/layer_tree_host_unittest.cc |
@@ -4927,11 +4927,13 @@ SINGLE_AND_MULTI_THREAD_TEST_F( |
struct TestSwapPromiseResult { |
TestSwapPromiseResult() |
- : did_swap_called(false), |
+ : did_activate_called(false), |
+ did_swap_called(false), |
did_not_swap_called(false), |
dtor_called(false), |
- reason(SwapPromise::DID_NOT_SWAP_UNKNOWN) {} |
+ reason(SwapPromise::COMMIT_FAILS) {} |
+ bool did_activate_called; |
bool did_swap_called; |
bool did_not_swap_called; |
bool dtor_called; |
@@ -4948,8 +4950,17 @@ class TestSwapPromise : public SwapPromise { |
result_->dtor_called = true; |
} |
+ void DidActivate() override { |
+ base::AutoLock lock(result_->lock); |
+ EXPECT_FALSE(result_->did_activate_called); |
+ EXPECT_FALSE(result_->did_swap_called); |
+ EXPECT_FALSE(result_->did_not_swap_called); |
+ result_->did_activate_called = true; |
+ } |
+ |
void DidSwap(CompositorFrameMetadata* metadata) override { |
base::AutoLock lock(result_->lock); |
+ EXPECT_TRUE(result_->did_activate_called); |
EXPECT_FALSE(result_->did_swap_called); |
EXPECT_FALSE(result_->did_not_swap_called); |
result_->did_swap_called = true; |
@@ -4959,6 +4970,8 @@ class TestSwapPromise : public SwapPromise { |
base::AutoLock lock(result_->lock); |
EXPECT_FALSE(result_->did_swap_called); |
EXPECT_FALSE(result_->did_not_swap_called); |
+ EXPECT_FALSE(result_->did_activate_called && |
+ reason != DidNotSwapReason::SWAP_FAILS); |
result_->did_not_swap_called = true; |
result_->reason = reason; |
} |
@@ -4992,6 +5005,22 @@ class LayerTreeHostTestBreakSwapPromise : public LayerTreeHostTest { |
} |
} |
+ void WillActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { |
+ if (host_impl->pending_tree()) { |
+ int frame = host_impl->pending_tree()->source_frame_number(); |
+ base::AutoLock lock(swap_promise_result_[frame].lock); |
+ EXPECT_FALSE(swap_promise_result_[frame].did_activate_called); |
+ EXPECT_FALSE(swap_promise_result_[frame].did_swap_called); |
+ } |
+ } |
+ |
+ void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { |
+ int frame = host_impl->active_tree()->source_frame_number(); |
+ base::AutoLock lock(swap_promise_result_[frame].lock); |
+ EXPECT_TRUE(swap_promise_result_[frame].did_activate_called); |
+ EXPECT_FALSE(swap_promise_result_[frame].did_swap_called); |
+ } |
+ |
void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) override { |
commit_complete_count_++; |
if (commit_complete_count_ == 1) { |
@@ -5019,6 +5048,7 @@ class LayerTreeHostTestBreakSwapPromise : public LayerTreeHostTest { |
{ |
// The second commit is aborted since it contains no updates. |
base::AutoLock lock(swap_promise_result_[1].lock); |
+ EXPECT_FALSE(swap_promise_result_[1].did_activate_called); |
EXPECT_FALSE(swap_promise_result_[1].did_swap_called); |
EXPECT_TRUE(swap_promise_result_[1].did_not_swap_called); |
EXPECT_EQ(SwapPromise::COMMIT_NO_UPDATE, swap_promise_result_[1].reason); |
@@ -5029,6 +5059,7 @@ class LayerTreeHostTestBreakSwapPromise : public LayerTreeHostTest { |
// The last commit completes but it does not cause swap buffer because |
// there is no damage in the frame data. |
base::AutoLock lock(swap_promise_result_[2].lock); |
+ EXPECT_TRUE(swap_promise_result_[2].did_activate_called); |
EXPECT_FALSE(swap_promise_result_[2].did_swap_called); |
EXPECT_TRUE(swap_promise_result_[2].did_not_swap_called); |
EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[2].reason); |
@@ -5078,6 +5109,41 @@ class LayerTreeHostTestKeepSwapPromise : public LayerTreeTest { |
} |
} |
+ void WillActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { |
+ if (host_impl->pending_tree()) { |
+ if (host_impl->pending_tree()->source_frame_number() == 1) { |
+ base::AutoLock lock(swap_promise_result_.lock); |
+ EXPECT_FALSE(swap_promise_result_.did_activate_called); |
+ EXPECT_FALSE(swap_promise_result_.did_swap_called); |
+ SetCallback(true); |
+ } else { |
+ SetCallback(false); |
+ } |
+ } |
+ } |
+ |
+ void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { |
+ if (host_impl->active_tree()->source_frame_number() == 1) { |
+ base::AutoLock lock(swap_promise_result_.lock); |
+ EXPECT_TRUE(swap_promise_result_.did_activate_called); |
+ EXPECT_FALSE(swap_promise_result_.did_swap_called); |
+ } |
+ } |
+ |
+ void ActivationCallback() { |
+ // DidActivate needs to happen before the tree activation callback. |
+ base::AutoLock lock(swap_promise_result_.lock); |
+ EXPECT_TRUE(swap_promise_result_.did_activate_called); |
+ } |
+ |
+ void SetCallback(bool enable) { |
+ output_surface()->SetTreeActivationCallback( |
+ enable |
+ ? base::Bind(&LayerTreeHostTestKeepSwapPromise::ActivationCallback, |
+ base::Unretained(this)) |
+ : base::Closure()); |
+ } |
+ |
void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override { |
EXPECT_TRUE(result); |
if (host_impl->active_tree()->source_frame_number() >= 1) { |
@@ -5127,6 +5193,7 @@ class LayerTreeHostTestBreakSwapPromiseForVisibility |
void AfterTest() override { |
{ |
base::AutoLock lock(swap_promise_result_.lock); |
+ EXPECT_FALSE(swap_promise_result_.did_activate_called); |
EXPECT_FALSE(swap_promise_result_.did_swap_called); |
EXPECT_TRUE(swap_promise_result_.did_not_swap_called); |
EXPECT_EQ(SwapPromise::COMMIT_FAILS, swap_promise_result_.reason); |
@@ -5176,6 +5243,7 @@ class LayerTreeHostTestBreakSwapPromiseForContext : public LayerTreeHostTest { |
void AfterTest() override { |
{ |
base::AutoLock lock(swap_promise_result_.lock); |
+ EXPECT_FALSE(swap_promise_result_.did_activate_called); |
EXPECT_FALSE(swap_promise_result_.did_swap_called); |
EXPECT_TRUE(swap_promise_result_.did_not_swap_called); |
EXPECT_EQ(SwapPromise::COMMIT_FAILS, swap_promise_result_.reason); |
@@ -5829,6 +5897,7 @@ class LayerTreeHostTestSynchronousCompositeSwapPromise |
// Second swap promise fails to swap. |
{ |
base::AutoLock lock(swap_promise_result_[1].lock); |
+ EXPECT_TRUE(swap_promise_result_[1].did_activate_called); |
EXPECT_FALSE(swap_promise_result_[1].did_swap_called); |
EXPECT_TRUE(swap_promise_result_[1].did_not_swap_called); |
EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[1].reason); |
@@ -5838,6 +5907,7 @@ class LayerTreeHostTestSynchronousCompositeSwapPromise |
// Third swap promises also fails to swap (and draw). |
{ |
base::AutoLock lock(swap_promise_result_[2].lock); |
+ EXPECT_TRUE(swap_promise_result_[2].did_activate_called); |
EXPECT_FALSE(swap_promise_result_[2].did_swap_called); |
EXPECT_TRUE(swap_promise_result_[2].did_not_swap_called); |
EXPECT_EQ(SwapPromise::SWAP_FAILS, swap_promise_result_[2].reason); |