| Index: cc/surfaces/surface_unittest.cc
 | 
| diff --git a/cc/surfaces/surface_unittest.cc b/cc/surfaces/surface_unittest.cc
 | 
| index 42fd55f4a03a9b3ebb0ca67aab8d3c49cb05bce6..5a9b744fd75dc320129d0be30ac106f4673fb65f 100644
 | 
| --- a/cc/surfaces/surface_unittest.cc
 | 
| +++ b/cc/surfaces/surface_unittest.cc
 | 
| @@ -4,16 +4,36 @@
 | 
|  
 | 
|  #include "cc/surfaces/surface.h"
 | 
|  #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"
 | 
|  
 | 
|  namespace cc {
 | 
|  namespace {
 | 
|  
 | 
| +class FakeSurfaceFactoryClient : public SurfaceFactoryClient {
 | 
| + public:
 | 
| +  FakeSurfaceFactoryClient() : begin_frame_source_(nullptr) {}
 | 
| +
 | 
| +  void ReturnResources(const ReturnedResourceArray& resources) override {}
 | 
| +
 | 
| +  void SetBeginFrameSource(SurfaceId surface_id,
 | 
| +                           BeginFrameSource* begin_frame_source) override {
 | 
| +    begin_frame_source_ = begin_frame_source;
 | 
| +  }
 | 
| +
 | 
| +  BeginFrameSource* begin_frame_source() { return begin_frame_source_; }
 | 
| +
 | 
| + private:
 | 
| +  BeginFrameSource* begin_frame_source_;
 | 
| +};
 | 
| +
 | 
|  TEST(SurfaceTest, SurfaceLifetime) {
 | 
|    SurfaceManager manager;
 | 
| -  SurfaceFactory factory(&manager, NULL);
 | 
| +  FakeSurfaceFactoryClient surface_factory_client;
 | 
| +  SurfaceFactory factory(&manager, &surface_factory_client);
 | 
|  
 | 
|    SurfaceId surface_id(6);
 | 
|    {
 | 
| @@ -25,5 +45,111 @@ TEST(SurfaceTest, SurfaceLifetime) {
 | 
|    EXPECT_EQ(NULL, manager.GetSurfaceForId(surface_id));
 | 
|  }
 | 
|  
 | 
| +TEST(SurfaceTest, StableBeginFrameSourceIndependentOfOrderAdded) {
 | 
| +  SurfaceManager manager;
 | 
| +  FakeSurfaceFactoryClient surface_factory_client;
 | 
| +  SurfaceFactory factory(&manager, &surface_factory_client);
 | 
| +
 | 
| +  SurfaceId surface_id(6);
 | 
| +  factory.Create(surface_id);
 | 
| +  Surface* surface = manager.GetSurfaceForId(surface_id);
 | 
| +
 | 
| +  FakeBeginFrameSource bfs1;
 | 
| +  FakeBeginFrameSource bfs2;
 | 
| +  FakeBeginFrameSource bfs3;
 | 
| +
 | 
| +  // Order 1.
 | 
| +  surface->AddBeginFrameSource(&bfs1);
 | 
| +  surface->AddBeginFrameSource(&bfs2);
 | 
| +  surface->AddBeginFrameSource(&bfs3);
 | 
| +  BeginFrameSource* bfs_order1 = surface_factory_client.begin_frame_source();
 | 
| +  // Make sure one of the provided sources was chosen.
 | 
| +  EXPECT_TRUE(&bfs1 == bfs_order1 || &bfs2 == bfs_order1 ||
 | 
| +              &bfs3 == bfs_order1);
 | 
| +  surface->RemoveBeginFrameSource(&bfs1);
 | 
| +  surface->RemoveBeginFrameSource(&bfs2);
 | 
| +  surface->RemoveBeginFrameSource(&bfs3);
 | 
| +  EXPECT_EQ(nullptr, surface_factory_client.begin_frame_source());
 | 
| +
 | 
| +  // Order 2.
 | 
| +  surface->AddBeginFrameSource(&bfs1);
 | 
| +  surface->AddBeginFrameSource(&bfs3);
 | 
| +  surface->AddBeginFrameSource(&bfs2);
 | 
| +  BeginFrameSource* bfs_order2 = surface_factory_client.begin_frame_source();
 | 
| +  // Verify choice is same as before.
 | 
| +  EXPECT_EQ(bfs_order1, bfs_order2);
 | 
| +  surface->RemoveBeginFrameSource(&bfs1);
 | 
| +  surface->RemoveBeginFrameSource(&bfs2);
 | 
| +  surface->RemoveBeginFrameSource(&bfs3);
 | 
| +  EXPECT_EQ(nullptr, surface_factory_client.begin_frame_source());
 | 
| +
 | 
| +  // Order 3.
 | 
| +  surface->AddBeginFrameSource(&bfs2);
 | 
| +  surface->AddBeginFrameSource(&bfs1);
 | 
| +  surface->AddBeginFrameSource(&bfs3);
 | 
| +  BeginFrameSource* bfs_order3 = surface_factory_client.begin_frame_source();
 | 
| +  // Verify choice is same as before.
 | 
| +  EXPECT_EQ(bfs_order2, bfs_order3);
 | 
| +  surface->RemoveBeginFrameSource(&bfs1);
 | 
| +  surface->RemoveBeginFrameSource(&bfs2);
 | 
| +  surface->RemoveBeginFrameSource(&bfs3);
 | 
| +  EXPECT_EQ(nullptr, surface_factory_client.begin_frame_source());
 | 
| +
 | 
| +  // Order 4.
 | 
| +  surface->AddBeginFrameSource(&bfs2);
 | 
| +  surface->AddBeginFrameSource(&bfs3);
 | 
| +  surface->AddBeginFrameSource(&bfs1);
 | 
| +  BeginFrameSource* bfs_order4 = surface_factory_client.begin_frame_source();
 | 
| +  // Verify choice is same as before.
 | 
| +  EXPECT_EQ(bfs_order3, bfs_order4);
 | 
| +  surface->RemoveBeginFrameSource(&bfs1);
 | 
| +  surface->RemoveBeginFrameSource(&bfs2);
 | 
| +  surface->RemoveBeginFrameSource(&bfs3);
 | 
| +  EXPECT_EQ(nullptr, surface_factory_client.begin_frame_source());
 | 
| +
 | 
| +  // Order 5.
 | 
| +  surface->AddBeginFrameSource(&bfs3);
 | 
| +  surface->AddBeginFrameSource(&bfs1);
 | 
| +  surface->AddBeginFrameSource(&bfs2);
 | 
| +  BeginFrameSource* bfs_order5 = surface_factory_client.begin_frame_source();
 | 
| +  // Verify choice is same as before.
 | 
| +  EXPECT_EQ(bfs_order4, bfs_order5);
 | 
| +  surface->RemoveBeginFrameSource(&bfs1);
 | 
| +  surface->RemoveBeginFrameSource(&bfs2);
 | 
| +  surface->RemoveBeginFrameSource(&bfs3);
 | 
| +  EXPECT_EQ(nullptr, surface_factory_client.begin_frame_source());
 | 
| +
 | 
| +  // Order 6.
 | 
| +  surface->AddBeginFrameSource(&bfs3);
 | 
| +  surface->AddBeginFrameSource(&bfs2);
 | 
| +  surface->AddBeginFrameSource(&bfs1);
 | 
| +  BeginFrameSource* bfs_order6 = surface_factory_client.begin_frame_source();
 | 
| +  // Verify choice is same as before.
 | 
| +  EXPECT_EQ(bfs_order5, bfs_order6);
 | 
| +  surface->RemoveBeginFrameSource(&bfs1);
 | 
| +  surface->RemoveBeginFrameSource(&bfs2);
 | 
| +  surface->RemoveBeginFrameSource(&bfs3);
 | 
| +  EXPECT_EQ(nullptr, surface_factory_client.begin_frame_source());
 | 
| +}
 | 
| +
 | 
| +TEST(SurfaceTest, BeginFrameSourceRemovedOnSurfaceDestruction) {
 | 
| +  SurfaceManager manager;
 | 
| +  FakeSurfaceFactoryClient surface_factory_client;
 | 
| +  SurfaceFactory factory(&manager, &surface_factory_client);
 | 
| +  FakeBeginFrameSource bfs;
 | 
| +
 | 
| +  SurfaceId surface_id(6);
 | 
| +  factory.Create(surface_id);
 | 
| +  Surface* surface = manager.GetSurfaceForId(surface_id);
 | 
| +  surface->AddBeginFrameSource(&bfs);
 | 
| +
 | 
| +  BeginFrameSource* bfs_before = surface_factory_client.begin_frame_source();
 | 
| +  factory.Destroy(surface_id);
 | 
| +  BeginFrameSource* bfs_after = surface_factory_client.begin_frame_source();
 | 
| +
 | 
| +  EXPECT_EQ(&bfs, bfs_before);
 | 
| +  EXPECT_EQ(nullptr, bfs_after);
 | 
| +}
 | 
| +
 | 
|  }  // namespace
 | 
|  }  // namespace cc
 | 
| 
 |