Skip to content

Commit

Permalink
Generalize printer color model handling, get rid of CUPS specific cas…
Browse files Browse the repository at this point in the history
…e. Enable supported paper szes reporting for all platforms.

BUG=239879
NOTRY=true

Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=275646

Review URL: https://codereview.chromium.org/324523002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@275716 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
alekseys@chromium.org committed Jun 8, 2014
1 parent 3dc75b1 commit 710286a
Show file tree
Hide file tree
Showing 11 changed files with 226 additions and 190 deletions.
16 changes: 5 additions & 11 deletions chrome/browser/resources/print_preview/data/print_ticket_store.js
Original file line number Diff line number Diff line change
Expand Up @@ -376,19 +376,13 @@ cr.define('print_preview', function() {
cjt.print.collate = {collate: this.collate.getValue()};
}
if (this.color.isCapabilityAvailable() && this.color.isUserEdited()) {
var colorType = this.color.getValue() ?
'STANDARD_COLOR' : 'STANDARD_MONOCHROME';
// Find option with this colorType to read its vendor_id.
var selectedOptions = destination.capabilities.printer.color.option.
filter(function(option) {
return option.type == colorType;
});
if (selectedOptions.length == 0) {
var selectedOption = this.color.getSelectedOption();
if (!selectedOption) {
console.error('Could not find correct color option');
} else {
cjt.print.color = {type: colorType};
if (selectedOptions[0].hasOwnProperty('vendor_id')) {
cjt.print.color.vendor_id = selectedOptions[0].vendor_id;
cjt.print.color = {type: selectedOption.type};
if (selectedOption.hasOwnProperty('vendor_id')) {
cjt.print.color.vendor_id = selectedOption.vendor_id;
}
}
}
Expand Down
90 changes: 59 additions & 31 deletions chrome/browser/resources/print_preview/data/ticket_items/color.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,18 @@ cr.define('print_preview.ticket_items', function() {
destinationStore);
};

/*
* @private {!Array.<string>} List of capability types considered color.
* @const
*/
Color.COLOR_TYPES_ = ['STANDARD_COLOR', 'CUSTOM_COLOR'];

/*
* @private {!Array.<string>} List of capability types considered monochrome.
* @const
*/
Color.MONOCHROME_TYPES_ = ['STANDARD_MONOCHROME', 'CUSTOM_MONOCHROME'];

Color.prototype = {
__proto__: print_preview.ticket_items.TicketItem.prototype,

Expand All @@ -33,56 +45,72 @@ cr.define('print_preview.ticket_items', function() {

/** @override */
isCapabilityAvailable: function() {
var colorCap = this.getColorCapability_();
if (!colorCap) {
var capability = this.capability;
if (!capability) {
return false;
}
var hasColor = false;
var hasMonochrome = false;
colorCap.option.forEach(function(option) {
hasColor = hasColor || option.type == 'STANDARD_COLOR';
hasMonochrome = hasMonochrome || option.type == 'STANDARD_MONOCHROME';
capability.option.forEach(function(option) {
hasColor = hasColor || (Color.COLOR_TYPES_.indexOf(option.type) >= 0);
hasMonochrome = hasMonochrome ||
(Color.MONOCHROME_TYPES_.indexOf(option.type) >= 0);
});
return hasColor && hasMonochrome;
},

/** @return {Object} Color capability of the selected destination. */
get capability() {
var dest = this.getSelectedDestInternal();
return (dest &&
dest.capabilities &&
dest.capabilities.printer &&
dest.capabilities.printer.color) ||
null;
},

/** @return {Object} Color option corresponding to the current value. */
getSelectedOption: function() {
var capability = this.capability;
var options = capability ? capability.option : null;
if (options) {
var typesToLookFor =
this.getValue() ? Color.COLOR_TYPES_ : Color.MONOCHROME_TYPES_;
for (var i = 0; i < typesToLookFor.length; i++) {
var matchingOptions = options.filter(function(option) {
return option.type == typesToLookFor[i];
});
if (matchingOptions.length > 0) {
return matchingOptions[0];
}
}
}
return null;
},

/** @override */
getDefaultValueInternal: function() {
var colorCap = this.getColorCapability_();
var defaultOption = this.getDefaultColorOption_(colorCap.option);
return defaultOption && defaultOption.type == 'STANDARD_COLOR';
var capability = this.capability;
var defaultOption = capability ?
this.getDefaultColorOption_(capability.option) : null;
return defaultOption &&
(Color.COLOR_TYPES_.indexOf(defaultOption.type) >= 0);
},

/** @override */
getCapabilityNotAvailableValueInternal: function() {
var colorCap = this.getColorCapability_();
var defaultOption = colorCap ?
this.getDefaultColorOption_(colorCap.option) : null;

// TODO(rltoscano): Get rid of this check based on destination ID. These
// destinations should really update their CDDs to have only one color
// option that has type 'STANDARD_COLOR'.
var dest = this.getSelectedDestInternal();
if (!dest) {
return false;
if (dest) {
if (dest.id == print_preview.Destination.GooglePromotedId.DOCS ||
dest.id == print_preview.Destination.GooglePromotedId.FEDEX ||
dest.type == print_preview.Destination.Type.MOBILE) {
return true;
}
}
return dest.id == print_preview.Destination.GooglePromotedId.DOCS ||
dest.id == print_preview.Destination.GooglePromotedId.FEDEX ||
dest.type == print_preview.Destination.Type.MOBILE ||
defaultOption && defaultOption.type == 'STANDARD_COLOR';
},

/**
* @return {Object} Color capability of the selected destination.
* @private
*/
getColorCapability_: function() {
var dest = this.getSelectedDestInternal();
return (dest &&
dest.capabilities &&
dest.capabilities.printer &&
dest.capabilities.printer.color) ||
null;
return this.getDefaultValueInternal();
},

/**
Expand Down
23 changes: 19 additions & 4 deletions chrome/browser/resources/print_preview/native_layer.js
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,23 @@ cr.define('print_preview', function() {
chrome.send('getPrinterCapabilities', [destinationId]);
},

/**
* @param {!print_preview.Destination} destination Destination to print to.
* @param {!print_preview.ticket_items.Color} color Color ticket item.
* @return {number} Native layer color model.
* @private
*/
getNativeColorModel_: function(destination, color) {
// For non-local printers native color model is ignored anyway.
var option = destination.isLocal ? color.getSelectedOption() : null;
var nativeColorModel = parseInt(option ? option.vendor_id : null);
if (isNaN(nativeColorModel)) {
return color.getValue() ?
NativeLayer.ColorMode_.COLOR : NativeLayer.ColorMode_.GRAY;
}
return nativeColorModel;
},

/**
* Requests that a preview be generated. The following events may be
* dispatched in response:
Expand All @@ -190,8 +207,7 @@ cr.define('print_preview', function() {
'pageRange': printTicketStore.pageRange.getDocumentPageRanges(),
'mediaSize': printTicketStore.mediaSize.getValue(),
'landscape': printTicketStore.landscape.getValue(),
'color': printTicketStore.color.getValue() ?
NativeLayer.ColorMode_.COLOR : NativeLayer.ColorMode_.GRAY,
'color': this.getNativeColorModel_(destination, printTicketStore.color),
'headerFooterEnabled': printTicketStore.headerFooter.getValue(),
'marginsType': printTicketStore.marginsType.getValue(),
'isFirstRequest': requestId == 0,
Expand Down Expand Up @@ -263,8 +279,7 @@ cr.define('print_preview', function() {
'pageRange': printTicketStore.pageRange.getDocumentPageRanges(),
'pageCount': printTicketStore.pageRange.getPageNumberSet().size,
'landscape': printTicketStore.landscape.getValue(),
'color': printTicketStore.color.getValue() ?
NativeLayer.ColorMode_.COLOR : NativeLayer.ColorMode_.GRAY,
'color': this.getNativeColorModel_(destination, printTicketStore.color),
'headerFooterEnabled': printTicketStore.headerFooter.getValue(),
'marginsType': printTicketStore.marginsType.getValue(),
'generateDraftData': true, // TODO(rltoscano): What should this be?
Expand Down
87 changes: 6 additions & 81 deletions chrome/browser/ui/webui/print_preview/print_preview_handler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "base/metrics/histogram.h"
#include "base/path_service.h"
#include "base/prefs/pref_service.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "base/threading/thread.h"
#include "base/threading/thread_restrictions.h"
Expand Down Expand Up @@ -190,10 +191,6 @@ const char kLocalPdfPrinterId[] = "Save as PDF";
// Additional printer capability setting keys.
const char kPrinterId[] = "printerId";
const char kPrinterCapabilities[] = "capabilities";
#if defined(USE_CUPS)
const char kCUPSsColorModel[] = "cupsColorModel";
const char kCUPSsBWModel[] = "cupsBWModel";
#endif

// Get the print job settings dictionary from |args|. The caller takes
// ownership of the returned DictionaryValue. Returns NULL on failure.
Expand Down Expand Up @@ -317,7 +314,11 @@ scoped_ptr<base::DictionaryValue> GetPdfCapabilitiesOnFileThread(
orientation.SaveTo(&description);

ColorCapability color;
color.AddDefaultOption(Color(STANDARD_COLOR), true);
{
Color standard_color(STANDARD_COLOR);
standard_color.vendor_id = base::IntToString(printing::COLOR);
color.AddDefaultOption(standard_color, true);
}
color.SaveTo(&description);

static const cloud_devices::printer::MediaType kPdfMedia[] = {
Expand Down Expand Up @@ -376,11 +377,6 @@ scoped_ptr<base::DictionaryValue> GetLocalPrinterCapabilitiesOnFileThread(
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();
}

Expand Down Expand Up @@ -473,14 +469,6 @@ printing::StickySettings* GetStickySettings() {

} // namespace

#if defined(USE_CUPS)
struct PrintPreviewHandler::CUPSPrinterColorModels {
std::string printer_name;
printing::ColorModel color_model;
printing::ColorModel bw_model;
};
#endif

class PrintPreviewHandler::AccessTokenService
: public OAuth2TokenService::Consumer {
public:
Expand Down Expand Up @@ -880,11 +868,6 @@ void PrintPreviewHandler::HandlePrint(const base::ListValue* args) {
// Reset selection only flag for the same reason.
settings->SetBoolean(printing::kSettingShouldPrintSelectionOnly, false);

#if defined(USE_CUPS)
if (!open_pdf_in_preview) // We can get here even for cloud printers.
ConvertColorSettingToCUPSColorModel(settings.get());
#endif

// Set ID to know whether printing is for preview.
settings->SetInteger(printing::kPreviewUIID,
print_preview_ui->GetIDForPrintPreviewUI());
Expand Down Expand Up @@ -1229,11 +1212,6 @@ void PrintPreviewHandler::SendAccessToken(const std::string& type,
void PrintPreviewHandler::SendPrinterCapabilities(
const base::DictionaryValue* settings_info) {
VLOG(1) << "Get printer capabilities finished";

#if defined(USE_CUPS)
SaveCUPSColorSetting(settings_info);
#endif

web_ui()->CallJavascriptFunction("updateWithPrinterCapabilities",
*settings_info);
}
Expand Down Expand Up @@ -1410,59 +1388,6 @@ bool PrintPreviewHandler::GetPreviewDataAndTitle(
return true;
}

#if defined(USE_CUPS)
void PrintPreviewHandler::SaveCUPSColorSetting(
const base::DictionaryValue* settings) {
cups_printer_color_models_.reset(new CUPSPrinterColorModels);
settings->GetString(kPrinterId, &cups_printer_color_models_->printer_name);
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));
capabilities->GetInteger(
kCUPSsBWModel,
reinterpret_cast<int*>(&cups_printer_color_models_->bw_model));
}

void PrintPreviewHandler::ConvertColorSettingToCUPSColorModel(
base::DictionaryValue* settings) const {
if (!cups_printer_color_models_)
return;

// Sanity check the printer name.
std::string printer_name;
if (!settings->GetString(printing::kSettingDeviceName, &printer_name) ||
printer_name != cups_printer_color_models_->printer_name) {
NOTREACHED();
return;
}

int color;
if (!settings->GetInteger(printing::kSettingColor, &color)) {
NOTREACHED();
return;
}

if (color == printing::GRAY) {
if (cups_printer_color_models_->bw_model != printing::UNKNOWN_COLOR_MODEL) {
settings->SetInteger(printing::kSettingColor,
cups_printer_color_models_->bw_model);
}
return;
}

printing::ColorModel color_model = cups_printer_color_models_->color_model;
if (color_model != printing::UNKNOWN_COLOR_MODEL)
settings->SetInteger(printing::kSettingColor, color_model);
}

#endif // defined(USE_CUPS)

#if defined(ENABLE_SERVICE_DISCOVERY)
void PrintPreviewHandler::LocalPrinterChanged(
bool added,
Expand Down
6 changes: 0 additions & 6 deletions chrome/browser/ui/webui/print_preview/print_preview_handler.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,6 @@ class PrintPreviewHandler

private:
class AccessTokenService;
struct CUPSPrinterColorModels;

static bool PrivetPrintingEnabled();

Expand Down Expand Up @@ -296,11 +295,6 @@ class PrintPreviewHandler
// Holds token service to get OAuth2 access tokens.
scoped_ptr<AccessTokenService> token_service_;

#if defined(USE_CUPS)
// The color capabilities from the last printer queried.
scoped_ptr<CUPSPrinterColorModels> cups_printer_color_models_;
#endif

#if defined(ENABLE_SERVICE_DISCOVERY)
scoped_refptr<local_discovery::ServiceDiscoverySharedClient>
service_discovery_client_;
Expand Down
9 changes: 2 additions & 7 deletions chrome/common/chrome_utility_messages.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,13 @@ IPC_STRUCT_TRAITS_BEGIN(printing::PrinterCapsAndDefaults)
IPC_STRUCT_TRAITS_MEMBER(defaults_mime_type)
IPC_STRUCT_TRAITS_END()

IPC_ENUM_TRAITS(printing::DuplexMode)
IPC_ENUM_TRAITS_MAX_VALUE(printing::ColorModel, printing::PROCESSCOLORMODEL_RGB)
IPC_ENUM_TRAITS_MAX_VALUE(printing::DuplexMode, printing::SHORT_EDGE)

#if defined(OS_WIN)
IPC_STRUCT_TRAITS_BEGIN(printing::PrinterSemanticCapsAndDefaults::Paper)
IPC_STRUCT_TRAITS_MEMBER(name)
IPC_STRUCT_TRAITS_MEMBER(size_um)
IPC_STRUCT_TRAITS_END()
#endif

IPC_STRUCT_TRAITS_BEGIN(printing::PrinterSemanticCapsAndDefaults)
IPC_STRUCT_TRAITS_MEMBER(collate_capable)
Expand All @@ -65,16 +64,12 @@ IPC_STRUCT_TRAITS_BEGIN(printing::PrinterSemanticCapsAndDefaults)
IPC_STRUCT_TRAITS_MEMBER(duplex_default)
IPC_STRUCT_TRAITS_MEMBER(color_changeable)
IPC_STRUCT_TRAITS_MEMBER(color_default)
#if defined(USE_CUPS)
IPC_STRUCT_TRAITS_MEMBER(color_model)
IPC_STRUCT_TRAITS_MEMBER(bw_model)
#endif
#if defined(OS_WIN)
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_END()

IPC_ENUM_TRAITS(printing::PwgRasterTransformType);
Expand Down
Loading

0 comments on commit 710286a

Please sign in to comment.