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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/webui/print_preview_handler.h" 5 #include "chrome/browser/ui/webui/print_preview_handler.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/base64.h"
10 #include "base/command_line.h"
9 #include "base/i18n/file_util_icu.h" 11 #include "base/i18n/file_util_icu.h"
10 #include "base/json/json_reader.h" 12 #include "base/json/json_reader.h"
11 #include "base/metrics/histogram.h" 13 #include "base/metrics/histogram.h"
12 #include "base/path_service.h" 14 #include "base/path_service.h"
13 #include "base/threading/thread.h" 15 #include "base/threading/thread.h"
14 #include "base/threading/thread_restrictions.h" 16 #include "base/threading/thread_restrictions.h"
15 #include "base/utf_string_conversions.h" 17 #include "base/utf_string_conversions.h"
16 #include "base/values.h" 18 #include "base/values.h"
17 #include "chrome/browser/browser_process.h" 19 #include "chrome/browser/browser_process.h"
18 #include "chrome/browser/platform_util.h" 20 #include "chrome/browser/platform_util.h"
19 #include "chrome/browser/printing/background_printing_manager.h" 21 #include "chrome/browser/printing/background_printing_manager.h"
22 #include "chrome/browser/printing/cloud_print/cloud_print_url.h"
20 #include "chrome/browser/printing/printer_manager_dialog.h" 23 #include "chrome/browser/printing/printer_manager_dialog.h"
21 #include "chrome/browser/printing/print_preview_tab_controller.h" 24 #include "chrome/browser/printing/print_preview_tab_controller.h"
22 #include "chrome/browser/tabs/tab_strip_model.h" 25 #include "chrome/browser/tabs/tab_strip_model.h"
23 #include "chrome/browser/ui/browser_list.h" 26 #include "chrome/browser/ui/browser_list.h"
24 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" 27 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
28 #include "chrome/browser/ui/webui/print_preview_ui.h"
25 #include "chrome/browser/ui/webui/print_preview_ui_html_source.h" 29 #include "chrome/browser/ui/webui/print_preview_ui_html_source.h"
26 #include "chrome/browser/ui/webui/print_preview_ui.h"
27 #include "chrome/common/chrome_paths.h" 30 #include "chrome/common/chrome_paths.h"
31 #include "chrome/common/chrome_switches.h"
28 #include "chrome/common/print_messages.h" 32 #include "chrome/common/print_messages.h"
29 #include "content/browser/browser_thread.h" 33 #include "content/browser/browser_thread.h"
30 #include "content/browser/renderer_host/render_view_host.h" 34 #include "content/browser/renderer_host/render_view_host.h"
31 #include "content/browser/tab_contents/tab_contents.h" 35 #include "content/browser/tab_contents/tab_contents.h"
36 #include "net/base/escape.h"
32 #include "printing/backend/print_backend.h" 37 #include "printing/backend/print_backend.h"
33 #include "printing/metafile.h" 38 #include "printing/metafile.h"
34 #include "printing/metafile_impl.h" 39 #include "printing/metafile_impl.h"
35 #include "printing/print_job_constants.h" 40 #include "printing/print_job_constants.h"
41 #include "webkit/glue/webpreferences.h"
36 42
37 #if defined(USE_CUPS) 43 #if defined(USE_CUPS)
38 #include <cups/cups.h> 44 #include <cups/cups.h>
39 45
40 #include "base/file_util.h" 46 #include "base/file_util.h"
41 #endif 47 #endif
42 48
43 namespace { 49 namespace {
44 50
45 const bool kColorDefaultValue = false; 51 const bool kColorDefaultValue = false;
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 printer_info->SetString(printing::kSettingDeviceName, 152 printer_info->SetString(printing::kSettingDeviceName,
147 index->printer_name); 153 index->printer_name);
148 printers->Append(printer_info); 154 printers->Append(printer_info);
149 if (index->is_default) 155 if (index->is_default)
150 default_printer_index = i; 156 default_printer_index = i;
151 } 157 }
152 158
153 BrowserThread::PostTask( 159 BrowserThread::PostTask(
154 BrowserThread::UI, FROM_HERE, 160 BrowserThread::UI, FROM_HERE,
155 NewRunnableMethod(this, 161 NewRunnableMethod(this,
156 &PrintSystemTaskProxy::SendPrinterList, 162 &PrintSystemTaskProxy::SetupPrinterList,
157 printers, 163 printers,
158 new FundamentalValue(default_printer_index))); 164 new FundamentalValue(default_printer_index)));
159 } 165 }
160 166
161 void SendPrinterList(ListValue* printers, 167 void SetupPrinterList(ListValue* printers,
162 FundamentalValue* default_printer_index) { 168 FundamentalValue* default_printer_index) {
163 if (handler_) 169 if (handler_) {
164 handler_->SendPrinterList(*printers, *default_printer_index); 170 handler_->SetupPrinterList(*printers, *default_printer_index);
171 }
165 delete printers; 172 delete printers;
166 delete default_printer_index; 173 delete default_printer_index;
167 } 174 }
168 175
169 void GetPrinterCapabilities(const std::string& printer_name) { 176 void GetPrinterCapabilities(const std::string& printer_name) {
170 printing::PrinterCapsAndDefaults printer_info; 177 printing::PrinterCapsAndDefaults printer_info;
171 bool supports_color = true; 178 bool supports_color = true;
172 if (!print_backend_->GetPrinterCapsAndDefaults(printer_name, 179 if (!print_backend_->GetPrinterCapsAndDefaults(printer_name,
173 &printer_info)) { 180 &printer_info)) {
174 return; 181 return;
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 web_ui_->RegisterMessageCallback("getPrinters", 293 web_ui_->RegisterMessageCallback("getPrinters",
287 NewCallback(this, &PrintPreviewHandler::HandleGetPrinters)); 294 NewCallback(this, &PrintPreviewHandler::HandleGetPrinters));
288 web_ui_->RegisterMessageCallback("getPreview", 295 web_ui_->RegisterMessageCallback("getPreview",
289 NewCallback(this, &PrintPreviewHandler::HandleGetPreview)); 296 NewCallback(this, &PrintPreviewHandler::HandleGetPreview));
290 web_ui_->RegisterMessageCallback("print", 297 web_ui_->RegisterMessageCallback("print",
291 NewCallback(this, &PrintPreviewHandler::HandlePrint)); 298 NewCallback(this, &PrintPreviewHandler::HandlePrint));
292 web_ui_->RegisterMessageCallback("getPrinterCapabilities", 299 web_ui_->RegisterMessageCallback("getPrinterCapabilities",
293 NewCallback(this, &PrintPreviewHandler::HandleGetPrinterCapabilities)); 300 NewCallback(this, &PrintPreviewHandler::HandleGetPrinterCapabilities));
294 web_ui_->RegisterMessageCallback("showSystemDialog", 301 web_ui_->RegisterMessageCallback("showSystemDialog",
295 NewCallback(this, &PrintPreviewHandler::HandleShowSystemDialog)); 302 NewCallback(this, &PrintPreviewHandler::HandleShowSystemDialog));
296 web_ui_->RegisterMessageCallback("managePrinters", 303 web_ui_->RegisterMessageCallback("morePrinters",
304 NewCallback(this, &PrintPreviewHandler::HandleShowSystemDialog));
305 web_ui_->RegisterMessageCallback("signIn",
306 NewCallback(this, &PrintPreviewHandler::HandleManageCloudPrint));
307 web_ui_->RegisterMessageCallback("addPrinter",
308 NewCallback(this, &PrintPreviewHandler::HandleManageCloudPrint));
309 web_ui_->RegisterMessageCallback("manageCloudPrinters",
310 NewCallback(this, &PrintPreviewHandler::HandleManageCloudPrint));
311 web_ui_->RegisterMessageCallback("manageLocalPrinters",
297 NewCallback(this, &PrintPreviewHandler::HandleManagePrinters)); 312 NewCallback(this, &PrintPreviewHandler::HandleManagePrinters));
298 web_ui_->RegisterMessageCallback("closePrintPreviewTab", 313 web_ui_->RegisterMessageCallback("closePrintPreviewTab",
299 NewCallback(this, &PrintPreviewHandler::HandleClosePreviewTab)); 314 NewCallback(this, &PrintPreviewHandler::HandleClosePreviewTab));
300 } 315 }
301 316
302 TabContents* PrintPreviewHandler::preview_tab() { 317 TabContents* PrintPreviewHandler::preview_tab() {
303 return web_ui_->tab_contents(); 318 return web_ui_->tab_contents();
304 } 319 }
305 320
306 void PrintPreviewHandler::HandleGetPrinters(const ListValue*) { 321 void PrintPreviewHandler::HandleGetPrinters(const ListValue*) {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args)); 366 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args));
352 if (!settings.get()) 367 if (!settings.get())
353 return; 368 return;
354 369
355 bool print_to_pdf = false; 370 bool print_to_pdf = false;
356 settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf); 371 settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf);
357 372
358 TabContentsWrapper* preview_tab_wrapper = 373 TabContentsWrapper* preview_tab_wrapper =
359 TabContentsWrapper::GetCurrentWrapperForContents(preview_tab()); 374 TabContentsWrapper::GetCurrentWrapperForContents(preview_tab());
360 375
361 if (print_to_pdf) { 376 bool print_to_cloud = settings->HasKey(printing::kSettingCloudPrintId);
377 if (print_to_cloud) {
378 SendCloudPrintJob(*settings);
379 } else if (print_to_pdf) {
362 UMA_HISTOGRAM_ENUMERATION(kUserAction, 380 UMA_HISTOGRAM_ENUMERATION(kUserAction,
363 PRINT_TO_PDF, 381 PRINT_TO_PDF,
364 USERACTION_BUCKET_BOUNDARY); 382 USERACTION_BUCKET_BOUNDARY);
365 383
366 // Pre-populating select file dialog with print job title. 384 // Pre-populating select file dialog with print job title.
367 string16 print_job_title_utf16 = 385 string16 print_job_title_utf16 =
368 preview_tab_wrapper->print_view_manager()->RenderSourceName(); 386 preview_tab_wrapper->print_view_manager()->RenderSourceName();
369 387
370 #if defined(OS_WIN) 388 #if defined(OS_WIN)
371 FilePath::StringType print_job_title(print_job_title_utf16); 389 FilePath::StringType print_job_title(print_job_title_utf16);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 print_backend_.get(), 424 print_backend_.get(),
407 has_logged_printers_count_); 425 has_logged_printers_count_);
408 426
409 BrowserThread::PostTask( 427 BrowserThread::PostTask(
410 BrowserThread::FILE, FROM_HERE, 428 BrowserThread::FILE, FROM_HERE,
411 NewRunnableMethod(task.get(), 429 NewRunnableMethod(task.get(),
412 &PrintSystemTaskProxy::GetPrinterCapabilities, 430 &PrintSystemTaskProxy::GetPrinterCapabilities,
413 printer_name)); 431 printer_name));
414 } 432 }
415 433
434 void PrintPreviewHandler::HandleManageCloudPrint(const ListValue* args) {
435 Browser* browser = BrowserList::GetLastActive();
436 browser->OpenURL(CloudPrintURL(browser->profile()).
437 GetCloudPrintServiceManageURL(),
438 GURL(),
439 NEW_FOREGROUND_TAB,
440 PageTransition::LINK);
441 }
442
416 void PrintPreviewHandler::HandleShowSystemDialog(const ListValue* args) { 443 void PrintPreviewHandler::HandleShowSystemDialog(const ListValue* args) {
417 ReportStats(); 444 ReportStats();
418 UMA_HISTOGRAM_ENUMERATION(kUserAction, 445 UMA_HISTOGRAM_ENUMERATION(kUserAction,
419 FALLBACK_TO_ADVANCED_SETTINGS_DIALOG, 446 FALLBACK_TO_ADVANCED_SETTINGS_DIALOG,
420 USERACTION_BUCKET_BOUNDARY); 447 USERACTION_BUCKET_BOUNDARY);
421 448
422 TabContents* initiator_tab = GetInitiatorTab(); 449 TabContents* initiator_tab = GetInitiatorTab();
423 if (!initiator_tab) 450 if (!initiator_tab)
424 return; 451 return;
425 initiator_tab->Activate(); 452 initiator_tab->Activate();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 initiator_tab->Activate(); 493 initiator_tab->Activate();
467 ClosePrintPreviewTab(); 494 ClosePrintPreviewTab();
468 } 495 }
469 496
470 void PrintPreviewHandler::SendPrinterCapabilities( 497 void PrintPreviewHandler::SendPrinterCapabilities(
471 const DictionaryValue& settings_info) { 498 const DictionaryValue& settings_info) {
472 web_ui_->CallJavascriptFunction("updateWithPrinterCapabilities", 499 web_ui_->CallJavascriptFunction("updateWithPrinterCapabilities",
473 settings_info); 500 settings_info);
474 } 501 }
475 502
476 void PrintPreviewHandler::SendPrinterList( 503 void PrintPreviewHandler::SetupPrinterList(
477 const ListValue& printers, 504 const ListValue& printers,
478 const FundamentalValue& default_printer_index) { 505 const FundamentalValue& default_printer_index) {
506 SendCloudPrintEnabled();
479 web_ui_->CallJavascriptFunction("setPrinters", printers, 507 web_ui_->CallJavascriptFunction("setPrinters", printers,
480 default_printer_index); 508 default_printer_index,
509 *(Value::CreateBooleanValue(true)));
510 }
511
512 void PrintPreviewHandler::SendCloudPrintEnabled() {
513 #if defined(OS_CHROMEOS)
514 bool enable_cloud_print_integration = true;
515 #else
516 bool enable_cloud_print_integration =
517 CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableCloudPrint);
518 #endif
519 FundamentalValue enable(enable_cloud_print_integration);
520 Browser* browser = BrowserList::GetLastActive();
521 StringValue gcp_url(
522 CloudPrintURL(browser->profile()).GetCloudPrintServiceURL().spec());
523 web_ui_->CallJavascriptFunction("setUseCloudPrint", enable, gcp_url);
524 }
525
526 void PrintPreviewHandler::SendCloudPrintJob(const DictionaryValue& settings) {
527 PrintPreviewUIHTMLSource::PrintPreviewData data;
528 PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(web_ui_);
529 print_preview_ui->html_source()->GetPrintPreviewData(&data);
530 CHECK(data.first);
531 DCHECK_GT(data.second, 0U);
532 TabContentsWrapper* wrapper =
533 TabContentsWrapper::GetCurrentWrapperForContents(preview_tab());
534 string16 print_job_title_utf16 =
535 wrapper->print_view_manager()->RenderSourceName();
536 std::string print_job_title = UTF16ToUTF8(print_job_title_utf16);
537 print_job_title = EscapeQueryParamValue(print_job_title, false);
538 std::string printer_id;
539 settings.GetString("cloudPrintID", &printer_id);
540 const char prolog_base[] = "printerid=%s&"
541 "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
542 "contentType=dataUrl&"
543 "title=%s&"
544 "content=data%%3Aapplication%%2Fpdf%%3Bbase64%%2C";
545 std::string prolog;
546 base::SStringPrintf(&prolog,
547 prolog_base,
548 printer_id.c_str(),
549 print_job_title.c_str());
550 std::string raw_data;
551 raw_data.assign(reinterpret_cast<char*>(data.first->memory()), data.second);
552 std::string base64_data;
553 if (!base::Base64Encode(raw_data, &base64_data)) {
554 NOTREACHED() << "Base64 encoding PDF data.";
555 }
556
557 char* buffer;
558 size_t buffer_size = prolog.length() + base64_data.length();
559 buffer = new char[buffer_size];
560 memcpy(buffer, prolog.c_str(), prolog.length());
561 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
562 base64_data.length());
563 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.
564
565 web_ui_->CallJavascriptFunction("printToCloud",
566 *data_value);
481 } 567 }
482 568
483 TabContents* PrintPreviewHandler::GetInitiatorTab() { 569 TabContents* PrintPreviewHandler::GetInitiatorTab() {
484 printing::PrintPreviewTabController* tab_controller = 570 printing::PrintPreviewTabController* tab_controller =
485 printing::PrintPreviewTabController::GetInstance(); 571 printing::PrintPreviewTabController::GetInstance();
486 if (!tab_controller) 572 if (!tab_controller)
487 return NULL; 573 return NULL;
488 return tab_controller->GetInitiatorTab(preview_tab()); 574 return tab_controller->GetInitiatorTab(preview_tab());
489 } 575 }
490 576
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 metafile->InitFromData(data.first->memory(), data.second); 631 metafile->InitFromData(data.first->memory(), data.second);
546 632
547 // Updating last_saved_path_ to the newly selected folder. 633 // Updating last_saved_path_ to the newly selected folder.
548 *last_saved_path_ = path.DirName(); 634 *last_saved_path_ = path.DirName();
549 635
550 PrintToPdfTask* task = new PrintToPdfTask(metafile, path); 636 PrintToPdfTask* task = new PrintToPdfTask(metafile, path);
551 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, task); 637 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, task);
552 638
553 ActivateInitiatorTabAndClosePreviewTab(); 639 ActivateInitiatorTabAndClosePreviewTab();
554 } 640 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698