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

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: Lint! 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 70b2b48f1db514d31e5a042a8150db22bdbbee74..5cf7e9b1a6fa84f8a3e37deeffed7afc68009d39 100644
--- a/chrome/browser/ui/webui/print_preview_handler.cc
+++ b/chrome/browser/ui/webui/print_preview_handler.cc
@@ -6,6 +6,8 @@
#include <string>
+#include "base/base64.h"
+#include "base/command_line.h"
Lei Zhang 2011/06/09 21:23:30 move to inside a #if !defined(OS_CHROMEOS) block.
Albert Bodenhamer 2011/06/10 01:29:36 Done.
#include "base/i18n/file_util_icu.h"
#include "base/json/json_reader.h"
#include "base/memory/ref_counted.h"
@@ -18,6 +20,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"
@@ -25,15 +28,18 @@
#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"
+#include "chrome/common/chrome_switches.h"
#include "chrome/common/print_messages.h"
#include "content/browser/browser_thread.h"
#include "content/browser/renderer_host/render_view_host.h"
#include "content/browser/tab_contents/tab_contents.h"
+#include "net/base/escape.h"
#include "printing/backend/print_backend.h"
#include "printing/metafile.h"
#include "printing/metafile_impl.h"
#include "printing/page_range.h"
#include "printing/print_job_constants.h"
+#include "webkit/glue/webpreferences.h"
Lei Zhang 2011/06/09 21:23:30 not used, ditto for escape.h above.
Albert Bodenhamer 2011/06/10 01:29:36 Done.
#if defined(USE_CUPS)
#include <cups/cups.h>
@@ -222,15 +228,16 @@ class PrintSystemTaskProxy
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
NewRunnableMethod(this,
- &PrintSystemTaskProxy::SendPrinterList,
+ &PrintSystemTaskProxy::SetupPrinterList,
printers,
new FundamentalValue(default_printer_index)));
}
- void SendPrinterList(ListValue* printers,
+ void SetupPrinterList(ListValue* printers,
FundamentalValue* default_printer_index) {
- if (handler_)
- handler_->SendPrinterList(*printers, *default_printer_index);
+ if (handler_) {
+ handler_->SetupPrinterList(*printers, *default_printer_index);
+ }
delete printers;
delete default_printer_index;
}
@@ -366,7 +373,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));
@@ -424,7 +439,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",
@@ -446,7 +460,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));
@@ -479,7 +498,8 @@ void PrintPreviewHandler::HandlePrint(const ListValue* args) {
// so ignore the page range and print all pages.
settings->Remove(printing::kSettingPageRange, NULL);
RenderViewHost* rvh = web_ui_->GetRenderViewHost();
- rvh->Send(new PrintMsg_PrintForPrintPreview(rvh->routing_id(), *settings));
+ rvh->Send(new PrintMsg_PrintForPrintPreview(rvh->routing_id(),
Lei Zhang 2011/06/09 21:23:30 nit: this is an unnecessary change.
Albert Bodenhamer 2011/06/10 01:29:36 Done.
+ *settings));
}
}
@@ -502,6 +522,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);
@@ -559,11 +588,83 @@ void PrintPreviewHandler::SendDefaultPrinter(
web_ui_->CallJavascriptFunction("setDefaultPrinter", default_printer);
}
-void PrintPreviewHandler::SendPrinterList(
+void PrintPreviewHandler::SetupPrinterList(
const ListValue& printers,
const FundamentalValue& default_printer_index) {
+ SendCloudPrintEnabled();
web_ui_->CallJavascriptFunction("setPrinters", printers,
- default_printer_index);
+ default_printer_index,
+ *(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() {
@@ -575,6 +676,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)

Powered by Google App Engine
This is Rietveld 408576698