OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "chrome/browser/ui/webui/print_preview/extension_printer_handler.h" | 5 #include "chrome/browser/ui/webui/print_preview/extension_printer_handler.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
11 #include "base/files/file.h" | 11 #include "base/files/file.h" |
12 #include "base/files/file_path.h" | 12 #include "base/files/file_path.h" |
13 #include "base/files/file_util.h" | 13 #include "base/files/file_util.h" |
14 #include "base/location.h" | 14 #include "base/location.h" |
15 #include "base/memory/ref_counted.h" | 15 #include "base/memory/ref_counted.h" |
16 #include "base/memory/ref_counted_memory.h" | 16 #include "base/memory/ref_counted_memory.h" |
17 #include "base/task_runner_util.h" | 17 #include "base/task_runner_util.h" |
18 #include "chrome/browser/local_discovery/pwg_raster_converter.h" | 18 #include "chrome/browser/local_discovery/pwg_raster_converter.h" |
19 #include "components/cloud_devices/common/cloud_device_description.h" | 19 #include "components/cloud_devices/common/cloud_device_description.h" |
20 #include "components/cloud_devices/common/printer_description.h" | 20 #include "components/cloud_devices/common/printer_description.h" |
21 #include "device/core/device_client.h" | |
22 #include "device/usb/usb_device.h" | |
23 #include "device/usb/usb_service.h" | |
24 #include "extensions/browser/api/device_permissions_manager.h" | |
21 #include "extensions/browser/api/printer_provider/printer_provider_api.h" | 25 #include "extensions/browser/api/printer_provider/printer_provider_api.h" |
22 #include "extensions/browser/api/printer_provider/printer_provider_api_factory.h " | 26 #include "extensions/browser/api/printer_provider/printer_provider_api_factory.h " |
23 #include "extensions/browser/api/printer_provider/printer_provider_print_job.h" | 27 #include "extensions/browser/api/printer_provider/printer_provider_print_job.h" |
28 #include "extensions/browser/extension_registry.h" | |
29 #include "extensions/common/api/printer_provider/usb_printer_manifest_data.h" | |
30 #include "extensions/common/permissions/permissions_data.h" | |
31 #include "extensions/common/permissions/usb_device_permission.h" | |
32 #include "extensions/common/permissions/usb_device_permission_data.h" | |
33 #include "extensions/common/value_builder.h" | |
24 #include "printing/pdf_render_settings.h" | 34 #include "printing/pdf_render_settings.h" |
25 #include "printing/pwg_raster_settings.h" | 35 #include "printing/pwg_raster_settings.h" |
26 | 36 |
37 using device::UsbDevice; | |
38 using extensions::DevicePermissionsManager; | |
39 using extensions::DictionaryBuilder; | |
40 using extensions::Extension; | |
41 using extensions::ExtensionRegistry; | |
42 using extensions::ListBuilder; | |
43 using extensions::UsbPrinterManifestData; | |
27 using local_discovery::PWGRasterConverter; | 44 using local_discovery::PWGRasterConverter; |
28 | 45 |
29 namespace { | 46 namespace { |
30 | 47 |
31 const char kContentTypePdf[] = "application/pdf"; | 48 const char kContentTypePdf[] = "application/pdf"; |
32 const char kContentTypePWGRaster[] = "image/pwg-raster"; | 49 const char kContentTypePWGRaster[] = "image/pwg-raster"; |
33 const char kContentTypeAll[] = "*/*"; | 50 const char kContentTypeAll[] = "*/*"; |
34 | 51 |
35 const char kInvalidDataPrintError[] = "INVALID_DATA"; | 52 const char kInvalidDataPrintError[] = "INVALID_DATA"; |
36 const char kInvalidTicketPrintError[] = "INVALID_TICKET"; | 53 const char kInvalidTicketPrintError[] = "INVALID_TICKET"; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
87 | 104 |
88 void ExtensionPrinterHandler::StartGetPrinters( | 105 void ExtensionPrinterHandler::StartGetPrinters( |
89 const PrinterHandler::GetPrintersCallback& callback) { | 106 const PrinterHandler::GetPrintersCallback& callback) { |
90 extensions::PrinterProviderAPIFactory::GetInstance() | 107 extensions::PrinterProviderAPIFactory::GetInstance() |
91 ->GetForBrowserContext(browser_context_) | 108 ->GetForBrowserContext(browser_context_) |
92 ->DispatchGetPrintersRequested( | 109 ->DispatchGetPrintersRequested( |
93 base::Bind(&ExtensionPrinterHandler::WrapGetPrintersCallback, | 110 base::Bind(&ExtensionPrinterHandler::WrapGetPrintersCallback, |
94 weak_ptr_factory_.GetWeakPtr(), callback)); | 111 weak_ptr_factory_.GetWeakPtr(), callback)); |
95 } | 112 } |
96 | 113 |
114 void ExtensionPrinterHandler::StartGetUsbPrinters( | |
115 const GetUsbPrintersCallback& callback) { | |
116 bool extensions_support_usb_devices = false; | |
117 ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context_); | |
118 for (const auto& extension : registry->enabled_extensions()) { | |
119 if (UsbPrinterManifestData::Get(extension.get()) && | |
120 extension->permissions_data() && | |
121 extension->permissions_data()->HasAPIPermission( | |
122 extensions::APIPermission::kPrinterProvider) && | |
123 extension->permissions_data()->HasAPIPermission( | |
124 extensions::APIPermission::kUsb)) { | |
tbarzic
2015/05/27 18:24:33
Maybe check that the extension has required event
Reilly Grant (use Gerrit)
2015/05/28 21:45:00
I think that starts to get to be a lot of properti
| |
125 extensions_support_usb_devices = true; | |
126 } | |
127 } | |
128 | |
129 if (extensions_support_usb_devices) { | |
130 device::UsbService* service = device::DeviceClient::Get()->GetUsbService(); | |
131 DCHECK(service); | |
132 service->GetDevices( | |
133 base::Bind(&ExtensionPrinterHandler::OnUsbDevicesEnumerated, | |
134 weak_ptr_factory_.GetWeakPtr(), callback)); | |
135 } | |
136 } | |
137 | |
97 void ExtensionPrinterHandler::StartGetCapability( | 138 void ExtensionPrinterHandler::StartGetCapability( |
98 const std::string& destination_id, | 139 const std::string& destination_id, |
99 const PrinterHandler::GetCapabilityCallback& callback) { | 140 const PrinterHandler::GetCapabilityCallback& callback) { |
100 extensions::PrinterProviderAPIFactory::GetInstance() | 141 extensions::PrinterProviderAPIFactory::GetInstance() |
101 ->GetForBrowserContext(browser_context_) | 142 ->GetForBrowserContext(browser_context_) |
102 ->DispatchGetCapabilityRequested( | 143 ->DispatchGetCapabilityRequested( |
103 destination_id, | 144 destination_id, |
104 base::Bind(&ExtensionPrinterHandler::WrapGetCapabilityCallback, | 145 base::Bind(&ExtensionPrinterHandler::WrapGetCapabilityCallback, |
105 weak_ptr_factory_.GetWeakPtr(), callback, destination_id)); | 146 weak_ptr_factory_.GetWeakPtr(), callback, destination_id)); |
106 } | 147 } |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
201 const base::DictionaryValue& capability) { | 242 const base::DictionaryValue& capability) { |
202 callback.Run(destination_id, capability); | 243 callback.Run(destination_id, capability); |
203 } | 244 } |
204 | 245 |
205 void ExtensionPrinterHandler::WrapPrintCallback( | 246 void ExtensionPrinterHandler::WrapPrintCallback( |
206 const PrinterHandler::PrintCallback& callback, | 247 const PrinterHandler::PrintCallback& callback, |
207 bool success, | 248 bool success, |
208 const std::string& status) { | 249 const std::string& status) { |
209 callback.Run(success, status); | 250 callback.Run(success, status); |
210 } | 251 } |
252 | |
253 void ExtensionPrinterHandler::OnUsbDevicesEnumerated( | |
254 const GetUsbPrintersCallback& callback, | |
255 const std::vector<scoped_refptr<UsbDevice>>& devices) { | |
256 std::map<scoped_refptr<UsbDevice>, | |
257 std::vector<scoped_refptr<const Extension>>> result_map; | |
258 | |
259 ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context_); | |
260 DevicePermissionsManager* permissions_manager = | |
tbarzic
2015/05/27 18:24:33
can this logic be moved somewhere under extensions
tbarzic
2015/05/28 00:30:21
you can ignore this one :)
| |
261 DevicePermissionsManager::Get(browser_context_); | |
262 | |
263 for (const auto& extension : registry->enabled_extensions()) { | |
264 const UsbPrinterManifestData* manifest_data = | |
265 UsbPrinterManifestData::Get(extension.get()); | |
266 const extensions::DevicePermissions* device_permissions = | |
267 permissions_manager->GetForExtension(extension->id()); | |
268 | |
269 if (!manifest_data || !extension->permissions_data() || | |
270 !extension->permissions_data()->HasAPIPermission( | |
271 extensions::APIPermission::kPrinterProvider) || | |
272 !extension->permissions_data()->HasAPIPermission( | |
273 extensions::APIPermission::kUsb)) { | |
274 continue; | |
275 } | |
276 | |
277 for (const auto& device : devices) { | |
278 if (manifest_data->SupportsDevice(device)) { | |
279 extensions::UsbDevicePermission::CheckParam param( | |
280 device->vendor_id(), | |
281 device->product_id(), | |
282 extensions::UsbDevicePermissionData::UNSPECIFIED_INTERFACE); | |
283 if (device_permissions->FindUsbDeviceEntry(device) || | |
284 extension->permissions_data()->CheckAPIPermissionWithParam( | |
285 extensions::APIPermission::kUsbDevice, ¶m)) { | |
286 // Skip devices the extension already has permission to access. | |
287 continue; | |
288 } | |
289 | |
290 result_map[device].push_back(extension); | |
291 } | |
292 } | |
293 } | |
294 | |
295 ListBuilder printer_list; | |
296 for (const auto& map_entry : result_map) { | |
297 ListBuilder extension_list; | |
298 for (const scoped_refptr<const Extension>& extension : map_entry.second) { | |
299 extension_list.Append(DictionaryBuilder() | |
300 .Set("extensionId", extension->id()) | |
301 .Set("extensionName", extension->name())); | |
302 } | |
303 | |
304 const scoped_refptr<UsbDevice>& device = map_entry.first; | |
305 printer_list.Append( | |
306 DictionaryBuilder() | |
307 .Set("name", DevicePermissionsManager::GetPermissionMessage( | |
308 device->vendor_id(), device->product_id(), | |
309 device->manufacturer_string(), | |
310 device->product_string(), base::string16(), false)) | |
311 .Set("usbDevice", static_cast<int>(device->unique_id())) | |
312 .Set("extensions", extension_list.Pass())); | |
313 } | |
314 | |
315 callback.Run(*printer_list.Build().get()); | |
316 } | |
OLD | NEW |