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

Side by Side Diff: trunk/src/chrome/browser/ui/webui/print_preview/print_preview_handler.cc

Issue 319373004: Revert 275646 "Generalize printer color model handling, get rid ..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 6 years, 6 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 <map>
10 #include <string> 10 #include <string>
11 11
12 #include "base/base64.h" 12 #include "base/base64.h"
13 #include "base/bind.h" 13 #include "base/bind.h"
14 #include "base/bind_helpers.h" 14 #include "base/bind_helpers.h"
15 #include "base/command_line.h" 15 #include "base/command_line.h"
16 #include "base/i18n/file_util_icu.h" 16 #include "base/i18n/file_util_icu.h"
17 #include "base/i18n/number_formatting.h" 17 #include "base/i18n/number_formatting.h"
18 #include "base/json/json_reader.h" 18 #include "base/json/json_reader.h"
19 #include "base/lazy_instance.h" 19 #include "base/lazy_instance.h"
20 #include "base/memory/linked_ptr.h" 20 #include "base/memory/linked_ptr.h"
21 #include "base/memory/ref_counted_memory.h" 21 #include "base/memory/ref_counted_memory.h"
22 #include "base/metrics/histogram.h" 22 #include "base/metrics/histogram.h"
23 #include "base/path_service.h" 23 #include "base/path_service.h"
24 #include "base/prefs/pref_service.h" 24 #include "base/prefs/pref_service.h"
25 #include "base/strings/string_number_conversions.h"
26 #include "base/strings/utf_string_conversions.h" 25 #include "base/strings/utf_string_conversions.h"
27 #include "base/threading/thread.h" 26 #include "base/threading/thread.h"
28 #include "base/threading/thread_restrictions.h" 27 #include "base/threading/thread_restrictions.h"
29 #include "base/values.h" 28 #include "base/values.h"
30 #include "chrome/browser/browser_process.h" 29 #include "chrome/browser/browser_process.h"
31 #include "chrome/browser/platform_util.h" 30 #include "chrome/browser/platform_util.h"
32 #include "chrome/browser/printing/print_dialog_cloud.h" 31 #include "chrome/browser/printing/print_dialog_cloud.h"
33 #include "chrome/browser/printing/print_error_dialog.h" 32 #include "chrome/browser/printing/print_error_dialog.h"
34 #include "chrome/browser/printing/print_job_manager.h" 33 #include "chrome/browser/printing/print_job_manager.h"
35 #include "chrome/browser/printing/print_preview_dialog_controller.h" 34 #include "chrome/browser/printing/print_preview_dialog_controller.h"
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 #endif 183 #endif
185 // Name of a dictionary field holding the state of selection for document. 184 // Name of a dictionary field holding the state of selection for document.
186 const char kDocumentHasSelection[] = "documentHasSelection"; 185 const char kDocumentHasSelection[] = "documentHasSelection";
187 186
188 // Id of the predefined PDF printer. 187 // Id of the predefined PDF printer.
189 const char kLocalPdfPrinterId[] = "Save as PDF"; 188 const char kLocalPdfPrinterId[] = "Save as PDF";
190 189
191 // Additional printer capability setting keys. 190 // Additional printer capability setting keys.
192 const char kPrinterId[] = "printerId"; 191 const char kPrinterId[] = "printerId";
193 const char kPrinterCapabilities[] = "capabilities"; 192 const char kPrinterCapabilities[] = "capabilities";
193 #if defined(USE_CUPS)
194 const char kCUPSsColorModel[] = "cupsColorModel";
195 const char kCUPSsBWModel[] = "cupsBWModel";
196 #endif
194 197
195 // Get the print job settings dictionary from |args|. The caller takes 198 // Get the print job settings dictionary from |args|. The caller takes
196 // ownership of the returned DictionaryValue. Returns NULL on failure. 199 // ownership of the returned DictionaryValue. Returns NULL on failure.
197 base::DictionaryValue* GetSettingsDictionary(const base::ListValue* args) { 200 base::DictionaryValue* GetSettingsDictionary(const base::ListValue* args) {
198 std::string json_str; 201 std::string json_str;
199 if (!args->GetString(0, &json_str)) { 202 if (!args->GetString(0, &json_str)) {
200 NOTREACHED() << "Could not read JSON argument"; 203 NOTREACHED() << "Could not read JSON argument";
201 return NULL; 204 return NULL;
202 } 205 }
203 if (json_str.empty()) { 206 if (json_str.empty()) {
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 cloud_devices::CloudDeviceDescription description; 310 cloud_devices::CloudDeviceDescription description;
308 using namespace cloud_devices::printer; 311 using namespace cloud_devices::printer;
309 312
310 OrientationCapability orientation; 313 OrientationCapability orientation;
311 orientation.AddOption(cloud_devices::printer::PORTRAIT); 314 orientation.AddOption(cloud_devices::printer::PORTRAIT);
312 orientation.AddOption(cloud_devices::printer::LANDSCAPE); 315 orientation.AddOption(cloud_devices::printer::LANDSCAPE);
313 orientation.AddDefaultOption(AUTO_ORIENTATION, true); 316 orientation.AddDefaultOption(AUTO_ORIENTATION, true);
314 orientation.SaveTo(&description); 317 orientation.SaveTo(&description);
315 318
316 ColorCapability color; 319 ColorCapability color;
317 { 320 color.AddDefaultOption(Color(STANDARD_COLOR), true);
318 Color standard_color(STANDARD_COLOR);
319 standard_color.vendor_id = base::IntToString(printing::COLOR);
320 color.AddDefaultOption(standard_color, true);
321 }
322 color.SaveTo(&description); 321 color.SaveTo(&description);
323 322
324 static const cloud_devices::printer::MediaType kPdfMedia[] = { 323 static const cloud_devices::printer::MediaType kPdfMedia[] = {
325 ISO_A4, 324 ISO_A4,
326 ISO_A3, 325 ISO_A3,
327 NA_LETTER, 326 NA_LETTER,
328 NA_LEGAL, 327 NA_LEGAL,
329 NA_LEDGER 328 NA_LEDGER
330 }; 329 };
331 const gfx::Size default_media_size = GetDefaultPdfMediaSizeMicrons(); 330 const gfx::Size default_media_size = GetDefaultPdfMediaSizeMicrons();
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 return scoped_ptr<base::DictionaryValue>(); 369 return scoped_ptr<base::DictionaryValue>();
371 } 370 }
372 371
373 scoped_ptr<base::DictionaryValue> description( 372 scoped_ptr<base::DictionaryValue> description(
374 cloud_print::PrinterSemanticCapsAndDefaultsToCdd(info)); 373 cloud_print::PrinterSemanticCapsAndDefaultsToCdd(info));
375 if (!description) { 374 if (!description) {
376 LOG(WARNING) << "Failed to convert capabilities for " << printer_name; 375 LOG(WARNING) << "Failed to convert capabilities for " << printer_name;
377 return scoped_ptr<base::DictionaryValue>(); 376 return scoped_ptr<base::DictionaryValue>();
378 } 377 }
379 378
379 #if defined(USE_CUPS)
380 // TODO(alekseys): Use CUSTOM_COLOR/MONOCHROME instead.
381 description->SetInteger(kCUPSsColorModel, info.color_model);
382 description->SetInteger(kCUPSsBWModel, info.bw_model);
383 #endif
380 return description.Pass(); 384 return description.Pass();
381 } 385 }
382 386
383 void EnumeratePrintersOnFileThread(base::ListValue* printers) { 387 void EnumeratePrintersOnFileThread(base::ListValue* printers) {
384 DCHECK_CURRENTLY_ON(BrowserThread::FILE); 388 DCHECK_CURRENTLY_ON(BrowserThread::FILE);
385 389
386 scoped_refptr<printing::PrintBackend> print_backend( 390 scoped_refptr<printing::PrintBackend> print_backend(
387 printing::PrintBackend::CreateInstance(NULL)); 391 printing::PrintBackend::CreateInstance(NULL));
388 392
389 VLOG(1) << "Enumerate printers start"; 393 VLOG(1) << "Enumerate printers start";
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 466
463 base::LazyInstance<printing::StickySettings> g_sticky_settings = 467 base::LazyInstance<printing::StickySettings> g_sticky_settings =
464 LAZY_INSTANCE_INITIALIZER; 468 LAZY_INSTANCE_INITIALIZER;
465 469
466 printing::StickySettings* GetStickySettings() { 470 printing::StickySettings* GetStickySettings() {
467 return g_sticky_settings.Pointer(); 471 return g_sticky_settings.Pointer();
468 } 472 }
469 473
470 } // namespace 474 } // namespace
471 475
476 #if defined(USE_CUPS)
477 struct PrintPreviewHandler::CUPSPrinterColorModels {
478 std::string printer_name;
479 printing::ColorModel color_model;
480 printing::ColorModel bw_model;
481 };
482 #endif
483
472 class PrintPreviewHandler::AccessTokenService 484 class PrintPreviewHandler::AccessTokenService
473 : public OAuth2TokenService::Consumer { 485 : public OAuth2TokenService::Consumer {
474 public: 486 public:
475 explicit AccessTokenService(PrintPreviewHandler* handler) 487 explicit AccessTokenService(PrintPreviewHandler* handler)
476 : OAuth2TokenService::Consumer("print_preview"), 488 : OAuth2TokenService::Consumer("print_preview"),
477 handler_(handler) { 489 handler_(handler) {
478 } 490 }
479 491
480 void RequestToken(const std::string& type) { 492 void RequestToken(const std::string& type) {
481 if (requests_.find(type) != requests_.end()) 493 if (requests_.find(type) != requests_.end())
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 // Do this so the initiator can open a new print preview dialog, while the 873 // Do this so the initiator can open a new print preview dialog, while the
862 // current print preview dialog is still handling its print job. 874 // current print preview dialog is still handling its print job.
863 ClearInitiatorDetails(); 875 ClearInitiatorDetails();
864 876
865 // The PDF being printed contains only the pages that the user selected, 877 // The PDF being printed contains only the pages that the user selected,
866 // so ignore the page range and print all pages. 878 // so ignore the page range and print all pages.
867 settings->Remove(printing::kSettingPageRange, NULL); 879 settings->Remove(printing::kSettingPageRange, NULL);
868 // Reset selection only flag for the same reason. 880 // Reset selection only flag for the same reason.
869 settings->SetBoolean(printing::kSettingShouldPrintSelectionOnly, false); 881 settings->SetBoolean(printing::kSettingShouldPrintSelectionOnly, false);
870 882
883 #if defined(USE_CUPS)
884 if (!open_pdf_in_preview) // We can get here even for cloud printers.
885 ConvertColorSettingToCUPSColorModel(settings.get());
886 #endif
887
871 // Set ID to know whether printing is for preview. 888 // Set ID to know whether printing is for preview.
872 settings->SetInteger(printing::kPreviewUIID, 889 settings->SetInteger(printing::kPreviewUIID,
873 print_preview_ui->GetIDForPrintPreviewUI()); 890 print_preview_ui->GetIDForPrintPreviewUI());
874 RenderViewHost* rvh = preview_web_contents()->GetRenderViewHost(); 891 RenderViewHost* rvh = preview_web_contents()->GetRenderViewHost();
875 rvh->Send(new PrintMsg_PrintForPrintPreview(rvh->GetRoutingID(), 892 rvh->Send(new PrintMsg_PrintForPrintPreview(rvh->GetRoutingID(),
876 *settings)); 893 *settings));
877 894
878 // For all other cases above, the preview dialog will stay open until the 895 // For all other cases above, the preview dialog will stay open until the
879 // printing has finished. Then the dialog closes and PrintPreviewDone() gets 896 // printing has finished. Then the dialog closes and PrintPreviewDone() gets
880 // called. In the case below, since the preview dialog will be hidden and 897 // called. In the case below, since the preview dialog will be hidden and
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
1205 const std::string& access_token) { 1222 const std::string& access_token) {
1206 VLOG(1) << "Get getAccessToken finished"; 1223 VLOG(1) << "Get getAccessToken finished";
1207 web_ui()->CallJavascriptFunction("onDidGetAccessToken", 1224 web_ui()->CallJavascriptFunction("onDidGetAccessToken",
1208 base::StringValue(type), 1225 base::StringValue(type),
1209 base::StringValue(access_token)); 1226 base::StringValue(access_token));
1210 } 1227 }
1211 1228
1212 void PrintPreviewHandler::SendPrinterCapabilities( 1229 void PrintPreviewHandler::SendPrinterCapabilities(
1213 const base::DictionaryValue* settings_info) { 1230 const base::DictionaryValue* settings_info) {
1214 VLOG(1) << "Get printer capabilities finished"; 1231 VLOG(1) << "Get printer capabilities finished";
1232
1233 #if defined(USE_CUPS)
1234 SaveCUPSColorSetting(settings_info);
1235 #endif
1236
1215 web_ui()->CallJavascriptFunction("updateWithPrinterCapabilities", 1237 web_ui()->CallJavascriptFunction("updateWithPrinterCapabilities",
1216 *settings_info); 1238 *settings_info);
1217 } 1239 }
1218 1240
1219 void PrintPreviewHandler::SendFailedToGetPrinterCapabilities( 1241 void PrintPreviewHandler::SendFailedToGetPrinterCapabilities(
1220 const std::string& printer_name) { 1242 const std::string& printer_name) {
1221 VLOG(1) << "Get printer capabilities failed"; 1243 VLOG(1) << "Get printer capabilities failed";
1222 base::StringValue printer_name_value(printer_name); 1244 base::StringValue printer_name_value(printer_name);
1223 web_ui()->CallJavascriptFunction("failedToGetPrinterCapabilities", 1245 web_ui()->CallJavascriptFunction("failedToGetPrinterCapabilities",
1224 printer_name_value); 1246 printer_name_value);
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
1381 // Nothing to print, no preview available. 1403 // Nothing to print, no preview available.
1382 return false; 1404 return false;
1383 } 1405 }
1384 DCHECK(tmp_data->size() && tmp_data->front()); 1406 DCHECK(tmp_data->size() && tmp_data->front());
1385 1407
1386 *data = tmp_data; 1408 *data = tmp_data;
1387 *title = print_preview_ui->initiator_title(); 1409 *title = print_preview_ui->initiator_title();
1388 return true; 1410 return true;
1389 } 1411 }
1390 1412
1413 #if defined(USE_CUPS)
1414 void PrintPreviewHandler::SaveCUPSColorSetting(
1415 const base::DictionaryValue* settings) {
1416 cups_printer_color_models_.reset(new CUPSPrinterColorModels);
1417 settings->GetString(kPrinterId, &cups_printer_color_models_->printer_name);
1418 const base::DictionaryValue* capabilities = NULL;
1419 if (!settings->GetDictionary(kPrinterCapabilities, &capabilities) ||
1420 !capabilities) {
1421 NOTREACHED();
1422 return;
1423 }
1424 capabilities->GetInteger(
1425 kCUPSsColorModel,
1426 reinterpret_cast<int*>(&cups_printer_color_models_->color_model));
1427 capabilities->GetInteger(
1428 kCUPSsBWModel,
1429 reinterpret_cast<int*>(&cups_printer_color_models_->bw_model));
1430 }
1431
1432 void PrintPreviewHandler::ConvertColorSettingToCUPSColorModel(
1433 base::DictionaryValue* settings) const {
1434 if (!cups_printer_color_models_)
1435 return;
1436
1437 // Sanity check the printer name.
1438 std::string printer_name;
1439 if (!settings->GetString(printing::kSettingDeviceName, &printer_name) ||
1440 printer_name != cups_printer_color_models_->printer_name) {
1441 NOTREACHED();
1442 return;
1443 }
1444
1445 int color;
1446 if (!settings->GetInteger(printing::kSettingColor, &color)) {
1447 NOTREACHED();
1448 return;
1449 }
1450
1451 if (color == printing::GRAY) {
1452 if (cups_printer_color_models_->bw_model != printing::UNKNOWN_COLOR_MODEL) {
1453 settings->SetInteger(printing::kSettingColor,
1454 cups_printer_color_models_->bw_model);
1455 }
1456 return;
1457 }
1458
1459 printing::ColorModel color_model = cups_printer_color_models_->color_model;
1460 if (color_model != printing::UNKNOWN_COLOR_MODEL)
1461 settings->SetInteger(printing::kSettingColor, color_model);
1462 }
1463
1464 #endif // defined(USE_CUPS)
1465
1391 #if defined(ENABLE_SERVICE_DISCOVERY) 1466 #if defined(ENABLE_SERVICE_DISCOVERY)
1392 void PrintPreviewHandler::LocalPrinterChanged( 1467 void PrintPreviewHandler::LocalPrinterChanged(
1393 bool added, 1468 bool added,
1394 const std::string& name, 1469 const std::string& name,
1395 bool has_local_printing, 1470 bool has_local_printing,
1396 const local_discovery::DeviceDescription& description) { 1471 const local_discovery::DeviceDescription& description) {
1397 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); 1472 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
1398 if (has_local_printing || 1473 if (has_local_printing ||
1399 command_line->HasSwitch(switches::kEnablePrintPreviewRegisterPromos)) { 1474 command_line->HasSwitch(switches::kEnablePrintPreviewRegisterPromos)) {
1400 base::DictionaryValue info; 1475 base::DictionaryValue info;
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
1581 printer_value->SetString("name", description.name); 1656 printer_value->SetString("name", description.name);
1582 printer_value->SetBoolean("hasLocalPrinting", has_local_printing); 1657 printer_value->SetBoolean("hasLocalPrinting", has_local_printing);
1583 printer_value->SetBoolean( 1658 printer_value->SetBoolean(
1584 "isUnregistered", 1659 "isUnregistered",
1585 description.id.empty() && 1660 description.id.empty() &&
1586 command_line->HasSwitch(switches::kEnablePrintPreviewRegisterPromos)); 1661 command_line->HasSwitch(switches::kEnablePrintPreviewRegisterPromos));
1587 printer_value->SetString("cloudID", description.id); 1662 printer_value->SetString("cloudID", description.id);
1588 } 1663 }
1589 1664
1590 #endif // defined(ENABLE_SERVICE_DISCOVERY) 1665 #endif // defined(ENABLE_SERVICE_DISCOVERY)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698