diff options
author | alekseys@chromium.org <alekseys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-05 21:44:45 +0000 |
---|---|---|
committer | alekseys@chromium.org <alekseys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-05 21:44:45 +0000 |
commit | dfb4a9d16122d903d026b8bba069ca144b8b729c (patch) | |
tree | 50fe7d4eaf1321fc9a3e15125a299367aedc7af4 | |
parent | ed5e116cc02087bb0172ef8aeaac4cc6cf656c70 (diff) | |
download | chromium_src-dfb4a9d16122d903d026b8bba069ca144b8b729c.zip chromium_src-dfb4a9d16122d903d026b8bba069ca144b8b729c.tar.gz chromium_src-dfb4a9d16122d903d026b8bba069ca144b8b729c.tar.bz2 |
Convert local printer capabilites to CDD format to unify with cloud printers and PDF printer. This is a necessary step for adding paper size capability to local printers.
BUG=239879
Review URL: https://codereview.chromium.org/313723002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@275250 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/resources/print_preview/data/destination_store.js | 7 | ||||
-rw-r--r-- | chrome/browser/resources/print_preview/data/local_parsers.js | 59 | ||||
-rw-r--r-- | chrome/browser/resources/print_preview/data/ticket_items/collate.js | 5 | ||||
-rw-r--r-- | chrome/browser/ui/webui/print_preview/print_preview_handler.cc | 110 | ||||
-rw-r--r-- | chrome/chrome_common.gypi | 2 | ||||
-rw-r--r-- | chrome/common/chrome_utility_messages.h | 10 | ||||
-rw-r--r-- | chrome/common/cloud_print/cloud_print_cdd_conversion.cc | 120 | ||||
-rw-r--r-- | chrome/common/cloud_print/cloud_print_cdd_conversion.h | 24 | ||||
-rw-r--r-- | chrome/service/cloud_print/cdd_conversion_win.cc | 108 | ||||
-rw-r--r-- | chrome/service/cloud_print/cdd_conversion_win.h | 7 | ||||
-rw-r--r-- | chrome/service/cloud_print/print_system_win.cc | 10 | ||||
-rw-r--r-- | chrome/test/data/webui/print_preview.js | 182 | ||||
-rw-r--r-- | printing/backend/cups_helper.cc | 4 | ||||
-rw-r--r-- | printing/backend/cups_helper_unittest.cc | 35 | ||||
-rw-r--r-- | printing/backend/print_backend.cc | 17 | ||||
-rw-r--r-- | printing/backend/print_backend.h | 22 |
16 files changed, 336 insertions, 386 deletions
diff --git a/chrome/browser/resources/print_preview/data/destination_store.js b/chrome/browser/resources/print_preview/data/destination_store.js index 1f45947..84e54d5 100644 --- a/chrome/browser/resources/print_preview/data/destination_store.js +++ b/chrome/browser/resources/print_preview/data/destination_store.js @@ -733,17 +733,16 @@ cr.define('print_preview', function() { destinationId, ''); var destination = this.destinationMap_[key]; + var capabilities = DestinationStore.localizeCapabilities_( + event.settingsInfo.capabilities); // Special case for PDF printer (until local printers capabilities are // reported in CDD format too). if (destinationId == print_preview.Destination.GooglePromotedId.SAVE_AS_PDF) { if (destination) { - destination.capabilities = DestinationStore.localizeCapabilities_( - event.settingsInfo.capabilities); + destination.capabilities = capabilities; } } else { - var capabilities = print_preview.LocalCapabilitiesParser.parse( - event.settingsInfo); if (destination) { // In case there were multiple capabilities request for this local // destination, just ignore the later ones. diff --git a/chrome/browser/resources/print_preview/data/local_parsers.js b/chrome/browser/resources/print_preview/data/local_parsers.js index 22cfded..c15fb59 100644 --- a/chrome/browser/resources/print_preview/data/local_parsers.js +++ b/chrome/browser/resources/print_preview/data/local_parsers.js @@ -32,64 +32,6 @@ cr.define('print_preview', function() { options); }; - /** Namespace that contains a method to parse local print capabilities. */ - function LocalCapabilitiesParser() {}; - - /** - * Parses local print capabilities. - * @param {!Object} settingsInfo Object that describes local print - * capabilities. - * @return {!print_preview.Cdd} Parsed local print capabilities. - */ - LocalCapabilitiesParser.parse = function(settingsInfo) { - var cdd = { - version: '1.0', - printer: { - collate: {'default': true} - } - }; - - if (!settingsInfo['disableColorOption']) { - cdd.printer.color = { - option: [ - { - type: 'STANDARD_COLOR', - is_default: !!settingsInfo['setColorAsDefault'] - }, - { - type: 'STANDARD_MONOCHROME', - is_default: !settingsInfo['setColorAsDefault'] - } - ] - }; - } - - if (!settingsInfo['disableCopiesOption']) { - cdd.printer.copies = {'default': 1}; - } - - if (settingsInfo['printerDefaultDuplexValue'] != - print_preview.NativeLayer.DuplexMode.UNKNOWN_DUPLEX_MODE) { - cdd.printer.duplex = { - option: [ - {type: 'NO_DUPLEX', is_default: !settingsInfo['setDuplexAsDefault']}, - {type: 'LONG_EDGE', is_default: !!settingsInfo['setDuplexAsDefault']} - ] - }; - } - - if (!settingsInfo['disableLandscapeOption']) { - cdd.printer.page_orientation = { - option: [ - {type: 'PORTRAIT', is_default: true}, - {type: 'LANDSCAPE'} - ] - }; - } - - return cdd; - }; - function PrivetDestinationParser() {} /** @@ -126,7 +68,6 @@ cr.define('print_preview', function() { // Export return { - LocalCapabilitiesParser: LocalCapabilitiesParser, LocalDestinationParser: LocalDestinationParser, PrivetDestinationParser: PrivetDestinationParser }; diff --git a/chrome/browser/resources/print_preview/data/ticket_items/collate.js b/chrome/browser/resources/print_preview/data/ticket_items/collate.js index 4c3f400..abf306d 100644 --- a/chrome/browser/resources/print_preview/data/ticket_items/collate.js +++ b/chrome/browser/resources/print_preview/data/ticket_items/collate.js @@ -38,12 +38,13 @@ cr.define('print_preview.ticket_items', function() { /** @override */ getDefaultValueInternal: function() { - return this.getCollateCapability_().default || false; + var capability = this.getCollateCapability_(); + return capability.hasOwnProperty('default') ? capability.default : true; }, /** @override */ getCapabilityNotAvailableValueInternal: function() { - return false; + return true; }, /** diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc index b1c37ad..c2636aa 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc @@ -45,6 +45,7 @@ #include "chrome/browser/ui/webui/print_preview/sticky_settings.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" +#include "chrome/common/cloud_print/cloud_print_cdd_conversion.h" #include "chrome/common/cloud_print/cloud_print_constants.h" #include "chrome/common/crash_keys.h" #include "chrome/common/pref_names.h" @@ -189,9 +190,6 @@ const char kLocalPdfPrinterId[] = "Save as PDF"; // Additional printer capability setting keys. const char kPrinterId[] = "printerId"; const char kPrinterCapabilities[] = "capabilities"; -const char kDisableColorOption[] = "disableColorOption"; -const char kSetDuplexAsDefault[] = "setDuplexAsDefault"; -const char kPrinterDefaultDuplexValue[] = "printerDefaultDuplexValue"; #if defined(USE_CUPS) const char kCUPSsColorModel[] = "cupsColorModel"; const char kCUPSsBWModel[] = "cupsBWModel"; @@ -349,6 +347,43 @@ scoped_ptr<base::DictionaryValue> GetPdfCapabilitiesOnFileThread( return scoped_ptr<base::DictionaryValue>(description.root().DeepCopy()); } +scoped_ptr<base::DictionaryValue> GetLocalPrinterCapabilitiesOnFileThread( + const std::string& printer_name) { + DCHECK_CURRENTLY_ON(BrowserThread::FILE); + + scoped_refptr<printing::PrintBackend> print_backend( + printing::PrintBackend::CreateInstance(NULL)); + + VLOG(1) << "Get printer capabilities start for " << printer_name; + crash_keys::ScopedPrinterInfo crash_key( + print_backend->GetPrinterDriverInfo(printer_name)); + + if (!print_backend->IsValidPrinter(printer_name)) { + LOG(WARNING) << "Invalid printer " << printer_name; + return scoped_ptr<base::DictionaryValue>(); + } + + printing::PrinterSemanticCapsAndDefaults info; + if (!print_backend->GetPrinterSemanticCapsAndDefaults(printer_name, &info)) { + LOG(WARNING) << "Failed to get capabilities for " << printer_name; + return scoped_ptr<base::DictionaryValue>(); + } + + scoped_ptr<base::DictionaryValue> description( + cloud_print::PrinterSemanticCapsAndDefaultsToCdd(info)); + if (!description) { + LOG(WARNING) << "Failed to convert capabilities for " << printer_name; + return scoped_ptr<base::DictionaryValue>(); + } + +#if defined(USE_CUPS) + // TODO(alekseys): Use CUSTOM_COLOR/MONOCHROME instead. + description->SetInteger(kCUPSsColorModel, info.color_model); + description->SetInteger(kCUPSsBWModel, info.bw_model); +#endif + return description.Pass(); +} + void EnumeratePrintersOnFileThread(base::ListValue* printers) { DCHECK_CURRENTLY_ON(BrowserThread::FILE); @@ -410,64 +445,23 @@ void GetPrinterCapabilitiesOnFileThread( DCHECK_CURRENTLY_ON(BrowserThread::FILE); DCHECK(!printer_name.empty()); - // Special case for PDF printer. - if (printer_name == kLocalPdfPrinterId) { - scoped_ptr<base::DictionaryValue> printer_info(new base::DictionaryValue); - printer_info->SetString(kPrinterId, printer_name); - printer_info->Set(kPrinterCapabilities, - GetPdfCapabilitiesOnFileThread(locale).release()); - BrowserThread::PostTask( - BrowserThread::UI, FROM_HERE, - base::Bind(success_cb, base::Owned(printer_info.release()))); - return; - } - - scoped_refptr<printing::PrintBackend> print_backend( - printing::PrintBackend::CreateInstance(NULL)); - - VLOG(1) << "Get printer capabilities start for " << printer_name; - crash_keys::ScopedPrinterInfo crash_key( - print_backend->GetPrinterDriverInfo(printer_name)); - - if (!print_backend->IsValidPrinter(printer_name)) { - // TODO(gene): Notify explicitly if printer is not valid, instead of - // failed to get capabilities. + scoped_ptr<base::DictionaryValue> printer_capabilities( + printer_name == kLocalPdfPrinterId ? + GetPdfCapabilitiesOnFileThread(locale) : + GetLocalPrinterCapabilitiesOnFileThread(printer_name)); + if (!printer_capabilities) { BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(failure_cb, printer_name)); return; } - printing::PrinterSemanticCapsAndDefaults info; - if (!print_backend->GetPrinterSemanticCapsAndDefaults(printer_name, &info)) { - LOG(WARNING) << "Failed to get capabilities for " << printer_name; - BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, - base::Bind(failure_cb, printer_name)); - return; - } - - scoped_ptr<base::DictionaryValue> settings_info(new base::DictionaryValue); - settings_info->SetString(kPrinterId, printer_name); - settings_info->SetBoolean(kDisableColorOption, !info.color_changeable); - settings_info->SetBoolean(printing::kSettingSetColorAsDefault, - info.color_default); -#if defined(USE_CUPS) - settings_info->SetInteger(kCUPSsColorModel, info.color_model); - settings_info->SetInteger(kCUPSsBWModel, info.bw_model); -#endif - - // TODO(gene): Make new capabilities format for Print Preview - // that will suit semantic capabilities better. - // Refactor pld API code below - bool default_duplex = info.duplex_capable ? - (info.duplex_default != printing::SIMPLEX) : false; - int duplex_value = info.duplex_capable ? - printing::LONG_EDGE : printing::UNKNOWN_DUPLEX_MODE; - settings_info->SetBoolean(kSetDuplexAsDefault, default_duplex); - settings_info->SetInteger(kPrinterDefaultDuplexValue, duplex_value); + scoped_ptr<base::DictionaryValue> printer_info(new base::DictionaryValue); + printer_info->SetString(kPrinterId, printer_name); + printer_info->Set(kPrinterCapabilities, printer_capabilities.release()); BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, - base::Bind(success_cb, base::Owned(settings_info.release()))); + base::Bind(success_cb, base::Owned(printer_info.release()))); } base::LazyInstance<printing::StickySettings> g_sticky_settings = @@ -1420,10 +1414,16 @@ void PrintPreviewHandler::SaveCUPSColorSetting( const base::DictionaryValue* settings) { cups_printer_color_models_.reset(new CUPSPrinterColorModels); settings->GetString(kPrinterId, &cups_printer_color_models_->printer_name); - settings->GetInteger( + const base::DictionaryValue* capabilities = NULL; + if (!settings->GetDictionary(kPrinterCapabilities, &capabilities) || + !capabilities) { + NOTREACHED(); + return; + } + capabilities->GetInteger( kCUPSsColorModel, reinterpret_cast<int*>(&cups_printer_color_models_->color_model)); - settings->GetInteger( + capabilities->GetInteger( kCUPSsBWModel, reinterpret_cast<int*>(&cups_printer_color_models_->bw_model)); } diff --git a/chrome/chrome_common.gypi b/chrome/chrome_common.gypi index 22a9ef6..aa711d92 100644 --- a/chrome/chrome_common.gypi +++ b/chrome/chrome_common.gypi @@ -85,6 +85,8 @@ 'common/chrome_version_info.h', 'common/cloud_print/cloud_print_class_mac.h', 'common/cloud_print/cloud_print_class_mac.mm', + 'common/cloud_print/cloud_print_cdd_conversion.cc', + 'common/cloud_print/cloud_print_cdd_conversion.h', 'common/cloud_print/cloud_print_constants.cc', 'common/cloud_print/cloud_print_constants.h', 'common/cloud_print/cloud_print_helpers.cc', diff --git a/chrome/common/chrome_utility_messages.h b/chrome/common/chrome_utility_messages.h index 1bb2c46..a926690 100644 --- a/chrome/common/chrome_utility_messages.h +++ b/chrome/common/chrome_utility_messages.h @@ -58,6 +58,11 @@ IPC_STRUCT_TRAITS_END() #endif IPC_STRUCT_TRAITS_BEGIN(printing::PrinterSemanticCapsAndDefaults) + IPC_STRUCT_TRAITS_MEMBER(collate_capable) + IPC_STRUCT_TRAITS_MEMBER(collate_default) + IPC_STRUCT_TRAITS_MEMBER(copies_capable) + IPC_STRUCT_TRAITS_MEMBER(duplex_capable) + IPC_STRUCT_TRAITS_MEMBER(duplex_default) IPC_STRUCT_TRAITS_MEMBER(color_changeable) IPC_STRUCT_TRAITS_MEMBER(color_default) #if defined(USE_CUPS) @@ -65,16 +70,11 @@ IPC_STRUCT_TRAITS_BEGIN(printing::PrinterSemanticCapsAndDefaults) IPC_STRUCT_TRAITS_MEMBER(bw_model) #endif #if defined(OS_WIN) - IPC_STRUCT_TRAITS_MEMBER(collate_capable) - IPC_STRUCT_TRAITS_MEMBER(collate_default) - IPC_STRUCT_TRAITS_MEMBER(copies_capable) IPC_STRUCT_TRAITS_MEMBER(papers) IPC_STRUCT_TRAITS_MEMBER(default_paper) IPC_STRUCT_TRAITS_MEMBER(dpis) IPC_STRUCT_TRAITS_MEMBER(default_dpi) #endif - IPC_STRUCT_TRAITS_MEMBER(duplex_capable) - IPC_STRUCT_TRAITS_MEMBER(duplex_default) IPC_STRUCT_TRAITS_END() IPC_ENUM_TRAITS(printing::PwgRasterTransformType); diff --git a/chrome/common/cloud_print/cloud_print_cdd_conversion.cc b/chrome/common/cloud_print/cloud_print_cdd_conversion.cc new file mode 100644 index 0000000..549b27d --- /dev/null +++ b/chrome/common/cloud_print/cloud_print_cdd_conversion.cc @@ -0,0 +1,120 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/common/cloud_print/cloud_print_cdd_conversion.h" + +#include "components/cloud_devices/common/printer_description.h" +#include "printing/backend/print_backend.h" + +namespace cloud_print { + +scoped_ptr<base::DictionaryValue> PrinterSemanticCapsAndDefaultsToCdd( + const printing::PrinterSemanticCapsAndDefaults& semantic_info) { + using namespace cloud_devices::printer; + cloud_devices::CloudDeviceDescription description; + + ContentTypesCapability content_types; + content_types.AddOption("application/pdf"); + content_types.SaveTo(&description); + + if (semantic_info.collate_capable) { + CollateCapability collate; + collate.set_default_value(semantic_info.collate_default); + collate.SaveTo(&description); + } + + if (semantic_info.copies_capable) { + CopiesCapability copies; + copies.SaveTo(&description); + } + + if (semantic_info.duplex_capable) { + DuplexCapability duplex; + duplex.AddDefaultOption( + NO_DUPLEX, semantic_info.duplex_default == printing::SIMPLEX); + duplex.AddDefaultOption( + LONG_EDGE, semantic_info.duplex_default == printing::LONG_EDGE); + duplex.AddDefaultOption( + SHORT_EDGE, semantic_info.duplex_default == printing::SHORT_EDGE); + duplex.SaveTo(&description); + } + + ColorCapability color; + if (semantic_info.color_default || semantic_info.color_changeable) { + color.AddDefaultOption(Color(STANDARD_COLOR), semantic_info.color_default); + } + if (!semantic_info.color_default || semantic_info.color_changeable) { + color.AddDefaultOption(Color(STANDARD_MONOCHROME), + !semantic_info.color_default); + } + color.SaveTo(&description); + +#if defined(OS_WIN) + if (!semantic_info.papers.empty()) { + Media default_media(semantic_info.default_paper.name, + semantic_info.default_paper.size_um.width(), + semantic_info.default_paper.size_um.height()); + default_media.MatchBySize(); + + MediaCapability media; + bool is_default_set = false; + for (size_t i = 0; i < semantic_info.papers.size(); ++i) { + gfx::Size paper_size = semantic_info.papers[i].size_um; + if (paper_size.width() > paper_size.height()) + paper_size.SetSize(paper_size.height(), paper_size.width()); + Media new_media(semantic_info.papers[i].name, paper_size.width(), + paper_size.height()); + new_media.MatchBySize(); + if (new_media.IsValid() && !media.Contains(new_media)) { + if (!default_media.IsValid()) + default_media = new_media; + media.AddDefaultOption(new_media, new_media == default_media); + is_default_set = is_default_set || (new_media == default_media); + } + } + if (!is_default_set && default_media.IsValid()) + media.AddDefaultOption(default_media, true); + + if (media.IsValid()) { + media.SaveTo(&description); + } else { + NOTREACHED(); + } + } + + if (!semantic_info.dpis.empty()) { + DpiCapability dpi; + Dpi default_dpi(semantic_info.default_dpi.width(), + semantic_info.default_dpi.height()); + bool is_default_set = false; + for (size_t i = 0; i < semantic_info.dpis.size(); ++i) { + Dpi new_dpi(semantic_info.dpis[i].width(), + semantic_info.dpis[i].height()); + if (new_dpi.IsValid() && !dpi.Contains(new_dpi)) { + if (!default_dpi.IsValid()) + default_dpi = new_dpi; + dpi.AddDefaultOption(new_dpi, new_dpi == default_dpi); + is_default_set = is_default_set || (new_dpi == default_dpi); + } + } + if (!is_default_set && default_dpi.IsValid()) + dpi.AddDefaultOption(default_dpi, true); + if (dpi.IsValid()) { + dpi.SaveTo(&description); + } else { + NOTREACHED(); + } + } +#endif + + OrientationCapability orientation; + orientation.AddDefaultOption(PORTRAIT, true); + orientation.AddOption(LANDSCAPE); + orientation.AddOption(AUTO_ORIENTATION); + orientation.SaveTo(&description); + + return scoped_ptr<base::DictionaryValue>(description.root().DeepCopy()); +} + +} // namespace cloud_print diff --git a/chrome/common/cloud_print/cloud_print_cdd_conversion.h b/chrome/common/cloud_print/cloud_print_cdd_conversion.h new file mode 100644 index 0000000..9600280 --- /dev/null +++ b/chrome/common/cloud_print/cloud_print_cdd_conversion.h @@ -0,0 +1,24 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_COMMON_CLOUD_PRINT_CLOUD_PRINT_CDD_CONVERSION_H_ +#define CHROME_COMMON_CLOUD_PRINT_CLOUD_PRINT_CDD_CONVERSION_H_ + +#include <string> + +#include "base/memory/scoped_ptr.h" +#include "base/values.h" + +namespace printing { +struct PrinterSemanticCapsAndDefaults; +} + +namespace cloud_print { + +scoped_ptr<base::DictionaryValue> PrinterSemanticCapsAndDefaultsToCdd( + const printing::PrinterSemanticCapsAndDefaults& semantic_info); + +} // namespace cloud_print + +#endif // CHROME_COMMON_CLOUD_PRINT_CLOUD_PRINT_CDD_CONVERSION_H_ diff --git a/chrome/service/cloud_print/cdd_conversion_win.cc b/chrome/service/cloud_print/cdd_conversion_win.cc index dab6cd0..bfcb920 100644 --- a/chrome/service/cloud_print/cdd_conversion_win.cc +++ b/chrome/service/cloud_print/cdd_conversion_win.cc @@ -5,7 +5,6 @@ #include "chrome/service/cloud_print/cdd_conversion_win.h" #include "components/cloud_devices/common/printer_description.h" -#include "printing/backend/print_backend.h" #include "printing/backend/win_helper.h" namespace cloud_print { @@ -125,111 +124,4 @@ scoped_ptr<DEVMODE, base::FreeDeleter> CjtToDevMode( return printing::CreateDevMode(printer, dev_mode.get()); } -std::string CapabilitiesToCdd( - const printing::PrinterSemanticCapsAndDefaults& semantic_info) { - using namespace cloud_devices::printer; - cloud_devices::CloudDeviceDescription description; - - ContentTypesCapability content_types; - content_types.AddOption("application/pdf"); - content_types.SaveTo(&description); - - ColorCapability color; - if (semantic_info.color_default || semantic_info.color_changeable) { - color.AddDefaultOption(Color(STANDARD_COLOR), semantic_info.color_default); - } - - if (!semantic_info.color_default || semantic_info.color_changeable) { - color.AddDefaultOption(Color(STANDARD_MONOCHROME), - !semantic_info.color_default); - } - color.SaveTo(&description); - - if (semantic_info.duplex_capable) { - DuplexCapability duplex; - duplex.AddDefaultOption( - NO_DUPLEX, semantic_info.duplex_default == printing::SIMPLEX); - duplex.AddDefaultOption( - LONG_EDGE, semantic_info.duplex_default == printing::LONG_EDGE); - duplex.AddDefaultOption( - SHORT_EDGE, semantic_info.duplex_default == printing::SHORT_EDGE); - duplex.SaveTo(&description); - } - - if (!semantic_info.papers.empty()) { - Media default_media(semantic_info.default_paper.name, - semantic_info.default_paper.size_um.width(), - semantic_info.default_paper.size_um.height()); - default_media.MatchBySize(); - - MediaCapability media; - bool is_default_set = false; - for (size_t i = 0; i < semantic_info.papers.size(); ++i) { - gfx::Size paper_size = semantic_info.papers[i].size_um; - if (paper_size.width() > paper_size.height()) - paper_size.SetSize(paper_size.height(), paper_size.width()); - Media new_media(semantic_info.papers[i].name, paper_size.width(), - paper_size.height()); - new_media.MatchBySize(); - if (new_media.IsValid() && !media.Contains(new_media)) { - if (!default_media.IsValid()) - default_media = new_media; - media.AddDefaultOption(new_media, new_media == default_media); - is_default_set = is_default_set || (new_media == default_media); - } - } - if (!is_default_set && default_media.IsValid()) - media.AddDefaultOption(default_media, true); - - if (media.IsValid()) { - media.SaveTo(&description); - } else { - NOTREACHED(); - } - } - - if (semantic_info.collate_capable) { - CollateCapability collate; - collate.set_default_value(semantic_info.collate_default); - collate.SaveTo(&description); - } - - if (semantic_info.copies_capable) { - CopiesCapability copies; - copies.SaveTo(&description); - } - - if (!semantic_info.dpis.empty()) { - DpiCapability dpi; - Dpi default_dpi(semantic_info.default_dpi.width(), - semantic_info.default_dpi.height()); - bool is_default_set = false; - for (size_t i = 0; i < semantic_info.dpis.size(); ++i) { - Dpi new_dpi(semantic_info.dpis[i].width(), - semantic_info.dpis[i].height()); - if (new_dpi.IsValid() && !dpi.Contains(new_dpi)) { - if (!default_dpi.IsValid()) - default_dpi = new_dpi; - dpi.AddDefaultOption(new_dpi, new_dpi == default_dpi); - is_default_set = is_default_set || (new_dpi == default_dpi); - } - } - if (!is_default_set && default_dpi.IsValid()) - dpi.AddDefaultOption(default_dpi, true); - if (dpi.IsValid()) { - dpi.SaveTo(&description); - } else { - NOTREACHED(); - } - } - - OrientationCapability orientation; - orientation.AddDefaultOption(PORTRAIT, true); - orientation.AddOption(LANDSCAPE); - orientation.AddOption(AUTO_ORIENTATION); - orientation.SaveTo(&description); - - return description.ToString(); -} - } // namespace cloud_print diff --git a/chrome/service/cloud_print/cdd_conversion_win.h b/chrome/service/cloud_print/cdd_conversion_win.h index 8f50fc9..0e9c3db 100644 --- a/chrome/service/cloud_print/cdd_conversion_win.h +++ b/chrome/service/cloud_print/cdd_conversion_win.h @@ -11,10 +11,6 @@ #include "base/memory/scoped_ptr.h" #include "base/strings/string16.h" -namespace printing { -struct PrinterSemanticCapsAndDefaults; -} - namespace cloud_print { bool IsValidCjt(const std::string& print_ticket); @@ -23,9 +19,6 @@ scoped_ptr<DEVMODE, base::FreeDeleter> CjtToDevMode( const base::string16& printer_name, const std::string& print_ticket); -std::string CapabilitiesToCdd( - const printing::PrinterSemanticCapsAndDefaults& semantic_info); - } // namespace cloud_print #endif // CHROME_SERVICE_CLOUD_PRINT_CDD_CONVERSION_WIN_H_ diff --git a/chrome/service/cloud_print/print_system_win.cc b/chrome/service/cloud_print/print_system_win.cc index 98a4e97..34d158f 100644 --- a/chrome/service/cloud_print/print_system_win.cc +++ b/chrome/service/cloud_print/print_system_win.cc @@ -6,6 +6,7 @@ #include "base/command_line.h" #include "base/file_util.h" +#include "base/json/json_writer.h" #include "base/memory/scoped_ptr.h" #include "base/strings/utf_string_conversions.h" #include "base/win/object_watcher.h" @@ -13,6 +14,7 @@ #include "base/win/scoped_comptr.h" #include "base/win/scoped_hdc.h" #include "chrome/common/chrome_switches.h" +#include "chrome/common/cloud_print/cloud_print_cdd_conversion.h" #include "chrome/common/cloud_print/cloud_print_constants.h" #include "chrome/common/crash_keys.h" #include "chrome/service/cloud_print/cdd_conversion_win.h" @@ -565,7 +567,13 @@ class PrinterCapsHandler : public ServiceUtilityProcessHost::Client { printing::PrinterCapsAndDefaults printer_info; if (succeeded) { printer_info.caps_mime_type = kContentTypeJSON; - printer_info.printer_capabilities = CapabilitiesToCdd(semantic_info); + scoped_ptr<base::DictionaryValue> description( + PrinterSemanticCapsAndDefaultsToCdd(semantic_info)); + if (description) { + base::JSONWriter::WriteWithOptions( + description.get(), base::JSONWriter::OPTIONS_PRETTY_PRINT, + &printer_info.printer_capabilities); + } } callback_.Run(succeeded, printer_name, printer_info); callback_.Reset(); diff --git a/chrome/test/data/webui/print_preview.js b/chrome/test/data/webui/print_preview.js index 22f6389..a7d8bdf 100644 --- a/chrome/test/data/webui/print_preview.js +++ b/chrome/test/data/webui/print_preview.js @@ -224,6 +224,40 @@ function checkElementDisplayed(el, isDisplayed) { expectEquals(isDisplayed, !el.hidden); } +function getCddTemplate(printerId) { + return { + "printerId": printerId, + "capabilities": { + "version": "1.0", + "printer": { + "supported_content_type": [{"content_type": "application/pdf"}], + "collate": {}, + "color": { + "option": [ + {"is_default": true, "type": "STANDARD_COLOR"}, + {"type": "STANDARD_MONOCHROME"} + ] + }, + "copies": {}, + "duplex": { + "option": [ + {"is_default": true, "type": "NO_DUPLEX"}, + {"type": "LONG_EDGE"}, + {"type": "SHORT_EDGE"} + ] + }, + "page_orientation": { + "option": [ + {"is_default": true, "type": "PORTRAIT"}, + {"type": "LANDSCAPE"}, + {"type": "AUTO"} + ] + } + } + } + }; +} + // Test that disabled settings hide the disabled sections. TEST_F('PrintPreviewWebUITest', 'TestSectionsDisabled', function() { checkSectionVisible($('layout-settings'), false); @@ -242,14 +276,13 @@ TEST_F('PrintPreviewWebUITest', 'TestSectionsDisabled', function() { var capsSetEvent = new Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); - capsSetEvent.settingsInfo = { - 'printerId': 'FooDevice', - 'disableColorOption': true, - 'setColorAsDefault': true, - 'disableCopiesOption': true, - 'disableLandscapeOption': false, - 'printerDefaultDuplexValue': 0 + capsSetEvent.settingsInfo = getCddTemplate("FooDevice"); + capsSetEvent.settingsInfo.capabilities.printer.color = { + "option": [ + {"is_default": true, "type": "STANDARD_COLOR"} + ] }; + delete capsSetEvent.settingsInfo.capabilities.printer.copies; this.nativeLayer_.dispatchEvent(capsSetEvent); checkSectionVisible($('layout-settings'), true); @@ -321,14 +354,7 @@ TEST_F('PrintPreviewWebUITest', 'SourceIsHTMLHideFitToPageOption', function() { var capsSetEvent = new Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); - capsSetEvent.settingsInfo = { - 'printerId': 'FooDevice', - 'disableColorOption': false, - 'setColorAsDefault': true, - 'disableCopiesOption': true, - 'disableLandscapeOption': true, - 'printerDefaultDuplexValue': 0 - }; + capsSetEvent.settingsInfo = getCddTemplate("FooDevice"); this.nativeLayer_.dispatchEvent(capsSetEvent); checkElementDisplayed( @@ -353,14 +379,7 @@ TEST_F('PrintPreviewWebUITest', 'SourceIsPDFShowFitToPageOption', function() { var capsSetEvent = new Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); - capsSetEvent.settingsInfo = { - 'printerId': 'FooDevice', - 'disableColorOption': false, - 'setColorAsDefault': true, - 'disableCopiesOption': true, - 'disableLandscapeOption': true, - 'printerDefaultDuplexValue': 0 - }; + capsSetEvent.settingsInfo = getCddTemplate("FooDevice"); this.nativeLayer_.dispatchEvent(capsSetEvent); checkElementDisplayed( @@ -388,14 +407,7 @@ TEST_F('PrintPreviewWebUITest', 'PrintScalingDisabledForPlugin', function() { var capsSetEvent = new Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); - capsSetEvent.settingsInfo = { - 'printerId': 'FooDevice', - 'disableColorOption': false, - 'setColorAsDefault': true, - 'disableCopiesOption': true, - 'disableLandscapeOption': true, - 'printerDefaultDuplexValue': 0 - }; + capsSetEvent.settingsInfo = getCddTemplate("FooDevice"); this.nativeLayer_.dispatchEvent(capsSetEvent); // Indicate that the PDF does not support scaling by default. @@ -424,14 +436,7 @@ TEST_F('PrintPreviewWebUITest', 'CustomMarginsControlsCheck', function() { var capsSetEvent = new Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); - capsSetEvent.settingsInfo = { - 'printerId': 'FooDevice', - 'disableColorOption': false, - 'setColorAsDefault': true, - 'disableCopiesOption': true, - 'disableLandscapeOption': true, - 'printerDefaultDuplexValue': 0 - }; + capsSetEvent.settingsInfo = getCddTemplate("FooDevice"); this.nativeLayer_.dispatchEvent(capsSetEvent); printPreview.printTicketStore_.marginsType.updateValue( @@ -462,14 +467,7 @@ TEST_F('PrintPreviewWebUITest', var capsSetEvent = new Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); - capsSetEvent.settingsInfo = { - 'printerId': 'FooDevice', - 'disableColorOption': false, - 'setColorAsDefault': true, - 'disableCopiesOption': true, - 'disableLandscapeOption': true, - 'printerDefaultDuplexValue': 0 - }; + capsSetEvent.settingsInfo = getCddTemplate("FooDevice"); this.nativeLayer_.dispatchEvent(capsSetEvent); checkElementDisplayed( @@ -502,14 +500,7 @@ TEST_F('PrintPreviewWebUITest', var capsSetEvent = new Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); - capsSetEvent.settingsInfo = { - 'printerId': 'FooDevice', - 'disableColorOption': false, - 'setColorAsDefault': true, - 'disableCopiesOption': true, - 'disableLandscapeOption': true, - 'printerDefaultDuplexValue': 0 - }; + capsSetEvent.settingsInfo = getCddTemplate("FooDevice"); this.nativeLayer_.dispatchEvent(capsSetEvent); checkElementDisplayed( @@ -542,14 +533,7 @@ TEST_F('PrintPreviewWebUITest', var capsSetEvent = new Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); - capsSetEvent.settingsInfo = { - 'printerId': 'FooDevice', - 'disableColorOption': false, - 'setColorAsDefault': true, - 'disableCopiesOption': true, - 'disableLandscapeOption': true, - 'printerDefaultDuplexValue': 0 - }; + capsSetEvent.settingsInfo = getCddTemplate("FooDevice"); this.nativeLayer_.dispatchEvent(capsSetEvent); checkElementDisplayed( @@ -583,14 +567,7 @@ TEST_F('PrintPreviewWebUITest', var capsSetEvent = new Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); - capsSetEvent.settingsInfo = { - 'printerId': 'FooDevice', - 'disableColorOption': false, - 'setColorAsDefault': true, - 'disableCopiesOption': true, - 'disableLandscapeOption': true, - 'printerDefaultDuplexValue': 0 - }; + capsSetEvent.settingsInfo = getCddTemplate("FooDevice"); this.nativeLayer_.dispatchEvent(capsSetEvent); checkElementDisplayed( @@ -621,14 +598,7 @@ TEST_F('PrintPreviewWebUITest', 'TestColorSettingsTrue', function() { var capsSetEvent = new Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); - capsSetEvent.settingsInfo = { - 'printerId': 'FooDevice', - 'disableColorOption': false, - 'setColorAsDefault': true, - 'disableCopiesOption': false, - 'disableLandscapeOption': true, - 'printerDefaultDuplexValue': 0 - }; + capsSetEvent.settingsInfo = getCddTemplate("FooDevice"); this.nativeLayer_.dispatchEvent(capsSetEvent); checkSectionVisible($('color-settings'), true); @@ -653,13 +623,11 @@ TEST_F('PrintPreviewWebUITest', 'TestColorSettingsFalse', function() { var capsSetEvent = new Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); - capsSetEvent.settingsInfo = { - 'printerId': 'FooDevice', - 'disableColorOption': true, - 'setColorAsDefault': false, - 'disableCopiesOption': false, - 'disableLandscapeOption': true, - 'printerDefaultDuplexValue': 0 + capsSetEvent.settingsInfo = getCddTemplate("FooDevice"); + capsSetEvent.settingsInfo.capabilities.printer.color = { + "option": [ + {"is_default": true, "type": "STANDARD_MONOCHROME"} + ] }; this.nativeLayer_.dispatchEvent(capsSetEvent); @@ -690,15 +658,7 @@ TEST_F('PrintPreviewWebUITest', 'TestDuplexSettingsTrue', function() { var capsSetEvent = new Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); - capsSetEvent.settingsInfo = { - 'printerId': 'FooDevice', - 'disableColorOption': false, - 'setColorAsDefault': true, - 'disableCopiesOption': false, - 'disableLandscapeOption': true, - 'printerDefaultDuplexValue': 0, - 'setDuplexAsDefault': false - }; + capsSetEvent.settingsInfo = getCddTemplate("FooDevice"); this.nativeLayer_.dispatchEvent(capsSetEvent); checkSectionVisible(otherOptionsDiv, true); @@ -724,15 +684,8 @@ TEST_F('PrintPreviewWebUITest', 'TestDuplexSettingsFalse', function() { var capsSetEvent = new Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); - capsSetEvent.settingsInfo = { - 'printerId': 'FooDevice', - 'disableColorOption': false, - 'setColorAsDefault': true, - 'disableCopiesOption': false, - 'disableLandscapeOption': true, - 'printerDefaultDuplexValue': -1, - 'setDuplexAsDefault': false - }; + capsSetEvent.settingsInfo = getCddTemplate("FooDevice"); + delete capsSetEvent.settingsInfo.capabilities.printer.duplex; this.nativeLayer_.dispatchEvent(capsSetEvent); checkSectionVisible(otherOptionsDiv, true); @@ -754,14 +707,7 @@ TEST_F('PrintPreviewWebUITest', 'TestPrinterChangeUpdatesPreview', function() { var capsSetEvent = new Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); - capsSetEvent.settingsInfo = { - 'printerId': 'FooDevice', - 'disableColorOption': false, - 'setColorAsDefault': true, - 'disableCopiesOption': true, - 'disableLandscapeOption': true, - 'printerDefaultDuplexValue': 0 - }; + capsSetEvent.settingsInfo = getCddTemplate("FooDevice"); this.nativeLayer_.dispatchEvent(capsSetEvent); var previewGenerator = mock(print_preview.PreviewGenerator); @@ -781,13 +727,11 @@ TEST_F('PrintPreviewWebUITest', 'TestPrinterChangeUpdatesPreview', function() { var capsSetEvent = new Event(print_preview.NativeLayer.EventType.CAPABILITIES_SET); - capsSetEvent.settingsInfo = { - 'printerId': 'BarDevice', - 'disableColorOption': true, - 'setColorAsDefault': false, - 'disableCopiesOption': true, - 'disableLandscapeOption': true, - 'printerDefaultDuplexValue': 0 + capsSetEvent.settingsInfo = getCddTemplate("BarDevice"); + capsSetEvent.settingsInfo.capabilities.printer.color = { + "option": [ + {"is_default": true, "type": "STANDARD_MONOCHROME"} + ] }; this.nativeLayer_.dispatchEvent(capsSetEvent); }); diff --git a/printing/backend/cups_helper.cc b/printing/backend/cups_helper.cc index e183841..981a539 100644 --- a/printing/backend/cups_helper.cc +++ b/printing/backend/cups_helper.cc @@ -365,6 +365,10 @@ bool ParsePpdCapabilities( #if !defined(OS_MACOSX) MarkLpOptions(printer_name, &ppd); #endif + caps.collate_capable = true; + caps.collate_default = true; + caps.copies_capable = true; + ppd_choice_t* duplex_choice = ppdFindMarkedChoice(ppd, kDuplex); if (!duplex_choice) { ppd_option_t* option = ppdFindOption(ppd, kDuplex); diff --git a/printing/backend/cups_helper_unittest.cc b/printing/backend/cups_helper_unittest.cc index 7f2b77c..83dc0a1 100644 --- a/printing/backend/cups_helper_unittest.cc +++ b/printing/backend/cups_helper_unittest.cc @@ -33,10 +33,13 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingNoColorDuplexLongEdge) { printing::PrinterSemanticCapsAndDefaults caps; EXPECT_TRUE(printing::ParsePpdCapabilities("test", test_ppd_data, &caps)); - EXPECT_FALSE(caps.color_changeable); - EXPECT_FALSE(caps.color_default); + EXPECT_TRUE(caps.collate_capable); + EXPECT_TRUE(caps.collate_default); + EXPECT_TRUE(caps.copies_capable); EXPECT_TRUE(caps.duplex_capable); EXPECT_EQ(caps.duplex_default, printing::LONG_EDGE); + EXPECT_FALSE(caps.color_changeable); + EXPECT_FALSE(caps.color_default); } // Test duplex detection code, which regressed in http://crbug.com/103999. @@ -58,10 +61,13 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingNoColorDuplexSimples) { printing::PrinterSemanticCapsAndDefaults caps; EXPECT_TRUE(printing::ParsePpdCapabilities("test", test_ppd_data, &caps)); - EXPECT_FALSE(caps.color_changeable); - EXPECT_FALSE(caps.color_default); + EXPECT_TRUE(caps.collate_capable); + EXPECT_TRUE(caps.collate_default); + EXPECT_TRUE(caps.copies_capable); EXPECT_TRUE(caps.duplex_capable); EXPECT_EQ(caps.duplex_default, printing::SIMPLEX); + EXPECT_FALSE(caps.color_changeable); + EXPECT_FALSE(caps.color_default); } TEST(PrintBackendCupsHelperTest, TestPpdParsingNoColorNoDuplex) { @@ -82,10 +88,13 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingNoColorNoDuplex) { printing::PrinterSemanticCapsAndDefaults caps; EXPECT_TRUE(printing::ParsePpdCapabilities("test", test_ppd_data, &caps)); - EXPECT_FALSE(caps.color_changeable); - EXPECT_FALSE(caps.color_default); + EXPECT_TRUE(caps.collate_capable); + EXPECT_TRUE(caps.collate_default); + EXPECT_TRUE(caps.copies_capable); EXPECT_FALSE(caps.duplex_capable); EXPECT_EQ(caps.duplex_default, printing::UNKNOWN_DUPLEX_MODE); + EXPECT_FALSE(caps.color_changeable); + EXPECT_FALSE(caps.color_default); } TEST(PrintBackendCupsHelperTest, TestPpdParsingColorTrueDuplexLongEdge) { @@ -115,10 +124,13 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingColorTrueDuplexLongEdge) { printing::PrinterSemanticCapsAndDefaults caps; EXPECT_TRUE(printing::ParsePpdCapabilities("test", test_ppd_data, &caps)); - EXPECT_TRUE(caps.color_changeable); - EXPECT_TRUE(caps.color_default); + EXPECT_TRUE(caps.collate_capable); + EXPECT_TRUE(caps.collate_default); + EXPECT_TRUE(caps.copies_capable); EXPECT_TRUE(caps.duplex_capable); EXPECT_EQ(caps.duplex_default, printing::LONG_EDGE); + EXPECT_TRUE(caps.color_changeable); + EXPECT_TRUE(caps.color_default); } TEST(PrintBackendCupsHelperTest, TestPpdParsingColorFalseDuplexLongEdge) { @@ -152,8 +164,11 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingColorFalseDuplexLongEdge) { printing::PrinterSemanticCapsAndDefaults caps; EXPECT_TRUE(printing::ParsePpdCapabilities("test", test_ppd_data, &caps)); - EXPECT_TRUE(caps.color_changeable); - EXPECT_FALSE(caps.color_default); + EXPECT_TRUE(caps.collate_capable); + EXPECT_TRUE(caps.collate_default); + EXPECT_TRUE(caps.copies_capable); EXPECT_TRUE(caps.duplex_capable); EXPECT_EQ(caps.duplex_default, printing::LONG_EDGE); + EXPECT_TRUE(caps.color_changeable); + EXPECT_FALSE(caps.color_default); } diff --git a/printing/backend/print_backend.cc b/printing/backend/print_backend.cc index 1ec7146..d071201 100644 --- a/printing/backend/print_backend.cc +++ b/printing/backend/print_backend.cc @@ -13,16 +13,19 @@ PrinterBasicInfo::PrinterBasicInfo() PrinterBasicInfo::~PrinterBasicInfo() {} PrinterSemanticCapsAndDefaults::PrinterSemanticCapsAndDefaults() - : color_changeable(false), - color_default(false), -#if defined (OS_WIN) - collate_capable(false), + : collate_capable(false), collate_default(false), copies_capable(false), -#endif duplex_capable(false), - duplex_default(UNKNOWN_DUPLEX_MODE) { -} + duplex_default(UNKNOWN_DUPLEX_MODE), + color_changeable(false), + color_default(false) +#if defined (OS_POSIX) + , + color_model(UNKNOWN_COLOR_MODEL), + bw_model(UNKNOWN_COLOR_MODEL) +#endif +{} PrinterSemanticCapsAndDefaults::~PrinterSemanticCapsAndDefaults() {} diff --git a/printing/backend/print_backend.h b/printing/backend/print_backend.h index 43a2563..30e4512 100644 --- a/printing/backend/print_backend.h +++ b/printing/backend/print_backend.h @@ -38,20 +38,27 @@ struct PRINTING_EXPORT PrinterSemanticCapsAndDefaults { PrinterSemanticCapsAndDefaults(); ~PrinterSemanticCapsAndDefaults(); + bool collate_capable; + bool collate_default; + + bool copies_capable; + + bool duplex_capable; + DuplexMode duplex_default; + bool color_changeable; bool color_default; -#if defined(USE_CUPS) + // These are CUPS specific data, which soon be removed altogether. They are + // not defined under USE_CUPS to do not pull CUPS dependency into common code. +#if defined(OS_POSIX) + // TODO(alekseys): Resolve color model within printing context, do not expose + // it outside of the context. ColorModel color_model; ColorModel bw_model; #endif #if defined(OS_WIN) - bool collate_capable; - bool collate_default; - - bool copies_capable; - struct Paper { std::string name; gfx::Size size_um; @@ -63,9 +70,6 @@ struct PRINTING_EXPORT PrinterSemanticCapsAndDefaults { std::vector<gfx::Size> dpis; gfx::Size default_dpi; #endif - - bool duplex_capable; - DuplexMode duplex_default; }; struct PRINTING_EXPORT PrinterCapsAndDefaults { |