| 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);
|
| + }
|
| }
|
| }
|
|
|
|
|