Index: extensions/browser/api/hid/hid_device_manager.cc |
diff --git a/extensions/browser/api/hid/hid_device_manager.cc b/extensions/browser/api/hid/hid_device_manager.cc |
index 5a6403c87c95b01bc5fb318e76adb27b5c647ee1..7ecf9989913a33a2cc0d675e8a447f7bbdf9ada0 100644 |
--- a/extensions/browser/api/hid/hid_device_manager.cc |
+++ b/extensions/browser/api/hid/hid_device_manager.cc |
@@ -11,6 +11,7 @@ |
#include "device/core/device_client.h" |
#include "device/hid/hid_device_filter.h" |
#include "device/hid/hid_service.h" |
+#include "extensions/browser/api/device_permissions_manager.h" |
#include "extensions/common/permissions/permissions_data.h" |
#include "extensions/common/permissions/usb_device_permission.h" |
@@ -57,12 +58,13 @@ void PopulateHidDeviceInfo(hid::HidDeviceInfo* output, |
} |
} |
-bool WillDispatchDeviceEvent(scoped_refptr<HidDeviceInfo> device_info, |
+bool WillDispatchDeviceEvent(base::WeakPtr<HidDeviceManager> device_manager, |
+ scoped_refptr<device::HidDeviceInfo> device_info, |
content::BrowserContext* context, |
const Extension* extension, |
base::ListValue* event_args) { |
- if (extension) { |
- return HidDeviceManager::HasPermission(extension, device_info); |
+ if (device_manager && extension) { |
+ return device_manager->HasPermission(extension, device_info, false); |
} |
return false; |
} |
@@ -83,10 +85,8 @@ struct HidDeviceManager::GetApiDevicesParams { |
}; |
HidDeviceManager::HidDeviceManager(content::BrowserContext* context) |
- : initialized_(false), |
+ : browser_context_(context), |
hid_service_observer_(this), |
- enumeration_ready_(false), |
- next_resource_id_(0), |
weak_factory_(this) { |
event_router_ = EventRouter::Get(context); |
if (event_router_) { |
@@ -125,6 +125,22 @@ void HidDeviceManager::GetApiDevices( |
} |
} |
+scoped_ptr<base::ListValue> HidDeviceManager::GetApiDevicesFromList( |
+ const std::vector<scoped_refptr<HidDeviceInfo>>& devices) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ scoped_ptr<base::ListValue> device_list(new base::ListValue()); |
+ for (const auto& device : devices) { |
+ const auto device_entry = resource_ids_.find(device->device_id()); |
+ DCHECK(device_entry != resource_ids_.end()); |
+ |
+ hid::HidDeviceInfo device_info; |
+ device_info.device_id = device_entry->second; |
+ PopulateHidDeviceInfo(&device_info, device); |
+ device_list->Append(device_info.ToValue().release()); |
+ } |
+ return device_list.Pass(); |
+} |
+ |
scoped_refptr<HidDeviceInfo> HidDeviceManager::GetDeviceInfo(int resource_id) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
HidService* hid_service = device::DeviceClient::Get()->GetHidService(); |
@@ -139,9 +155,24 @@ scoped_refptr<HidDeviceInfo> HidDeviceManager::GetDeviceInfo(int resource_id) { |
return hid_service->GetDeviceInfo(device_iter->second); |
} |
-// static |
bool HidDeviceManager::HasPermission(const Extension* extension, |
- scoped_refptr<HidDeviceInfo> device_info) { |
+ scoped_refptr<HidDeviceInfo> device_info, |
+ bool update_last_used) { |
+ DevicePermissionsManager* permissions_manager = |
+ DevicePermissionsManager::Get(browser_context_); |
+ CHECK(permissions_manager); |
+ DevicePermissions* device_permissions = |
+ permissions_manager->GetForExtension(extension->id()); |
+ DCHECK(device_permissions); |
+ scoped_refptr<DevicePermissionEntry> permission_entry = |
+ device_permissions->FindHidDeviceEntry(device_info); |
+ if (permission_entry) { |
+ if (update_last_used) { |
+ permissions_manager->UpdateLastUsed(extension->id(), permission_entry); |
+ } |
+ return true; |
+ } |
+ |
UsbDevicePermission::CheckParam usbParam( |
device_info->vendor_id(), device_info->product_id(), |
UsbDevicePermissionData::UNSPECIFIED_INTERFACE); |
@@ -250,7 +281,7 @@ scoped_ptr<base::ListValue> HidDeviceManager::CreateApiDeviceList( |
continue; |
} |
- if (!HasPermission(extension, device_info)) { |
+ if (!HasPermission(extension, device_info, false)) { |
continue; |
} |
@@ -288,8 +319,8 @@ void HidDeviceManager::DispatchEvent(const std::string& event_name, |
scoped_ptr<base::ListValue> event_args, |
scoped_refptr<HidDeviceInfo> device_info) { |
scoped_ptr<Event> event(new Event(event_name, event_args.Pass())); |
- event->will_dispatch_callback = |
- base::Bind(&WillDispatchDeviceEvent, device_info); |
+ event->will_dispatch_callback = base::Bind( |
+ &WillDispatchDeviceEvent, weak_factory_.GetWeakPtr(), device_info); |
event_router_->BroadcastEvent(event.Pass()); |
} |