OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 } |
OLD | NEW |