Index: device/vr/vr_service_impl.cc |
diff --git a/device/vr/vr_service_impl.cc b/device/vr/vr_service_impl.cc |
index 49ddde0482efb074ec3eb3977ea272730a3a817e..8be4a83e1660bb0aabeedd5429f67eec8559cfa0 100644 |
--- a/device/vr/vr_service_impl.cc |
+++ b/device/vr/vr_service_impl.cc |
@@ -37,16 +37,27 @@ VRDisplayImpl* VRServiceImpl::GetVRDisplayImpl(VRDevice* device) { |
} |
void VRServiceImpl::Bind(mojo::InterfaceRequest<mojom::VRService> request) { |
- // TODO(shaobo.yan@intel.com) : Keep one binding_ and use close and rebind. |
- binding_.reset(new mojo::Binding<mojom::VRService>(this, std::move(request))); |
+ if (!binding_) |
+ binding_.reset( |
+ new mojo::Binding<mojom::VRService>(this, std::move(request))); |
+ else |
+ binding_->Bind(std::move(request)); |
binding_->set_connection_error_handler(base::Bind( |
&VRServiceImpl::RemoveFromDeviceManager, base::Unretained(this))); |
} |
void VRServiceImpl::RemoveFromDeviceManager() { |
- displays_.clear(); |
+ // Remove VRDisplayImpl in service/device pair. |
+ // displays_ is a map which first element is a VRDevice pointer, |
+ // the second element is a VRDisplayImpl pointer. |
+ for (DisplayImplMap::iterator it = displays_.begin(); it != displays_.end(); |
+ ++it) { |
+ it->first->RemoveDisplay(it->second.get()); |
+ } |
+ |
VRDeviceManager* device_manager = VRDeviceManager::GetInstance(); |
device_manager->RemoveService(this); |
+ displays_.clear(); |
} |
void VRServiceImpl::RemoveDevice(VRDevice* device) { |
@@ -56,7 +67,6 @@ void VRServiceImpl::RemoveDevice(VRDevice* device) { |
void VRServiceImpl::SetClient(mojom::VRServiceClientPtr service_client, |
const SetClientCallback& callback) { |
DCHECK(!client_.get()); |
- |
client_ = std::move(service_client); |
VRDeviceManager* device_manager = VRDeviceManager::GetInstance(); |
// Once a client has been connected AddService will force any VRDisplays to |