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

Unified 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 side-by-side diff with in-line comments
Download patch
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() {

Powered by Google App Engine
This is Rietveld 408576698