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() { |