| 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..b1c37ad87dc483737770f8f229cd36732f2098a4 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";
|
| @@ -267,20 +275,86 @@ void PrintToPdfCallback(printing::Metafile* metafile,
|
| BrowserThread::DeleteSoon(BrowserThread::UI, FROM_HERE, metafile);
|
| }
|
|
|
| -std::string GetDefaultPrinterOnFileThread(
|
| - scoped_refptr<printing::PrintBackend> print_backend) {
|
| +std::string GetDefaultPrinterOnFileThread() {
|
| DCHECK_CURRENTLY_ON(BrowserThread::FILE);
|
|
|
| + scoped_refptr<printing::PrintBackend> print_backend(
|
| + printing::PrintBackend::CreateInstance(NULL));
|
| +
|
| std::string default_printer = print_backend->GetDefaultPrinterName();
|
| VLOG(1) << "Default Printer: " << default_printer;
|
| return default_printer;
|
| }
|
|
|
| -void EnumeratePrintersOnFileThread(
|
| - scoped_refptr<printing::PrintBackend> print_backend,
|
| - base::ListValue* printers) {
|
| +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;
|
| +
|
| +scoped_ptr<base::DictionaryValue> GetPdfCapabilitiesOnFileThread(
|
| + const std::string& locale) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::FILE);
|
|
|
| + cloud_devices::CloudDeviceDescription description;
|
| + using namespace cloud_devices::printer;
|
| +
|
| + OrientationCapability orientation;
|
| + orientation.AddOption(cloud_devices::printer::PORTRAIT);
|
| + orientation.AddOption(cloud_devices::printer::LANDSCAPE);
|
| + orientation.AddDefaultOption(AUTO_ORIENTATION, true);
|
| + orientation.SaveTo(&description);
|
| +
|
| + ColorCapability color;
|
| + color.AddDefaultOption(Color(STANDARD_COLOR), true);
|
| + color.SaveTo(&description);
|
| +
|
| + static const cloud_devices::printer::MediaType kPdfMedia[] = {
|
| + ISO_A4,
|
| + ISO_A3,
|
| + NA_LETTER,
|
| + NA_LEGAL,
|
| + NA_LEDGER
|
| + };
|
| + const gfx::Size default_media_size = GetDefaultPdfMediaSizeMicrons();
|
| + Media default_media(
|
| + "", default_media_size.width(), default_media_size.height());
|
| + if (!default_media.MatchBySize() ||
|
| + std::find(kPdfMedia,
|
| + kPdfMedia + arraysize(kPdfMedia),
|
| + default_media.type) == kPdfMedia + arraysize(kPdfMedia)) {
|
| + default_media = Media(locale == "en-US" ? NA_LETTER : ISO_A4);
|
| + }
|
| + MediaCapability media;
|
| + for (size_t i = 0; i < arraysize(kPdfMedia); ++i) {
|
| + Media media_option(kPdfMedia[i]);
|
| + media.AddDefaultOption(media_option,
|
| + default_media.type == media_option.type);
|
| + }
|
| + media.SaveTo(&description);
|
| +
|
| + return scoped_ptr<base::DictionaryValue>(description.root().DeepCopy());
|
| +}
|
| +
|
| +void EnumeratePrintersOnFileThread(base::ListValue* printers) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::FILE);
|
| +
|
| + scoped_refptr<printing::PrintBackend> print_backend(
|
| + printing::PrintBackend::CreateInstance(NULL));
|
| +
|
| VLOG(1) << "Enumerate printers start";
|
| printing::PrinterList printer_list;
|
| print_backend->EnumeratePrinters(&printer_list);
|
| @@ -329,13 +403,28 @@ typedef base::Callback<void(const std::string&)>
|
| GetPrinterCapabilitiesFailureCallback;
|
|
|
| void GetPrinterCapabilitiesOnFileThread(
|
| - scoped_refptr<printing::PrintBackend> print_backend,
|
| const std::string& printer_name,
|
| + const std::string& locale,
|
| const GetPrinterCapabilitiesSuccessCallback& success_cb,
|
| const GetPrinterCapabilitiesFailureCallback& failure_cb) {
|
| 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));
|
| @@ -367,7 +456,7 @@ void GetPrinterCapabilitiesOnFileThread(
|
| #endif
|
|
|
| // TODO(gene): Make new capabilities format for Print Preview
|
| - // that will suit semantic capabiltities better.
|
| + // that will suit semantic capabilities better.
|
| // Refactor pld API code below
|
| bool default_duplex = info.duplex_capable ?
|
| (info.duplex_default != printing::SIMPLEX) : false;
|
| @@ -475,8 +564,7 @@ class PrintPreviewHandler::AccessTokenService
|
| };
|
|
|
| PrintPreviewHandler::PrintPreviewHandler()
|
| - : print_backend_(printing::PrintBackend::CreateInstance(NULL)),
|
| - regenerate_preview_request_count_(0),
|
| + : regenerate_preview_request_count_(0),
|
| manage_printers_dialog_request_count_(0),
|
| manage_cloud_printers_dialog_request_count_(0),
|
| reported_failed_preview_(false),
|
| @@ -570,7 +658,7 @@ void PrintPreviewHandler::HandleGetPrinters(const base::ListValue* /*args*/) {
|
| base::ListValue* results = new base::ListValue;
|
| BrowserThread::PostTaskAndReply(
|
| BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&EnumeratePrintersOnFileThread, print_backend_,
|
| + base::Bind(&EnumeratePrintersOnFileThread,
|
| base::Unretained(results)),
|
| base::Bind(&PrintPreviewHandler::SetupPrinterList,
|
| weak_factory_.GetWeakPtr(),
|
| @@ -886,10 +974,11 @@ void PrintPreviewHandler::HandleGetPrinterCapabilities(
|
| GetPrinterCapabilitiesFailureCallback failure_cb =
|
| base::Bind(&PrintPreviewHandler::SendFailedToGetPrinterCapabilities,
|
| weak_factory_.GetWeakPtr());
|
| - BrowserThread::PostTask(
|
| - BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&GetPrinterCapabilitiesOnFileThread,
|
| - print_backend_, printer_name, success_cb, failure_cb));
|
| + BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
|
| + base::Bind(&GetPrinterCapabilitiesOnFileThread,
|
| + printer_name,
|
| + g_browser_process->GetApplicationLocale(),
|
| + success_cb, failure_cb));
|
| }
|
|
|
| void PrintPreviewHandler::OnSigninComplete() {
|
| @@ -1041,7 +1130,7 @@ void PrintPreviewHandler::HandleGetInitialSettings(
|
| SendCloudPrintEnabled();
|
| BrowserThread::PostTaskAndReplyWithResult(
|
| BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&GetDefaultPrinterOnFileThread, print_backend_),
|
| + base::Bind(&GetDefaultPrinterOnFileThread),
|
| base::Bind(&PrintPreviewHandler::SendInitialSettings,
|
| weak_factory_.GetWeakPtr()));
|
| }
|
|
|