| 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 c0db5272edfa1575e71a59516b955e43cceaf0f0..ff714efda116b3fea73f0418ba1baa08cc4921e6 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>
|
|
|
| @@ -228,13 +235,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;
|
| }
|
|
|
| @@ -370,7 +378,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));
|
| @@ -428,7 +444,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",
|
| @@ -456,7 +471,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));
|
| @@ -512,6 +532,15 @@ void PrintPreviewHandler::HandleGetPrinterCapabilities(
|
| printer_name));
|
| }
|
|
|
| +void PrintPreviewHandler::HandleManageCloudPrint(const ListValue* args) {
|
| + 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);
|
| @@ -569,8 +598,80 @@ 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());
|
| + if (enable_cloud_print_integration) {
|
| + RenderViewHost* rvh = web_ui_->GetRenderViewHost();
|
| + rvh->Send(new PrintMsg_PrintSetupWhitelist(rvh->routing_id(),
|
| + gcp_url.host()));
|
| + }
|
| + 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() {
|
| @@ -582,6 +683,11 @@ TabContents* PrintPreviewHandler::GetInitiatorTab() {
|
| }
|
|
|
| void PrintPreviewHandler::ClosePrintPreviewTab() {
|
| + RenderViewHost* rvh = web_ui_->GetRenderViewHost();
|
| + GURL gcp_url(CloudPrintURL(BrowserList::GetLastActive()->profile()).
|
| + GetCloudPrintServiceURL());
|
| + rvh->Send(new PrintMsg_PrintTeardownWhitelist(rvh->routing_id(),
|
| + gcp_url.host()));
|
| Browser* preview_tab_browser = BrowserList::FindBrowserWithID(
|
| preview_tab()->controller().window_id().id());
|
| if (!preview_tab_browser)
|
|
|