Index: extensions/browser/api/device_permissions_manager.cc |
diff --git a/extensions/browser/api/device_permissions_manager.cc b/extensions/browser/api/device_permissions_manager.cc |
index 17e3eab44c01b0f9d5209fb4ee7988a7ce8173a0..d64c0271c43742c30a0fb3a96245e7739a4fa93d 100644 |
--- a/extensions/browser/api/device_permissions_manager.cc |
+++ b/extensions/browser/api/device_permissions_manager.cc |
@@ -233,16 +233,13 @@ std::set<scoped_refptr<DevicePermissionEntry>> GetDevicePermissionEntries( |
} // namespace |
DevicePermissionEntry::DevicePermissionEntry( |
- scoped_refptr<device::UsbDevice> device, |
- const base::string16& serial_number, |
- const base::string16& manufacturer_string, |
- const base::string16& product_string) |
+ scoped_refptr<device::UsbDevice> device) |
: device_(device), |
vendor_id_(device->vendor_id()), |
product_id_(device->product_id()), |
- serial_number_(serial_number), |
- manufacturer_string_(manufacturer_string), |
- product_string_(product_string) { |
+ serial_number_(device->serial_number()), |
+ manufacturer_string_(device->manufacturer_string()), |
+ product_string_(device->product_string()) { |
} |
DevicePermissionEntry::DevicePermissionEntry( |
@@ -341,14 +338,13 @@ DevicePermissions::~DevicePermissions() { |
} |
scoped_refptr<DevicePermissionEntry> DevicePermissions::FindEntry( |
- scoped_refptr<device::UsbDevice> device, |
- const base::string16& serial_number) const { |
+ scoped_refptr<device::UsbDevice> device) const { |
const auto& ephemeral_device_entry = ephemeral_devices_.find(device); |
if (ephemeral_device_entry != ephemeral_devices_.end()) { |
return ephemeral_device_entry->second; |
} |
- if (serial_number.empty()) { |
+ if (device->serial_number().empty()) { |
return nullptr; |
} |
@@ -362,7 +358,7 @@ scoped_refptr<DevicePermissionEntry> DevicePermissions::FindEntry( |
if (entry->product_id() != device->product_id()) { |
continue; |
} |
- if (entry->serial_number() != serial_number) { |
+ if (entry->serial_number() != device->serial_number()) { |
continue; |
} |
return entry; |
@@ -376,50 +372,22 @@ DevicePermissions::DevicePermissions(BrowserContext* context, |
entries_ = GetDevicePermissionEntries(prefs, extension_id); |
} |
-DevicePermissions::DevicePermissions(const DevicePermissions* original) |
- : entries_(original->entries_), |
- ephemeral_devices_(original->ephemeral_devices_) { |
-} |
- |
-class DevicePermissionsManager::FileThreadHelper : public UsbService::Observer { |
- public: |
- FileThreadHelper( |
- base::WeakPtr<DevicePermissionsManager> device_permissions_manager) |
- : device_permissions_manager_(device_permissions_manager), |
- observer_(this) {} |
- virtual ~FileThreadHelper() {} |
- |
- void Start() { |
- DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
- UsbService* service = device::DeviceClient::Get()->GetUsbService(); |
- if (service) { |
- observer_.Add(service); |
- } |
- } |
- |
- private: |
- void OnDeviceRemovedCleanup(scoped_refptr<UsbDevice> device) override { |
- DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&DevicePermissionsManager::OnDeviceRemoved, |
- device_permissions_manager_, device)); |
- } |
- |
- base::WeakPtr<DevicePermissionsManager> device_permissions_manager_; |
- ScopedObserver<UsbService, UsbService::Observer> observer_; |
-}; |
- |
// static |
DevicePermissionsManager* DevicePermissionsManager::Get( |
BrowserContext* context) { |
return DevicePermissionsManagerFactory::GetForBrowserContext(context); |
} |
-scoped_ptr<DevicePermissions> DevicePermissionsManager::GetForExtension( |
+DevicePermissions* DevicePermissionsManager::GetForExtension( |
const std::string& extension_id) { |
DCHECK(CalledOnValidThread()); |
- return make_scoped_ptr(new DevicePermissions(GetOrInsert(extension_id))); |
+ DevicePermissions* device_permissions = GetInternal(extension_id); |
+ if (!device_permissions) { |
+ device_permissions = new DevicePermissions(context_, extension_id); |
+ extension_id_to_device_permissions_[extension_id] = device_permissions; |
+ } |
+ |
+ return device_permissions; |
} |
std::vector<base::string16> |
@@ -427,7 +395,7 @@ DevicePermissionsManager::GetPermissionMessageStrings( |
const std::string& extension_id) const { |
DCHECK(CalledOnValidThread()); |
std::vector<base::string16> messages; |
- const DevicePermissions* device_permissions = Get(extension_id); |
+ const DevicePermissions* device_permissions = GetInternal(extension_id); |
if (device_permissions) { |
for (const scoped_refptr<DevicePermissionEntry>& entry : |
device_permissions->entries()) { |
@@ -439,15 +407,12 @@ DevicePermissionsManager::GetPermissionMessageStrings( |
void DevicePermissionsManager::AllowUsbDevice( |
const std::string& extension_id, |
- scoped_refptr<device::UsbDevice> device, |
- const base::string16& product_string, |
- const base::string16& manufacturer_string, |
- const base::string16& serial_number) { |
+ scoped_refptr<device::UsbDevice> device) { |
DCHECK(CalledOnValidThread()); |
- DevicePermissions* device_permissions = GetOrInsert(extension_id); |
+ DevicePermissions* device_permissions = GetForExtension(extension_id); |
- scoped_refptr<DevicePermissionEntry> device_entry(new DevicePermissionEntry( |
- device, serial_number, manufacturer_string, product_string)); |
+ scoped_refptr<DevicePermissionEntry> device_entry( |
+ new DevicePermissionEntry(device)); |
if (device_entry->IsPersistent()) { |
for (const auto& entry : device_permissions->entries()) { |
@@ -474,13 +439,9 @@ void DevicePermissionsManager::AllowUsbDevice( |
// Only start observing when an ephemeral device has been added so that |
// UsbService is not automatically initialized on profile creation (which it |
// would be if this call were in the constructor). |
- if (!helper_) { |
- helper_ = new FileThreadHelper(weak_factory_.GetWeakPtr()); |
- // base::Unretained is safe because any task to delete helper_ will be |
- // executed after this call. |
- BrowserThread::PostTask( |
- BrowserThread::FILE, FROM_HERE, |
- base::Bind(&FileThreadHelper::Start, base::Unretained(helper_))); |
+ UsbService* usb_service = device::DeviceClient::Get()->GetUsbService(); |
+ if (!usb_service_observer_.IsObserving(usb_service)) { |
+ usb_service_observer_.Add(usb_service); |
} |
} |
} |
@@ -499,7 +460,7 @@ void DevicePermissionsManager::RemoveEntry( |
const std::string& extension_id, |
scoped_refptr<DevicePermissionEntry> entry) { |
DCHECK(CalledOnValidThread()); |
- DevicePermissions* device_permissions = Get(extension_id); |
+ DevicePermissions* device_permissions = GetInternal(extension_id); |
DCHECK(device_permissions); |
DCHECK(ContainsKey(device_permissions->entries_, entry)); |
device_permissions->entries_.erase(entry); |
@@ -514,7 +475,7 @@ void DevicePermissionsManager::Clear(const std::string& extension_id) { |
DCHECK(CalledOnValidThread()); |
ClearDevicePermissionEntries(ExtensionPrefs::Get(context_), extension_id); |
- DevicePermissions* device_permissions = Get(extension_id); |
+ DevicePermissions* device_permissions = GetInternal(extension_id); |
if (device_permissions) { |
extension_id_to_device_permissions_.erase(extension_id); |
delete device_permissions; |
@@ -525,8 +486,7 @@ DevicePermissionsManager::DevicePermissionsManager( |
content::BrowserContext* context) |
: context_(context), |
process_manager_observer_(this), |
- helper_(nullptr), |
- weak_factory_(this) { |
+ usb_service_observer_(this) { |
process_manager_observer_.Add(ProcessManager::Get(context)); |
} |
@@ -535,13 +495,9 @@ DevicePermissionsManager::~DevicePermissionsManager() { |
DevicePermissions* device_permissions = map_entry.second; |
delete device_permissions; |
} |
- if (helper_) { |
- BrowserThread::DeleteSoon(BrowserThread::FILE, FROM_HERE, helper_); |
- helper_ = nullptr; |
- } |
} |
-DevicePermissions* DevicePermissionsManager::Get( |
+DevicePermissions* DevicePermissionsManager::GetInternal( |
const std::string& extension_id) const { |
std::map<std::string, DevicePermissions*>::const_iterator it = |
extension_id_to_device_permissions_.find(extension_id); |
@@ -552,22 +508,11 @@ DevicePermissions* DevicePermissionsManager::Get( |
return NULL; |
} |
-DevicePermissions* DevicePermissionsManager::GetOrInsert( |
- const std::string& extension_id) { |
- DevicePermissions* device_permissions = Get(extension_id); |
- if (!device_permissions) { |
- device_permissions = new DevicePermissions(context_, extension_id); |
- extension_id_to_device_permissions_[extension_id] = device_permissions; |
- } |
- |
- return device_permissions; |
-} |
- |
void DevicePermissionsManager::OnBackgroundHostClose( |
const std::string& extension_id) { |
DCHECK(CalledOnValidThread()); |
- DevicePermissions* device_permissions = Get(extension_id); |
+ DevicePermissions* device_permissions = GetInternal(extension_id); |
if (device_permissions) { |
// When all of the app's windows are closed and the background page is |
// suspended all ephemeral device permissions are cleared. |
@@ -578,7 +523,7 @@ void DevicePermissionsManager::OnBackgroundHostClose( |
} |
} |
-void DevicePermissionsManager::OnDeviceRemoved( |
+void DevicePermissionsManager::OnDeviceRemovedCleanup( |
scoped_refptr<UsbDevice> device) { |
DCHECK(CalledOnValidThread()); |
for (const auto& map_entry : extension_id_to_device_permissions_) { |