Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1467)

Unified Diff: cc/trees/layer_tree_host_unittest_proxy.cc

Issue 2000493002: cc: Fix overwriting of commit completion event in MFBA mode. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 46a2d36e7d7ffb57ea410d30fc68065e010e4ef9..d19ec46b6094c8b1aeed8c51f50aa76ff52b69ff 100644
--- a/cc/trees/layer_tree_host_unittest_proxy.cc
+++ b/cc/trees/layer_tree_host_unittest_proxy.cc
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/atomic_ref_count.h"
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "cc/test/fake_content_layer_client.h"
@@ -280,64 +281,152 @@ PROXY_MAIN_THREADED_TEST_F(ProxyMainThreadedSetNeedsCommitWhileAnimating);
class ProxyMainThreadedCommitWaitsForActivation : public ProxyMainThreaded {
protected:
- ProxyMainThreadedCommitWaitsForActivation() : commits_completed_(0) {}
+ ProxyMainThreadedCommitWaitsForActivation()
+ : num_commits_(0), commit_blocked_on_activation_(0) {}
~ProxyMainThreadedCommitWaitsForActivation() override {}
void BeginTest() override { proxy()->SetNeedsCommit(); }
+ void DidBeginMainFrame() override {
+ // Check that commit is not blocked on activation after it finishes on the
+ // impl thread.
+ bool commit_blocked_on_activation =
+ !base::AtomicRefCountIsZero(&commit_blocked_on_activation_);
+ EXPECT_FALSE(commit_blocked_on_activation);
+ }
+
void ScheduledActionCommit() override {
- switch (commits_completed_) {
+ switch (num_commits_) {
case 0:
- // The first commit does not wait for activation. Verify that the
- // completion event is cleared.
- EXPECT_FALSE(GetProxyImplForTest()->HasCommitCompletionEvent());
- EXPECT_FALSE(GetProxyImplForTest()->GetNextCommitWaitsForActivation());
-
+ // The next commit is marked as blocked on activation.
+ EXPECT_TRUE(base::AtomicRefCountIsZero(&commit_blocked_on_activation_));
+ base::AtomicRefCountInc(&commit_blocked_on_activation_);
// Set next commit waits for activation and start another commit.
- commits_completed_++;
PostNextCommitWaitsForActivationToMainThread();
+ // Fallthrough.
+ case 1:
PostSetNeedsCommitToMainThread();
break;
+ }
+ num_commits_++;
+ }
+
+ void DidActivateSyncTree() override {
+ switch (num_commits_) {
+ case 2:
+ // Mark commit as unblocked since activation is done.
+ EXPECT_TRUE(base::AtomicRefCountIsOne(&commit_blocked_on_activation_));
+ base::AtomicRefCountDec(&commit_blocked_on_activation_);
+ break;
+ case 3:
+ 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_);
+ }
+
+ private:
+ int num_commits_;
+ base::AtomicRefCount commit_blocked_on_activation_;
+
+ DISALLOW_COPY_AND_ASSIGN(ProxyMainThreadedCommitWaitsForActivation);
+};
+
+PROXY_MAIN_THREADED_TEST_F(ProxyMainThreadedCommitWaitsForActivation);
+
+// 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 {
+ protected:
+ ProxyMainThreadedCommitWaitsForActivationMFBA()
+ : num_commits_(0), commit_blocked_on_activation_(0) {}
+ ~ProxyMainThreadedCommitWaitsForActivationMFBA() override {}
+
+ void InitializeSettings(LayerTreeSettings* settings) override {
+ settings->main_frame_before_activation_enabled = true;
+ ProxyMainThreaded::InitializeSettings(settings);
+ }
+
+ void BeginTest() override { proxy()->SetNeedsCommit(); }
+
+ void DidBeginMainFrame() override {
+ // Check that commit is not blocked on activation after it finishes on the
+ // impl thread.
+ bool commit_blocked_on_activation =
+ !base::AtomicRefCountIsZero(&commit_blocked_on_activation_);
+ EXPECT_FALSE(commit_blocked_on_activation);
+ }
+
+ void StartCommitOnImpl() override {
+ switch (num_commits_) {
+ case 0:
+ // Block activation until next commit is ready.
+ GetProxyImplForTest()->BlockNotifyReadyToActivateForTesting(true);
+ break;
case 1:
- // The second commit should be held until activation.
- EXPECT_TRUE(GetProxyImplForTest()->HasCommitCompletionEvent());
- EXPECT_TRUE(GetProxyImplForTest()->GetNextCommitWaitsForActivation());
+ // After the second commit is ready unblock activation.
+ if (num_commits_ == 1) {
+ ImplThreadTaskRunner()->PostTask(
+ FROM_HERE,
+ base::Bind(
+ &ProxyImplForTest::BlockNotifyReadyToActivateForTesting,
+ base::Unretained(GetProxyImplForTest()), false));
+ }
+ break;
+ }
+ }
- // Start another commit to verify that this is not held until
- // activation.
- commits_completed_++;
+ void ScheduledActionCommit() override {
+ switch (num_commits_) {
+ case 0:
+ // The next commit is marked as blocked on activation.
+ EXPECT_TRUE(base::AtomicRefCountIsZero(&commit_blocked_on_activation_));
+ base::AtomicRefCountInc(&commit_blocked_on_activation_);
+ // Set next commit waits for activation and start another commit.
+ PostNextCommitWaitsForActivationToMainThread();
+ // Fallthrough.
+ case 1:
PostSetNeedsCommitToMainThread();
break;
- case 2:
- // The third commit should not wait for activation.
- EXPECT_FALSE(GetProxyImplForTest()->HasCommitCompletionEvent());
- EXPECT_FALSE(GetProxyImplForTest()->GetNextCommitWaitsForActivation());
-
- commits_completed_++;
}
+ num_commits_++;
}
void DidActivateSyncTree() override {
- // The next_commit_waits_for_activation should have been cleared after the
- // sync tree is activated.
- EXPECT_FALSE(GetProxyImplForTest()->GetNextCommitWaitsForActivation());
- if (commits_completed_ == 3)
- EndTest();
+ switch (num_commits_) {
+ case 2:
+ // Mark commit as unblocked since activation is done.
+ EXPECT_TRUE(base::AtomicRefCountIsOne(&commit_blocked_on_activation_));
+ base::AtomicRefCountDec(&commit_blocked_on_activation_);
+ break;
+ case 3:
+ EndTest();
+ break;
+ }
}
void AfterTest() override {
- // It is safe to read commits_completed_ on the main thread now since
- // AfterTest() runs after the LayerTreeHost is destroyed and the impl thread
- // tear down is finished.
- EXPECT_EQ(3, commits_completed_);
+ // 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_);
}
private:
- int commits_completed_;
+ int num_commits_;
+ base::AtomicRefCount commit_blocked_on_activation_;
- DISALLOW_COPY_AND_ASSIGN(ProxyMainThreadedCommitWaitsForActivation);
+ DISALLOW_COPY_AND_ASSIGN(ProxyMainThreadedCommitWaitsForActivationMFBA);
};
-PROXY_MAIN_THREADED_TEST_F(ProxyMainThreadedCommitWaitsForActivation);
+PROXY_MAIN_THREADED_TEST_F(ProxyMainThreadedCommitWaitsForActivationMFBA);
} // namespace cc
« no previous file with comments | « cc/test/proxy_impl_for_test.cc ('k') | cc/trees/proxy_impl.h » ('j') | cc/trees/proxy_impl.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698