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 8ae677664155e5e399de34eb3085a12d1cfe0ce2..afb895cd642490596df8e226c8f8c4ef25c512a2 100644 |
--- a/extensions/browser/api/device_permissions_prompt.cc |
+++ b/extensions/browser/api/device_permissions_prompt.cc |
@@ -17,23 +17,53 @@ |
#include "extensions/strings/grit/extensions_strings.h" |
#include "ui/base/l10n/l10n_util.h" |
-namespace extensions { |
- |
using device::UsbDevice; |
using device::UsbDeviceFilter; |
using device::UsbService; |
+namespace extensions { |
+ |
DevicePermissionsPrompt::Prompt::DeviceInfo::DeviceInfo( |
- scoped_refptr<UsbDevice> device, |
- const base::string16& name, |
- const base::string16& product_string, |
- const base::string16& manufacturer_string, |
- const base::string16& serial_number) |
- : device(device), |
- name(name), |
- product_string(product_string), |
- manufacturer_string(manufacturer_string), |
- serial_number(serial_number) { |
+ scoped_refptr<UsbDevice> device) |
+ : device(device) { |
+ base::string16 manufacturer_string; |
+ if (device->GetManufacturer(&manufacturer_string)) { |
+ original_manufacturer_string = manufacturer_string; |
+ } else { |
+ const char* vendor_name = |
+ device::UsbIds::GetVendorName(device->vendor_id()); |
+ if (vendor_name) { |
+ manufacturer_string = base::UTF8ToUTF16(vendor_name); |
+ } else { |
+ base::string16 vendor_id = |
+ base::ASCIIToUTF16(base::StringPrintf("0x%04x", device->vendor_id())); |
+ manufacturer_string = |
+ l10n_util::GetStringFUTF16(IDS_DEVICE_UNKNOWN_VENDOR, vendor_id); |
+ } |
+ } |
+ |
+ base::string16 product_string; |
+ if (device->GetProduct(&product_string)) { |
+ original_product_string = product_string; |
+ } else { |
+ const char* product_name = device::UsbIds::GetProductName( |
+ device->vendor_id(), device->product_id()); |
+ if (product_name) { |
+ product_string = base::UTF8ToUTF16(product_name); |
+ } else { |
+ base::string16 product_id = base::ASCIIToUTF16( |
+ base::StringPrintf("0x%04x", device->product_id())); |
+ product_string = |
+ l10n_util::GetStringFUTF16(IDS_DEVICE_UNKNOWN_PRODUCT, product_id); |
+ } |
+ } |
+ |
+ if (!device->GetSerialNumber(&serial_number)) { |
+ serial_number.clear(); |
+ } |
+ |
+ name = l10n_util::GetStringFUTF16(IDS_DEVICE_PERMISSIONS_DEVICE_NAME, |
+ product_string, manufacturer_string); |
} |
DevicePermissionsPrompt::Prompt::DeviceInfo::~DeviceInfo() { |
@@ -43,16 +73,18 @@ DevicePermissionsPrompt::Prompt::Prompt() |
: extension_(nullptr), |
browser_context_(nullptr), |
multiple_(false), |
- observer_(nullptr) { |
+ observer_(nullptr), |
+ usb_service_observer_(this) { |
} |
void DevicePermissionsPrompt::Prompt::SetObserver(Observer* observer) { |
observer_ = observer; |
- content::BrowserThread::PostTask( |
- content::BrowserThread::FILE, |
- FROM_HERE, |
- base::Bind(&DevicePermissionsPrompt::Prompt::DoDeviceQuery, this)); |
+ if (observer_) { |
+ content::BrowserThread::PostTask( |
+ content::BrowserThread::FILE, FROM_HERE, |
+ base::Bind(&DevicePermissionsPrompt::Prompt::DoDeviceQuery, this)); |
+ } |
} |
base::string16 DevicePermissionsPrompt::Prompt::GetHeading() const { |
@@ -81,11 +113,9 @@ void DevicePermissionsPrompt::Prompt::GrantDevicePermission( |
DevicePermissionsManager::Get(browser_context_); |
if (permissions_manager) { |
const DeviceInfo& device = devices_[index]; |
- permissions_manager->AllowUsbDevice(extension_->id(), |
- device.device, |
- device.product_string, |
- device.manufacturer_string, |
- device.serial_number); |
+ permissions_manager->AllowUsbDevice( |
+ extension_->id(), device.device, device.original_product_string, |
+ device.original_manufacturer_string, device.serial_number); |
} |
} |
@@ -112,53 +142,11 @@ void DevicePermissionsPrompt::Prompt::DoDeviceQuery() { |
continue; |
} |
- base::string16 manufacturer_string; |
- base::string16 original_manufacturer_string; |
- if (device->GetManufacturer(&original_manufacturer_string)) { |
- manufacturer_string = original_manufacturer_string; |
- } else { |
- const char* vendor_name = |
- device::UsbIds::GetVendorName(device->vendor_id()); |
- if (vendor_name) { |
- manufacturer_string = base::UTF8ToUTF16(vendor_name); |
- } else { |
- base::string16 vendor_id = base::ASCIIToUTF16( |
- base::StringPrintf("0x%04x", device->vendor_id())); |
- manufacturer_string = |
- l10n_util::GetStringFUTF16(IDS_DEVICE_UNKNOWN_VENDOR, vendor_id); |
- } |
- } |
- |
- base::string16 product_string; |
- base::string16 original_product_string; |
- if (device->GetProduct(&original_product_string)) { |
- product_string = original_product_string; |
- } else { |
- const char* product_name = device::UsbIds::GetProductName( |
- device->vendor_id(), device->product_id()); |
- if (product_name) { |
- product_string = base::UTF8ToUTF16(product_name); |
- } else { |
- base::string16 product_id = base::ASCIIToUTF16( |
- base::StringPrintf("0x%04x", device->product_id())); |
- product_string = |
- l10n_util::GetStringFUTF16(IDS_DEVICE_UNKNOWN_PRODUCT, product_id); |
- } |
- } |
- |
- base::string16 serial_number; |
- if (!device->GetSerialNumber(&serial_number)) { |
- serial_number.clear(); |
- } |
+ device_info.push_back(DeviceInfo(device)); |
+ } |
- device_info.push_back(DeviceInfo( |
- device, |
- l10n_util::GetStringFUTF16(IDS_DEVICE_PERMISSIONS_DEVICE_NAME, |
- product_string, |
- manufacturer_string), |
- original_product_string, |
- original_manufacturer_string, |
- serial_number)); |
+ if (!usb_service_observer_.IsObserving(service)) { |
+ usb_service_observer_.Add(service); |
} |
content::BrowserThread::PostTask( |
@@ -176,6 +164,48 @@ void DevicePermissionsPrompt::Prompt::SetDevices( |
} |
} |
+void DevicePermissionsPrompt::Prompt::AddDevice(const DeviceInfo& device) { |
+ devices_.push_back(device); |
+ if (observer_) { |
+ observer_->OnDevicesChanged(); |
+ } |
+} |
+ |
+void DevicePermissionsPrompt::Prompt::RemoveDevice( |
+ scoped_refptr<UsbDevice> device) { |
+ bool removed_entry = false; |
+ for (std::vector<DeviceInfo>::iterator it = devices_.begin(); |
+ it != devices_.end(); ++it) { |
+ if (it->device == device) { |
+ devices_.erase(it); |
+ removed_entry = true; |
+ break; |
+ } |
+ } |
+ if (observer_ && removed_entry) { |
+ observer_->OnDevicesChanged(); |
+ } |
+} |
+ |
+void DevicePermissionsPrompt::Prompt::OnDeviceAdded( |
+ scoped_refptr<UsbDevice> device) { |
+ if (!(filters_.empty() || UsbDeviceFilter::MatchesAny(device, filters_))) { |
+ return; |
+ } |
+ |
+ content::BrowserThread::PostTask( |
+ content::BrowserThread::UI, FROM_HERE, |
+ base::Bind(&DevicePermissionsPrompt::Prompt::AddDevice, this, |
+ DeviceInfo(device))); |
+} |
+ |
+void DevicePermissionsPrompt::Prompt::OnDeviceRemoved( |
+ scoped_refptr<UsbDevice> device) { |
+ content::BrowserThread::PostTask( |
+ content::BrowserThread::UI, FROM_HERE, |
+ base::Bind(&DevicePermissionsPrompt::Prompt::RemoveDevice, this, device)); |
+} |
+ |
DevicePermissionsPrompt::DevicePermissionsPrompt( |
content::WebContents* web_contents) |
: web_contents_(web_contents), delegate_(nullptr) { |