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

Unified 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, 7 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
diff --git a/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc b/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
index 3236e3ecda46426e5261994ef313b501b8fbc0f7..b5d2feb599b3dad353f8883f1fc3c6e4f3a5f7fb 100644
--- a/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
@@ -18,12 +18,29 @@
#include "chrome/browser/local_discovery/pwg_raster_converter.h"
#include "components/cloud_devices/common/cloud_device_description.h"
#include "components/cloud_devices/common/printer_description.h"
+#include "device/core/device_client.h"
+#include "device/usb/usb_device.h"
+#include "device/usb/usb_service.h"
+#include "extensions/browser/api/device_permissions_manager.h"
#include "extensions/browser/api/printer_provider/printer_provider_api.h"
#include "extensions/browser/api/printer_provider/printer_provider_api_factory.h"
#include "extensions/browser/api/printer_provider/printer_provider_print_job.h"
+#include "extensions/browser/extension_registry.h"
+#include "extensions/common/api/printer_provider/usb_printer_manifest_data.h"
+#include "extensions/common/permissions/permissions_data.h"
+#include "extensions/common/permissions/usb_device_permission.h"
+#include "extensions/common/permissions/usb_device_permission_data.h"
+#include "extensions/common/value_builder.h"
#include "printing/pdf_render_settings.h"
#include "printing/pwg_raster_settings.h"
+using device::UsbDevice;
+using extensions::DevicePermissionsManager;
+using extensions::DictionaryBuilder;
+using extensions::Extension;
+using extensions::ExtensionRegistry;
+using extensions::ListBuilder;
+using extensions::UsbPrinterManifestData;
using local_discovery::PWGRasterConverter;
namespace {
@@ -94,6 +111,30 @@ void ExtensionPrinterHandler::StartGetPrinters(
weak_ptr_factory_.GetWeakPtr(), callback));
}
+void ExtensionPrinterHandler::StartGetUsbPrinters(
+ const GetUsbPrintersCallback& callback) {
+ bool extensions_support_usb_devices = false;
+ ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context_);
+ for (const auto& extension : registry->enabled_extensions()) {
+ if (UsbPrinterManifestData::Get(extension.get()) &&
+ extension->permissions_data() &&
+ extension->permissions_data()->HasAPIPermission(
+ extensions::APIPermission::kPrinterProvider) &&
+ extension->permissions_data()->HasAPIPermission(
+ 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
+ extensions_support_usb_devices = true;
+ }
+ }
+
+ if (extensions_support_usb_devices) {
+ device::UsbService* service = device::DeviceClient::Get()->GetUsbService();
+ DCHECK(service);
+ service->GetDevices(
+ base::Bind(&ExtensionPrinterHandler::OnUsbDevicesEnumerated,
+ weak_ptr_factory_.GetWeakPtr(), callback));
+ }
+}
+
void ExtensionPrinterHandler::StartGetCapability(
const std::string& destination_id,
const PrinterHandler::GetCapabilityCallback& callback) {
@@ -208,3 +249,68 @@ void ExtensionPrinterHandler::WrapPrintCallback(
const std::string& status) {
callback.Run(success, status);
}
+
+void ExtensionPrinterHandler::OnUsbDevicesEnumerated(
+ const GetUsbPrintersCallback& callback,
+ const std::vector<scoped_refptr<UsbDevice>>& devices) {
+ std::map<scoped_refptr<UsbDevice>,
+ std::vector<scoped_refptr<const Extension>>> result_map;
+
+ ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context_);
+ 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 :)
+ DevicePermissionsManager::Get(browser_context_);
+
+ for (const auto& extension : registry->enabled_extensions()) {
+ const UsbPrinterManifestData* manifest_data =
+ UsbPrinterManifestData::Get(extension.get());
+ const extensions::DevicePermissions* device_permissions =
+ permissions_manager->GetForExtension(extension->id());
+
+ if (!manifest_data || !extension->permissions_data() ||
+ !extension->permissions_data()->HasAPIPermission(
+ extensions::APIPermission::kPrinterProvider) ||
+ !extension->permissions_data()->HasAPIPermission(
+ extensions::APIPermission::kUsb)) {
+ continue;
+ }
+
+ for (const auto& device : devices) {
+ if (manifest_data->SupportsDevice(device)) {
+ extensions::UsbDevicePermission::CheckParam param(
+ device->vendor_id(),
+ device->product_id(),
+ extensions::UsbDevicePermissionData::UNSPECIFIED_INTERFACE);
+ if (device_permissions->FindUsbDeviceEntry(device) ||
+ extension->permissions_data()->CheckAPIPermissionWithParam(
+ extensions::APIPermission::kUsbDevice, &param)) {
+ // Skip devices the extension already has permission to access.
+ continue;
+ }
+
+ result_map[device].push_back(extension);
+ }
+ }
+ }
+
+ ListBuilder printer_list;
+ for (const auto& map_entry : result_map) {
+ ListBuilder extension_list;
+ for (const scoped_refptr<const Extension>& extension : map_entry.second) {
+ extension_list.Append(DictionaryBuilder()
+ .Set("extensionId", extension->id())
+ .Set("extensionName", extension->name()));
+ }
+
+ const scoped_refptr<UsbDevice>& device = map_entry.first;
+ printer_list.Append(
+ DictionaryBuilder()
+ .Set("name", DevicePermissionsManager::GetPermissionMessage(
+ device->vendor_id(), device->product_id(),
+ device->manufacturer_string(),
+ device->product_string(), base::string16(), false))
+ .Set("usbDevice", static_cast<int>(device->unique_id()))
+ .Set("extensions", extension_list.Pass()));
+ }
+
+ callback.Run(*printer_list.Build().get());
+}

Powered by Google App Engine
This is Rietveld 408576698