Chromium Code Reviews| 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 f315de43cb35bb0a8ca82291086700e1c5c39ff8..335337540eb48bb68d1de607f61fdccf00892671 100644 |
| --- a/content/renderer/usb/web_usb_client_impl.cc |
| +++ b/content/renderer/usb/web_usb_client_impl.cc |
| @@ -123,8 +123,8 @@ void WebUSBClientImpl::requestDevice( |
| base::Unretained(device_manager_.get()))); |
| } |
| -void WebUSBClientImpl::setObserver(Observer* observer) { |
| - if (!observer_) { |
| +void WebUSBClientImpl::addObserver(Observer* observer) { |
| + if (observers_.empty()) { |
| // Set up two sequential calls to GetDeviceChanges to avoid latency. |
| device::usb::DeviceManager* device_manager = GetDeviceManager(); |
| device_manager->GetDeviceChanges(base::Bind( |
| @@ -133,7 +133,12 @@ void WebUSBClientImpl::setObserver(Observer* observer) { |
| &WebUSBClientImpl::OnDeviceChangeNotification, base::Unretained(this))); |
| } |
| - observer_ = observer; |
| + observers_.insert(observer); |
|
sof
2016/04/02 07:02:17
It sounds as if this code won't stay around for lo
|
| +} |
| + |
| +void WebUSBClientImpl::removeObserver(Observer* observer) { |
| + DCHECK(ContainsKey(observers_, observer)); |
| + observers_.erase(observer); |
| } |
| device::usb::DeviceManager* WebUSBClientImpl::GetDeviceManager() { |
| @@ -144,7 +149,7 @@ device::usb::DeviceManager* WebUSBClientImpl::GetDeviceManager() { |
| void WebUSBClientImpl::OnDeviceChangeNotification( |
| device::usb::DeviceChangeNotificationPtr notification) { |
| - if (!observer_) |
| + if (observers_.empty()) |
| return; |
| device_manager_->GetDeviceChanges(base::Bind( |
| @@ -152,17 +157,20 @@ void WebUSBClientImpl::OnDeviceChangeNotification( |
| for (size_t i = 0; i < notification->devices_added.size(); ++i) { |
| const device::usb::DeviceInfoPtr& device_info = |
| notification->devices_added[i]; |
| - device::usb::DevicePtr device; |
| - device_manager_->GetDevice(device_info->guid, mojo::GetProxy(&device)); |
| - observer_->onDeviceConnected(blink::adoptWebPtr(new WebUSBDeviceImpl( |
| - std::move(device), |
| - mojo::ConvertTo<blink::WebUSBDeviceInfo>(device_info)))); |
| + for (auto observer : observers_) { |
| + device::usb::DevicePtr device; |
| + device_manager_->GetDevice(device_info->guid, mojo::GetProxy(&device)); |
| + observer->onDeviceConnected(blink::adoptWebPtr(new WebUSBDeviceImpl( |
| + std::move(device), |
| + mojo::ConvertTo<blink::WebUSBDeviceInfo>(device_info)))); |
| + } |
| } |
| for (size_t i = 0; i < notification->devices_removed.size(); ++i) { |
| const device::usb::DeviceInfoPtr& device_info = |
| notification->devices_removed[i]; |
| - observer_->onDeviceDisconnected(blink::adoptWebPtr(new WebUSBDeviceImpl( |
| - nullptr, mojo::ConvertTo<blink::WebUSBDeviceInfo>(device_info)))); |
| + for (auto observer : observers_) |
| + observer->onDeviceDisconnected(blink::adoptWebPtr(new WebUSBDeviceImpl( |
| + nullptr, mojo::ConvertTo<blink::WebUSBDeviceInfo>(device_info)))); |
| } |
| } |