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

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: Fix bad merge Created 9 years, 7 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 d3cf30e505b257c48dbcb432e64e6d0b6904e9b7..57d312b156245558228918b464371184e3459c9f 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"
#include "base/i18n/file_util_icu.h"
#include "base/json/json_reader.h"
#include "base/metrics/histogram.h"
@@ -17,22 +19,26 @@
#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"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
-#include "chrome/browser/ui/webui/print_preview_ui_html_source.h"
#include "chrome/browser/ui/webui/print_preview_ui.h"
+#include "chrome/browser/ui/webui/print_preview_ui_html_source.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/print_job_constants.h"
+#include "webkit/glue/webpreferences.h"
#if defined(USE_CUPS)
#include <cups/cups.h>
@@ -153,15 +159,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;
}
@@ -293,7 +300,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));
@@ -358,7 +373,10 @@ 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) {
+ SendCloudPrintJob(*settings);
+ } else if (print_to_pdf) {
UMA_HISTOGRAM_ENUMERATION(kUserAction,
PRINT_TO_PDF,
USERACTION_BUCKET_BOUNDARY);
@@ -413,6 +431,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();
UMA_HISTOGRAM_ENUMERATION(kUserAction,
@@ -473,11 +500,70 @@ void PrintPreviewHandler::SendPrinterCapabilities(
settings_info);
}
-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
+ FundamentalValue enable(enable_cloud_print_integration);
+ Browser* browser = BrowserList::GetLastActive();
+ StringValue gcp_url(
+ CloudPrintURL(browser->profile()).GetCloudPrintServiceURL().spec());
+ web_ui_->CallJavascriptFunction("setUseCloudPrint", enable, gcp_url);
+}
+
+void PrintPreviewHandler::SendCloudPrintJob(const DictionaryValue& settings) {
+ PrintPreviewUIHTMLSource::PrintPreviewData data;
+ PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(web_ui_);
+ print_preview_ui->html_source()->GetPrintPreviewData(&data);
+ CHECK(data.first);
+ DCHECK_GT(data.second, 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);
+ print_job_title = EscapeQueryParamValue(print_job_title, false);
+ std::string printer_id;
+ settings.GetString("cloudPrintID", &printer_id);
+ const char prolog_base[] = "printerid=%s&"
+ "capabilities=%%7B%%22capabilities%%22%%3A%%5B%%5D%%7D&"
sanjeevr 2011/05/24 23:21:25 Hmm, might it be more readable if the string was n
Albert Bodenhamer 2011/06/09 17:33:11 This is just copied/pasted from a successful print
+ "contentType=dataUrl&"
+ "title=%s&"
+ "content=data%%3Aapplication%%2Fpdf%%3Bbase64%%2C";
+ std::string prolog;
+ base::SStringPrintf(&prolog,
+ prolog_base,
+ printer_id.c_str(),
+ print_job_title.c_str());
+ std::string raw_data;
+ raw_data.assign(reinterpret_cast<char*>(data.first->memory()), data.second);
+ std::string base64_data;
+ if (!base::Base64Encode(raw_data, &base64_data)) {
+ NOTREACHED() << "Base64 encoding PDF data.";
+ }
+
+ char* buffer;
+ size_t buffer_size = prolog.length() + base64_data.length();
+ buffer = new char[buffer_size];
+ memcpy(buffer, prolog.c_str(), prolog.length());
+ memcpy(buffer + prolog.length(), base64_data.c_str(),
Scott Byer 2011/05/24 23:40:32 Hmm, what about just adding the base64 encoded stu
Albert Bodenhamer 2011/06/09 17:33:11 Good call. That makes the code much cleaner. Don
+ base64_data.length());
+ scoped_ptr<BinaryValue> data_value(BinaryValue::Create(buffer, buffer_size));
Scott Byer 2011/05/24 23:40:32 Shouldn't need to be a BinaryValue anymore with th
Albert Bodenhamer 2011/06/09 17:33:11 Done.
+
+ web_ui_->CallJavascriptFunction("printToCloud",
+ *data_value);
}
TabContents* PrintPreviewHandler::GetInitiatorTab() {

Powered by Google App Engine
This is Rietveld 408576698