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

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

Issue 7038028: Initial support for cloudprint in print preview (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Review feedback Created 9 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) 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
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
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 } 399 }
384 400
385 TabContents* PrintPreviewHandler::preview_tab() { 401 TabContents* PrintPreviewHandler::preview_tab() {
386 return web_ui_->tab_contents(); 402 return web_ui_->tab_contents();
387 } 403 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 if (!settings.get()) 443 if (!settings.get())
428 return; 444 return;
429 445
430 VLOG(1) << "Print preview request start"; 446 VLOG(1) << "Print preview request start";
431 RenderViewHost* rvh = initiator_tab->render_view_host(); 447 RenderViewHost* rvh = initiator_tab->render_view_host();
432 rvh->Send(new PrintMsg_PrintPreview(rvh->routing_id(), *settings)); 448 rvh->Send(new PrintMsg_PrintPreview(rvh->routing_id(), *settings));
433 } 449 }
434 450
435 void PrintPreviewHandler::HandlePrint(const ListValue* args) { 451 void PrintPreviewHandler::HandlePrint(const ListValue* args) {
436 ReportStats(); 452 ReportStats();
437
438 // Record the number of times the user requests to regenerate preview data 453 // Record the number of times the user requests to regenerate preview data
439 // before printing. 454 // before printing.
440 UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforePrint", 455 UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforePrint",
441 regenerate_preview_request_count_); 456 regenerate_preview_request_count_);
442 457
443 TabContents* initiator_tab = GetInitiatorTab(); 458 TabContents* initiator_tab = GetInitiatorTab();
444 if (initiator_tab) { 459 if (initiator_tab) {
445 RenderViewHost* rvh = initiator_tab->render_view_host(); 460 RenderViewHost* rvh = initiator_tab->render_view_host();
446 rvh->Send(new PrintMsg_ResetScriptedPrintCount(rvh->routing_id())); 461 rvh->Send(new PrintMsg_ResetScriptedPrintCount(rvh->routing_id()));
447 } 462 }
448 463
449 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args)); 464 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args));
450 if (!settings.get()) 465 if (!settings.get())
451 return; 466 return;
452 467
453 // Initializing last_used_printer_ if it is not already initialized. 468 // Initializing last_used_printer_ if it is not already initialized.
454 if (!last_used_printer_) 469 if (!last_used_printer_)
455 last_used_printer_ = new std::string(); 470 last_used_printer_ = new std::string();
456 // Storing last used printer. 471 // Storing last used printer.
457 settings->GetString("deviceName", last_used_printer_); 472 settings->GetString("deviceName", last_used_printer_);
458 473
459 bool print_to_pdf = false; 474 bool print_to_pdf = false;
460 settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf); 475 settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf);
461 476
462 TabContentsWrapper* preview_tab_wrapper = 477 TabContentsWrapper* preview_tab_wrapper =
463 TabContentsWrapper::GetCurrentWrapperForContents(preview_tab()); 478 TabContentsWrapper::GetCurrentWrapperForContents(preview_tab());
464 479
465 if (print_to_pdf) { 480 bool print_to_cloud = settings->HasKey(printing::kSettingCloudPrintId);
481 if (print_to_cloud) {
482 std::string print_ticket;
483 args->GetString(1, &print_ticket);
484 SendCloudPrintJob(*settings, print_ticket);
485 } else if (print_to_pdf) {
466 ReportUserActionHistogram(PRINT_TO_PDF); 486 ReportUserActionHistogram(PRINT_TO_PDF);
467 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPDF", 487 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPDF",
468 GetPageCountFromSettingsDictionary(*settings)); 488 GetPageCountFromSettingsDictionary(*settings));
469 489
470 // Pre-populating select file dialog with print job title. 490 // Pre-populating select file dialog with print job title.
471 string16 print_job_title_utf16 = 491 string16 print_job_title_utf16 =
472 preview_tab_wrapper->print_view_manager()->RenderSourceName(); 492 preview_tab_wrapper->print_view_manager()->RenderSourceName();
473 493
474 #if defined(OS_WIN) 494 #if defined(OS_WIN)
475 FilePath::StringType print_job_title(print_job_title_utf16); 495 FilePath::StringType print_job_title(print_job_title_utf16);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 print_backend_.get(), 536 print_backend_.get(),
517 has_logged_printers_count_); 537 has_logged_printers_count_);
518 538
519 BrowserThread::PostTask( 539 BrowserThread::PostTask(
520 BrowserThread::FILE, FROM_HERE, 540 BrowserThread::FILE, FROM_HERE,
521 NewRunnableMethod(task.get(), 541 NewRunnableMethod(task.get(),
522 &PrintSystemTaskProxy::GetPrinterCapabilities, 542 &PrintSystemTaskProxy::GetPrinterCapabilities,
523 printer_name)); 543 printer_name));
524 } 544 }
525 545
546 void PrintPreviewHandler::HandleManageCloudPrint(const ListValue* args) {
547 Browser* browser = BrowserList::GetLastActive();
548 browser->OpenURL(CloudPrintURL(browser->profile()).
549 GetCloudPrintServiceManageURL(),
550 GURL(),
551 NEW_FOREGROUND_TAB,
552 PageTransition::LINK);
553 }
554
526 void PrintPreviewHandler::HandleShowSystemDialog(const ListValue* args) { 555 void PrintPreviewHandler::HandleShowSystemDialog(const ListValue* args) {
527 ReportStats(); 556 ReportStats();
528 ReportUserActionHistogram(FALLBACK_TO_ADVANCED_SETTINGS_DIALOG); 557 ReportUserActionHistogram(FALLBACK_TO_ADVANCED_SETTINGS_DIALOG);
529 558
530 TabContents* initiator_tab = GetInitiatorTab(); 559 TabContents* initiator_tab = GetInitiatorTab();
531 if (!initiator_tab) 560 if (!initiator_tab)
532 return; 561 return;
533 initiator_tab->Activate(); 562 initiator_tab->Activate();
534 563
535 TabContentsWrapper* wrapper = 564 TabContentsWrapper* wrapper =
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 VLOG(1) << "Get printer capabilities finished"; 602 VLOG(1) << "Get printer capabilities finished";
574 web_ui_->CallJavascriptFunction("updateWithPrinterCapabilities", 603 web_ui_->CallJavascriptFunction("updateWithPrinterCapabilities",
575 settings_info); 604 settings_info);
576 } 605 }
577 606
578 void PrintPreviewHandler::SendDefaultPrinter( 607 void PrintPreviewHandler::SendDefaultPrinter(
579 const StringValue& default_printer) { 608 const StringValue& default_printer) {
580 web_ui_->CallJavascriptFunction("setDefaultPrinter", default_printer); 609 web_ui_->CallJavascriptFunction("setDefaultPrinter", default_printer);
581 } 610 }
582 611
583 void PrintPreviewHandler::SendPrinterList(const ListValue& printers) { 612 void PrintPreviewHandler::SetupPrinterList(const ListValue& printers) {
584 web_ui_->CallJavascriptFunction("setPrinters", printers); 613 SendCloudPrintEnabled();
614 web_ui_->CallJavascriptFunction("setPrinters", printers,
615 *(Value::CreateBooleanValue(true)));
616 }
617
618 void PrintPreviewHandler::SendCloudPrintEnabled() {
619 #if defined(OS_CHROMEOS)
620 bool enable_cloud_print_integration = true;
621 #else
622 bool enable_cloud_print_integration =
623 CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableCloudPrint);
624 #endif
625 GURL gcp_url(CloudPrintURL(BrowserList::GetLastActive()->profile()).
626 GetCloudPrintServiceURL());
627 if (enable_cloud_print_integration) {
628 RenderViewHost* rvh = web_ui_->GetRenderViewHost();
629 rvh->Send(new PrintMsg_PrintSetupWhitelist(rvh->routing_id(),
630 gcp_url.host()));
631 }
632 FundamentalValue enable(enable_cloud_print_integration);
633 StringValue gcp_url_value(gcp_url.spec());
634 web_ui_->CallJavascriptFunction("setUseCloudPrint", enable, gcp_url_value);
635 }
636
637 void PrintPreviewHandler::SendCloudPrintJob(const DictionaryValue& settings,
638 std::string print_ticket) {
639 scoped_refptr<RefCountedBytes> data;
640 PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(web_ui_);
641 print_preview_ui->GetPrintPreviewData(&data);
642 CHECK(data->front());
643 DCHECK_GT(data->size(), 0U);
644
645 // BASE64 encode the job data.
646 std::string raw_data(reinterpret_cast<const char*>(data->front()),
647 data->size());
648 std::string base64_data;
649 if (!base::Base64Encode(raw_data, &base64_data)) {
650 NOTREACHED() << "Base64 encoding PDF data.";
651 }
652
653 TabContentsWrapper* wrapper =
654 TabContentsWrapper::GetCurrentWrapperForContents(preview_tab());
655 string16 print_job_title_utf16 =
656 wrapper->print_view_manager()->RenderSourceName();
657 std::string print_job_title = UTF16ToUTF8(print_job_title_utf16);
658 std::string printer_id;
659 settings.GetString("cloudPrintID", &printer_id);
660
661 const char prolog[] = "------CloudPrintFormBoundaryjc9wuprokl8i\r\n"
662 "Content-Disposition: form-data; name=\"capabilities\"\r\n\r\n%s\r\n"
663 "------CloudPrintFormBoundaryjc9wuprokl8i\r\n"
664 "Content-Disposition: form-data; name=\"contentType\"\r\n\r\ndataUrl\r\n"
665 "------CloudPrintFormBoundaryjc9wuprokl8i\r\n"
666 "Content-Disposition: form-data; name=\"title\"\r\n\r\n%s\r\n"
667 "------CloudPrintFormBoundaryjc9wuprokl8i\r\n"
668 "Content-Disposition: form-data; name=\"printerid\"\r\n\r\n%s\r\n"
669 "------CloudPrintFormBoundaryjc9wuprokl8i\r\n"
670 "Content-Disposition: form-data; name=\"content\"\r\n\r\n"
671 "data:application/pdf;base64,%s\r\n"
672 "------CloudPrintFormBoundaryjc9wuprokl8i\r\n";
673
674 std::string final_data;
675 base::SStringPrintf(&final_data,
676 prolog,
677 print_ticket.c_str(),
678 print_job_title.c_str(),
679 printer_id.c_str(),
680 base64_data.c_str());
681
682 StringValue data_value(final_data);
683
684 web_ui_->CallJavascriptFunction("printToCloud",
685 data_value);
585 } 686 }
586 687
587 TabContents* PrintPreviewHandler::GetInitiatorTab() { 688 TabContents* PrintPreviewHandler::GetInitiatorTab() {
588 printing::PrintPreviewTabController* tab_controller = 689 printing::PrintPreviewTabController* tab_controller =
589 printing::PrintPreviewTabController::GetInstance(); 690 printing::PrintPreviewTabController::GetInstance();
590 if (!tab_controller) 691 if (!tab_controller)
591 return NULL; 692 return NULL;
592 return tab_controller->GetInitiatorTab(preview_tab()); 693 return tab_controller->GetInitiatorTab(preview_tab());
593 } 694 }
594 695
595 void PrintPreviewHandler::ClosePrintPreviewTab() { 696 void PrintPreviewHandler::ClosePrintPreviewTab() {
697 RenderViewHost* rvh = web_ui_->GetRenderViewHost();
698 GURL gcp_url(CloudPrintURL(BrowserList::GetLastActive()->profile()).
699 GetCloudPrintServiceURL());
700 rvh->Send(new PrintMsg_PrintTeardownWhitelist(rvh->routing_id(),
701 gcp_url.host()));
596 Browser* preview_tab_browser = BrowserList::FindBrowserWithID( 702 Browser* preview_tab_browser = BrowserList::FindBrowserWithID(
597 preview_tab()->controller().window_id().id()); 703 preview_tab()->controller().window_id().id());
598 if (!preview_tab_browser) 704 if (!preview_tab_browser)
599 return; 705 return;
600 TabStripModel* tabstrip = preview_tab_browser->tabstrip_model(); 706 TabStripModel* tabstrip = preview_tab_browser->tabstrip_model();
601 707
602 // Keep print preview tab out of the recently closed tab list, because 708 // Keep print preview tab out of the recently closed tab list, because
603 // re-opening that page will just display a non-functional print preview page. 709 // re-opening that page will just display a non-functional print preview page.
604 tabstrip->CloseTabContentsAt(tabstrip->GetIndexOfController( 710 tabstrip->CloseTabContentsAt(tabstrip->GetIndexOfController(
605 &preview_tab()->controller()), TabStripModel::CLOSE_NONE); 711 &preview_tab()->controller()), TabStripModel::CLOSE_NONE);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
670 if (initiator_tab) { 776 if (initiator_tab) {
671 // We no longer require the intiator tab details. Remove those details 777 // We no longer require the intiator tab details. Remove those details
672 // associated with the preview tab to allow the initiator tab to create 778 // associated with the preview tab to allow the initiator tab to create
673 // another preview tab. 779 // another preview tab.
674 printing::PrintPreviewTabController* tab_controller = 780 printing::PrintPreviewTabController* tab_controller =
675 printing::PrintPreviewTabController::GetInstance(); 781 printing::PrintPreviewTabController::GetInstance();
676 if (tab_controller) 782 if (tab_controller)
677 tab_controller->EraseInitiatorTabInfo(preview_tab()); 783 tab_controller->EraseInitiatorTabInfo(preview_tab());
678 } 784 }
679 } 785 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698