| 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..ecbadfc60754d87d6e798db84df51d4f7602f979 100644 | 
| --- a/extensions/browser/api/device_permissions_prompt.cc | 
| +++ b/extensions/browser/api/device_permissions_prompt.cc | 
| @@ -26,10 +26,8 @@ namespace extensions { | 
| DevicePermissionsPrompt::Prompt::DeviceInfo::DeviceInfo( | 
| scoped_refptr<UsbDevice> device) | 
| : device(device) { | 
| -  base::string16 manufacturer_string; | 
| -  if (device->GetManufacturer(&manufacturer_string)) { | 
| -    original_manufacturer_string = manufacturer_string; | 
| -  } else { | 
| +  base::string16 manufacturer_string = device->manufacturer_string(); | 
| +  if (manufacturer_string.empty()) { | 
| const char* vendor_name = | 
| device::UsbIds::GetVendorName(device->vendor_id()); | 
| if (vendor_name) { | 
| @@ -42,10 +40,8 @@ DevicePermissionsPrompt::Prompt::DeviceInfo::DeviceInfo( | 
| } | 
| } | 
|  | 
| -  base::string16 product_string; | 
| -  if (device->GetProduct(&product_string)) { | 
| -    original_product_string = product_string; | 
| -  } else { | 
| +  base::string16 product_string = device->product_string(); | 
| +  if (product_string.empty()) { | 
| const char* product_name = device::UsbIds::GetProductName( | 
| device->vendor_id(), device->product_id()); | 
| if (product_name) { | 
| @@ -58,10 +54,6 @@ DevicePermissionsPrompt::Prompt::DeviceInfo::DeviceInfo( | 
| } | 
| } | 
|  | 
| -  if (!device->GetSerialNumber(&serial_number)) { | 
| -    serial_number.clear(); | 
| -  } | 
| - | 
| name = l10n_util::GetStringFUTF16(IDS_DEVICE_PERMISSIONS_DEVICE_NAME, | 
| product_string, manufacturer_string); | 
| } | 
| @@ -81,9 +73,34 @@ void DevicePermissionsPrompt::Prompt::SetObserver(Observer* observer) { | 
| observer_ = observer; | 
|  | 
| if (observer_) { | 
| -    content::BrowserThread::PostTask( | 
| -        content::BrowserThread::FILE, FROM_HERE, | 
| -        base::Bind(&DevicePermissionsPrompt::Prompt::DoDeviceQuery, this)); | 
| +    UsbService* service = device::DeviceClient::Get()->GetUsbService(); | 
| +    if (!service) { | 
| +      return; | 
| +    } | 
| + | 
| +    service->GetDevices(base::Bind( | 
| +        &DevicePermissionsPrompt::Prompt::OnDevicesEnumerated, this)); | 
| + | 
| +    if (!usb_service_observer_.IsObserving(service)) { | 
| +      usb_service_observer_.Add(service); | 
| +    } | 
| +  } | 
| +} | 
| + | 
| +void DevicePermissionsPrompt::Prompt::OnDevicesEnumerated( | 
| +    const std::vector<scoped_refptr<UsbDevice>>& devices) { | 
| +  std::vector<DeviceInfo> device_info; | 
| +  for (const auto& device : devices) { | 
| +    if (!(filters_.empty() || UsbDeviceFilter::MatchesAny(device, filters_))) { | 
| +      continue; | 
| +    } | 
| + | 
| +    device_info.push_back(DeviceInfo(device)); | 
| +  } | 
| +  devices_.swap(device_info); | 
| + | 
| +  if (observer_) { | 
| +    observer_->OnDevicesChanged(); | 
| } | 
| } | 
|  | 
| @@ -113,9 +130,7 @@ void DevicePermissionsPrompt::Prompt::GrantDevicePermission( | 
| DevicePermissionsManager::Get(browser_context_); | 
| if (permissions_manager) { | 
| const DeviceInfo& device = devices_[index]; | 
| -    permissions_manager->AllowUsbDevice( | 
| -        extension_->id(), device.device, device.original_product_string, | 
| -        device.original_manufacturer_string, device.serial_number); | 
| +    permissions_manager->AllowUsbDevice(extension_->id(), device.device); | 
| } | 
| } | 
|  | 
| @@ -127,51 +142,19 @@ void DevicePermissionsPrompt::Prompt::set_filters( | 
| DevicePermissionsPrompt::Prompt::~Prompt() { | 
| } | 
|  | 
| -void DevicePermissionsPrompt::Prompt::DoDeviceQuery() { | 
| -  UsbService* service = device::DeviceClient::Get()->GetUsbService(); | 
| -  if (!service) { | 
| +void DevicePermissionsPrompt::Prompt::OnDeviceAdded( | 
| +    scoped_refptr<UsbDevice> device) { | 
| +  if (!(filters_.empty() || UsbDeviceFilter::MatchesAny(device, filters_))) { | 
| return; | 
| } | 
|  | 
| -  std::vector<scoped_refptr<UsbDevice>> devices; | 
| -  service->GetDevices(&devices); | 
| - | 
| -  std::vector<DeviceInfo> device_info; | 
| -  for (const auto& device : devices) { | 
| -    if (!(filters_.empty() || UsbDeviceFilter::MatchesAny(device, filters_))) { | 
| -      continue; | 
| -    } | 
| - | 
| -    device_info.push_back(DeviceInfo(device)); | 
| -  } | 
| - | 
| -  if (!usb_service_observer_.IsObserving(service)) { | 
| -    usb_service_observer_.Add(service); | 
| -  } | 
| - | 
| -  content::BrowserThread::PostTask( | 
| -      content::BrowserThread::UI, | 
| -      FROM_HERE, | 
| -      base::Bind( | 
| -          &DevicePermissionsPrompt::Prompt::SetDevices, this, device_info)); | 
| -} | 
| - | 
| -void DevicePermissionsPrompt::Prompt::SetDevices( | 
| -    const std::vector<DeviceInfo>& devices) { | 
| -  devices_ = devices; | 
| -  if (observer_) { | 
| -    observer_->OnDevicesChanged(); | 
| -  } | 
| -} | 
| - | 
| -void DevicePermissionsPrompt::Prompt::AddDevice(const DeviceInfo& device) { | 
| -  devices_.push_back(device); | 
| +  devices_.push_back(DeviceInfo(device)); | 
| if (observer_) { | 
| observer_->OnDevicesChanged(); | 
| } | 
| } | 
|  | 
| -void DevicePermissionsPrompt::Prompt::RemoveDevice( | 
| +void DevicePermissionsPrompt::Prompt::OnDeviceRemoved( | 
| scoped_refptr<UsbDevice> device) { | 
| bool removed_entry = false; | 
| for (std::vector<DeviceInfo>::iterator it = devices_.begin(); | 
| @@ -187,25 +170,6 @@ void DevicePermissionsPrompt::Prompt::RemoveDevice( | 
| } | 
| } | 
|  | 
| -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) { | 
|  |