Index: content/renderer/usb/web_usb_client_impl.cc |
diff --git a/content/renderer/usb/web_usb_client_impl.cc b/content/renderer/usb/web_usb_client_impl.cc |
index ac4f681a3ff34f49702e6c7e3a7c410f1524fabf..f2eee2b3db5eeb0ebb8d70efccf9b1c95716f4f8 100644 |
--- a/content/renderer/usb/web_usb_client_impl.cc |
+++ b/content/renderer/usb/web_usb_client_impl.cc |
@@ -98,4 +98,39 @@ void WebUSBClientImpl::requestDevice( |
delete callbacks; |
} |
+void WebUSBClientImpl::setObserver(Observer* observer) { |
+ if (!observer_) { |
+ // Set up two sequential calls to GetDeviceChanges to avoid latency. |
+ device_manager_->GetDeviceChanges(base::Bind( |
+ &WebUSBClientImpl::OnDeviceChangeNotification, base::Unretained(this))); |
+ device_manager_->GetDeviceChanges(base::Bind( |
+ &WebUSBClientImpl::OnDeviceChangeNotification, base::Unretained(this))); |
+ } |
+ |
+ observer_ = observer; |
+} |
+ |
+void WebUSBClientImpl::OnDeviceChangeNotification( |
+ device::usb::DeviceChangeNotificationPtr notification) { |
+ if (!observer_) |
+ return; |
+ |
+ device_manager_->GetDeviceChanges(base::Bind( |
+ &WebUSBClientImpl::OnDeviceChangeNotification, base::Unretained(this))); |
+ for (size_t i = 0; i < notification->devices_added.size(); ++i) { |
+ device::usb::DeviceManagerPtr device_manager; |
+ mojo::ConnectToService(device_services_.get(), &device_manager); |
+ observer_->onDeviceConnected(blink::adoptWebPtr(new WebUSBDeviceImpl( |
+ device_manager.Pass(), mojo::ConvertTo<blink::WebUSBDeviceInfo>( |
+ notification->devices_added[i])))); |
+ } |
+ for (size_t i = 0; i < notification->devices_removed.size(); ++i) { |
+ device::usb::DeviceManagerPtr device_manager; |
+ mojo::ConnectToService(device_services_.get(), &device_manager); |
+ observer_->onDeviceDisconnected(blink::adoptWebPtr(new WebUSBDeviceImpl( |
+ device_manager.Pass(), mojo::ConvertTo<blink::WebUSBDeviceInfo>( |
+ notification->devices_removed[i])))); |
+ } |
+} |
+ |
} // namespace content |