Index: cc/test/layer_tree_test.cc |
diff --git a/cc/test/layer_tree_test.cc b/cc/test/layer_tree_test.cc |
index d1d196267ffc8c702da95a3fb6ec34401246d297..373959df0d40ca72490d1992f9b70f9da228135e 100644 |
--- a/cc/test/layer_tree_test.cc |
+++ b/cc/test/layer_tree_test.cc |
@@ -15,6 +15,7 @@ |
#include "cc/layers/layer.h" |
#include "cc/layers/layer_impl.h" |
#include "cc/test/animation_test_common.h" |
+#include "cc/test/begin_frame_args_test.h" |
#include "cc/test/fake_layer_tree_host_client.h" |
#include "cc/test/fake_output_surface.h" |
#include "cc/test/test_context_provider.h" |
@@ -53,9 +54,51 @@ void TestHooks::CreateResourceAndRasterWorkerPool( |
raster_worker_pool, resource_pool, staging_resource_pool); |
} |
-base::TimeDelta TestHooks::LowFrequencyAnimationInterval() const { |
- return base::TimeDelta::FromMilliseconds(16); |
-} |
+class ExternalBeginFrameSourceForTest |
+ : public BeginFrameSourceMixIn, |
+ public NON_EXPORTED_BASE(base::NonThreadSafe) { |
+ public: |
+ explicit ExternalBeginFrameSourceForTest(double refresh_rate) |
+ : milliseconds_per_frame_(1000.0 / refresh_rate), |
+ is_ready_(false), |
+ weak_ptr_factory_(this) { |
+ DetachFromThread(); |
+ } |
+ |
+ virtual ~ExternalBeginFrameSourceForTest() { |
+ DCHECK(CalledOnValidThread()); |
+ } |
+ |
+ virtual void OnNeedsBeginFramesChange(bool needs_begin_frames) override { |
+ DCHECK(CalledOnValidThread()); |
+ if (needs_begin_frames) { |
+ base::MessageLoop::current()->PostDelayedTask( |
+ FROM_HERE, |
+ base::Bind(&ExternalBeginFrameSourceForTest::TestOnBeginFrame, |
+ weak_ptr_factory_.GetWeakPtr()), |
+ base::TimeDelta::FromMilliseconds(milliseconds_per_frame_)); |
+ } |
+ } |
+ |
+ virtual void SetClientReady() override { |
+ DCHECK(CalledOnValidThread()); |
+ is_ready_ = true; |
+ } |
+ |
+ bool is_ready() const { |
+ return is_ready_; |
+ } |
+ |
+ void TestOnBeginFrame() { |
+ DCHECK(CalledOnValidThread()); |
+ CallOnBeginFrame(CreateBeginFrameArgsForTesting()); |
+ } |
+ |
+ private: |
+ double milliseconds_per_frame_; |
+ bool is_ready_; |
+ base::WeakPtrFactory<ExternalBeginFrameSourceForTest> weak_ptr_factory_; |
+}; |
// Adapts ThreadProxy for test. Injects test hooks for testing. |
class ThreadProxyForTest : public ThreadProxy { |
@@ -64,9 +107,14 @@ class ThreadProxyForTest : public ThreadProxy { |
TestHooks* test_hooks, |
LayerTreeHost* host, |
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, |
- scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) { |
+ scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner, |
+ scoped_ptr<BeginFrameSource> external_begin_frame_source) { |
return make_scoped_ptr(new ThreadProxyForTest( |
- test_hooks, host, main_task_runner, impl_task_runner)); |
+ test_hooks, |
+ host, |
+ main_task_runner, |
+ impl_task_runner, |
+ external_begin_frame_source.Pass())); |
} |
~ThreadProxyForTest() override {} |
@@ -109,8 +157,11 @@ class ThreadProxyForTest : public ThreadProxy { |
TestHooks* test_hooks, |
LayerTreeHost* host, |
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, |
- scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) |
- : ThreadProxy(host, main_task_runner, impl_task_runner), |
+ scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner, |
+ scoped_ptr<BeginFrameSource> external_begin_frame_source) |
+ : ThreadProxy(host, main_task_runner, |
+ impl_task_runner, |
+ external_begin_frame_source.Pass()), |
test_hooks_(test_hooks) {} |
}; |
@@ -214,10 +265,17 @@ class LayerTreeHostImplForTesting : public LayerTreeHostImpl { |
} |
void NotifyReadyToActivate() override { |
- if (block_notify_ready_to_activate_for_testing_) |
+ if (block_notify_ready_to_activate_for_testing_) { |
notify_ready_to_activate_was_blocked_ = true; |
- else |
+ } else { |
client_->NotifyReadyToActivate(); |
+ test_hooks_->NotifyReadyToActivateOnThread(this); |
+ } |
+ } |
+ |
+ void NotifyReadyToDraw() override { |
+ client_->NotifyReadyToDraw(); |
+ test_hooks_->NotifyReadyToDrawOnThread(this); |
} |
void BlockNotifyReadyToActivateForTesting(bool block) override { |
@@ -269,10 +327,6 @@ class LayerTreeHostImplForTesting : public LayerTreeHostImpl { |
test_hooks_->UpdateAnimationState(this, has_unfinished_animation); |
} |
- base::TimeDelta LowFrequencyAnimationInterval() const override { |
- return test_hooks_->LowFrequencyAnimationInterval(); |
- } |
- |
private: |
TestHooks* test_hooks_; |
bool block_notify_ready_to_activate_for_testing_; |
@@ -361,7 +415,8 @@ class LayerTreeHostForTesting : public LayerTreeHost { |
LayerTreeHostClientForTesting* client, |
const LayerTreeSettings& settings, |
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, |
- scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) { |
+ scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner, |
+ scoped_ptr<BeginFrameSource> external_begin_frame_source) { |
scoped_ptr<LayerTreeHostForTesting> layer_tree_host( |
new LayerTreeHostForTesting(test_hooks, client, settings)); |
if (impl_task_runner.get()) { |
@@ -369,10 +424,14 @@ class LayerTreeHostForTesting : public LayerTreeHost { |
ThreadProxyForTest::Create(test_hooks, |
layer_tree_host.get(), |
main_task_runner, |
- impl_task_runner)); |
+ impl_task_runner, |
+ external_begin_frame_source.Pass())); |
} else { |
layer_tree_host->InitializeForTesting(SingleThreadProxy::Create( |
- layer_tree_host.get(), client, main_task_runner)); |
+ layer_tree_host.get(), |
+ client, |
+ main_task_runner, |
+ external_begin_frame_source.Pass())); |
} |
return layer_tree_host.Pass(); |
} |
@@ -417,6 +476,7 @@ class LayerTreeHostForTesting : public LayerTreeHost { |
LayerTreeTest::LayerTreeTest() |
: output_surface_(nullptr), |
+ external_begin_frame_source_(nullptr), |
beginning_(false), |
end_when_begin_returns_(false), |
timed_out_(false), |
@@ -546,13 +606,22 @@ void LayerTreeTest::WillBeginTest() { |
void LayerTreeTest::DoBeginTest() { |
client_ = LayerTreeHostClientForTesting::Create(this); |
+ scoped_ptr<ExternalBeginFrameSourceForTest> external_begin_frame_source; |
+ if (settings_.use_external_begin_frame_source && |
+ settings_.throttle_frame_production) { |
+ external_begin_frame_source.reset( |
+ new ExternalBeginFrameSourceForTest(settings_.refresh_rate)); |
+ external_begin_frame_source_ = external_begin_frame_source.get(); |
+ } |
+ |
DCHECK(!impl_thread_ || impl_thread_->message_loop_proxy().get()); |
layer_tree_host_ = LayerTreeHostForTesting::Create( |
this, |
client_.get(), |
settings_, |
base::MessageLoopProxy::current(), |
- impl_thread_ ? impl_thread_->message_loop_proxy() : NULL); |
+ impl_thread_ ? impl_thread_->message_loop_proxy() : NULL, |
+ external_begin_frame_source.Pass()); |
ASSERT_TRUE(layer_tree_host_); |
started_ = true; |
@@ -675,6 +744,7 @@ void LayerTreeTest::RunTest(bool threaded, |
// Spend less time waiting for BeginFrame because the output is |
// mocked out. |
settings_.refresh_rate = 200.0; |
+ settings_.background_animation_rate = 200.0; |
settings_.impl_side_painting = impl_side_painting; |
InitializeSettings(&settings_); |
@@ -720,6 +790,12 @@ scoped_ptr<OutputSurface> LayerTreeTest::CreateOutputSurface(bool fallback) { |
output_surface->capabilities().delegated_rendering); |
} |
output_surface_ = output_surface.get(); |
+ |
+ if (settings_.use_external_begin_frame_source && |
+ settings_.throttle_frame_production) { |
+ DCHECK(external_begin_frame_source_); |
+ DCHECK(external_begin_frame_source_->is_ready()); |
+ } |
return output_surface.Pass(); |
} |