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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/webui/print_preview/print_preview_handler.h" 5 #include "chrome/browser/ui/webui/print_preview/print_preview_handler.h"
6 6
7 #include <ctype.h> 7 #include <ctype.h>
8 8
9 #include <map>
9 #include <string> 10 #include <string>
10 11
11 #include "base/base64.h" 12 #include "base/base64.h"
12 #include "base/bind.h" 13 #include "base/bind.h"
13 #include "base/bind_helpers.h" 14 #include "base/bind_helpers.h"
14 #include "base/command_line.h" 15 #include "base/command_line.h"
15 #include "base/i18n/file_util_icu.h" 16 #include "base/i18n/file_util_icu.h"
16 #include "base/i18n/number_formatting.h" 17 #include "base/i18n/number_formatting.h"
17 #include "base/json/json_reader.h" 18 #include "base/json/json_reader.h"
18 #include "base/lazy_instance.h" 19 #include "base/lazy_instance.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 #include "content/public/browser/navigation_controller.h" 58 #include "content/public/browser/navigation_controller.h"
58 #include "content/public/browser/navigation_entry.h" 59 #include "content/public/browser/navigation_entry.h"
59 #include "content/public/browser/render_view_host.h" 60 #include "content/public/browser/render_view_host.h"
60 #include "content/public/browser/web_contents.h" 61 #include "content/public/browser/web_contents.h"
61 #include "content/public/browser/web_ui.h" 62 #include "content/public/browser/web_ui.h"
62 #include "google_apis/gaia/oauth2_token_service.h" 63 #include "google_apis/gaia/oauth2_token_service.h"
63 #include "printing/backend/print_backend.h" 64 #include "printing/backend/print_backend.h"
64 #include "printing/backend/print_backend_consts.h" 65 #include "printing/backend/print_backend_consts.h"
65 #include "printing/metafile.h" 66 #include "printing/metafile.h"
66 #include "printing/metafile_impl.h" 67 #include "printing/metafile_impl.h"
68 #include "printing/page_range.h"
67 #include "printing/pdf_render_settings.h" 69 #include "printing/pdf_render_settings.h"
68 #include "printing/print_settings.h" 70 #include "printing/print_settings.h"
71 #include "printing/printing_context.h"
69 #include "printing/units.h" 72 #include "printing/units.h"
70 #include "third_party/icu/source/i18n/unicode/ulocdata.h" 73 #include "third_party/icu/source/i18n/unicode/ulocdata.h"
71 74
72 #if defined(OS_CHROMEOS) 75 #if defined(OS_CHROMEOS)
73 #include "chrome/browser/chromeos/settings/device_oauth2_token_service.h" 76 #include "chrome/browser/chromeos/settings/device_oauth2_token_service.h"
74 #include "chrome/browser/chromeos/settings/device_oauth2_token_service_factory.h " 77 #include "chrome/browser/chromeos/settings/device_oauth2_token_service_factory.h "
75 #endif 78 #endif
76 79
77 #if defined(ENABLE_SERVICE_DISCOVERY) 80 #if defined(ENABLE_SERVICE_DISCOVERY)
78 #include "chrome/browser/local_discovery/privet_constants.h" 81 #include "chrome/browser/local_discovery/privet_constants.h"
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 272
270 std::string GetDefaultPrinterOnFileThread( 273 std::string GetDefaultPrinterOnFileThread(
271 scoped_refptr<printing::PrintBackend> print_backend) { 274 scoped_refptr<printing::PrintBackend> print_backend) {
272 DCHECK_CURRENTLY_ON(BrowserThread::FILE); 275 DCHECK_CURRENTLY_ON(BrowserThread::FILE);
273 276
274 std::string default_printer = print_backend->GetDefaultPrinterName(); 277 std::string default_printer = print_backend->GetDefaultPrinterName();
275 VLOG(1) << "Default Printer: " << default_printer; 278 VLOG(1) << "Default Printer: " << default_printer;
276 return default_printer; 279 return default_printer;
277 } 280 }
278 281
282 gfx::Size GetDefaultPdfMediaSizeMicrons() {
283 scoped_ptr<printing::PrintingContext> printing_context(
284 printing::PrintingContext::Create(
285 g_browser_process->GetApplicationLocale()));
286 scoped_ptr<base::DictionaryValue> pdf_settings(new base::DictionaryValue);
287 pdf_settings->SetBoolean(printing::kSettingHeaderFooterEnabled, false);
288 pdf_settings->SetBoolean(printing::kSettingShouldPrintBackgrounds, false);
289 pdf_settings->SetBoolean(printing::kSettingShouldPrintSelectionOnly, false);
290 pdf_settings->SetInteger(printing::kSettingMarginsType, printing::NO_MARGINS);
291 pdf_settings->SetBoolean(printing::kSettingCollate, true);
292 pdf_settings->SetInteger(printing::kSettingCopies, 1);
293 pdf_settings->SetInteger(printing::kSettingColor, printing::COLOR);
294 pdf_settings->SetInteger(printing::kSettingDuplexMode, printing::SIMPLEX);
295 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.
296 pdf_settings->SetString(printing::kSettingDeviceName, "");
297 pdf_settings->SetBoolean(printing::kSettingPrintToPDF, true);
298 pdf_settings->SetBoolean(printing::kSettingCloudPrintDialog, false);
299 pdf_settings->SetBoolean(printing::kSettingPrintWithPrivet, false);
300
301 printing::PrintingContext::Result result =
302 printing_context->UpdatePrintSettings(*pdf_settings,
303 printing::PageRanges());
304 if (printing::PrintingContext::OK != result ||
305 printing_context->settings().device_units_per_inch() <= 0) {
306 return gfx::Size();
307 }
308 gfx::Size pdf_media_size = printing_context->GetPdfPaperSizeDeviceUnits();
309 float deviceMicronsPerDeviceUnit =
310 (printing::kHundrethsMMPerInch * 10.0f) /
311 printing_context->settings().device_units_per_inch();
312 return gfx::Size(pdf_media_size.width() * deviceMicronsPerDeviceUnit,
313 pdf_media_size.height() * deviceMicronsPerDeviceUnit);
314 }
315
316 typedef base::Callback<void(const base::DictionaryValue*)>
317 GetPdfCapabilitiesCallback;
318
319 const struct {
320 int width_microns;
321 int height_microns;
322 const char* name;
323 } PDF_MEDIA_SIZE[] = {
324 {
325 209900, /*x*/ 297000,
326 "ISO_A4"
327 },
328 {
329 297000, /*x*/ 420000,
330 "ISO_A3"
331 },
332 {
333 215900, /*x*/ 279400,
334 "NA_LETTER"
335 },
336 {
337 215900, /*x*/ 355600,
338 "NA_LEGAL"
339 },
340 {
341 279400, /*x*/ 431800,
342 "NA_LEDGER"
343 }
344 };
345
346 void GetPdfCapabilitiesOnFileThread(
347 scoped_refptr<printing::PrintBackend> print_backend,
348 const GetPdfCapabilitiesCallback& capabilities_cb) {
349 DCHECK_CURRENTLY_ON(BrowserThread::FILE);
350
351 gfx::Size default_media_size = GetDefaultPdfMediaSizeMicrons();
352
353 // Create a list of media.
354 scoped_ptr<base::ListValue> media_size_option(new base::ListValue);
355
356 base::DictionaryValue* default_media_item = 0;
357 int max_diff = default_media_size.width() + default_media_size.height();
358 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(PDF_MEDIA_SIZE); ++i) {
359 scoped_ptr<base::DictionaryValue> media_item(new base::DictionaryValue);
360 media_item->SetInteger("width_microns", PDF_MEDIA_SIZE[i].width_microns);
361 media_item->SetInteger("height_microns", PDF_MEDIA_SIZE[i].height_microns);
362 media_item->SetString("name", PDF_MEDIA_SIZE[i].name);
363 int diff =
364 abs(default_media_size.width() - PDF_MEDIA_SIZE[i].width_microns) +
365 abs(default_media_size.height() - PDF_MEDIA_SIZE[i].height_microns);
366 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.
367 max_diff = diff;
368 default_media_item = media_item.get();
369 }
370 media_size_option->Append(media_item.release());
371 }
372 if (!default_media_item) {
373 media_size_option->GetDictionary(0, &default_media_item);
374 }
375 default_media_item->SetBoolean("is_default", true);
376
377 scoped_ptr<base::DictionaryValue> media_size(new base::DictionaryValue);
378 media_size->Set("option", media_size_option.release());
379
380 scoped_ptr<base::DictionaryValue> printer(new base::DictionaryValue);
381 printer->Set("media_size", media_size.release());
382
383 scoped_ptr<base::DictionaryValue> capabilities(new base::DictionaryValue);
384 capabilities->Set("printer", printer.release());
385
386 BrowserThread::PostTask(
387 BrowserThread::UI, FROM_HERE,
388 base::Bind(capabilities_cb, base::Owned(capabilities.release())));
389 }
390
279 void EnumeratePrintersOnFileThread( 391 void EnumeratePrintersOnFileThread(
280 scoped_refptr<printing::PrintBackend> print_backend, 392 scoped_refptr<printing::PrintBackend> print_backend,
281 base::ListValue* printers) { 393 base::ListValue* printers) {
282 DCHECK_CURRENTLY_ON(BrowserThread::FILE); 394 DCHECK_CURRENTLY_ON(BrowserThread::FILE);
283 395
284 VLOG(1) << "Enumerate printers start"; 396 VLOG(1) << "Enumerate printers start";
285 printing::PrinterList printer_list; 397 printing::PrinterList printer_list;
286 print_backend->EnumeratePrinters(&printer_list); 398 print_backend->EnumeratePrinters(&printer_list);
287 399
288 for (printing::PrinterList::iterator it = printer_list.begin(); 400 for (printing::PrinterList::iterator it = printer_list.begin();
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 typedef base::Callback<void(const base::DictionaryValue*)> 438 typedef base::Callback<void(const base::DictionaryValue*)>
327 GetPrinterCapabilitiesSuccessCallback; 439 GetPrinterCapabilitiesSuccessCallback;
328 typedef base::Callback<void(const std::string&)> 440 typedef base::Callback<void(const std::string&)>
329 GetPrinterCapabilitiesFailureCallback; 441 GetPrinterCapabilitiesFailureCallback;
330 442
331 void GetPrinterCapabilitiesOnFileThread( 443 void GetPrinterCapabilitiesOnFileThread(
332 scoped_refptr<printing::PrintBackend> print_backend, 444 scoped_refptr<printing::PrintBackend> print_backend,
333 const std::string& printer_name, 445 const std::string& printer_name,
334 const GetPrinterCapabilitiesSuccessCallback& success_cb, 446 const GetPrinterCapabilitiesSuccessCallback& success_cb,
335 const GetPrinterCapabilitiesFailureCallback& failure_cb) { 447 const GetPrinterCapabilitiesFailureCallback& failure_cb) {
336 DCHECK_CURRENTLY_ON(BrowserThread::FILE); 448 DCHECK_CURRENTLY_ON(BrowserThread::FILE);
Vitaly Buka (NO REVIEWS) 2014/05/20 23:53:02 calculate here?
Aleksey Shlyapnikov 2014/05/22 00:08:14 Done.
337 DCHECK(!printer_name.empty()); 449 DCHECK(!printer_name.empty());
338 450
339 VLOG(1) << "Get printer capabilities start for " << printer_name; 451 VLOG(1) << "Get printer capabilities start for " << printer_name;
340 crash_keys::ScopedPrinterInfo crash_key( 452 crash_keys::ScopedPrinterInfo crash_key(
341 print_backend->GetPrinterDriverInfo(printer_name)); 453 print_backend->GetPrinterDriverInfo(printer_name));
342 454
343 if (!print_backend->IsValidPrinter(printer_name)) { 455 if (!print_backend->IsValidPrinter(printer_name)) {
344 // TODO(gene): Notify explicitly if printer is not valid, instead of 456 // TODO(gene): Notify explicitly if printer is not valid, instead of
345 // failed to get capabilities. 457 // failed to get capabilities.
346 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 458 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
526 base::Unretained(this))); 638 base::Unretained(this)));
527 web_ui()->RegisterMessageCallback("cancelPendingPrintRequest", 639 web_ui()->RegisterMessageCallback("cancelPendingPrintRequest",
528 base::Bind(&PrintPreviewHandler::HandleCancelPendingPrintRequest, 640 base::Bind(&PrintPreviewHandler::HandleCancelPendingPrintRequest,
529 base::Unretained(this))); 641 base::Unretained(this)));
530 web_ui()->RegisterMessageCallback("saveAppState", 642 web_ui()->RegisterMessageCallback("saveAppState",
531 base::Bind(&PrintPreviewHandler::HandleSaveAppState, 643 base::Bind(&PrintPreviewHandler::HandleSaveAppState,
532 base::Unretained(this))); 644 base::Unretained(this)));
533 web_ui()->RegisterMessageCallback("getInitialSettings", 645 web_ui()->RegisterMessageCallback("getInitialSettings",
534 base::Bind(&PrintPreviewHandler::HandleGetInitialSettings, 646 base::Bind(&PrintPreviewHandler::HandleGetInitialSettings,
535 base::Unretained(this))); 647 base::Unretained(this)));
648 web_ui()->RegisterMessageCallback("getPdfCapabilities",
649 base::Bind(&PrintPreviewHandler::HandleGetPdfCapabilities,
650 base::Unretained(this)));
536 web_ui()->RegisterMessageCallback("reportUiEvent", 651 web_ui()->RegisterMessageCallback("reportUiEvent",
537 base::Bind(&PrintPreviewHandler::HandleReportUiEvent, 652 base::Bind(&PrintPreviewHandler::HandleReportUiEvent,
538 base::Unretained(this))); 653 base::Unretained(this)));
539 web_ui()->RegisterMessageCallback("printWithCloudPrintDialog", 654 web_ui()->RegisterMessageCallback("printWithCloudPrintDialog",
540 base::Bind(&PrintPreviewHandler::HandlePrintWithCloudPrintDialog, 655 base::Bind(&PrintPreviewHandler::HandlePrintWithCloudPrintDialog,
541 base::Unretained(this))); 656 base::Unretained(this)));
542 web_ui()->RegisterMessageCallback("forceOpenNewTab", 657 web_ui()->RegisterMessageCallback("forceOpenNewTab",
543 base::Bind(&PrintPreviewHandler::HandleForceOpenNewTab, 658 base::Bind(&PrintPreviewHandler::HandleForceOpenNewTab,
544 base::Unretained(this))); 659 base::Unretained(this)));
545 web_ui()->RegisterMessageCallback("getPrivetPrinters", 660 web_ui()->RegisterMessageCallback("getPrivetPrinters",
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after
1039 const base::ListValue* /*args*/) { 1154 const base::ListValue* /*args*/) {
1040 // Send before SendInitialSettings to allow cloud printer auto select. 1155 // Send before SendInitialSettings to allow cloud printer auto select.
1041 SendCloudPrintEnabled(); 1156 SendCloudPrintEnabled();
1042 BrowserThread::PostTaskAndReplyWithResult( 1157 BrowserThread::PostTaskAndReplyWithResult(
1043 BrowserThread::FILE, FROM_HERE, 1158 BrowserThread::FILE, FROM_HERE,
1044 base::Bind(&GetDefaultPrinterOnFileThread, print_backend_), 1159 base::Bind(&GetDefaultPrinterOnFileThread, print_backend_),
1045 base::Bind(&PrintPreviewHandler::SendInitialSettings, 1160 base::Bind(&PrintPreviewHandler::SendInitialSettings,
1046 weak_factory_.GetWeakPtr())); 1161 weak_factory_.GetWeakPtr()));
1047 } 1162 }
1048 1163
1164 void PrintPreviewHandler::HandleGetPdfCapabilities(
1165 const base::ListValue* /*args*/) {
1166 GetPdfCapabilitiesCallback capabilities_cb =
1167 base::Bind(&PrintPreviewHandler::SendPdfCapabilities,
1168 weak_factory_.GetWeakPtr());
1169 BrowserThread::PostTask(
1170 BrowserThread::FILE, FROM_HERE,
1171 base::Bind(&GetPdfCapabilitiesOnFileThread,
1172 print_backend_, capabilities_cb));
1173 }
1174
1049 void PrintPreviewHandler::HandleReportUiEvent(const base::ListValue* args) { 1175 void PrintPreviewHandler::HandleReportUiEvent(const base::ListValue* args) {
1050 int event_group, event_number; 1176 int event_group, event_number;
1051 if (!args->GetInteger(0, &event_group) || !args->GetInteger(1, &event_number)) 1177 if (!args->GetInteger(0, &event_group) || !args->GetInteger(1, &event_number))
1052 return; 1178 return;
1053 1179
1054 enum UiBucketGroups ui_bucket_group = 1180 enum UiBucketGroups ui_bucket_group =
1055 static_cast<enum UiBucketGroups>(event_group); 1181 static_cast<enum UiBucketGroups>(event_group);
1056 if (ui_bucket_group >= UI_BUCKET_GROUP_BOUNDARY) 1182 if (ui_bucket_group >= UI_BUCKET_GROUP_BOUNDARY)
1057 return; 1183 return;
1058 1184
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1121 // metro. 1247 // metro.
1122 bool is_ash = (chrome::GetActiveDesktop() == chrome::HOST_DESKTOP_TYPE_ASH); 1248 bool is_ash = (chrome::GetActiveDesktop() == chrome::HOST_DESKTOP_TYPE_ASH);
1123 initial_settings.SetBoolean(kHidePrintWithSystemDialogLink, is_ash); 1249 initial_settings.SetBoolean(kHidePrintWithSystemDialogLink, is_ash);
1124 #endif 1250 #endif
1125 1251
1126 if (print_preview_ui->source_is_modifiable()) 1252 if (print_preview_ui->source_is_modifiable())
1127 GetNumberFormatAndMeasurementSystem(&initial_settings); 1253 GetNumberFormatAndMeasurementSystem(&initial_settings);
1128 web_ui()->CallJavascriptFunction("setInitialSettings", initial_settings); 1254 web_ui()->CallJavascriptFunction("setInitialSettings", initial_settings);
1129 } 1255 }
1130 1256
1257 void PrintPreviewHandler::SendPdfCapabilities(
1258 const base::DictionaryValue* capabilities) {
1259 web_ui()->CallJavascriptFunction("setPdfCapabilities", *capabilities);
1260 }
1261
1131 void PrintPreviewHandler::ClosePreviewDialog() { 1262 void PrintPreviewHandler::ClosePreviewDialog() {
1132 PrintPreviewUI* print_preview_ui = 1263 PrintPreviewUI* print_preview_ui =
1133 static_cast<PrintPreviewUI*>(web_ui()->GetController()); 1264 static_cast<PrintPreviewUI*>(web_ui()->GetController());
1134 print_preview_ui->OnClosePrintPreviewDialog(); 1265 print_preview_ui->OnClosePrintPreviewDialog();
1135 } 1266 }
1136 1267
1137 void PrintPreviewHandler::SendAccessToken(const std::string& type, 1268 void PrintPreviewHandler::SendAccessToken(const std::string& type,
1138 const std::string& access_token) { 1269 const std::string& access_token) {
1139 VLOG(1) << "Get getAccessToken finished"; 1270 VLOG(1) << "Get getAccessToken finished";
1140 web_ui()->CallJavascriptFunction("onDidGetAccessToken", 1271 web_ui()->CallJavascriptFunction("onDidGetAccessToken",
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
1566 printer_value->SetString("name", description.name); 1697 printer_value->SetString("name", description.name);
1567 printer_value->SetBoolean("hasLocalPrinting", has_local_printing); 1698 printer_value->SetBoolean("hasLocalPrinting", has_local_printing);
1568 printer_value->SetBoolean( 1699 printer_value->SetBoolean(
1569 "isUnregistered", 1700 "isUnregistered",
1570 description.id.empty() && 1701 description.id.empty() &&
1571 command_line->HasSwitch(switches::kEnablePrintPreviewRegisterPromos)); 1702 command_line->HasSwitch(switches::kEnablePrintPreviewRegisterPromos));
1572 printer_value->SetString("cloudID", description.id); 1703 printer_value->SetString("cloudID", description.id);
1573 } 1704 }
1574 1705
1575 #endif 1706 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698