Index: cc/trees/layer_tree_host_unittest_delegated.cc |
diff --git a/cc/trees/layer_tree_host_unittest_delegated.cc b/cc/trees/layer_tree_host_unittest_delegated.cc |
index 721613a767460f18cf2d8beab6e05308aaed5694..3fd040bc31ce4e2dc9f7e14f8de56b9d762c6520 100644 |
--- a/cc/trees/layer_tree_host_unittest_delegated.cc |
+++ b/cc/trees/layer_tree_host_unittest_delegated.cc |
@@ -7,6 +7,9 @@ |
#include <algorithm> |
#include "base/bind.h" |
+#include "base/synchronization/waitable_event.h" |
+#include "base/threading/thread.h" |
+#include "base/time/time.h" |
#include "cc/layers/delegated_renderer_layer.h" |
#include "cc/layers/delegated_renderer_layer_client.h" |
#include "cc/layers/delegated_renderer_layer_impl.h" |
@@ -1582,5 +1585,107 @@ class LayerTreeHostDelegatedTestCommitWithoutTake |
SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDelegatedTestCommitWithoutTake); |
+class DelegatedFrameIsActivatedDuringCommit |
+ : public LayerTreeHostDelegatedTestCaseSingleDelegatedLayer { |
+ protected: |
+ DelegatedFrameIsActivatedDuringCommit() |
+ : wait_thread_("WAIT"), |
+ wait_event_(false, false) { |
+ wait_thread_.Start(); |
+ } |
+ |
+ virtual void BeginTest() OVERRIDE { |
+ activate_count_ = 0; |
+ |
+ scoped_ptr<DelegatedFrameData> frame = |
+ CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); |
+ AddTextureQuad(frame.get(), 999); |
+ AddTransferableResource(frame.get(), 999); |
+ delegated_->SetFrameData(frame.Pass()); |
+ |
+ PostSetNeedsCommitToMainThread(); |
+ } |
+ |
+ virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { |
+ // Slow down activation so the main thread DidCommit() will run if |
+ // not blocked. |
+ wait_thread_.message_loop()->PostDelayedTask( |
+ FROM_HERE, |
+ base::Bind(&base::WaitableEvent::Signal, |
+ base::Unretained(&wait_event_)), |
+ base::TimeDelta::FromMilliseconds(10)); |
+ wait_event_.Wait(); |
+ |
+ base::AutoLock lock(activate_lock_); |
+ ++activate_count_; |
+ } |
+ |
+ virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { |
+ // The main thread is awake now, and will run DidCommit() immediately. |
+ // Run DidActivate() afterwards by posting it now. |
+ proxy()->MainThreadTaskRunner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&DelegatedFrameIsActivatedDuringCommit::DidActivate, |
+ base::Unretained(this))); |
+ } |
+ |
+ void DidActivate() { |
+ base::AutoLock lock(activate_lock_); |
+ switch (activate_count_) { |
+ case 1: { |
+ // The first frame has been activated. Set a new frame, and |
+ // expect the next commit to finish *after* it is activated. |
+ scoped_ptr<DelegatedFrameData> frame = |
+ CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); |
+ AddTextureQuad(frame.get(), 555); |
+ AddTransferableResource(frame.get(), 555); |
+ delegated_->SetFrameData(frame.Pass()); |
+ // So this commit number should complete after the second activate. |
+ EXPECT_EQ(1, layer_tree_host()->source_frame_number()); |
+ break; |
+ } |
+ case 2: |
+ // The second frame has been activated. Remove the layer from |
+ // the tree to cause another commit/activation. The commit should |
+ // finish *after* the layer is removed from the active tree. |
+ delegated_->RemoveFromParent(); |
+ // So this commit number should complete after the third activate. |
+ EXPECT_EQ(2, layer_tree_host()->source_frame_number()); |
+ break; |
+ case 3: |
+ EndTest(); |
+ break; |
+ } |
+ } |
+ |
+ virtual void DidCommit() OVERRIDE { |
+ switch (layer_tree_host()->source_frame_number()) { |
+ case 2: { |
+ // The activate for the 2nd frame should have happened before now. |
+ base::AutoLock lock(activate_lock_); |
+ EXPECT_EQ(2, activate_count_); |
+ break; |
+ } |
+ case 3: { |
+ // The activate to remove the layer should have happened before now. |
+ base::AutoLock lock(activate_lock_); |
+ EXPECT_EQ(3, activate_count_); |
+ break; |
+ } |
+ } |
+ } |
+ |
+ |
+ virtual void AfterTest() OVERRIDE {} |
+ |
+ base::Thread wait_thread_; |
+ base::WaitableEvent wait_event_; |
+ base::Lock activate_lock_; |
+ int activate_count_; |
+}; |
+ |
+SINGLE_AND_MULTI_THREAD_TEST_F( |
+ DelegatedFrameIsActivatedDuringCommit); |
+ |
} // namespace |
} // namespace cc |