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

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: Resolved new conflictswq Created 9 years, 5 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
« no previous file with comments | « chrome/browser/ui/webui/print_preview_handler.h ('k') | chrome/renderer/print_web_view_helper.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 aeebe64fc1374bdbd524b189f899dcbf1fa409eb..2dee625872159036bc8ce80ed0c71e75c2fc794a 100644
--- a/chrome/browser/ui/webui/print_preview_handler.cc
+++ b/chrome/browser/ui/webui/print_preview_handler.cc
@@ -6,6 +6,10 @@
#include <string>
+#include "base/base64.h"
+#if !defined(OS_CHROMEOS)
+#include "base/command_line.h"
+#endif
#include "base/i18n/file_util_icu.h"
#include "base/json/json_reader.h"
#include "base/memory/ref_counted.h"
@@ -18,6 +22,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/sessions/restore_tab_helper.h"
@@ -26,6 +31,9 @@
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
#include "chrome/browser/ui/webui/print_preview_ui.h"
#include "chrome/common/chrome_paths.h"
+#if !defined(OS_CHROMEOS)
+#include "chrome/common/chrome_switches.h"
+#endif
#include "chrome/common/print_messages.h"
#include "content/browser/browser_thread.h"
#include "content/browser/renderer_host/render_view_host.h"
@@ -176,28 +184,38 @@ class PrintSystemTaskProxy
void GetDefaultPrinter() {
VLOG(1) << "Get default printer start";
StringValue* default_printer = NULL;
- if (PrintPreviewHandler::last_used_printer_ == NULL) {
+ if (PrintPreviewHandler::last_used_printer_name_ == NULL) {
default_printer = new StringValue(
print_backend_->GetDefaultPrinterName());
} else {
default_printer = new StringValue(
- *PrintPreviewHandler::last_used_printer_);
+ *PrintPreviewHandler::last_used_printer_name_);
}
std::string default_printer_string;
default_printer->GetAsString(&default_printer_string);
VLOG(1) << "Get default printer finished, found: "
<< default_printer_string;
+ StringValue* cloud_print_data = NULL;
+ if (PrintPreviewHandler::last_used_printer_cloud_print_data_ != NULL) {
+ cloud_print_data = new StringValue(
+ *PrintPreviewHandler::last_used_printer_cloud_print_data_);
+ } else {
+ cloud_print_data = new StringValue("");
+ }
+
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
NewRunnableMethod(this,
&PrintSystemTaskProxy::SendDefaultPrinter,
- default_printer));
+ default_printer,
+ cloud_print_data));
}
- void SendDefaultPrinter(StringValue* default_printer) {
+ void SendDefaultPrinter(const StringValue* default_printer,
+ const StringValue* cloud_print_data) {
if (handler_)
- handler_->SendDefaultPrinter(*default_printer);
+ handler_->SendDefaultPrinter(*default_printer, *cloud_print_data);
delete default_printer;
}
@@ -235,13 +253,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;
}
@@ -366,7 +385,8 @@ class PrintToPdfTask : public Task {
// static
FilePath* PrintPreviewHandler::last_saved_path_ = NULL;
-std::string* PrintPreviewHandler::last_used_printer_ = NULL;
+std::string* PrintPreviewHandler::last_used_printer_cloud_print_data_ = NULL;
+std::string* PrintPreviewHandler::last_used_printer_name_ = NULL;
PrintPreviewHandler::PrintPreviewHandler()
: print_backend_(printing::PrintBackend::CreateInstance(NULL)),
@@ -395,7 +415,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("addCloudPrinter",
+ 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));
@@ -403,6 +431,8 @@ void PrintPreviewHandler::RegisterMessages() {
NewCallback(this, &PrintPreviewHandler::HandleHidePreview));
web_ui_->RegisterMessageCallback("cancelPendingPrintRequest",
NewCallback(this, &PrintPreviewHandler::HandleCancelPendingPrintRequest));
+ web_ui_->RegisterMessageCallback("saveLastPrinter",
+ NewCallback(this, &PrintPreviewHandler::HandleSaveLastPrinter));
}
TabContents* PrintPreviewHandler::preview_tab() {
@@ -476,19 +506,18 @@ void PrintPreviewHandler::HandlePrint(const ListValue* args) {
if (!settings.get())
return;
- // Initializing last_used_printer_ if it is not already initialized.
- if (!last_used_printer_)
- last_used_printer_ = new std::string();
- // Storing last used printer.
- settings->GetString("deviceName", last_used_printer_);
-
bool print_to_pdf = false;
settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf);
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));
@@ -549,6 +578,21 @@ void PrintPreviewHandler::HandleCancelPendingPrintRequest(
delete TabContentsWrapper::GetCurrentWrapperForContents(preview_tab());
}
+void PrintPreviewHandler::HandleSaveLastPrinter(
+ const ListValue* args) {
+ std::string data_to_save;
+ if (args->GetString(0, &data_to_save) && !data_to_save.empty()) {
+ if (last_used_printer_name_ == NULL)
+ last_used_printer_name_ = new std::string();
+ *last_used_printer_name_ = data_to_save;
+ }
+ if (args->GetString(1, &data_to_save) && !data_to_save.empty()) {
+ if (last_used_printer_cloud_print_data_ == NULL)
+ last_used_printer_cloud_print_data_ = new std::string();
+ *last_used_printer_cloud_print_data_ = data_to_save;
+ }
+}
+
void PrintPreviewHandler::HandleGetPrinterCapabilities(
const ListValue* args) {
std::string printer_name;
@@ -568,6 +612,15 @@ void PrintPreviewHandler::HandleGetPrinterCapabilities(
printer_name));
}
+void PrintPreviewHandler::HandleManageCloudPrint(const ListValue*) {
+ 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);
@@ -620,12 +673,90 @@ void PrintPreviewHandler::SendPrinterCapabilities(
}
void PrintPreviewHandler::SendDefaultPrinter(
- const StringValue& default_printer) {
- web_ui_->CallJavascriptFunction("setDefaultPrinter", default_printer);
+ const StringValue& default_printer,
+ const StringValue& cloud_print_data) {
+ web_ui_->CallJavascriptFunction("setDefaultPrinter",
+ default_printer,
+ cloud_print_data);
+}
+
+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::SendPrinterList(const ListValue& printers) {
- web_ui_->CallJavascriptFunction("setPrinters", printers);
+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);
+
+ 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);
+// 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.";
+ }
+
+ const char boundary[] = "----CloudPrintFormBoundaryjc9wuprokl8i";
+ const char prolog[] = "--%s\r\n"
+ "Content-Disposition: form-data; name=\"capabilities\"\r\n\r\n%s\r\n"
+ "--%s\r\n"
+ "Content-Disposition: form-data; name=\"contentType\"\r\n\r\ndataUrl\r\n"
+ "--%s\r\n"
+ "Content-Disposition: form-data; name=\"title\"\r\n\r\n%s\r\n"
+ "--%s\r\n"
+ "Content-Disposition: form-data; name=\"printerid\"\r\n\r\n%s\r\n"
+ "--%s\r\n"
+ "Content-Disposition: form-data; name=\"content\"\r\n\r\n"
+ "data:application/pdf;base64,%s\r\n"
+ "--%s\r\n";
+
+// TODO(abodenha@chromium.org) This implies a large copy operation.
+// Profile this and optimize if necessary.
+ std::string final_data;
+ base::SStringPrintf(&final_data,
+ prolog,
+ boundary,
+ print_ticket.c_str(),
+ boundary,
+ boundary,
+ print_job_title.c_str(),
+ boundary,
+ printer_id.c_str(),
+ boundary,
+ base64_data.c_str(),
+ boundary);
+
+ StringValue data_value(final_data);
+
+ web_ui_->CallJavascriptFunction("printToCloud",
+ data_value);
}
TabContents* PrintPreviewHandler::GetInitiatorTab() {
« no previous file with comments | « chrome/browser/ui/webui/print_preview_handler.h ('k') | chrome/renderer/print_web_view_helper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698