Index: cc/trees/layer_tree_host_unittest_context.cc |
diff --git a/cc/trees/layer_tree_host_unittest_context.cc b/cc/trees/layer_tree_host_unittest_context.cc |
index c250b0c6bb9154ff79f0f48bfd0b94fdc355c9c2..b6060a96d495eae56e3b7c02a6969f0822fac2f1 100644 |
--- a/cc/trees/layer_tree_host_unittest_context.cc |
+++ b/cc/trees/layer_tree_host_unittest_context.cc |
@@ -1637,27 +1637,102 @@ class UIResourceLostTest : public LayerTreeHostContextTest { |
virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } |
virtual void AfterTest() OVERRIDE {} |
+ // This is called on the main thread after each commit and |
+ // DidActivateTreeOnThread, with the value of time_step_ at the time |
+ // of the call to DidActivateTreeOnThread. Similar tests will do |
+ // work on the main thread in DidCommit but that is unsuitable because |
+ // the main thread work for these tests must happen after |
+ // DidActivateTreeOnThread, which happens after DidCommit with impl-side |
+ // painting. |
+ virtual void StepCompleteOnMainThread(int time_step) = 0; |
+ |
+ // Called after DidActivateTreeOnThread. If this is done during the commit, |
+ // the call to StepCompleteOnMainThread will not occur until after |
+ // the commit completes, because the main thread is blocked. |
+ void PostStepCompleteToMainThread() { |
+ proxy()->MainThreadTaskRunner()->PostTask( |
+ FROM_HERE, |
+ base::Bind( |
+ &UIResourceLostTest::StepCompleteOnMainThreadInternal, |
+ base::Unretained(this), |
+ time_step_)); |
+ } |
+ |
+ void PostLoseContextToImplThread() { |
+ EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); |
+ base::SingleThreadTaskRunner* task_runner = |
+ HasImplThread() ? ImplThreadTaskRunner() |
+ : base::MessageLoopProxy::current(); |
+ task_runner->PostTask( |
+ FROM_HERE, |
+ base::Bind( |
+ &LayerTreeHostContextTest::LoseContext, |
+ base::Unretained(this))); |
+ } |
+ |
protected: |
int time_step_; |
scoped_ptr<FakeScopedUIResource> ui_resource_; |
+ |
+ private: |
+ void StepCompleteOnMainThreadInternal(int step) { |
+ EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); |
+ StepCompleteOnMainThread(step); |
+ } |
}; |
-// Losing context after an UI resource has been created. |
-class UIResourceLostAfterCommit : public UIResourceLostTest { |
+class UIResourceLostTestSimple : public UIResourceLostTest { |
public: |
+ // This is called when the commit is complete and the new layer tree has been |
+ // activated. |
+ virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) = 0; |
+ |
virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { |
- LayerTreeHostContextTest::CommitCompleteOnThread(impl); |
- switch (time_step_) { |
+ if (!layer_tree_host()->settings().impl_side_painting) { |
+ StepCompleteOnImplThread(impl); |
+ PostStepCompleteToMainThread(); |
+ ++time_step_; |
+ } |
+ } |
+ |
+ virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { |
+ if (layer_tree_host()->settings().impl_side_painting) { |
+ StepCompleteOnImplThread(impl); |
+ PostStepCompleteToMainThread(); |
+ ++time_step_; |
+ } |
+ } |
+}; |
+ |
+// Losing context after an UI resource has been created. |
+class UIResourceLostAfterCommit : public UIResourceLostTestSimple { |
+ public: |
+ virtual void StepCompleteOnMainThread(int step) OVERRIDE { |
+ EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); |
+ switch (step) { |
case 0: |
ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); |
// Expects a valid UIResourceId. |
EXPECT_NE(0, ui_resource_->id()); |
PostSetNeedsCommitToMainThread(); |
break; |
+ case 4: |
+ // Release resource before ending the test. |
+ ui_resource_.reset(); |
+ EndTest(); |
+ break; |
+ case 5: |
+ // Make sure no extra commits happened. |
+ NOTREACHED(); |
+ } |
+ } |
+ |
+ virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE { |
+ LayerTreeHostContextTest::CommitCompleteOnThread(impl); |
+ switch (time_step_) { |
case 1: |
// The resource should have been created on LTHI after the commit. |
- if (!layer_tree_host()->settings().impl_side_painting) |
- EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); |
+ EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); |
PostSetNeedsCommitToMainThread(); |
break; |
case 2: |
@@ -1669,31 +1744,10 @@ class UIResourceLostAfterCommit : public UIResourceLostTest { |
EXPECT_EQ(1, ui_resource_->lost_resource_count); |
// Resource Id on the impl-side have been recreated as well. Note |
// that the same UIResourceId persists after the context lost. |
- if (!layer_tree_host()->settings().impl_side_painting) |
- EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); |
+ EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); |
PostSetNeedsCommitToMainThread(); |
break; |
- case 4: |
- // Release resource before ending test. |
- ui_resource_.reset(); |
- EndTest(); |
- break; |
- } |
- } |
- |
- virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { |
- LayerTreeHostContextTest::DidActivateTreeOnThread(impl); |
- switch (time_step_) { |
- case 1: |
- if (layer_tree_host()->settings().impl_side_painting) |
- EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); |
- break; |
- case 3: |
- if (layer_tree_host()->settings().impl_side_painting) |
- EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); |
- break; |
} |
- ++time_step_; |
} |
}; |
@@ -1708,34 +1762,18 @@ SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostAfterCommit); |
// test_id1_ to have been created. |
// 3. Create one resource -> Delete that same resource -> Context Lost => Expect |
// the resource to not exist in the manager. |
-class UIResourceLostBeforeCommit : public UIResourceLostTest { |
+class UIResourceLostBeforeCommit : public UIResourceLostTestSimple { |
public: |
UIResourceLostBeforeCommit() |
: test_id0_(0), |
test_id1_(0) {} |
- virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { |
- LayerTreeHostContextTest::CommitCompleteOnThread(impl); |
- switch (time_step_) { |
+ virtual void StepCompleteOnMainThread(int step) OVERRIDE { |
+ switch (step) { |
case 0: |
- // Sequence 1: |
ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); |
- LoseContext(); |
- // Resource Id on the impl-side should no longer be valid after |
- // context is lost. |
- EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id())); |
- break; |
- case 1: |
- // The resources should have been recreated. |
- EXPECT_EQ(2, ui_resource_->resource_create_count); |
- // "resource lost" callback was called once for the resource in the |
- // resource map. |
- EXPECT_EQ(1, ui_resource_->lost_resource_count); |
- // Resource Id on the impl-side have been recreated as well. Note |
- // that the same UIResourceId persists after the context lost. |
- if (!layer_tree_host()->settings().impl_side_painting) |
- EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); |
- PostSetNeedsCommitToMainThread(); |
+ // Lose the context on the impl thread before the commit. |
+ PostLoseContextToImplThread(); |
break; |
case 2: |
// Sequence 2: |
@@ -1748,21 +1786,10 @@ class UIResourceLostBeforeCommit : public UIResourceLostTest { |
test_id1_ = ui_resource_->id(); |
// Sanity check that two resource creations return different ids. |
EXPECT_NE(test_id0_, test_id1_); |
- // Lose the context before commit. |
- LoseContext(); |
+ // Lose the context on the impl thread before the commit. |
+ PostLoseContextToImplThread(); |
break; |
case 3: |
- if (!layer_tree_host()->settings().impl_side_painting) { |
- // The previous resource should have been deleted. |
- EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_)); |
- // The second resource should have been created. |
- EXPECT_NE(0u, impl->ResourceIdForUIResource(test_id1_)); |
- } |
- |
- // The second resource called the resource callback once and since the |
- // context is lost, a "resource lost" callback was also issued. |
- EXPECT_EQ(2, ui_resource_->resource_create_count); |
- EXPECT_EQ(1, ui_resource_->lost_resource_count); |
// Clear the manager of resources. |
ui_resource_.reset(); |
PostSetNeedsCommitToMainThread(); |
@@ -1777,45 +1804,79 @@ class UIResourceLostBeforeCommit : public UIResourceLostTest { |
// destructor (so usually ui_resource_.reset()). But here we need |
// ui_resource_ for the next step, so call DeleteUIResource directly. |
layer_tree_host()->DeleteUIResource(test_id0_); |
- LoseContext(); |
+ // Delete the resouce and then lose the context. |
+ PostLoseContextToImplThread(); |
break; |
case 5: |
- // Expect the resource callback to have been called once. |
- EXPECT_EQ(1, ui_resource_->resource_create_count); |
- // No "resource lost" callbacks. |
- EXPECT_EQ(0, ui_resource_->lost_resource_count); |
- if (!layer_tree_host()->settings().impl_side_painting) { |
- // The UI resource id should not be valid |
- EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_)); |
- } |
- PostSetNeedsCommitToMainThread(); |
- break; |
- case 6: |
+ // Release resource before ending the test. |
ui_resource_.reset(); |
EndTest(); |
break; |
+ case 6: |
+ // Single thread proxy issues extra commits after context lost. |
+ // http://crbug.com/287250 |
+ if (HasImplThread()) |
+ NOTREACHED(); |
+ break; |
+ case 8: |
+ NOTREACHED(); |
} |
} |
- virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { |
- LayerTreeHostContextTest::DidActivateTreeOnThread(impl); |
+ virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE { |
+ LayerTreeHostContextTest::CommitCompleteOnThread(impl); |
switch (time_step_) { |
case 1: |
- if (layer_tree_host()->settings().impl_side_painting) |
- EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); |
+ // Sequence 1 (continued): |
+ if (HasImplThread()) { |
+ // The resources should have been recreated. |
+ EXPECT_EQ(2, ui_resource_->resource_create_count); |
+ // The "resource lost" callback was called once for the resource in |
+ // the resource map. |
+ EXPECT_EQ(1, ui_resource_->lost_resource_count); |
+ } else { |
+ // The extra commit that happens at context lost in the single thread |
+ // proxy changes the timing so that the resource recreation callback |
+ // is skipped. |
+ // http://crbug.com/287250 |
+ EXPECT_EQ(1, ui_resource_->resource_create_count); |
+ EXPECT_EQ(0, ui_resource_->lost_resource_count); |
+ } |
+ // Resource Id on the impl-side have been recreated as well. Note |
+ // that the same UIResourceId persists after the context lost. |
+ EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); |
+ PostSetNeedsCommitToMainThread(); |
break; |
case 3: |
- if (layer_tree_host()->settings().impl_side_painting) { |
- EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_)); |
- EXPECT_NE(0u, impl->ResourceIdForUIResource(test_id1_)); |
+ // Sequence 2 (continued): |
+ // The previous resource should have been deleted. |
+ EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_)); |
+ // The second resource should have been created. |
+ EXPECT_NE(0u, impl->ResourceIdForUIResource(test_id1_)); |
+ if (HasImplThread()) { |
+ // The second resource called the resource callback once and since the |
+ // context is lost, a "resource lost" callback was also issued. |
+ EXPECT_EQ(2, ui_resource_->resource_create_count); |
+ EXPECT_EQ(1, ui_resource_->lost_resource_count); |
+ } else { |
+ // The extra commit that happens at context lost in the single thread |
+ // proxy changes the timing so that the resource recreation callback |
+ // is skipped. |
+ // http://crbug.com/287250 |
+ EXPECT_EQ(1, ui_resource_->resource_create_count); |
+ EXPECT_EQ(0, ui_resource_->lost_resource_count); |
} |
break; |
case 5: |
- if (layer_tree_host()->settings().impl_side_painting) |
- EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_)); |
+ // Sequence 3 (continued): |
+ // Expect the resource callback to have been called once. |
+ EXPECT_EQ(1, ui_resource_->resource_create_count); |
+ // No "resource lost" callbacks. |
+ EXPECT_EQ(0, ui_resource_->lost_resource_count); |
+ // The UI resource id should not be valid |
+ EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_)); |
break; |
} |
- ++time_step_; |
} |
private: |
@@ -1828,34 +1889,43 @@ SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostBeforeCommit); |
// Losing UI resource before the pending trees is activated but after the |
// commit. Impl-side-painting only. |
class UIResourceLostBeforeActivateTree : public UIResourceLostTest { |
- virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { |
- LayerTreeHostContextTest::CommitCompleteOnThread(impl); |
- switch (time_step_) { |
+ virtual void StepCompleteOnMainThread(int step) OVERRIDE { |
+ EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); |
+ switch (step) { |
case 0: |
ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); |
PostSetNeedsCommitToMainThread(); |
break; |
- case 2: |
- PostSetNeedsCommitToMainThread(); |
- break; |
case 3: |
test_id_ = ui_resource_->id(); |
ui_resource_.reset(); |
PostSetNeedsCommitToMainThread(); |
break; |
- case 4: |
- PostSetNeedsCommitToMainThread(); |
- break; |
case 5: |
+ // Release resource before ending the test. |
+ ui_resource_.reset(); |
EndTest(); |
break; |
+ case 6: |
+ // Make sure no extra commits happened. |
+ NOTREACHED(); |
} |
} |
- virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { |
+ virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { |
+ LayerTreeHostContextTest::CommitCompleteOnThread(impl); |
switch (time_step_) { |
- case 0: |
+ case 2: |
+ PostSetNeedsCommitToMainThread(); |
+ break; |
+ case 4: |
+ PostSetNeedsCommitToMainThread(); |
break; |
+ } |
+ } |
+ |
+ virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { |
+ switch (time_step_) { |
case 1: |
// The resource creation callback has been called. |
EXPECT_EQ(1, ui_resource_->resource_create_count); |
@@ -1888,6 +1958,8 @@ class UIResourceLostBeforeActivateTree : public UIResourceLostTest { |
EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id_)); |
break; |
} |
+ |
+ PostStepCompleteToMainThread(); |
++time_step_; |
} |