| Index: cc/test/layer_tree_test.cc
|
| diff --git a/cc/test/layer_tree_test.cc b/cc/test/layer_tree_test.cc
|
| index c19c63f09f1ca22dccc24822a8716e7cdbc8a728..4b09b366c8dfd408d04c80e3c6d32b305c0fd143 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"
|
| @@ -48,6 +49,41 @@ 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),
|
| + 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_));
|
| + }
|
| + }
|
| +
|
| + void TestOnBeginFrame() {
|
| + DCHECK(CalledOnValidThread());
|
| + CallOnBeginFrame(CreateBeginFrameArgsForTesting());
|
| + }
|
| +
|
| + private:
|
| + double milliseconds_per_frame_;
|
| + base::WeakPtrFactory<ExternalBeginFrameSourceForTest> weak_ptr_factory_;
|
| +};
|
| +
|
| // Adapts ThreadProxy for test. Injects test hooks for testing.
|
| class ThreadProxyForTest : public ThreadProxy {
|
| public:
|
| @@ -55,9 +91,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 {}
|
| @@ -100,8 +141,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) {}
|
| };
|
|
|
| @@ -343,7 +387,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()) {
|
| @@ -351,10 +396,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();
|
| }
|
| @@ -520,13 +569,20 @@ void LayerTreeTest::WillBeginTest() {
|
| void LayerTreeTest::DoBeginTest() {
|
| client_ = LayerTreeHostClientForTesting::Create(this);
|
|
|
| + scoped_ptr<BeginFrameSource> external_begin_frame_source;
|
| + if (settings_.begin_frame_scheduling_enabled &&
|
| + settings_.throttle_frame_production)
|
| + external_begin_frame_source.reset(
|
| + new ExternalBeginFrameSourceForTest(settings_.refresh_rate));
|
| +
|
| 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;
|
|
|