OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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_handler.h" | 5 #include "chrome/browser/ui/webui/print_preview_handler.h" |
6 | 6 |
7 #include <ctype.h> | 7 #include <ctype.h> |
8 | 8 |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
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/i18n/file_util_icu.h" | 15 #include "base/i18n/file_util_icu.h" |
16 #include "base/json/json_reader.h" | 16 #include "base/json/json_reader.h" |
17 #include "base/memory/ref_counted.h" | 17 #include "base/memory/ref_counted.h" |
18 #include "base/metrics/histogram.h" | 18 #include "base/metrics/histogram.h" |
19 #include "base/path_service.h" | 19 #include "base/path_service.h" |
| 20 #include "base/string_split.h" |
| 21 #include "base/string_util.h" |
20 #include "base/threading/thread.h" | 22 #include "base/threading/thread.h" |
21 #include "base/threading/thread_restrictions.h" | 23 #include "base/threading/thread_restrictions.h" |
22 #include "base/utf_string_conversions.h" | 24 #include "base/utf_string_conversions.h" |
23 #include "base/values.h" | 25 #include "base/values.h" |
24 #include "chrome/browser/browser_process.h" | 26 #include "chrome/browser/browser_process.h" |
25 #include "chrome/browser/platform_util.h" | 27 #include "chrome/browser/platform_util.h" |
26 #include "chrome/browser/printing/background_printing_manager.h" | 28 #include "chrome/browser/printing/background_printing_manager.h" |
27 #include "chrome/browser/printing/cloud_print/cloud_print_url.h" | 29 #include "chrome/browser/printing/cloud_print/cloud_print_url.h" |
28 #include "chrome/browser/printing/print_dialog_cloud.h" | 30 #include "chrome/browser/printing/print_dialog_cloud.h" |
29 #include "chrome/browser/printing/print_job_manager.h" | 31 #include "chrome/browser/printing/print_job_manager.h" |
30 #include "chrome/browser/printing/print_preview_tab_controller.h" | 32 #include "chrome/browser/printing/print_preview_tab_controller.h" |
31 #include "chrome/browser/printing/print_system_task_proxy.h" | |
32 #include "chrome/browser/printing/print_view_manager.h" | 33 #include "chrome/browser/printing/print_view_manager.h" |
33 #include "chrome/browser/printing/printer_manager_dialog.h" | 34 #include "chrome/browser/printing/printer_manager_dialog.h" |
34 #include "chrome/browser/sessions/restore_tab_helper.h" | 35 #include "chrome/browser/sessions/restore_tab_helper.h" |
35 #include "chrome/browser/tabs/tab_strip_model.h" | 36 #include "chrome/browser/tabs/tab_strip_model.h" |
36 #include "chrome/browser/ui/browser_list.h" | 37 #include "chrome/browser/ui/browser_list.h" |
37 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 38 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
38 #include "chrome/browser/ui/webui/cloud_print_signin_dialog.h" | 39 #include "chrome/browser/ui/webui/cloud_print_signin_dialog.h" |
39 #include "chrome/browser/ui/webui/print_preview_ui.h" | 40 #include "chrome/browser/ui/webui/print_preview_ui.h" |
40 #include "chrome/common/chrome_paths.h" | 41 #include "chrome/common/chrome_paths.h" |
41 #include "chrome/common/print_messages.h" | 42 #include "chrome/common/print_messages.h" |
42 #include "content/browser/browser_thread.h" | 43 #include "content/browser/browser_thread.h" |
43 #include "content/browser/renderer_host/render_view_host.h" | 44 #include "content/browser/renderer_host/render_view_host.h" |
44 #include "content/browser/tab_contents/tab_contents.h" | 45 #include "content/browser/tab_contents/tab_contents.h" |
45 #include "printing/backend/print_backend.h" | 46 #include "printing/backend/print_backend.h" |
46 #include "printing/metafile.h" | 47 #include "printing/metafile.h" |
47 #include "printing/metafile_impl.h" | 48 #include "printing/metafile_impl.h" |
48 #include "printing/page_range.h" | 49 #include "printing/page_range.h" |
49 #include "printing/print_settings.h" | 50 #include "printing/print_job_constants.h" |
| 51 |
| 52 #if defined(USE_CUPS) |
| 53 #include <cups/cups.h> |
| 54 #include <cups/ppd.h> |
| 55 |
| 56 #include "base/file_util.h" |
| 57 #endif |
50 | 58 |
51 #if !defined(OS_CHROMEOS) | 59 #if !defined(OS_CHROMEOS) |
52 #include "base/command_line.h" | 60 #include "base/command_line.h" |
53 #include "chrome/common/chrome_switches.h" | 61 #include "chrome/common/chrome_switches.h" |
54 #endif | 62 #endif |
55 | 63 |
| 64 #if defined(USE_CUPS) && !defined(OS_MACOSX) |
| 65 namespace printing_internal { |
| 66 |
| 67 void parse_lpoptions(const FilePath& filepath, const std::string& printer_name, |
| 68 int* num_options, cups_option_t** options) { |
| 69 std::string content; |
| 70 if (!file_util::ReadFileToString(filepath, &content)) |
| 71 return; |
| 72 |
| 73 const char kDest[] = "dest"; |
| 74 const char kDefault[] = "default"; |
| 75 size_t kDestLen = sizeof(kDest) - 1; |
| 76 size_t kDefaultLen = sizeof(kDefault) - 1; |
| 77 std::vector <std::string> lines; |
| 78 base::SplitString(content, '\n', &lines); |
| 79 |
| 80 for (size_t i = 0; i < lines.size(); ++i) { |
| 81 std::string line = lines[i]; |
| 82 if (line.empty()) |
| 83 continue; |
| 84 |
| 85 if (base::strncasecmp (line.c_str(), kDefault, kDefaultLen) == 0 && |
| 86 isspace(line[kDefaultLen])) { |
| 87 line = line.substr(kDefaultLen); |
| 88 } else if (base::strncasecmp (line.c_str(), kDest, kDestLen) == 0 && |
| 89 isspace(line[kDestLen])) { |
| 90 line = line.substr(kDestLen); |
| 91 } else { |
| 92 continue; |
| 93 } |
| 94 |
| 95 TrimWhitespaceASCII(line, TRIM_ALL, &line); |
| 96 if (line.empty()) |
| 97 continue; |
| 98 |
| 99 size_t space_found = line.find(' '); |
| 100 if (space_found == std::string::npos) |
| 101 continue; |
| 102 |
| 103 std::string name = line.substr(0, space_found); |
| 104 if (name.empty()) |
| 105 continue; |
| 106 |
| 107 if (base::strncasecmp(printer_name.c_str(), name.c_str(), |
| 108 name.length()) != 0) { |
| 109 continue; // This is not the required printer. |
| 110 } |
| 111 |
| 112 line = line.substr(space_found + 1); |
| 113 TrimWhitespaceASCII(line, TRIM_ALL, &line); // Remove extra spaces. |
| 114 if (line.empty()) |
| 115 continue; |
| 116 // Parse the selected printer custom options. |
| 117 *num_options = cupsParseOptions(line.c_str(), 0, options); |
| 118 } |
| 119 } |
| 120 |
| 121 void mark_lpoptions(const std::string& printer_name, ppd_file_t** ppd) { |
| 122 cups_option_t* options = NULL; |
| 123 int num_options = 0; |
| 124 ppdMarkDefaults(*ppd); |
| 125 |
| 126 const char kSystemLpOptionPath[] = "/etc/cups/lpoptions"; |
| 127 const char kUserLpOptionPath[] = ".cups/lpoptions"; |
| 128 |
| 129 std::vector<FilePath> file_locations; |
| 130 file_locations.push_back(FilePath(kSystemLpOptionPath)); |
| 131 file_locations.push_back(file_util::GetHomeDir().Append(kUserLpOptionPath)); |
| 132 |
| 133 for (std::vector<FilePath>::const_iterator it = file_locations.begin(); |
| 134 it != file_locations.end(); ++it) { |
| 135 num_options = 0; |
| 136 options = NULL; |
| 137 parse_lpoptions(*it, printer_name, &num_options, &options); |
| 138 if (num_options > 0 && options) { |
| 139 cupsMarkOptions(*ppd, num_options, options); |
| 140 cupsFreeOptions(num_options, options); |
| 141 } |
| 142 } |
| 143 } |
| 144 |
| 145 } // printing_internal namespace |
| 146 #endif |
| 147 |
56 namespace { | 148 namespace { |
57 | 149 |
| 150 const char kDisableColorOption[] = "disableColorOption"; |
| 151 const char kSetColorAsDefault[] = "setColorAsDefault"; |
| 152 const char kSetDuplexAsDefault[] = "setDuplexAsDefault"; |
| 153 const char kPrinterColorModelForColor[] = "printerColorModelForColor"; |
| 154 const char kPrinterDefaultDuplexValue[] = "printerDefaultDuplexValue"; |
| 155 |
| 156 #if defined(USE_CUPS) |
| 157 const char kColorDevice[] = "ColorDevice"; |
| 158 const char kColorModel[] = "ColorModel"; |
| 159 const char kColorModelForColor[] = "Color"; |
| 160 const char kCMYK[] = "CMYK"; |
| 161 const char kDuplex[] = "Duplex"; |
| 162 const char kDuplexNone[] = "None"; |
| 163 #elif defined(OS_WIN) |
| 164 const char kPskColor[] = "psk:Color"; |
| 165 const char kPskDuplexFeature[] = "psk:JobDuplexAllDocumentsContiguously"; |
| 166 const char kPskTwoSided[] = "psk:TwoSided"; |
| 167 #endif |
| 168 |
58 enum UserActionBuckets { | 169 enum UserActionBuckets { |
59 PRINT_TO_PRINTER, | 170 PRINT_TO_PRINTER, |
60 PRINT_TO_PDF, | 171 PRINT_TO_PDF, |
61 CANCEL, | 172 CANCEL, |
62 FALLBACK_TO_ADVANCED_SETTINGS_DIALOG, | 173 FALLBACK_TO_ADVANCED_SETTINGS_DIALOG, |
63 PREVIEW_FAILED, | 174 PREVIEW_FAILED, |
64 PREVIEW_STARTED, | 175 PREVIEW_STARTED, |
65 INITIATOR_TAB_CRASHED, | 176 INITIATOR_TAB_CRASHED, |
66 INITIATOR_TAB_CLOSED, | 177 INITIATOR_TAB_CLOSED, |
67 PRINT_WITH_CLOUD_PRINT, | 178 PRINT_WITH_CLOUD_PRINT, |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
145 bool collate; | 256 bool collate; |
146 if (settings.GetBoolean(printing::kSettingCollate, &collate) && collate) | 257 if (settings.GetBoolean(printing::kSettingCollate, &collate) && collate) |
147 ReportPrintSettingHistogram(COLLATE); | 258 ReportPrintSettingHistogram(COLLATE); |
148 | 259 |
149 int duplex_mode; | 260 int duplex_mode; |
150 if (settings.GetInteger(printing::kSettingDuplexMode, &duplex_mode)) | 261 if (settings.GetInteger(printing::kSettingDuplexMode, &duplex_mode)) |
151 ReportPrintSettingHistogram(duplex_mode ? DUPLEX : SIMPLEX); | 262 ReportPrintSettingHistogram(duplex_mode ? DUPLEX : SIMPLEX); |
152 | 263 |
153 int color_mode; | 264 int color_mode; |
154 if (settings.GetInteger(printing::kSettingColor, &color_mode)) { | 265 if (settings.GetInteger(printing::kSettingColor, &color_mode)) { |
155 ReportPrintSettingHistogram( | 266 ReportPrintSettingHistogram(color_mode == printing::GRAY ? BLACK_AND_WHITE : |
156 printing::isColorModelSelected(color_mode) ? COLOR : BLACK_AND_WHITE); | 267 COLOR); |
157 } | 268 } |
158 } | 269 } |
159 | 270 |
160 printing::BackgroundPrintingManager* GetBackgroundPrintingManager() { | 271 printing::BackgroundPrintingManager* GetBackgroundPrintingManager() { |
161 return g_browser_process->background_printing_manager(); | 272 return g_browser_process->background_printing_manager(); |
162 } | 273 } |
163 | 274 |
164 } // namespace | 275 } // namespace |
165 | 276 |
| 277 class PrintSystemTaskProxy |
| 278 : public base::RefCountedThreadSafe<PrintSystemTaskProxy, |
| 279 BrowserThread::DeleteOnUIThread> { |
| 280 public: |
| 281 PrintSystemTaskProxy(const base::WeakPtr<PrintPreviewHandler>& handler, |
| 282 printing::PrintBackend* print_backend, |
| 283 bool has_logged_printers_count) |
| 284 : handler_(handler), |
| 285 print_backend_(print_backend), |
| 286 has_logged_printers_count_(has_logged_printers_count) { |
| 287 } |
| 288 |
| 289 void GetDefaultPrinter() { |
| 290 VLOG(1) << "Get default printer start"; |
| 291 StringValue* default_printer = NULL; |
| 292 if (PrintPreviewHandler::last_used_printer_name_ == NULL) { |
| 293 default_printer = new StringValue( |
| 294 print_backend_->GetDefaultPrinterName()); |
| 295 } else { |
| 296 default_printer = new StringValue( |
| 297 *PrintPreviewHandler::last_used_printer_name_); |
| 298 } |
| 299 std::string default_printer_string; |
| 300 default_printer->GetAsString(&default_printer_string); |
| 301 VLOG(1) << "Get default printer finished, found: " |
| 302 << default_printer_string; |
| 303 |
| 304 StringValue* cloud_print_data = NULL; |
| 305 if (PrintPreviewHandler::last_used_printer_cloud_print_data_ != NULL) { |
| 306 cloud_print_data = new StringValue( |
| 307 *PrintPreviewHandler::last_used_printer_cloud_print_data_); |
| 308 } else { |
| 309 cloud_print_data = new StringValue(""); |
| 310 } |
| 311 |
| 312 BrowserThread::PostTask( |
| 313 BrowserThread::UI, FROM_HERE, |
| 314 base::Bind(&PrintSystemTaskProxy::SendDefaultPrinter, this, |
| 315 default_printer, cloud_print_data)); |
| 316 } |
| 317 |
| 318 void SendDefaultPrinter(const StringValue* default_printer, |
| 319 const StringValue* cloud_print_data) { |
| 320 if (handler_) |
| 321 handler_->SendDefaultPrinter(*default_printer, *cloud_print_data); |
| 322 delete default_printer; |
| 323 } |
| 324 |
| 325 void EnumeratePrinters() { |
| 326 VLOG(1) << "Enumerate printers start"; |
| 327 ListValue* printers = new ListValue; |
| 328 |
| 329 printing::PrinterList printer_list; |
| 330 print_backend_->EnumeratePrinters(&printer_list); |
| 331 |
| 332 if (!has_logged_printers_count_) { |
| 333 // Record the total number of printers. |
| 334 UMA_HISTOGRAM_COUNTS("PrintPreview.NumberOfPrinters", |
| 335 printer_list.size()); |
| 336 } |
| 337 |
| 338 int i = 0; |
| 339 for (printing::PrinterList::iterator iter = printer_list.begin(); |
| 340 iter != printer_list.end(); ++iter, ++i) { |
| 341 DictionaryValue* printer_info = new DictionaryValue; |
| 342 std::string printerName; |
| 343 #if defined(OS_MACOSX) |
| 344 // On Mac, |iter->printer_description| specifies the printer name and |
| 345 // |iter->printer_name| specifies the device name / printer queue name. |
| 346 printerName = iter->printer_description; |
| 347 #else |
| 348 printerName = iter->printer_name; |
| 349 #endif |
| 350 printer_info->SetString(printing::kSettingPrinterName, printerName); |
| 351 printer_info->SetString(printing::kSettingDeviceName, iter->printer_name); |
| 352 printers->Append(printer_info); |
| 353 } |
| 354 VLOG(1) << "Enumerate printers finished, found " << i << " printers"; |
| 355 |
| 356 BrowserThread::PostTask( |
| 357 BrowserThread::UI, FROM_HERE, |
| 358 base::Bind(&PrintSystemTaskProxy::SetupPrinterList, this, printers)); |
| 359 } |
| 360 |
| 361 void SetupPrinterList(ListValue* printers) { |
| 362 if (handler_) { |
| 363 handler_->SetupPrinterList(*printers); |
| 364 } |
| 365 delete printers; |
| 366 } |
| 367 |
| 368 void GetPrinterCapabilities(const std::string& printer_name) { |
| 369 VLOG(1) << "Get printer capabilities start for " << printer_name; |
| 370 printing::PrinterCapsAndDefaults printer_info; |
| 371 bool supports_color = true; |
| 372 bool set_duplex_as_default = false; |
| 373 int printer_color_space = printing::GRAY; |
| 374 int default_duplex_setting_value = printing::UNKNOWN_DUPLEX_MODE; |
| 375 if (!print_backend_->GetPrinterCapsAndDefaults(printer_name, |
| 376 &printer_info)) { |
| 377 return; |
| 378 } |
| 379 |
| 380 #if defined(USE_CUPS) |
| 381 FilePath ppd_file_path; |
| 382 if (!file_util::CreateTemporaryFile(&ppd_file_path)) |
| 383 return; |
| 384 |
| 385 int data_size = printer_info.printer_capabilities.length(); |
| 386 if (data_size != file_util::WriteFile( |
| 387 ppd_file_path, |
| 388 printer_info.printer_capabilities.data(), |
| 389 data_size)) { |
| 390 file_util::Delete(ppd_file_path, false); |
| 391 return; |
| 392 } |
| 393 |
| 394 ppd_file_t* ppd = ppdOpenFile(ppd_file_path.value().c_str()); |
| 395 if (ppd) { |
| 396 #if !defined(OS_MACOSX) |
| 397 printing_internal::mark_lpoptions(printer_name, &ppd); |
| 398 #endif |
| 399 ppd_attr_t* attr = ppdFindAttr(ppd, kColorDevice, NULL); |
| 400 if (attr && attr->value) |
| 401 supports_color = ppd->color_device; |
| 402 |
| 403 ppd_choice_t* duplex_choice = ppdFindMarkedChoice(ppd, kDuplex); |
| 404 if (duplex_choice) { |
| 405 ppd_option_t* option = ppdFindOption(ppd, kDuplex); |
| 406 if (option) |
| 407 duplex_choice = ppdFindChoice(option, option->defchoice); |
| 408 } |
| 409 |
| 410 if (duplex_choice) { |
| 411 if (base::strcasecmp(duplex_choice->choice, kDuplexNone) != 0) { |
| 412 set_duplex_as_default = true; |
| 413 default_duplex_setting_value = printing::LONG_EDGE; |
| 414 } else { |
| 415 default_duplex_setting_value = printing::SIMPLEX; |
| 416 } |
| 417 } |
| 418 |
| 419 if (supports_color) { |
| 420 // Identify the color space (COLOR/CMYK) for this printer. |
| 421 ppd_option_t* color_model = ppdFindOption(ppd, kColorModel); |
| 422 if (color_model) { |
| 423 if (ppdFindChoice(color_model, kColorModelForColor)) |
| 424 printer_color_space = printing::COLOR; |
| 425 else if (ppdFindChoice(color_model, kCMYK)) |
| 426 printer_color_space = printing::CMYK; |
| 427 } |
| 428 } |
| 429 ppdClose(ppd); |
| 430 } |
| 431 file_util::Delete(ppd_file_path, false); |
| 432 #elif defined(OS_WIN) |
| 433 // According to XPS 1.0 spec, only color printers have psk:Color. |
| 434 // Therefore we don't need to parse the whole XML file, we just need to |
| 435 // search the string. The spec can be found at: |
| 436 // http://msdn.microsoft.com/en-us/windows/hardware/gg463431. |
| 437 supports_color = (printer_info.printer_capabilities.find(kPskColor) != |
| 438 std::string::npos); |
| 439 if (supports_color) |
| 440 printer_color_space = printing::COLOR; |
| 441 |
| 442 set_duplex_as_default = |
| 443 (printer_info.printer_defaults.find(kPskDuplexFeature) != |
| 444 std::string::npos) && |
| 445 (printer_info.printer_defaults.find(kPskTwoSided) != |
| 446 std::string::npos); |
| 447 |
| 448 if (printer_info.printer_defaults.find(kPskDuplexFeature) != |
| 449 std::string::npos) { |
| 450 if (printer_info.printer_defaults.find(kPskTwoSided) != |
| 451 std::string::npos) { |
| 452 default_duplex_setting_value = printing::LONG_EDGE; |
| 453 } else { |
| 454 default_duplex_setting_value = printing::SIMPLEX; |
| 455 } |
| 456 } |
| 457 #else |
| 458 NOTIMPLEMENTED(); |
| 459 #endif |
| 460 |
| 461 DictionaryValue settings_info; |
| 462 settings_info.SetBoolean(kDisableColorOption, !supports_color); |
| 463 if (!supports_color) { |
| 464 settings_info.SetBoolean(kSetColorAsDefault, false); |
| 465 } else { |
| 466 settings_info.SetBoolean(kSetColorAsDefault, |
| 467 PrintPreviewHandler::last_used_color_setting_); |
| 468 } |
| 469 settings_info.SetBoolean(kSetDuplexAsDefault, set_duplex_as_default); |
| 470 settings_info.SetInteger(kPrinterColorModelForColor, printer_color_space); |
| 471 settings_info.SetInteger(kPrinterDefaultDuplexValue, |
| 472 default_duplex_setting_value); |
| 473 BrowserThread::PostTask( |
| 474 BrowserThread::UI, FROM_HERE, |
| 475 base::Bind(&PrintSystemTaskProxy::SendPrinterCapabilities, this, |
| 476 settings_info.DeepCopy())); |
| 477 } |
| 478 |
| 479 void SendPrinterCapabilities(DictionaryValue* settings_info) { |
| 480 if (handler_) |
| 481 handler_->SendPrinterCapabilities(*settings_info); |
| 482 delete settings_info; |
| 483 } |
| 484 |
| 485 private: |
| 486 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; |
| 487 friend class DeleteTask<PrintSystemTaskProxy>; |
| 488 |
| 489 ~PrintSystemTaskProxy() {} |
| 490 |
| 491 base::WeakPtr<PrintPreviewHandler> handler_; |
| 492 |
| 493 scoped_refptr<printing::PrintBackend> print_backend_; |
| 494 |
| 495 bool has_logged_printers_count_; |
| 496 |
| 497 DISALLOW_COPY_AND_ASSIGN(PrintSystemTaskProxy); |
| 498 }; |
| 499 |
166 // A Task implementation that stores a PDF file on disk. | 500 // A Task implementation that stores a PDF file on disk. |
167 class PrintToPdfTask : public Task { | 501 class PrintToPdfTask : public Task { |
168 public: | 502 public: |
169 // Takes ownership of |metafile|. | 503 // Takes ownership of |metafile|. |
170 PrintToPdfTask(printing::Metafile* metafile, const FilePath& path) | 504 PrintToPdfTask(printing::Metafile* metafile, const FilePath& path) |
171 : metafile_(metafile), path_(path) { | 505 : metafile_(metafile), path_(path) { |
172 DCHECK(metafile); | 506 DCHECK(metafile); |
173 } | 507 } |
174 | 508 |
175 ~PrintToPdfTask() { | 509 ~PrintToPdfTask() { |
(...skipping 12 matching lines...) Expand all Loading... |
188 scoped_ptr<printing::Metafile> metafile_; | 522 scoped_ptr<printing::Metafile> metafile_; |
189 | 523 |
190 // The absolute path where the file will be saved. | 524 // The absolute path where the file will be saved. |
191 FilePath path_; | 525 FilePath path_; |
192 }; | 526 }; |
193 | 527 |
194 // static | 528 // static |
195 FilePath* PrintPreviewHandler::last_saved_path_ = NULL; | 529 FilePath* PrintPreviewHandler::last_saved_path_ = NULL; |
196 std::string* PrintPreviewHandler::last_used_printer_cloud_print_data_ = NULL; | 530 std::string* PrintPreviewHandler::last_used_printer_cloud_print_data_ = NULL; |
197 std::string* PrintPreviewHandler::last_used_printer_name_ = NULL; | 531 std::string* PrintPreviewHandler::last_used_printer_name_ = NULL; |
198 printing::ColorModels PrintPreviewHandler::last_used_color_model_ = | 532 bool PrintPreviewHandler::last_used_color_setting_ = false; |
199 printing::UNKNOWN_COLOR_MODEL; | |
200 | 533 |
201 PrintPreviewHandler::PrintPreviewHandler() | 534 PrintPreviewHandler::PrintPreviewHandler() |
202 : print_backend_(printing::PrintBackend::CreateInstance(NULL)), | 535 : print_backend_(printing::PrintBackend::CreateInstance(NULL)), |
203 regenerate_preview_request_count_(0), | 536 regenerate_preview_request_count_(0), |
204 manage_printers_dialog_request_count_(0), | 537 manage_printers_dialog_request_count_(0), |
205 reported_failed_preview_(false), | 538 reported_failed_preview_(false), |
206 has_logged_printers_count_(false) { | 539 has_logged_printers_count_(false) { |
207 ReportUserActionHistogram(PREVIEW_STARTED); | 540 ReportUserActionHistogram(PREVIEW_STARTED); |
208 } | 541 } |
209 | 542 |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
370 TabContentsWrapper* initiator_tab = GetInitiatorTab(); | 703 TabContentsWrapper* initiator_tab = GetInitiatorTab(); |
371 if (initiator_tab) { | 704 if (initiator_tab) { |
372 RenderViewHost* rvh = initiator_tab->render_view_host(); | 705 RenderViewHost* rvh = initiator_tab->render_view_host(); |
373 rvh->Send(new PrintMsg_ResetScriptedPrintCount(rvh->routing_id())); | 706 rvh->Send(new PrintMsg_ResetScriptedPrintCount(rvh->routing_id())); |
374 } | 707 } |
375 | 708 |
376 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args)); | 709 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args)); |
377 if (!settings.get()) | 710 if (!settings.get()) |
378 return; | 711 return; |
379 | 712 |
380 // Storing last used color model. | 713 // Storing last used color setting. |
381 int color_model; | 714 int color_mode; |
382 if (!settings->GetInteger(printing::kSettingColor, &color_model)) | 715 if (!settings->GetInteger(printing::kSettingColor, &color_mode)) |
383 color_model = printing::GRAY; | 716 color_mode = printing::GRAY; |
384 last_used_color_model_ = static_cast<printing::ColorModels>(color_model); | 717 last_used_color_setting_ = (color_mode != printing::GRAY); |
385 | 718 |
386 bool print_to_pdf = false; | 719 bool print_to_pdf = false; |
387 settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf); | 720 settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf); |
388 | 721 |
389 settings->SetBoolean(printing::kSettingHeaderFooterEnabled, false); | 722 settings->SetBoolean(printing::kSettingHeaderFooterEnabled, false); |
390 | 723 |
391 bool is_cloud_printer = settings->HasKey(printing::kSettingCloudPrintId); | 724 bool is_cloud_printer = settings->HasKey(printing::kSettingCloudPrintId); |
392 bool is_cloud_dialog = false; | 725 bool is_cloud_dialog = false; |
393 settings->GetBoolean(printing::kSettingCloudPrintDialog, &is_cloud_dialog); | 726 settings->GetBoolean(printing::kSettingCloudPrintDialog, &is_cloud_dialog); |
394 if (is_cloud_printer) { | 727 if (is_cloud_printer) { |
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
829 return; | 1162 return; |
830 | 1163 |
831 // We no longer require the initiator tab details. Remove those details | 1164 // We no longer require the initiator tab details. Remove those details |
832 // associated with the preview tab to allow the initiator tab to create | 1165 // associated with the preview tab to allow the initiator tab to create |
833 // another preview tab. | 1166 // another preview tab. |
834 printing::PrintPreviewTabController* tab_controller = | 1167 printing::PrintPreviewTabController* tab_controller = |
835 printing::PrintPreviewTabController::GetInstance(); | 1168 printing::PrintPreviewTabController::GetInstance(); |
836 if (tab_controller) | 1169 if (tab_controller) |
837 tab_controller->EraseInitiatorTabInfo(preview_tab_wrapper()); | 1170 tab_controller->EraseInitiatorTabInfo(preview_tab_wrapper()); |
838 } | 1171 } |
OLD | NEW |