Chromium Code Reviews| Index: chrome/browser/ui/webui/print_preview_handler.cc |
| diff --git a/chrome/browser/ui/webui/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview_handler.cc |
| index b696a04756363f7369a6c59426c3d35e2485b53a..ae3a83f359c07dfdd9c56e0e0e5652bb56b8a34a 100644 |
| --- a/chrome/browser/ui/webui/print_preview_handler.cc |
| +++ b/chrome/browser/ui/webui/print_preview_handler.cc |
| @@ -6,6 +6,7 @@ |
| #include <string> |
| +#include "base/base64.h" |
| #include "base/i18n/file_util_icu.h" |
| #include "base/json/json_reader.h" |
| #include "base/memory/ref_counted.h" |
| @@ -18,6 +19,7 @@ |
| #include "chrome/browser/browser_process.h" |
| #include "chrome/browser/platform_util.h" |
| #include "chrome/browser/printing/background_printing_manager.h" |
| +#include "chrome/browser/printing/cloud_print/cloud_print_url.h" |
| #include "chrome/browser/printing/printer_manager_dialog.h" |
| #include "chrome/browser/printing/print_preview_tab_controller.h" |
| #include "chrome/browser/tabs/tab_strip_model.h" |
| @@ -35,6 +37,11 @@ |
| #include "printing/page_range.h" |
| #include "printing/print_job_constants.h" |
| +#if !defined(OS_CHROMEOS) |
| +#include "base/command_line.h" |
| +#include "chrome/common/chrome_switches.h" |
| +#endif |
| + |
| #if defined(USE_CUPS) |
| #include <cups/cups.h> |
| @@ -232,13 +239,14 @@ class PrintSystemTaskProxy |
| BrowserThread::PostTask( |
| BrowserThread::UI, FROM_HERE, |
| NewRunnableMethod(this, |
| - &PrintSystemTaskProxy::SendPrinterList, |
| + &PrintSystemTaskProxy::SetupPrinterList, |
| printers)); |
| } |
| - void SendPrinterList(ListValue* printers) { |
| - if (handler_) |
| - handler_->SendPrinterList(*printers); |
| + void SetupPrinterList(ListValue* printers) { |
| + if (handler_) { |
| + handler_->SetupPrinterList(*printers); |
| + } |
| delete printers; |
| } |
| @@ -374,7 +382,15 @@ void PrintPreviewHandler::RegisterMessages() { |
| NewCallback(this, &PrintPreviewHandler::HandleGetPrinterCapabilities)); |
| web_ui_->RegisterMessageCallback("showSystemDialog", |
| NewCallback(this, &PrintPreviewHandler::HandleShowSystemDialog)); |
| - web_ui_->RegisterMessageCallback("managePrinters", |
| + web_ui_->RegisterMessageCallback("morePrinters", |
| + NewCallback(this, &PrintPreviewHandler::HandleShowSystemDialog)); |
| + web_ui_->RegisterMessageCallback("signIn", |
| + NewCallback(this, &PrintPreviewHandler::HandleManageCloudPrint)); |
| + web_ui_->RegisterMessageCallback("addPrinter", |
| + NewCallback(this, &PrintPreviewHandler::HandleManageCloudPrint)); |
| + web_ui_->RegisterMessageCallback("manageCloudPrinters", |
| + NewCallback(this, &PrintPreviewHandler::HandleManageCloudPrint)); |
| + web_ui_->RegisterMessageCallback("manageLocalPrinters", |
| NewCallback(this, &PrintPreviewHandler::HandleManagePrinters)); |
| web_ui_->RegisterMessageCallback("closePrintPreviewTab", |
| NewCallback(this, &PrintPreviewHandler::HandleClosePreviewTab)); |
| @@ -436,7 +452,6 @@ void PrintPreviewHandler::HandleGetPreview(const ListValue* args) { |
| void PrintPreviewHandler::HandlePrint(const ListValue* args) { |
| ReportStats(); |
| - |
| // Record the number of times the user requests to regenerate preview data |
| // before printing. |
| UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforePrint", |
| @@ -464,7 +479,12 @@ void PrintPreviewHandler::HandlePrint(const ListValue* args) { |
| TabContentsWrapper* preview_tab_wrapper = |
| TabContentsWrapper::GetCurrentWrapperForContents(preview_tab()); |
| - if (print_to_pdf) { |
| + bool print_to_cloud = settings->HasKey(printing::kSettingCloudPrintId); |
| + if (print_to_cloud) { |
| + std::string print_ticket; |
| + args->GetString(1, &print_ticket); |
| + SendCloudPrintJob(*settings, print_ticket); |
| + } else if (print_to_pdf) { |
| ReportUserActionHistogram(PRINT_TO_PDF); |
| UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPDF", |
| GetPageCountFromSettingsDictionary(*settings)); |
| @@ -544,6 +564,15 @@ void PrintPreviewHandler::HandleGetPrinterCapabilities( |
| printer_name)); |
| } |
| +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.
|
| + Browser* browser = BrowserList::GetLastActive(); |
| + browser->OpenURL(CloudPrintURL(browser->profile()). |
| + GetCloudPrintServiceManageURL(), |
| + GURL(), |
| + NEW_FOREGROUND_TAB, |
| + PageTransition::LINK); |
| +} |
| + |
| void PrintPreviewHandler::HandleShowSystemDialog(const ListValue* args) { |
| ReportStats(); |
| ReportUserActionHistogram(FALLBACK_TO_ADVANCED_SETTINGS_DIALOG); |
| @@ -601,8 +630,75 @@ void PrintPreviewHandler::SendDefaultPrinter( |
| web_ui_->CallJavascriptFunction("setDefaultPrinter", default_printer); |
| } |
| -void PrintPreviewHandler::SendPrinterList(const ListValue& printers) { |
| - web_ui_->CallJavascriptFunction("setPrinters", printers); |
| +void PrintPreviewHandler::SetupPrinterList(const ListValue& printers) { |
| + SendCloudPrintEnabled(); |
| + web_ui_->CallJavascriptFunction("setPrinters", printers, |
| + *(Value::CreateBooleanValue(true))); |
| +} |
| + |
| +void PrintPreviewHandler::SendCloudPrintEnabled() { |
| +#if defined(OS_CHROMEOS) |
| + bool enable_cloud_print_integration = true; |
| +#else |
| + bool enable_cloud_print_integration = |
| + CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableCloudPrint); |
| +#endif |
| + GURL gcp_url(CloudPrintURL(BrowserList::GetLastActive()->profile()). |
| + GetCloudPrintServiceURL()); |
| + FundamentalValue enable(enable_cloud_print_integration); |
| + StringValue gcp_url_value(gcp_url.spec()); |
| + web_ui_->CallJavascriptFunction("setUseCloudPrint", enable, gcp_url_value); |
| +} |
| + |
| +void PrintPreviewHandler::SendCloudPrintJob(const DictionaryValue& settings, |
| + std::string print_ticket) { |
| + scoped_refptr<RefCountedBytes> data; |
| + PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(web_ui_); |
| + print_preview_ui->GetPrintPreviewData(&data); |
| + CHECK(data->front()); |
| + DCHECK_GT(data->size(), 0U); |
| + |
| + // BASE64 encode the job data. |
| + std::string raw_data(reinterpret_cast<const char*>(data->front()), |
| + data->size()); |
| + std::string base64_data; |
| + if (!base::Base64Encode(raw_data, &base64_data)) { |
| + NOTREACHED() << "Base64 encoding PDF data."; |
| + } |
| + |
| + TabContentsWrapper* wrapper = |
| + TabContentsWrapper::GetCurrentWrapperForContents(preview_tab()); |
| + string16 print_job_title_utf16 = |
| + wrapper->print_view_manager()->RenderSourceName(); |
| + std::string print_job_title = UTF16ToUTF8(print_job_title_utf16); |
| + std::string printer_id; |
| + settings.GetString("cloudPrintID", &printer_id); |
| + |
| + const char prolog[] = "------CloudPrintFormBoundaryjc9wuprokl8i\r\n" |
| + "Content-Disposition: form-data; name=\"capabilities\"\r\n\r\n%s\r\n" |
| + "------CloudPrintFormBoundaryjc9wuprokl8i\r\n" |
| + "Content-Disposition: form-data; name=\"contentType\"\r\n\r\ndataUrl\r\n" |
| + "------CloudPrintFormBoundaryjc9wuprokl8i\r\n" |
| + "Content-Disposition: form-data; name=\"title\"\r\n\r\n%s\r\n" |
| + "------CloudPrintFormBoundaryjc9wuprokl8i\r\n" |
| + "Content-Disposition: form-data; name=\"printerid\"\r\n\r\n%s\r\n" |
| + "------CloudPrintFormBoundaryjc9wuprokl8i\r\n" |
| + "Content-Disposition: form-data; name=\"content\"\r\n\r\n" |
| + "data:application/pdf;base64,%s\r\n" |
| + "------CloudPrintFormBoundaryjc9wuprokl8i\r\n"; |
| + |
| + std::string final_data; |
| + base::SStringPrintf(&final_data, |
| + prolog, |
| + print_ticket.c_str(), |
| + print_job_title.c_str(), |
| + printer_id.c_str(), |
| + base64_data.c_str()); |
| + |
| + StringValue data_value(final_data); |
| + |
| + web_ui_->CallJavascriptFunction("printToCloud", |
| + data_value); |
| } |
| TabContents* PrintPreviewHandler::GetInitiatorTab() { |