Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(486)

Side by Side Diff: extensions/browser/api/hid/hid_device_manager.cc

Issue 604843003: Check that extensions::HidDeviceManager is used from the FILE thread. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « extensions/browser/api/hid/hid_device_manager.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « extensions/browser/api/hid/hid_device_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698