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

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: Latest merge. Removed whitelist code.wq 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 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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698