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 87f52f081fdb5f74df53a9008e846cf1542f2d42..00503208a1c15ad385a6b0d9c1b8f52c6aca72ab 100644 |
--- a/extensions/browser/api/device_permissions_manager.cc |
+++ b/extensions/browser/api/device_permissions_manager.cc |
@@ -10,6 +10,8 @@ |
#include "base/strings/utf_string_conversions.h" |
#include "base/values.h" |
#include "components/keyed_service/content/browser_context_dependency_manager.h" |
+#include "device/core/device_client.h" |
+#include "device/usb/usb_device.h" |
#include "device/usb/usb_ids.h" |
#include "extensions/browser/extension_host.h" |
#include "extensions/browser/extension_prefs.h" |
@@ -438,7 +440,16 @@ void DevicePermissionsManager::AllowUsbDevice( |
// Register an observer here so that this set doesn't grow undefinitely. |
device_permissions->entries_.insert(device_entry); |
device_permissions->ephemeral_devices_[device] = device_entry; |
- device->AddObserver(this); |
+ |
+ // 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). |
+ device::UsbService* usb_service = |
+ device::DeviceClient::Get()->GetUsbService(); |
+ DCHECK(usb_service); |
+ if (!usb_service_observer_.IsObserving(usb_service)) { |
+ usb_service_observer_.Add(usb_service); |
+ } |
} |
} |
@@ -464,7 +475,6 @@ void DevicePermissionsManager::RemoveEntry( |
RemoveDevicePermissionEntry(context_, extension_id, entry); |
} else { |
device_permissions->ephemeral_devices_.erase(entry->device_); |
- entry->device_->RemoveObserver(this); |
} |
} |
@@ -474,9 +484,6 @@ void DevicePermissionsManager::Clear(const std::string& extension_id) { |
ClearDevicePermissionEntries(ExtensionPrefs::Get(context_), extension_id); |
DevicePermissions* device_permissions = Get(extension_id); |
if (device_permissions) { |
- for (const auto& device_entry : device_permissions->ephemeral_devices_) { |
- device_entry.first->RemoveObserver(this); |
- } |
extension_id_to_device_permissions_.erase(extension_id); |
delete device_permissions; |
} |
@@ -484,16 +491,15 @@ void DevicePermissionsManager::Clear(const std::string& extension_id) { |
DevicePermissionsManager::DevicePermissionsManager( |
content::BrowserContext* context) |
- : context_(context), process_manager_observer_(this) { |
+ : context_(context), |
+ process_manager_observer_(this), |
+ usb_service_observer_(this) { |
process_manager_observer_.Add(ProcessManager::Get(context)); |
} |
DevicePermissionsManager::~DevicePermissionsManager() { |
for (const auto& map_entry : extension_id_to_device_permissions_) { |
DevicePermissions* device_permissions = map_entry.second; |
- for (const auto& device_entry : device_permissions->ephemeral_devices_) { |
- device_entry.first->RemoveObserver(this); |
- } |
delete device_permissions; |
} |
} |
@@ -529,24 +535,24 @@ void DevicePermissionsManager::OnBackgroundHostClose( |
// When all of the app's windows are closed and the background page is |
// suspended all ephemeral device permissions are cleared. |
for (const auto& map_entry : device_permissions->ephemeral_devices_) { |
- map_entry.first->RemoveObserver(this); |
device_permissions->entries_.erase(map_entry.second); |
} |
device_permissions->ephemeral_devices_.clear(); |
} |
} |
-void DevicePermissionsManager::OnDisconnect(scoped_refptr<UsbDevice> device) { |
+void DevicePermissionsManager::OnDeviceRemoved( |
+ scoped_refptr<UsbDevice> device) { |
for (const auto& map_entry : extension_id_to_device_permissions_) { |
// An ephemeral device cannot be identified if it is reconnected and so |
// permission to access it is cleared on disconnect. |
DevicePermissions* device_permissions = map_entry.second; |
const auto& device_entry = |
device_permissions->ephemeral_devices_.find(device); |
- DCHECK(device_entry != device_permissions->ephemeral_devices_.end()); |
- device_permissions->entries_.erase(device_entry->second); |
- device_permissions->ephemeral_devices_.erase(device); |
- device->RemoveObserver(this); |
+ if (device_entry != device_permissions->ephemeral_devices_.end()) { |
+ device_permissions->entries_.erase(device_entry->second); |
+ device_permissions->ephemeral_devices_.erase(device); |
+ } |
} |
} |