| Index: cc/surfaces/surface_factory_unittest.cc
 | 
| diff --git a/cc/surfaces/surface_factory_unittest.cc b/cc/surfaces/surface_factory_unittest.cc
 | 
| index c7ce96403e2468ba29721fddf17aad21881c76ec..14d9b351eb25ccd1590d77e8156a230e437fe153 100644
 | 
| --- a/cc/surfaces/surface_factory_unittest.cc
 | 
| +++ b/cc/surfaces/surface_factory_unittest.cc
 | 
| @@ -10,6 +10,7 @@
 | 
|  #include "cc/surfaces/surface_factory.h"
 | 
|  #include "cc/surfaces/surface_factory_client.h"
 | 
|  #include "cc/surfaces/surface_manager.h"
 | 
| +#include "cc/test/scheduler_test_common.h"
 | 
|  #include "testing/gtest/include/gtest/gtest.h"
 | 
|  #include "ui/gfx/geometry/size.h"
 | 
|  
 | 
| @@ -18,7 +19,7 @@ namespace {
 | 
|  
 | 
|  class TestSurfaceFactoryClient : public SurfaceFactoryClient {
 | 
|   public:
 | 
| -  TestSurfaceFactoryClient() {}
 | 
| +  TestSurfaceFactoryClient() : begin_frame_source_(nullptr) {}
 | 
|    ~TestSurfaceFactoryClient() override {}
 | 
|  
 | 
|    void ReturnResources(const ReturnedResourceArray& resources) override {
 | 
| @@ -26,27 +27,35 @@ class TestSurfaceFactoryClient : public SurfaceFactoryClient {
 | 
|          returned_resources_.end(), resources.begin(), resources.end());
 | 
|    }
 | 
|  
 | 
| +  void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override {
 | 
| +    begin_frame_source_ = begin_frame_source;
 | 
| +  }
 | 
| +
 | 
|    const ReturnedResourceArray& returned_resources() const {
 | 
|      return returned_resources_;
 | 
|    }
 | 
|  
 | 
|    void clear_returned_resources() { returned_resources_.clear(); }
 | 
|  
 | 
| +  BeginFrameSource* begin_frame_source() const { return begin_frame_source_; }
 | 
| +
 | 
|   private:
 | 
|    ReturnedResourceArray returned_resources_;
 | 
| +  BeginFrameSource* begin_frame_source_;
 | 
|  
 | 
|    DISALLOW_COPY_AND_ASSIGN(TestSurfaceFactoryClient);
 | 
|  };
 | 
|  
 | 
|  class SurfaceFactoryTest : public testing::Test {
 | 
|   public:
 | 
| -  SurfaceFactoryTest() : factory_(&manager_, &client_), surface_id_(3) {
 | 
| -    factory_.Create(surface_id_);
 | 
| +  SurfaceFactoryTest()
 | 
| +      : factory_(new SurfaceFactory(&manager_, &client_)), surface_id_(3) {
 | 
| +    factory_->Create(surface_id_);
 | 
|    }
 | 
|  
 | 
|    ~SurfaceFactoryTest() override {
 | 
|      if (!surface_id_.is_null())
 | 
| -      factory_.Destroy(surface_id_);
 | 
| +      factory_->Destroy(surface_id_);
 | 
|    }
 | 
|  
 | 
|    void SubmitCompositorFrameWithResources(ResourceId* resource_ids,
 | 
| @@ -60,8 +69,8 @@ class SurfaceFactoryTest : public testing::Test {
 | 
|      }
 | 
|      scoped_ptr<CompositorFrame> frame(new CompositorFrame);
 | 
|      frame->delegated_frame_data = frame_data.Pass();
 | 
| -    factory_.SubmitCompositorFrame(surface_id_, frame.Pass(),
 | 
| -                                   SurfaceFactory::DrawCallback());
 | 
| +    factory_->SubmitCompositorFrame(surface_id_, frame.Pass(),
 | 
| +                                    SurfaceFactory::DrawCallback());
 | 
|    }
 | 
|  
 | 
|    void UnrefResources(ResourceId* ids_to_unref,
 | 
| @@ -74,7 +83,7 @@ class SurfaceFactoryTest : public testing::Test {
 | 
|        resource.count = counts_to_unref[i];
 | 
|        unref_array.push_back(resource);
 | 
|      }
 | 
| -    factory_.UnrefResources(unref_array);
 | 
| +    factory_->UnrefResources(unref_array);
 | 
|    }
 | 
|  
 | 
|    void CheckReturnedResourcesMatchExpected(ResourceId* expected_returned_ids,
 | 
| @@ -93,14 +102,14 @@ class SurfaceFactoryTest : public testing::Test {
 | 
|  
 | 
|    void RefCurrentFrameResources() {
 | 
|      Surface* surface = manager_.GetSurfaceForId(surface_id_);
 | 
| -    factory_.RefResources(
 | 
| +    factory_->RefResources(
 | 
|          surface->GetEligibleFrame()->delegated_frame_data->resource_list);
 | 
|    }
 | 
|  
 | 
|   protected:
 | 
|    SurfaceManager manager_;
 | 
|    TestSurfaceFactoryClient client_;
 | 
| -  SurfaceFactory factory_;
 | 
| +  scoped_ptr<SurfaceFactory> factory_;
 | 
|    SurfaceId surface_id_;
 | 
|  };
 | 
|  
 | 
| @@ -372,17 +381,17 @@ TEST_F(SurfaceFactoryTest, ResourceLifetime) {
 | 
|  
 | 
|  TEST_F(SurfaceFactoryTest, BlankNoIndexIncrement) {
 | 
|    SurfaceId surface_id(6);
 | 
| -  factory_.Create(surface_id);
 | 
| +  factory_->Create(surface_id);
 | 
|    Surface* surface = manager_.GetSurfaceForId(surface_id);
 | 
|    ASSERT_NE(nullptr, surface);
 | 
|    EXPECT_EQ(2, surface->frame_index());
 | 
|    scoped_ptr<CompositorFrame> frame(new CompositorFrame);
 | 
|    frame->delegated_frame_data.reset(new DelegatedFrameData);
 | 
|  
 | 
| -  factory_.SubmitCompositorFrame(surface_id, frame.Pass(),
 | 
| -                                 SurfaceFactory::DrawCallback());
 | 
| +  factory_->SubmitCompositorFrame(surface_id, frame.Pass(),
 | 
| +                                  SurfaceFactory::DrawCallback());
 | 
|    EXPECT_EQ(2, surface->frame_index());
 | 
| -  factory_.Destroy(surface_id);
 | 
| +  factory_->Destroy(surface_id);
 | 
|  }
 | 
|  
 | 
|  void DrawCallback(uint32* execute_count,
 | 
| @@ -395,7 +404,7 @@ void DrawCallback(uint32* execute_count,
 | 
|  // Tests doing a DestroyAll before shutting down the factory;
 | 
|  TEST_F(SurfaceFactoryTest, DestroyAll) {
 | 
|    SurfaceId id(7);
 | 
| -  factory_.Create(id);
 | 
| +  factory_->Create(id);
 | 
|  
 | 
|    scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData);
 | 
|    TransferableResource resource;
 | 
| @@ -407,25 +416,25 @@ TEST_F(SurfaceFactoryTest, DestroyAll) {
 | 
|    uint32 execute_count = 0;
 | 
|    SurfaceDrawStatus drawn = SurfaceDrawStatus::DRAW_SKIPPED;
 | 
|  
 | 
| -  factory_.SubmitCompositorFrame(
 | 
| +  factory_->SubmitCompositorFrame(
 | 
|        id, frame.Pass(), base::Bind(&DrawCallback, &execute_count, &drawn));
 | 
|  
 | 
|    surface_id_ = SurfaceId();
 | 
| -  factory_.DestroyAll();
 | 
| +  factory_->DestroyAll();
 | 
|    EXPECT_EQ(1u, execute_count);
 | 
|    EXPECT_EQ(SurfaceDrawStatus::DRAW_SKIPPED, drawn);
 | 
|  }
 | 
|  
 | 
|  TEST_F(SurfaceFactoryTest, DestroySequence) {
 | 
|    SurfaceId id2(5);
 | 
| -  factory_.Create(id2);
 | 
| +  factory_->Create(id2);
 | 
|  
 | 
|    manager_.RegisterSurfaceIdNamespace(0);
 | 
|  
 | 
|    // Check that waiting before the sequence is satisfied works.
 | 
|    manager_.GetSurfaceForId(id2)
 | 
|        ->AddDestructionDependency(SurfaceSequence(0, 4));
 | 
| -  factory_.Destroy(id2);
 | 
| +  factory_->Destroy(id2);
 | 
|  
 | 
|    scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData);
 | 
|    scoped_ptr<CompositorFrame> frame(new CompositorFrame);
 | 
| @@ -433,16 +442,16 @@ TEST_F(SurfaceFactoryTest, DestroySequence) {
 | 
|    frame->metadata.satisfies_sequences.push_back(4);
 | 
|    frame->delegated_frame_data = frame_data.Pass();
 | 
|    DCHECK(manager_.GetSurfaceForId(id2));
 | 
| -  factory_.SubmitCompositorFrame(surface_id_, frame.Pass(),
 | 
| -                                 SurfaceFactory::DrawCallback());
 | 
| +  factory_->SubmitCompositorFrame(surface_id_, frame.Pass(),
 | 
| +                                  SurfaceFactory::DrawCallback());
 | 
|    DCHECK(!manager_.GetSurfaceForId(id2));
 | 
|  
 | 
|    // Check that waiting after the sequence is satisfied works.
 | 
| -  factory_.Create(id2);
 | 
| +  factory_->Create(id2);
 | 
|    DCHECK(manager_.GetSurfaceForId(id2));
 | 
|    manager_.GetSurfaceForId(id2)
 | 
|        ->AddDestructionDependency(SurfaceSequence(0, 6));
 | 
| -  factory_.Destroy(id2);
 | 
| +  factory_->Destroy(id2);
 | 
|    DCHECK(!manager_.GetSurfaceForId(id2));
 | 
|  }
 | 
|  
 | 
| @@ -451,12 +460,12 @@ TEST_F(SurfaceFactoryTest, DestroySequence) {
 | 
|  TEST_F(SurfaceFactoryTest, InvalidIdNamespace) {
 | 
|    uint32_t id_namespace = 9u;
 | 
|    SurfaceId id(5);
 | 
| -  factory_.Create(id);
 | 
| +  factory_->Create(id);
 | 
|  
 | 
|    manager_.RegisterSurfaceIdNamespace(id_namespace);
 | 
|    manager_.GetSurfaceForId(id)
 | 
|        ->AddDestructionDependency(SurfaceSequence(id_namespace, 4));
 | 
| -  factory_.Destroy(id);
 | 
| +  factory_->Destroy(id);
 | 
|  
 | 
|    // Verify the dependency has prevented the surface from getting destroyed.
 | 
|    EXPECT_TRUE(manager_.GetSurfaceForId(id));
 | 
| @@ -470,7 +479,7 @@ TEST_F(SurfaceFactoryTest, InvalidIdNamespace) {
 | 
|  
 | 
|  TEST_F(SurfaceFactoryTest, DestroyCycle) {
 | 
|    SurfaceId id2(5);
 | 
| -  factory_.Create(id2);
 | 
| +  factory_->Create(id2);
 | 
|  
 | 
|    manager_.RegisterSurfaceIdNamespace(0);
 | 
|  
 | 
| @@ -485,10 +494,10 @@ TEST_F(SurfaceFactoryTest, DestroyCycle) {
 | 
|      frame_data->render_pass_list.push_back(render_pass.Pass());
 | 
|      scoped_ptr<CompositorFrame> frame(new CompositorFrame);
 | 
|      frame->delegated_frame_data = frame_data.Pass();
 | 
| -    factory_.SubmitCompositorFrame(id2, frame.Pass(),
 | 
| -                                   SurfaceFactory::DrawCallback());
 | 
| +    factory_->SubmitCompositorFrame(id2, frame.Pass(),
 | 
| +                                    SurfaceFactory::DrawCallback());
 | 
|    }
 | 
| -  factory_.Destroy(id2);
 | 
| +  factory_->Destroy(id2);
 | 
|  
 | 
|    // Give surface_id_ a frame that references id2.
 | 
|    {
 | 
| @@ -498,10 +507,10 @@ TEST_F(SurfaceFactoryTest, DestroyCycle) {
 | 
|      frame_data->render_pass_list.push_back(render_pass.Pass());
 | 
|      scoped_ptr<CompositorFrame> frame(new CompositorFrame);
 | 
|      frame->delegated_frame_data = frame_data.Pass();
 | 
| -    factory_.SubmitCompositorFrame(surface_id_, frame.Pass(),
 | 
| -                                   SurfaceFactory::DrawCallback());
 | 
| +    factory_->SubmitCompositorFrame(surface_id_, frame.Pass(),
 | 
| +                                    SurfaceFactory::DrawCallback());
 | 
|    }
 | 
| -  factory_.Destroy(surface_id_);
 | 
| +  factory_->Destroy(surface_id_);
 | 
|    EXPECT_TRUE(manager_.GetSurfaceForId(id2));
 | 
|    // surface_id_ should be retained by reference from id2.
 | 
|    EXPECT_TRUE(manager_.GetSurfaceForId(surface_id_));
 | 
| @@ -519,5 +528,36 @@ TEST_F(SurfaceFactoryTest, DestroyCycle) {
 | 
|    surface_id_ = SurfaceId();
 | 
|  }
 | 
|  
 | 
| +// Verifies BFS is forwarded to the client.
 | 
| +TEST_F(SurfaceFactoryTest, SetBeginFrameSource) {
 | 
| +  FakeBeginFrameSource bfs1;
 | 
| +  FakeBeginFrameSource bfs2;
 | 
| +  EXPECT_EQ(nullptr, client_.begin_frame_source());
 | 
| +  factory_->SetBeginFrameSource(surface_id_, &bfs1);
 | 
| +  EXPECT_EQ(&bfs1, client_.begin_frame_source());
 | 
| +  factory_->SetBeginFrameSource(surface_id_, &bfs2);
 | 
| +  EXPECT_EQ(&bfs2, client_.begin_frame_source());
 | 
| +  factory_->SetBeginFrameSource(surface_id_, nullptr);
 | 
| +  EXPECT_EQ(nullptr, client_.begin_frame_source());
 | 
| +}
 | 
| +
 | 
| +TEST_F(SurfaceFactoryTest, BeginFrameSourceRemovedOnFactoryDestruction) {
 | 
| +  FakeBeginFrameSource bfs;
 | 
| +  factory_->SetBeginFrameSource(surface_id_, &bfs);
 | 
| +  EXPECT_EQ(&bfs, client_.begin_frame_source());
 | 
| +
 | 
| +  // Prevent the Surface from being destroyed when we destroy the factory.
 | 
| +  manager_.RegisterSurfaceIdNamespace(0);
 | 
| +  manager_.GetSurfaceForId(surface_id_)
 | 
| +      ->AddDestructionDependency(SurfaceSequence(0, 4));
 | 
| +
 | 
| +  surface_id_ = SurfaceId();
 | 
| +  factory_->DestroyAll();
 | 
| +
 | 
| +  EXPECT_EQ(&bfs, client_.begin_frame_source());
 | 
| +  factory_.reset();
 | 
| +  EXPECT_EQ(nullptr, client_.begin_frame_source());
 | 
| +}
 | 
| +
 | 
|  }  // namespace
 | 
|  }  // namespace cc
 | 
| 
 |