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 <string> | 7 #include <string> |
8 | 8 |
9 #include "base/base64.h" | |
9 #include "base/i18n/file_util_icu.h" | 10 #include "base/i18n/file_util_icu.h" |
10 #include "base/json/json_reader.h" | 11 #include "base/json/json_reader.h" |
11 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
12 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
13 #include "base/path_service.h" | 14 #include "base/path_service.h" |
14 #include "base/threading/thread.h" | 15 #include "base/threading/thread.h" |
15 #include "base/threading/thread_restrictions.h" | 16 #include "base/threading/thread_restrictions.h" |
16 #include "base/utf_string_conversions.h" | 17 #include "base/utf_string_conversions.h" |
17 #include "base/values.h" | 18 #include "base/values.h" |
18 #include "chrome/browser/browser_process.h" | 19 #include "chrome/browser/browser_process.h" |
19 #include "chrome/browser/platform_util.h" | 20 #include "chrome/browser/platform_util.h" |
20 #include "chrome/browser/printing/background_printing_manager.h" | 21 #include "chrome/browser/printing/background_printing_manager.h" |
22 #include "chrome/browser/printing/cloud_print/cloud_print_url.h" | |
21 #include "chrome/browser/printing/printer_manager_dialog.h" | 23 #include "chrome/browser/printing/printer_manager_dialog.h" |
22 #include "chrome/browser/printing/print_preview_tab_controller.h" | 24 #include "chrome/browser/printing/print_preview_tab_controller.h" |
23 #include "chrome/browser/tabs/tab_strip_model.h" | 25 #include "chrome/browser/tabs/tab_strip_model.h" |
24 #include "chrome/browser/ui/browser_list.h" | 26 #include "chrome/browser/ui/browser_list.h" |
25 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 27 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
26 #include "chrome/browser/ui/webui/print_preview_ui.h" | 28 #include "chrome/browser/ui/webui/print_preview_ui.h" |
27 #include "chrome/common/chrome_paths.h" | 29 #include "chrome/common/chrome_paths.h" |
28 #include "chrome/common/print_messages.h" | 30 #include "chrome/common/print_messages.h" |
29 #include "content/browser/browser_thread.h" | 31 #include "content/browser/browser_thread.h" |
30 #include "content/browser/renderer_host/render_view_host.h" | 32 #include "content/browser/renderer_host/render_view_host.h" |
31 #include "content/browser/tab_contents/tab_contents.h" | 33 #include "content/browser/tab_contents/tab_contents.h" |
32 #include "printing/backend/print_backend.h" | 34 #include "printing/backend/print_backend.h" |
33 #include "printing/metafile.h" | 35 #include "printing/metafile.h" |
34 #include "printing/metafile_impl.h" | 36 #include "printing/metafile_impl.h" |
35 #include "printing/page_range.h" | 37 #include "printing/page_range.h" |
36 #include "printing/print_job_constants.h" | 38 #include "printing/print_job_constants.h" |
37 | 39 |
40 #if !defined(OS_CHROMEOS) | |
41 #include "base/command_line.h" | |
42 #include "chrome/common/chrome_switches.h" | |
43 #endif | |
44 | |
38 #if defined(USE_CUPS) | 45 #if defined(USE_CUPS) |
39 #include <cups/cups.h> | 46 #include <cups/cups.h> |
40 | 47 |
41 #include "base/file_util.h" | 48 #include "base/file_util.h" |
42 #endif | 49 #endif |
43 | 50 |
44 namespace { | 51 namespace { |
45 | 52 |
46 const bool kColorDefaultValue = false; | 53 const bool kColorDefaultValue = false; |
47 const bool kLandscapeDefaultValue = false; | 54 const bool kLandscapeDefaultValue = false; |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
225 #endif | 232 #endif |
226 printer_info->SetString(printing::kSettingPrinterName, printerName); | 233 printer_info->SetString(printing::kSettingPrinterName, printerName); |
227 printer_info->SetString(printing::kSettingDeviceName, iter->printer_name); | 234 printer_info->SetString(printing::kSettingDeviceName, iter->printer_name); |
228 printers->Append(printer_info); | 235 printers->Append(printer_info); |
229 } | 236 } |
230 VLOG(1) << "Enumerate printers finished, found " << i << " printers"; | 237 VLOG(1) << "Enumerate printers finished, found " << i << " printers"; |
231 | 238 |
232 BrowserThread::PostTask( | 239 BrowserThread::PostTask( |
233 BrowserThread::UI, FROM_HERE, | 240 BrowserThread::UI, FROM_HERE, |
234 NewRunnableMethod(this, | 241 NewRunnableMethod(this, |
235 &PrintSystemTaskProxy::SendPrinterList, | 242 &PrintSystemTaskProxy::SetupPrinterList, |
236 printers)); | 243 printers)); |
237 } | 244 } |
238 | 245 |
239 void SendPrinterList(ListValue* printers) { | 246 void SetupPrinterList(ListValue* printers) { |
240 if (handler_) | 247 if (handler_) { |
241 handler_->SendPrinterList(*printers); | 248 handler_->SetupPrinterList(*printers); |
249 } | |
242 delete printers; | 250 delete printers; |
243 } | 251 } |
244 | 252 |
245 void GetPrinterCapabilities(const std::string& printer_name) { | 253 void GetPrinterCapabilities(const std::string& printer_name) { |
246 VLOG(1) << "Get printer capabilities start for " << printer_name; | 254 VLOG(1) << "Get printer capabilities start for " << printer_name; |
247 printing::PrinterCapsAndDefaults printer_info; | 255 printing::PrinterCapsAndDefaults printer_info; |
248 bool supports_color = true; | 256 bool supports_color = true; |
249 if (!print_backend_->GetPrinterCapsAndDefaults(printer_name, | 257 if (!print_backend_->GetPrinterCapsAndDefaults(printer_name, |
250 &printer_info)) { | 258 &printer_info)) { |
251 return; | 259 return; |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
367 web_ui_->RegisterMessageCallback("getPrinters", | 375 web_ui_->RegisterMessageCallback("getPrinters", |
368 NewCallback(this, &PrintPreviewHandler::HandleGetPrinters)); | 376 NewCallback(this, &PrintPreviewHandler::HandleGetPrinters)); |
369 web_ui_->RegisterMessageCallback("getPreview", | 377 web_ui_->RegisterMessageCallback("getPreview", |
370 NewCallback(this, &PrintPreviewHandler::HandleGetPreview)); | 378 NewCallback(this, &PrintPreviewHandler::HandleGetPreview)); |
371 web_ui_->RegisterMessageCallback("print", | 379 web_ui_->RegisterMessageCallback("print", |
372 NewCallback(this, &PrintPreviewHandler::HandlePrint)); | 380 NewCallback(this, &PrintPreviewHandler::HandlePrint)); |
373 web_ui_->RegisterMessageCallback("getPrinterCapabilities", | 381 web_ui_->RegisterMessageCallback("getPrinterCapabilities", |
374 NewCallback(this, &PrintPreviewHandler::HandleGetPrinterCapabilities)); | 382 NewCallback(this, &PrintPreviewHandler::HandleGetPrinterCapabilities)); |
375 web_ui_->RegisterMessageCallback("showSystemDialog", | 383 web_ui_->RegisterMessageCallback("showSystemDialog", |
376 NewCallback(this, &PrintPreviewHandler::HandleShowSystemDialog)); | 384 NewCallback(this, &PrintPreviewHandler::HandleShowSystemDialog)); |
377 web_ui_->RegisterMessageCallback("managePrinters", | 385 web_ui_->RegisterMessageCallback("morePrinters", |
386 NewCallback(this, &PrintPreviewHandler::HandleShowSystemDialog)); | |
387 web_ui_->RegisterMessageCallback("signIn", | |
388 NewCallback(this, &PrintPreviewHandler::HandleManageCloudPrint)); | |
389 web_ui_->RegisterMessageCallback("addPrinter", | |
390 NewCallback(this, &PrintPreviewHandler::HandleManageCloudPrint)); | |
391 web_ui_->RegisterMessageCallback("manageCloudPrinters", | |
392 NewCallback(this, &PrintPreviewHandler::HandleManageCloudPrint)); | |
393 web_ui_->RegisterMessageCallback("manageLocalPrinters", | |
378 NewCallback(this, &PrintPreviewHandler::HandleManagePrinters)); | 394 NewCallback(this, &PrintPreviewHandler::HandleManagePrinters)); |
379 web_ui_->RegisterMessageCallback("closePrintPreviewTab", | 395 web_ui_->RegisterMessageCallback("closePrintPreviewTab", |
380 NewCallback(this, &PrintPreviewHandler::HandleClosePreviewTab)); | 396 NewCallback(this, &PrintPreviewHandler::HandleClosePreviewTab)); |
381 web_ui_->RegisterMessageCallback("hidePreview", | 397 web_ui_->RegisterMessageCallback("hidePreview", |
382 NewCallback(this, &PrintPreviewHandler::HandleHidePreview)); | 398 NewCallback(this, &PrintPreviewHandler::HandleHidePreview)); |
383 web_ui_->RegisterMessageCallback("cancelPendingPrintRequest", | 399 web_ui_->RegisterMessageCallback("cancelPendingPrintRequest", |
384 NewCallback(this, &PrintPreviewHandler::HandleCancelPendingPrintRequest)); | 400 NewCallback(this, &PrintPreviewHandler::HandleCancelPendingPrintRequest)); |
385 } | 401 } |
386 | 402 |
387 TabContents* PrintPreviewHandler::preview_tab() { | 403 TabContents* PrintPreviewHandler::preview_tab() { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
429 if (!settings.get()) | 445 if (!settings.get()) |
430 return; | 446 return; |
431 | 447 |
432 VLOG(1) << "Print preview request start"; | 448 VLOG(1) << "Print preview request start"; |
433 RenderViewHost* rvh = initiator_tab->render_view_host(); | 449 RenderViewHost* rvh = initiator_tab->render_view_host(); |
434 rvh->Send(new PrintMsg_PrintPreview(rvh->routing_id(), *settings)); | 450 rvh->Send(new PrintMsg_PrintPreview(rvh->routing_id(), *settings)); |
435 } | 451 } |
436 | 452 |
437 void PrintPreviewHandler::HandlePrint(const ListValue* args) { | 453 void PrintPreviewHandler::HandlePrint(const ListValue* args) { |
438 ReportStats(); | 454 ReportStats(); |
439 | |
440 // Record the number of times the user requests to regenerate preview data | 455 // Record the number of times the user requests to regenerate preview data |
441 // before printing. | 456 // before printing. |
442 UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforePrint", | 457 UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforePrint", |
443 regenerate_preview_request_count_); | 458 regenerate_preview_request_count_); |
444 | 459 |
445 TabContents* initiator_tab = GetInitiatorTab(); | 460 TabContents* initiator_tab = GetInitiatorTab(); |
446 if (initiator_tab) { | 461 if (initiator_tab) { |
447 RenderViewHost* rvh = initiator_tab->render_view_host(); | 462 RenderViewHost* rvh = initiator_tab->render_view_host(); |
448 rvh->Send(new PrintMsg_ResetScriptedPrintCount(rvh->routing_id())); | 463 rvh->Send(new PrintMsg_ResetScriptedPrintCount(rvh->routing_id())); |
449 } | 464 } |
450 | 465 |
451 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args)); | 466 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args)); |
452 if (!settings.get()) | 467 if (!settings.get()) |
453 return; | 468 return; |
454 | 469 |
455 // Initializing last_used_printer_ if it is not already initialized. | 470 // Initializing last_used_printer_ if it is not already initialized. |
456 if (!last_used_printer_) | 471 if (!last_used_printer_) |
457 last_used_printer_ = new std::string(); | 472 last_used_printer_ = new std::string(); |
458 // Storing last used printer. | 473 // Storing last used printer. |
459 settings->GetString("deviceName", last_used_printer_); | 474 settings->GetString("deviceName", last_used_printer_); |
460 | 475 |
461 bool print_to_pdf = false; | 476 bool print_to_pdf = false; |
462 settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf); | 477 settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf); |
463 | 478 |
464 TabContentsWrapper* preview_tab_wrapper = | 479 TabContentsWrapper* preview_tab_wrapper = |
465 TabContentsWrapper::GetCurrentWrapperForContents(preview_tab()); | 480 TabContentsWrapper::GetCurrentWrapperForContents(preview_tab()); |
466 | 481 |
467 if (print_to_pdf) { | 482 bool print_to_cloud = settings->HasKey(printing::kSettingCloudPrintId); |
483 if (print_to_cloud) { | |
484 std::string print_ticket; | |
485 args->GetString(1, &print_ticket); | |
486 SendCloudPrintJob(*settings, print_ticket); | |
487 } else if (print_to_pdf) { | |
468 ReportUserActionHistogram(PRINT_TO_PDF); | 488 ReportUserActionHistogram(PRINT_TO_PDF); |
469 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPDF", | 489 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPDF", |
470 GetPageCountFromSettingsDictionary(*settings)); | 490 GetPageCountFromSettingsDictionary(*settings)); |
471 | 491 |
472 // Pre-populating select file dialog with print job title. | 492 // Pre-populating select file dialog with print job title. |
473 string16 print_job_title_utf16 = | 493 string16 print_job_title_utf16 = |
474 preview_tab_wrapper->print_view_manager()->RenderSourceName(); | 494 preview_tab_wrapper->print_view_manager()->RenderSourceName(); |
475 | 495 |
476 #if defined(OS_WIN) | 496 #if defined(OS_WIN) |
477 FilePath::StringType print_job_title(print_job_title_utf16); | 497 FilePath::StringType print_job_title(print_job_title_utf16); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
537 print_backend_.get(), | 557 print_backend_.get(), |
538 has_logged_printers_count_); | 558 has_logged_printers_count_); |
539 | 559 |
540 BrowserThread::PostTask( | 560 BrowserThread::PostTask( |
541 BrowserThread::FILE, FROM_HERE, | 561 BrowserThread::FILE, FROM_HERE, |
542 NewRunnableMethod(task.get(), | 562 NewRunnableMethod(task.get(), |
543 &PrintSystemTaskProxy::GetPrinterCapabilities, | 563 &PrintSystemTaskProxy::GetPrinterCapabilities, |
544 printer_name)); | 564 printer_name)); |
545 } | 565 } |
546 | 566 |
567 void PrintPreviewHandler::HandleManageCloudPrint(const ListValue* args) { | |
Lei Zhang
2011/06/14 01:08:08
nit: leave off args since it's unused.
Albert Bodenhamer
2011/06/14 19:43:54
Done.
| |
568 Browser* browser = BrowserList::GetLastActive(); | |
569 browser->OpenURL(CloudPrintURL(browser->profile()). | |
570 GetCloudPrintServiceManageURL(), | |
571 GURL(), | |
572 NEW_FOREGROUND_TAB, | |
573 PageTransition::LINK); | |
574 } | |
575 | |
547 void PrintPreviewHandler::HandleShowSystemDialog(const ListValue* args) { | 576 void PrintPreviewHandler::HandleShowSystemDialog(const ListValue* args) { |
548 ReportStats(); | 577 ReportStats(); |
549 ReportUserActionHistogram(FALLBACK_TO_ADVANCED_SETTINGS_DIALOG); | 578 ReportUserActionHistogram(FALLBACK_TO_ADVANCED_SETTINGS_DIALOG); |
550 | 579 |
551 TabContents* initiator_tab = GetInitiatorTab(); | 580 TabContents* initiator_tab = GetInitiatorTab(); |
552 if (!initiator_tab) | 581 if (!initiator_tab) |
553 return; | 582 return; |
554 initiator_tab->Activate(); | 583 initiator_tab->Activate(); |
555 | 584 |
556 TabContentsWrapper* wrapper = | 585 TabContentsWrapper* wrapper = |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
594 VLOG(1) << "Get printer capabilities finished"; | 623 VLOG(1) << "Get printer capabilities finished"; |
595 web_ui_->CallJavascriptFunction("updateWithPrinterCapabilities", | 624 web_ui_->CallJavascriptFunction("updateWithPrinterCapabilities", |
596 settings_info); | 625 settings_info); |
597 } | 626 } |
598 | 627 |
599 void PrintPreviewHandler::SendDefaultPrinter( | 628 void PrintPreviewHandler::SendDefaultPrinter( |
600 const StringValue& default_printer) { | 629 const StringValue& default_printer) { |
601 web_ui_->CallJavascriptFunction("setDefaultPrinter", default_printer); | 630 web_ui_->CallJavascriptFunction("setDefaultPrinter", default_printer); |
602 } | 631 } |
603 | 632 |
604 void PrintPreviewHandler::SendPrinterList(const ListValue& printers) { | 633 void PrintPreviewHandler::SetupPrinterList(const ListValue& printers) { |
605 web_ui_->CallJavascriptFunction("setPrinters", printers); | 634 SendCloudPrintEnabled(); |
635 web_ui_->CallJavascriptFunction("setPrinters", printers, | |
636 *(Value::CreateBooleanValue(true))); | |
637 } | |
638 | |
639 void PrintPreviewHandler::SendCloudPrintEnabled() { | |
640 #if defined(OS_CHROMEOS) | |
641 bool enable_cloud_print_integration = true; | |
642 #else | |
643 bool enable_cloud_print_integration = | |
644 CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableCloudPrint); | |
645 #endif | |
646 GURL gcp_url(CloudPrintURL(BrowserList::GetLastActive()->profile()). | |
647 GetCloudPrintServiceURL()); | |
648 FundamentalValue enable(enable_cloud_print_integration); | |
649 StringValue gcp_url_value(gcp_url.spec()); | |
650 web_ui_->CallJavascriptFunction("setUseCloudPrint", enable, gcp_url_value); | |
651 } | |
652 | |
653 void PrintPreviewHandler::SendCloudPrintJob(const DictionaryValue& settings, | |
654 std::string print_ticket) { | |
655 scoped_refptr<RefCountedBytes> data; | |
656 PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(web_ui_); | |
657 print_preview_ui->GetPrintPreviewData(&data); | |
658 CHECK(data->front()); | |
659 DCHECK_GT(data->size(), 0U); | |
660 | |
661 // BASE64 encode the job data. | |
662 std::string raw_data(reinterpret_cast<const char*>(data->front()), | |
663 data->size()); | |
664 std::string base64_data; | |
665 if (!base::Base64Encode(raw_data, &base64_data)) { | |
666 NOTREACHED() << "Base64 encoding PDF data."; | |
667 } | |
668 | |
669 TabContentsWrapper* wrapper = | |
670 TabContentsWrapper::GetCurrentWrapperForContents(preview_tab()); | |
671 string16 print_job_title_utf16 = | |
672 wrapper->print_view_manager()->RenderSourceName(); | |
673 std::string print_job_title = UTF16ToUTF8(print_job_title_utf16); | |
674 std::string printer_id; | |
675 settings.GetString("cloudPrintID", &printer_id); | |
676 | |
677 const char prolog[] = "------CloudPrintFormBoundaryjc9wuprokl8i\r\n" | |
678 "Content-Disposition: form-data; name=\"capabilities\"\r\n\r\n%s\r\n" | |
679 "------CloudPrintFormBoundaryjc9wuprokl8i\r\n" | |
680 "Content-Disposition: form-data; name=\"contentType\"\r\n\r\ndataUrl\r\n" | |
681 "------CloudPrintFormBoundaryjc9wuprokl8i\r\n" | |
682 "Content-Disposition: form-data; name=\"title\"\r\n\r\n%s\r\n" | |
683 "------CloudPrintFormBoundaryjc9wuprokl8i\r\n" | |
684 "Content-Disposition: form-data; name=\"printerid\"\r\n\r\n%s\r\n" | |
685 "------CloudPrintFormBoundaryjc9wuprokl8i\r\n" | |
686 "Content-Disposition: form-data; name=\"content\"\r\n\r\n" | |
687 "data:application/pdf;base64,%s\r\n" | |
688 "------CloudPrintFormBoundaryjc9wuprokl8i\r\n"; | |
689 | |
690 std::string final_data; | |
691 base::SStringPrintf(&final_data, | |
692 prolog, | |
693 print_ticket.c_str(), | |
694 print_job_title.c_str(), | |
695 printer_id.c_str(), | |
696 base64_data.c_str()); | |
697 | |
698 StringValue data_value(final_data); | |
699 | |
700 web_ui_->CallJavascriptFunction("printToCloud", | |
701 data_value); | |
606 } | 702 } |
607 | 703 |
608 TabContents* PrintPreviewHandler::GetInitiatorTab() { | 704 TabContents* PrintPreviewHandler::GetInitiatorTab() { |
609 printing::PrintPreviewTabController* tab_controller = | 705 printing::PrintPreviewTabController* tab_controller = |
610 printing::PrintPreviewTabController::GetInstance(); | 706 printing::PrintPreviewTabController::GetInstance(); |
611 if (!tab_controller) | 707 if (!tab_controller) |
612 return NULL; | 708 return NULL; |
613 return tab_controller->GetInitiatorTab(preview_tab()); | 709 return tab_controller->GetInitiatorTab(preview_tab()); |
614 } | 710 } |
615 | 711 |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
691 if (initiator_tab) { | 787 if (initiator_tab) { |
692 // We no longer require the intiator tab details. Remove those details | 788 // We no longer require the intiator tab details. Remove those details |
693 // associated with the preview tab to allow the initiator tab to create | 789 // associated with the preview tab to allow the initiator tab to create |
694 // another preview tab. | 790 // another preview tab. |
695 printing::PrintPreviewTabController* tab_controller = | 791 printing::PrintPreviewTabController* tab_controller = |
696 printing::PrintPreviewTabController::GetInstance(); | 792 printing::PrintPreviewTabController::GetInstance(); |
697 if (tab_controller) | 793 if (tab_controller) |
698 tab_controller->EraseInitiatorTabInfo(preview_tab()); | 794 tab_controller->EraseInitiatorTabInfo(preview_tab()); |
699 } | 795 } |
700 } | 796 } |
OLD | NEW |