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..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()); |