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

Unified Diff: chrome/browser/ui/webui/print_preview/print_preview_handler.cc

Issue 294923005: Add media size capability to PDF printer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 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/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..856ff01aba2f1b197a84905ed4387cce76810559 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"
@@ -64,8 +65,10 @@
#include "printing/backend/print_backend_consts.h"
#include "printing/metafile.h"
#include "printing/metafile_impl.h"
+#include "printing/page_range.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"
@@ -276,6 +279,115 @@ std::string GetDefaultPrinterOnFileThread(
return default_printer;
}
+gfx::Size GetDefaultPdfMediaSizeMicrons() {
+ scoped_ptr<printing::PrintingContext> printing_context(
+ printing::PrintingContext::Create(
+ g_browser_process->GetApplicationLocale()));
+ scoped_ptr<base::DictionaryValue> pdf_settings(new base::DictionaryValue);
+ pdf_settings->SetBoolean(printing::kSettingHeaderFooterEnabled, false);
+ pdf_settings->SetBoolean(printing::kSettingShouldPrintBackgrounds, false);
+ pdf_settings->SetBoolean(printing::kSettingShouldPrintSelectionOnly, false);
+ pdf_settings->SetInteger(printing::kSettingMarginsType, printing::NO_MARGINS);
+ pdf_settings->SetBoolean(printing::kSettingCollate, true);
+ pdf_settings->SetInteger(printing::kSettingCopies, 1);
+ pdf_settings->SetInteger(printing::kSettingColor, printing::COLOR);
+ pdf_settings->SetInteger(printing::kSettingDuplexMode, printing::SIMPLEX);
+ pdf_settings->SetBoolean(printing::kSettingLandscape, false);
Vitaly Buka (NO REVIEWS) 2014/05/20 23:53:02 move to context
Aleksey Shlyapnikov 2014/05/22 00:08:14 Done.
+ pdf_settings->SetString(printing::kSettingDeviceName, "");
+ pdf_settings->SetBoolean(printing::kSettingPrintToPDF, true);
+ pdf_settings->SetBoolean(printing::kSettingCloudPrintDialog, false);
+ pdf_settings->SetBoolean(printing::kSettingPrintWithPrivet, false);
+
+ printing::PrintingContext::Result result =
+ printing_context->UpdatePrintSettings(*pdf_settings,
+ printing::PageRanges());
+ if (printing::PrintingContext::OK != result ||
+ 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 struct {
+ int width_microns;
+ int height_microns;
+ const char* name;
+} PDF_MEDIA_SIZE[] = {
+ {
+ 209900, /*x*/ 297000,
+ "ISO_A4"
+ },
+ {
+ 297000, /*x*/ 420000,
+ "ISO_A3"
+ },
+ {
+ 215900, /*x*/ 279400,
+ "NA_LETTER"
+ },
+ {
+ 215900, /*x*/ 355600,
+ "NA_LEGAL"
+ },
+ {
+ 279400, /*x*/ 431800,
+ "NA_LEDGER"
+ }
+};
+
+void GetPdfCapabilitiesOnFileThread(
+ scoped_refptr<printing::PrintBackend> print_backend,
+ const GetPdfCapabilitiesCallback& capabilities_cb) {
+ DCHECK_CURRENTLY_ON(BrowserThread::FILE);
+
+ gfx::Size default_media_size = GetDefaultPdfMediaSizeMicrons();
+
+ // Create a list of media.
+ scoped_ptr<base::ListValue> media_size_option(new base::ListValue);
+
+ base::DictionaryValue* default_media_item = 0;
+ int max_diff = default_media_size.width() + default_media_size.height();
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(PDF_MEDIA_SIZE); ++i) {
+ scoped_ptr<base::DictionaryValue> media_item(new base::DictionaryValue);
+ media_item->SetInteger("width_microns", PDF_MEDIA_SIZE[i].width_microns);
+ media_item->SetInteger("height_microns", PDF_MEDIA_SIZE[i].height_microns);
+ media_item->SetString("name", PDF_MEDIA_SIZE[i].name);
+ int diff =
+ abs(default_media_size.width() - PDF_MEDIA_SIZE[i].width_microns) +
+ abs(default_media_size.height() - PDF_MEDIA_SIZE[i].height_microns);
+ if (max_diff >= diff) {
Vitaly Buka (NO REVIEWS) 2014/05/20 23:53:02 TEST(PrinterDescriptionTest, CddSetAll)
Aleksey Shlyapnikov 2014/05/22 00:08:14 Done.
+ max_diff = diff;
+ default_media_item = media_item.get();
+ }
+ media_size_option->Append(media_item.release());
+ }
+ if (!default_media_item) {
+ media_size_option->GetDictionary(0, &default_media_item);
+ }
+ default_media_item->SetBoolean("is_default", true);
+
+ scoped_ptr<base::DictionaryValue> media_size(new base::DictionaryValue);
+ media_size->Set("option", media_size_option.release());
+
+ scoped_ptr<base::DictionaryValue> printer(new base::DictionaryValue);
+ printer->Set("media_size", media_size.release());
+
+ scoped_ptr<base::DictionaryValue> capabilities(new base::DictionaryValue);
+ capabilities->Set("printer", printer.release());
+
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(capabilities_cb, base::Owned(capabilities.release())));
+}
+
void EnumeratePrintersOnFileThread(
scoped_refptr<printing::PrintBackend> print_backend,
base::ListValue* printers) {
@@ -533,6 +645,9 @@ void PrintPreviewHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback("getInitialSettings",
base::Bind(&PrintPreviewHandler::HandleGetInitialSettings,
base::Unretained(this)));
+ web_ui()->RegisterMessageCallback("getPdfCapabilities",
+ base::Bind(&PrintPreviewHandler::HandleGetPdfCapabilities,
+ base::Unretained(this)));
web_ui()->RegisterMessageCallback("reportUiEvent",
base::Bind(&PrintPreviewHandler::HandleReportUiEvent,
base::Unretained(this)));
@@ -1046,6 +1161,17 @@ void PrintPreviewHandler::HandleGetInitialSettings(
weak_factory_.GetWeakPtr()));
}
+void PrintPreviewHandler::HandleGetPdfCapabilities(
+ const base::ListValue* /*args*/) {
+ GetPdfCapabilitiesCallback capabilities_cb =
+ base::Bind(&PrintPreviewHandler::SendPdfCapabilities,
+ weak_factory_.GetWeakPtr());
+ BrowserThread::PostTask(
+ BrowserThread::FILE, FROM_HERE,
+ base::Bind(&GetPdfCapabilitiesOnFileThread,
+ print_backend_, capabilities_cb));
+}
+
void PrintPreviewHandler::HandleReportUiEvent(const base::ListValue* args) {
int event_group, event_number;
if (!args->GetInteger(0, &event_group) || !args->GetInteger(1, &event_number))
@@ -1128,6 +1254,11 @@ void PrintPreviewHandler::SendInitialSettings(
web_ui()->CallJavascriptFunction("setInitialSettings", initial_settings);
}
+void PrintPreviewHandler::SendPdfCapabilities(
+ const base::DictionaryValue* capabilities) {
+ web_ui()->CallJavascriptFunction("setPdfCapabilities", *capabilities);
+}
+
void PrintPreviewHandler::ClosePreviewDialog() {
PrintPreviewUI* print_preview_ui =
static_cast<PrintPreviewUI*>(web_ui()->GetController());

Powered by Google App Engine
This is Rietveld 408576698