| Index: device/usb/mojo/device_impl.cc
 | 
| diff --git a/device/usb/mojo/device_impl.cc b/device/usb/mojo/device_impl.cc
 | 
| index 0d1c64f6a2dd1336fe8b659ce9407633af9dbdf7..ae5f4bb53bef88d4f4324f13b163606e3df0f381 100644
 | 
| --- a/device/usb/mojo/device_impl.cc
 | 
| +++ b/device/usb/mojo/device_impl.cc
 | 
| @@ -179,13 +179,17 @@ void OnIsochronousTransferOut(
 | 
|  DeviceImpl::DeviceImpl(scoped_refptr<UsbDevice> device,
 | 
|                         PermissionProviderPtr permission_provider,
 | 
|                         mojo::InterfaceRequest<Device> request)
 | 
| -    : binding_(this, std::move(request)),
 | 
| -      device_(device),
 | 
| +    : device_(device),
 | 
| +      observer_(this),
 | 
|        permission_provider_(std::move(permission_provider)),
 | 
| +      binding_(this, std::move(request)),
 | 
|        weak_factory_(this) {
 | 
| -  // This object owns itself and will be destroyed if either the message pipe
 | 
| -  // it is bound to is closed or the PermissionProvider it depends on is
 | 
| -  // unavailable.
 | 
| +  DCHECK(device_);
 | 
| +  // This object owns itself and will be destroyed if,
 | 
| +  //  * the device is disconnected,
 | 
| +  //  * the message pipe it is bound to is closed, or
 | 
| +  //  * the PermissionProvider it depends on is unavailable.
 | 
| +  observer_.Add(device_.get());
 | 
|    binding_.set_connection_error_handler([this]() { delete this; });
 | 
|    permission_provider_.set_connection_error_handler([this]() { delete this; });
 | 
|  }
 | 
| @@ -463,5 +467,10 @@ void DeviceImpl::IsochronousTransferOut(
 | 
|        base::Bind(&OnIsochronousTransferOut, base::Passed(&callback_ptr)));
 | 
|  }
 | 
|  
 | 
| +void DeviceImpl::OnDeviceRemoved(scoped_refptr<UsbDevice> device) {
 | 
| +  DCHECK_EQ(device_, device);
 | 
| +  delete this;
 | 
| +}
 | 
| +
 | 
|  }  // namespace usb
 | 
|  }  // namespace device
 | 
| 
 |