Chromium Code Reviews| Index: chrome/browser/ui/webui/print_preview/print_preview_handler.cc |
| 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 7b4a5b360f7a14406994af9657e60ba40ff2bef9..37cfcf27017b36158532cfa2bdbe1d9f1f533dd5 100644 |
| --- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc |
| +++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc |
| @@ -6,6 +6,7 @@ |
| #include <ctype.h> |
| +#include <map> |
| #include <string> |
| #include "base/base64.h" |
| @@ -48,7 +49,9 @@ |
| #include "chrome/common/crash_keys.h" |
| #include "chrome/common/pref_names.h" |
| #include "chrome/common/print_messages.h" |
| +#include "components/cloud_devices/common/cloud_device_description.h" |
| #include "components/cloud_devices/common/cloud_devices_urls.h" |
| +#include "components/cloud_devices/common/printer_description.h" |
| #include "components/signin/core/browser/profile_oauth2_token_service.h" |
| #include "components/signin/core/browser/signin_manager.h" |
| #include "components/signin/core/browser/signin_manager_base.h" |
| @@ -66,6 +69,7 @@ |
| #include "printing/metafile_impl.h" |
| #include "printing/pdf_render_settings.h" |
| #include "printing/print_settings.h" |
| +#include "printing/printing_context.h" |
| #include "printing/units.h" |
| #include "third_party/icu/source/i18n/unicode/ulocdata.h" |
| @@ -179,8 +183,12 @@ const char kHidePrintWithSystemDialogLink[] = "hidePrintWithSystemDialogLink"; |
| // Name of a dictionary field holding the state of selection for document. |
| const char kDocumentHasSelection[] = "documentHasSelection"; |
| +// Id of the predefined PDF printer. |
| +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"; |
| @@ -276,6 +284,75 @@ std::string GetDefaultPrinterOnFileThread( |
| return default_printer; |
| } |
| +gfx::Size GetDefaultPdfMediaSizeMicrons() { |
| + scoped_ptr<printing::PrintingContext> printing_context( |
| + printing::PrintingContext::Create( |
| + g_browser_process->GetApplicationLocale())); |
| + if (printing::PrintingContext::OK != printing_context->UsePdfSettings() || |
| + printing_context->settings().device_units_per_inch() <= 0) { |
| + return gfx::Size(); |
| + } |
| + gfx::Size pdf_media_size = printing_context->GetPdfPaperSizeDeviceUnits(); |
| + float deviceMicronsPerDeviceUnit = |
| + (printing::kHundrethsMMPerInch * 10.0f) / |
| + printing_context->settings().device_units_per_inch(); |
| + return gfx::Size(pdf_media_size.width() * deviceMicronsPerDeviceUnit, |
| + pdf_media_size.height() * deviceMicronsPerDeviceUnit); |
| +} |
| + |
| +typedef base::Callback<void(const base::DictionaryValue*)> |
| + GetPdfCapabilitiesCallback; |
| + |
| +const cloud_devices::printer::MediaType PDF_MEDIA[] = { |
| + cloud_devices::printer::ISO_A4, |
| + cloud_devices::printer::ISO_A3, |
| + cloud_devices::printer::NA_LETTER, |
| + cloud_devices::printer::NA_LEGAL, |
| + cloud_devices::printer::NA_LEDGER |
| +}; |
| + |
| +scoped_ptr<base::DictionaryValue> GetPdfCapabilities( |
| + scoped_refptr<printing::PrintBackend> print_backend) { |
| + gfx::Size default_media_size = GetDefaultPdfMediaSizeMicrons(); |
| + |
| + cloud_devices::CloudDeviceDescription description; |
|
Vitaly Buka (NO REVIEWS)
2014/05/22 01:11:21
use namespace cloud_devices::printer;
Aleksey Shlyapnikov
2014/05/22 03:51:18
Done.
|
| + |
| + cloud_devices::printer::OrientationCapability orientation; |
| + orientation.AddOption(cloud_devices::printer::PORTRAIT); |
| + orientation.AddOption(cloud_devices::printer::LANDSCAPE); |
| + orientation.AddDefaultOption(cloud_devices::printer::AUTO_ORIENTATION, true); |
| + orientation.SaveTo(&description); |
| + |
| + cloud_devices::printer::ColorCapability color; |
| + color.AddDefaultOption(cloud_devices::printer::Color( |
| + cloud_devices::printer::STANDARD_COLOR), true); |
| + color.SaveTo(&description); |
| + |
| + cloud_devices::printer::Media default_media_option( |
| + "", default_media_size.width(), default_media_size.height()); |
| + if (!default_media_option.MatchBySize() || |
| + std::find(PDF_MEDIA, |
| + PDF_MEDIA + arraysize(PDF_MEDIA), |
| + default_media_option.type) == |
| + PDF_MEDIA + arraysize(PDF_MEDIA)) { |
| + default_media_option = cloud_devices::printer::Media( |
| + g_browser_process->GetApplicationLocale() == "en-US" ? |
| + cloud_devices::printer::NA_LETTER : cloud_devices::printer::ISO_A4); |
| + default_media_option.MatchByType(); |
| + } |
| + cloud_devices::printer::MediaCapability media; |
| + for (size_t i = 0; i < arraysize(PDF_MEDIA); ++i) { |
| + cloud_devices::printer::Media media_option(PDF_MEDIA[i]); |
| + if (media_option.MatchByType()) { |
| + media.AddDefaultOption(media_option, |
| + default_media_option.type == media_option.type); |
| + } |
| + } |
| + media.SaveTo(&description); |
| + |
| + return description.release(); |
|
Vitaly Buka (NO REVIEWS)
2014/05/22 01:11:21
return description.Pass();
Aleksey Shlyapnikov
2014/05/22 03:51:18
Done.
|
| +} |
| + |
| void EnumeratePrintersOnFileThread( |
| scoped_refptr<printing::PrintBackend> print_backend, |
| base::ListValue* printers) { |
| @@ -336,6 +413,18 @@ 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, |
| + GetPdfCapabilities(print_backend).release()); |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, FROM_HERE, |
| + base::Bind(success_cb, base::Owned(printer_info.release()))); |
| + return; |
| + } |
| + |
| VLOG(1) << "Get printer capabilities start for " << printer_name; |
| crash_keys::ScopedPrinterInfo crash_key( |
| print_backend->GetPrinterDriverInfo(printer_name)); |