| Index: cc/surfaces/surface_factory.cc
 | 
| diff --git a/cc/surfaces/surface_factory.cc b/cc/surfaces/surface_factory.cc
 | 
| index 19fd8910d660480a0c2e235b452d9330ab6ddfd9..36a79ee9e9ad0557aa92978a661bb961dd56ed6b 100644
 | 
| --- a/cc/surfaces/surface_factory.cc
 | 
| +++ b/cc/surfaces/surface_factory.cc
 | 
| @@ -22,7 +22,8 @@ SurfaceFactory::SurfaceFactory(const FrameSinkId& frame_sink_id,
 | 
|        manager_(manager),
 | 
|        client_(client),
 | 
|        holder_(client),
 | 
| -      needs_sync_points_(true) {}
 | 
| +      needs_sync_points_(true),
 | 
| +      weak_factory_(this) {}
 | 
|  
 | 
|  SurfaceFactory::~SurfaceFactory() {
 | 
|    if (!surface_map_.empty()) {
 | 
| @@ -40,9 +41,17 @@ void SurfaceFactory::DestroyAll() {
 | 
|    surface_map_.clear();
 | 
|  }
 | 
|  
 | 
| +void SurfaceFactory::Reset() {
 | 
| +  DestroyAll();
 | 
| +  // Disown Surfaces that are still alive so that they don't try to unref
 | 
| +  // resources that we're not tracking any more.
 | 
| +  weak_factory_.InvalidateWeakPtrs();
 | 
| +  holder_.Reset();
 | 
| +}
 | 
| +
 | 
|  void SurfaceFactory::Create(const LocalFrameId& local_frame_id) {
 | 
| -  std::unique_ptr<Surface> surface(base::MakeUnique<Surface>(
 | 
| -      SurfaceId(frame_sink_id_, local_frame_id), this));
 | 
| +  auto surface(base::MakeUnique<Surface>(
 | 
| +      SurfaceId(frame_sink_id_, local_frame_id), weak_factory_.GetWeakPtr()));
 | 
|    manager_->RegisterSurface(surface.get());
 | 
|    DCHECK(!surface_map_.count(local_frame_id));
 | 
|    surface_map_[local_frame_id] = std::move(surface);
 | 
| 
 |