| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "extensions/browser/api/hid/hid_device_manager.h" | 5 #include "extensions/browser/api/hid/hid_device_manager.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| 11 #include "content/public/browser/browser_thread.h" |
| 11 #include "device/core/device_client.h" | 12 #include "device/core/device_client.h" |
| 12 #include "device/hid/hid_device_filter.h" | 13 #include "device/hid/hid_device_filter.h" |
| 13 #include "device/hid/hid_service.h" | 14 #include "device/hid/hid_service.h" |
| 14 #include "extensions/browser/api/extensions_api_client.h" | 15 #include "extensions/browser/api/extensions_api_client.h" |
| 15 #include "extensions/common/permissions/permissions_data.h" | 16 #include "extensions/common/permissions/permissions_data.h" |
| 16 #include "extensions/common/permissions/usb_device_permission.h" | 17 #include "extensions/common/permissions/usb_device_permission.h" |
| 17 | 18 |
| 18 using device::HidDeviceFilter; | 19 using device::HidDeviceFilter; |
| 19 using device::HidService; | 20 using device::HidService; |
| 20 using device::HidUsageAndPage; | 21 using device::HidUsageAndPage; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 31 BrowserContextKeyedAPIFactory<HidDeviceManager>* | 32 BrowserContextKeyedAPIFactory<HidDeviceManager>* |
| 32 HidDeviceManager::GetFactoryInstance() { | 33 HidDeviceManager::GetFactoryInstance() { |
| 33 static base::LazyInstance<BrowserContextKeyedAPIFactory<HidDeviceManager> > | 34 static base::LazyInstance<BrowserContextKeyedAPIFactory<HidDeviceManager> > |
| 34 factory = LAZY_INSTANCE_INITIALIZER; | 35 factory = LAZY_INSTANCE_INITIALIZER; |
| 35 return &factory.Get(); | 36 return &factory.Get(); |
| 36 } | 37 } |
| 37 | 38 |
| 38 scoped_ptr<base::ListValue> HidDeviceManager::GetApiDevices( | 39 scoped_ptr<base::ListValue> HidDeviceManager::GetApiDevices( |
| 39 const Extension* extension, | 40 const Extension* extension, |
| 40 const std::vector<HidDeviceFilter>& filters) { | 41 const std::vector<HidDeviceFilter>& filters) { |
| 42 DCHECK(IsCalledOnValidThread()); |
| 41 UpdateDevices(); | 43 UpdateDevices(); |
| 42 | 44 |
| 43 HidService* hid_service = device::DeviceClient::Get()->GetHidService(); | 45 HidService* hid_service = device::DeviceClient::Get()->GetHidService(); |
| 44 DCHECK(hid_service); | 46 DCHECK(hid_service); |
| 45 base::ListValue* api_devices = new base::ListValue(); | 47 base::ListValue* api_devices = new base::ListValue(); |
| 46 for (ResourceIdToDeviceIdMap::const_iterator device_iter = | 48 for (ResourceIdToDeviceIdMap::const_iterator device_iter = |
| 47 device_ids_.begin(); | 49 device_ids_.begin(); |
| 48 device_iter != device_ids_.end(); | 50 device_iter != device_ids_.end(); |
| 49 ++device_iter) { | 51 ++device_iter) { |
| 50 int resource_id = device_iter->first; | 52 int resource_id = device_iter->first; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 api_devices->Append(api_device_info.ToValue().release()); | 102 api_devices->Append(api_device_info.ToValue().release()); |
| 101 } | 103 } |
| 102 } | 104 } |
| 103 } | 105 } |
| 104 | 106 |
| 105 return scoped_ptr<base::ListValue>(api_devices); | 107 return scoped_ptr<base::ListValue>(api_devices); |
| 106 } | 108 } |
| 107 | 109 |
| 108 bool HidDeviceManager::GetDeviceInfo(int resource_id, | 110 bool HidDeviceManager::GetDeviceInfo(int resource_id, |
| 109 device::HidDeviceInfo* device_info) { | 111 device::HidDeviceInfo* device_info) { |
| 112 DCHECK(IsCalledOnValidThread()); |
| 110 UpdateDevices(); | 113 UpdateDevices(); |
| 111 HidService* hid_service = device::DeviceClient::Get()->GetHidService(); | 114 HidService* hid_service = device::DeviceClient::Get()->GetHidService(); |
| 112 DCHECK(hid_service); | 115 DCHECK(hid_service); |
| 113 | 116 |
| 114 ResourceIdToDeviceIdMap::const_iterator device_iter = | 117 ResourceIdToDeviceIdMap::const_iterator device_iter = |
| 115 device_ids_.find(resource_id); | 118 device_ids_.find(resource_id); |
| 116 if (device_iter == device_ids_.end()) | 119 if (device_iter == device_ids_.end()) |
| 117 return false; | 120 return false; |
| 118 | 121 |
| 119 return hid_service->GetDeviceInfo(device_iter->second, device_info); | 122 return hid_service->GetDeviceInfo(device_iter->second, device_info); |
| 120 } | 123 } |
| 121 | 124 |
| 122 bool HidDeviceManager::HasPermission(const Extension* extension, | 125 bool HidDeviceManager::HasPermission(const Extension* extension, |
| 123 const device::HidDeviceInfo& device_info) { | 126 const device::HidDeviceInfo& device_info) { |
| 127 DCHECK(IsCalledOnValidThread()); |
| 124 UsbDevicePermission::CheckParam usbParam( | 128 UsbDevicePermission::CheckParam usbParam( |
| 125 device_info.vendor_id, | 129 device_info.vendor_id, |
| 126 device_info.product_id, | 130 device_info.product_id, |
| 127 UsbDevicePermissionData::UNSPECIFIED_INTERFACE); | 131 UsbDevicePermissionData::UNSPECIFIED_INTERFACE); |
| 128 if (extension->permissions_data()->CheckAPIPermissionWithParam( | 132 if (extension->permissions_data()->CheckAPIPermissionWithParam( |
| 129 APIPermission::kUsbDevice, &usbParam)) { | 133 APIPermission::kUsbDevice, &usbParam)) { |
| 130 return true; | 134 return true; |
| 131 } | 135 } |
| 132 | 136 |
| 133 if (extension->permissions_data()->HasAPIPermission( | 137 if (extension->permissions_data()->HasAPIPermission( |
| 134 APIPermission::kU2fDevices)) { | 138 APIPermission::kU2fDevices)) { |
| 135 HidDeviceFilter u2f_filter; | 139 HidDeviceFilter u2f_filter; |
| 136 u2f_filter.SetUsagePage(0xF1D0); | 140 u2f_filter.SetUsagePage(0xF1D0); |
| 137 if (u2f_filter.Matches(device_info)) { | 141 if (u2f_filter.Matches(device_info)) { |
| 138 return true; | 142 return true; |
| 139 } | 143 } |
| 140 } | 144 } |
| 141 | 145 |
| 142 return false; | 146 return false; |
| 143 } | 147 } |
| 144 | 148 |
| 149 // static |
| 150 bool HidDeviceManager::IsCalledOnValidThread() { |
| 151 return content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE); |
| 152 } |
| 153 |
| 145 void HidDeviceManager::UpdateDevices() { | 154 void HidDeviceManager::UpdateDevices() { |
| 146 thread_checker_.CalledOnValidThread(); | 155 DCHECK(IsCalledOnValidThread()); |
| 147 HidService* hid_service = device::DeviceClient::Get()->GetHidService(); | 156 HidService* hid_service = device::DeviceClient::Get()->GetHidService(); |
| 148 DCHECK(hid_service); | 157 DCHECK(hid_service); |
| 149 | 158 |
| 150 std::vector<device::HidDeviceInfo> devices; | 159 std::vector<device::HidDeviceInfo> devices; |
| 151 hid_service->GetDevices(&devices); | 160 hid_service->GetDevices(&devices); |
| 152 | 161 |
| 153 // Build an updated bidi mapping between resource ID and underlying device ID. | 162 // Build an updated bidi mapping between resource ID and underlying device ID. |
| 154 DeviceIdToResourceIdMap new_resource_ids; | 163 DeviceIdToResourceIdMap new_resource_ids; |
| 155 ResourceIdToDeviceIdMap new_device_ids; | 164 ResourceIdToDeviceIdMap new_device_ids; |
| 156 for (std::vector<device::HidDeviceInfo>::const_iterator iter = | 165 for (std::vector<device::HidDeviceInfo>::const_iterator iter = |
| (...skipping 11 matching lines...) Expand all Loading... |
| 168 new_id = next_resource_id_++; | 177 new_id = next_resource_id_++; |
| 169 } | 178 } |
| 170 new_resource_ids[device_info.device_id] = new_id; | 179 new_resource_ids[device_info.device_id] = new_id; |
| 171 new_device_ids[new_id] = device_info.device_id; | 180 new_device_ids[new_id] = device_info.device_id; |
| 172 } | 181 } |
| 173 device_ids_.swap(new_device_ids); | 182 device_ids_.swap(new_device_ids); |
| 174 resource_ids_.swap(new_resource_ids); | 183 resource_ids_.swap(new_resource_ids); |
| 175 } | 184 } |
| 176 | 185 |
| 177 } // namespace extensions | 186 } // namespace extensions |
| OLD | NEW |