| Index: cc/test/layer_tree_test.cc | 
| diff --git a/cc/test/layer_tree_test.cc b/cc/test/layer_tree_test.cc | 
| index 15a1a44ef73260bfc79c3943ee09aaaaf19b7b7e..734e40e4f4adb24ae1e35405ff01a78e15afe1b8 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,36 @@ base::TimeDelta TestHooks::LowFrequencyAnimationInterval() const { | 
| return base::TimeDelta::FromMilliseconds(16); | 
| } | 
|  | 
| +class ExternalBeginFrameSourceForTest : public ExternalBeginFrameSource { | 
| + public: | 
| +  ExternalBeginFrameSourceForTest() : weak_ptr_factory_(this) { | 
| +    DetachFromThread(); | 
| +  } | 
| + | 
| +  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(16)); | 
| +    } | 
| +  } | 
| + | 
| +  void TestOnBeginFrame() { | 
| +    DCHECK(CalledOnValidThread()); | 
| +    CallOnBeginFrame(CreateBeginFrameArgsForTesting()); | 
| +  } | 
| + | 
| + private: | 
| +  virtual ~ExternalBeginFrameSourceForTest() { | 
| +    DCHECK(CalledOnValidThread()); | 
| +  } | 
| + | 
| +  base::WeakPtrFactory<ExternalBeginFrameSourceForTest> weak_ptr_factory_; | 
| +}; | 
| + | 
| // Adapts ThreadProxy for test. Injects test hooks for testing. | 
| class ThreadProxyForTest : public ThreadProxy { | 
| public: | 
| @@ -55,9 +86,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_refptr<ExternalBeginFrameSource> 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)); | 
| } | 
|  | 
| virtual ~ThreadProxyForTest() {} | 
| @@ -100,8 +136,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_refptr<ExternalBeginFrameSource> external_begin_frame_source) | 
| +      : ThreadProxy(host, main_task_runner, | 
| +                    impl_task_runner, | 
| +                    external_begin_frame_source), | 
| test_hooks_(test_hooks) {} | 
| }; | 
|  | 
| @@ -347,7 +386,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_refptr<ExternalBeginFrameSource> external_begin_frame_source) { | 
| scoped_ptr<LayerTreeHostForTesting> layer_tree_host( | 
| new LayerTreeHostForTesting(test_hooks, client, settings)); | 
| if (impl_task_runner.get()) { | 
| @@ -355,10 +395,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)); | 
| } 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)); | 
| } | 
| return layer_tree_host.Pass(); | 
| } | 
| @@ -524,13 +568,18 @@ void LayerTreeTest::WillBeginTest() { | 
| void LayerTreeTest::DoBeginTest() { | 
| client_ = LayerTreeHostClientForTesting::Create(this); | 
|  | 
| +  scoped_refptr<ExternalBeginFrameSource> external_begin_frame_source; | 
| +  if (settings_.begin_frame_scheduling_enabled) | 
| +    external_begin_frame_source = new ExternalBeginFrameSourceForTest; | 
| + | 
| 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); | 
| ASSERT_TRUE(layer_tree_host_); | 
|  | 
| started_ = true; | 
|  |