| Index: extensions/browser/api/device_permissions_prompt.cc
|
| diff --git a/extensions/browser/api/device_permissions_prompt.cc b/extensions/browser/api/device_permissions_prompt.cc
|
| index afb895cd642490596df8e226c8f8c4ef25c512a2..f45ae5638bf196a1ff974ec5fe3e490b3b72b2f6 100644
|
| --- a/extensions/browser/api/device_permissions_prompt.cc
|
| +++ b/extensions/browser/api/device_permissions_prompt.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "extensions/browser/api/device_permissions_prompt.h"
|
|
|
| +#include "base/barrier_closure.h"
|
| #include "base/strings/stringprintf.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "content/public/browser/browser_thread.h"
|
| @@ -17,6 +18,7 @@
|
| #include "extensions/strings/grit/extensions_strings.h"
|
| #include "ui/base/l10n/l10n_util.h"
|
|
|
| +using content::BrowserThread;
|
| using device::UsbDevice;
|
| using device::UsbDeviceFilter;
|
| using device::UsbService;
|
| @@ -81,8 +83,8 @@ void DevicePermissionsPrompt::Prompt::SetObserver(Observer* observer) {
|
| observer_ = observer;
|
|
|
| if (observer_) {
|
| - content::BrowserThread::PostTask(
|
| - content::BrowserThread::FILE, FROM_HERE,
|
| + BrowserThread::PostTask(
|
| + BrowserThread::FILE, FROM_HERE,
|
| base::Bind(&DevicePermissionsPrompt::Prompt::DoDeviceQuery, this));
|
| }
|
| }
|
| @@ -136,24 +138,55 @@ void DevicePermissionsPrompt::Prompt::DoDeviceQuery() {
|
| std::vector<scoped_refptr<UsbDevice>> devices;
|
| service->GetDevices(&devices);
|
|
|
| - std::vector<DeviceInfo> device_info;
|
| + if (!usb_service_observer_.IsObserving(service)) {
|
| + usb_service_observer_.Add(service);
|
| + }
|
| +
|
| + std::vector<DeviceInfo>* device_info = new std::vector<DeviceInfo>();
|
| + base::Closure barrier = base::BarrierClosure(
|
| + devices.size(),
|
| + base::Bind(&DevicePermissionsPrompt::Prompt::DeviceQueryComplete, this,
|
| + base::Owned(device_info)));
|
| +
|
| for (const auto& device : devices) {
|
| - if (!(filters_.empty() || UsbDeviceFilter::MatchesAny(device, filters_))) {
|
| - continue;
|
| + if (filters_.empty() || UsbDeviceFilter::MatchesAny(device, filters_)) {
|
| + device->CheckUsbAccess(
|
| + base::Bind(&DevicePermissionsPrompt::Prompt::AppendCheckedUsbDevice,
|
| + this, device_info, device, barrier));
|
| + } else {
|
| + barrier.Run();
|
| }
|
| + }
|
| +}
|
|
|
| - device_info.push_back(DeviceInfo(device));
|
| +void DevicePermissionsPrompt::Prompt::AppendCheckedUsbDevice(
|
| + std::vector<DeviceInfo>* device_info,
|
| + scoped_refptr<UsbDevice> device,
|
| + const base::Closure& callback,
|
| + bool allowed) {
|
| + if (allowed) {
|
| + device_info->push_back(DeviceInfo(device));
|
| }
|
| + callback.Run();
|
| +}
|
|
|
| - if (!usb_service_observer_.IsObserving(service)) {
|
| - usb_service_observer_.Add(service);
|
| +void DevicePermissionsPrompt::Prompt::AddCheckedUsbDevice(
|
| + scoped_refptr<UsbDevice> device,
|
| + bool allowed) {
|
| + if (allowed) {
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&DevicePermissionsPrompt::Prompt::AddDevice, this,
|
| + DeviceInfo(device)));
|
| }
|
| +}
|
|
|
| - content::BrowserThread::PostTask(
|
| - content::BrowserThread::UI,
|
| - FROM_HERE,
|
| - base::Bind(
|
| - &DevicePermissionsPrompt::Prompt::SetDevices, this, device_info));
|
| +void DevicePermissionsPrompt::Prompt::DeviceQueryComplete(
|
| + std::vector<DeviceInfo>* device_info) {
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&DevicePermissionsPrompt::Prompt::SetDevices, this,
|
| + *device_info));
|
| }
|
|
|
| void DevicePermissionsPrompt::Prompt::SetDevices(
|
| @@ -193,16 +226,14 @@ void DevicePermissionsPrompt::Prompt::OnDeviceAdded(
|
| return;
|
| }
|
|
|
| - content::BrowserThread::PostTask(
|
| - content::BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&DevicePermissionsPrompt::Prompt::AddDevice, this,
|
| - DeviceInfo(device)));
|
| + device->CheckUsbAccess(base::Bind(
|
| + &DevicePermissionsPrompt::Prompt::AddCheckedUsbDevice, this, device));
|
| }
|
|
|
| void DevicePermissionsPrompt::Prompt::OnDeviceRemoved(
|
| scoped_refptr<UsbDevice> device) {
|
| - content::BrowserThread::PostTask(
|
| - content::BrowserThread::UI, FROM_HERE,
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI, FROM_HERE,
|
| base::Bind(&DevicePermissionsPrompt::Prompt::RemoveDevice, this, device));
|
| }
|
|
|
|
|