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

Side by Side Diff: chrome/browser/ui/webui/print_preview/extension_printer_handler.cc

Issue 1153173002: Include USB printers in printer list as "provisional" devices. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 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
OLDNEW
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
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
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, &param)) {
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698