Chromium Code Reviews| 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 |