| Index: gpu/ipc/common/gpu_surface_tracker.cc | 
| diff --git a/gpu/ipc/common/gpu_surface_tracker.cc b/gpu/ipc/common/gpu_surface_tracker.cc | 
| index b2b8dacdaf75ba8c1bd11f1706ce416fd826cf2c..a93ea2cc665840030c339ca9aac777d7ef3105f8 100644 | 
| --- a/gpu/ipc/common/gpu_surface_tracker.cc | 
| +++ b/gpu/ipc/common/gpu_surface_tracker.cc | 
| @@ -14,6 +14,23 @@ | 
|  | 
| namespace gpu { | 
|  | 
| +#if defined(OS_ANDROID) | 
| +GpuSurfaceTracker::SurfaceRecord::SurfaceRecord(gfx::AcceleratedWidget widget, | 
| +                                                jobject j_surface) | 
| +    : widget(widget) { | 
| +  // TODO(liberato): It would be nice to assert |surface != nullptr|, but we | 
| +  // can't.  in_process_context_factory.cc (for tests) actually calls us without | 
| +  // a Surface from java.  Presumably, nobody uses it.  crbug.com/712717 . | 
| +  if (j_surface != nullptr) | 
| +    surface = gl::ScopedJavaSurface::AcquireExternalSurface(j_surface); | 
| +} | 
| +#else   // defined(OS_ANDROID) | 
| +GpuSurfaceTracker::SurfaceRecord::SurfaceRecord(gfx::AcceleratedWidget widget) | 
| +    : widget(widget) {} | 
| +#endif  // !defined(OS_ANDROID) | 
| + | 
| +GpuSurfaceTracker::SurfaceRecord::SurfaceRecord(SurfaceRecord&&) = default; | 
| + | 
| GpuSurfaceTracker::GpuSurfaceTracker() | 
| : next_surface_handle_(1) { | 
| gpu::GpuSurfaceLookup::InitInstance(this); | 
| @@ -27,11 +44,10 @@ GpuSurfaceTracker* GpuSurfaceTracker::GetInstance() { | 
| return base::Singleton<GpuSurfaceTracker>::get(); | 
| } | 
|  | 
| -int GpuSurfaceTracker::AddSurfaceForNativeWidget( | 
| -    gfx::AcceleratedWidget widget) { | 
| +int GpuSurfaceTracker::AddSurfaceForNativeWidget(SurfaceRecord record) { | 
| base::AutoLock lock(surface_map_lock_); | 
| gpu::SurfaceHandle surface_handle = next_surface_handle_++; | 
| -  surface_map_[surface_handle] = widget; | 
| +  surface_map_.emplace(surface_handle, std::move(record)); | 
| return surface_handle; | 
| } | 
|  | 
| @@ -55,38 +71,22 @@ gfx::AcceleratedWidget GpuSurfaceTracker::AcquireNativeWidget( | 
| return gfx::kNullAcceleratedWidget; | 
|  | 
| #if defined(OS_ANDROID) | 
| -  if (it->second != gfx::kNullAcceleratedWidget) | 
| -    ANativeWindow_acquire(it->second); | 
| +  if (it->second.widget != gfx::kNullAcceleratedWidget) | 
| +    ANativeWindow_acquire(it->second.widget); | 
| #endif  // defined(OS_ANDROID) | 
|  | 
| -  return it->second; | 
| +  return it->second.widget; | 
| } | 
|  | 
| #if defined(OS_ANDROID) | 
| -void GpuSurfaceTracker::RegisterViewSurface( | 
| -    int surface_id, jobject j_surface) { | 
| -  base::AutoLock lock(surface_view_map_lock_); | 
| -  DCHECK(surface_view_map_.find(surface_id) == surface_view_map_.end()); | 
| - | 
| -  surface_view_map_[surface_id] = | 
| -      gl::ScopedJavaSurface::AcquireExternalSurface(j_surface); | 
| -  CHECK(surface_view_map_[surface_id].IsValid()); | 
| -} | 
| - | 
| -void GpuSurfaceTracker::UnregisterViewSurface(int surface_id) | 
| -{ | 
| -  base::AutoLock lock(surface_view_map_lock_); | 
| -  DCHECK(surface_view_map_.find(surface_id) != surface_view_map_.end()); | 
| -  surface_view_map_.erase(surface_id); | 
| -} | 
| - | 
| -gl::ScopedJavaSurface GpuSurfaceTracker::AcquireJavaSurface(int surface_id) { | 
| -  base::AutoLock lock(surface_view_map_lock_); | 
| -  SurfaceViewMap::const_iterator iter = surface_view_map_.find(surface_id); | 
| -  if (iter == surface_view_map_.end()) | 
| +gl::ScopedJavaSurface GpuSurfaceTracker::AcquireJavaSurface( | 
| +    gpu::SurfaceHandle surface_handle) { | 
| +  base::AutoLock lock(surface_map_lock_); | 
| +  SurfaceMap::const_iterator it = surface_map_.find(surface_handle); | 
| +  if (it == surface_map_.end()) | 
| return gl::ScopedJavaSurface(); | 
|  | 
| -  const gl::ScopedJavaSurface& j_surface = iter->second; | 
| +  const gl::ScopedJavaSurface& j_surface = it->second.surface; | 
| DCHECK(j_surface.IsValid()); | 
| return gl::ScopedJavaSurface::AcquireExternalSurface( | 
| j_surface.j_surface().obj()); | 
|  |