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 <ctype.h> | 7 #include <ctype.h> |
8 | 8 |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/base64.h" | 12 #include "base/base64.h" |
13 #include "base/bind.h" | 13 #include "base/bind.h" |
14 #include "base/bind_helpers.h" | 14 #include "base/bind_helpers.h" |
15 #include "base/i18n/file_util_icu.h" | 15 #include "base/i18n/file_util_icu.h" |
16 #include "base/i18n/number_formatting.h" | 16 #include "base/i18n/number_formatting.h" |
17 #include "base/json/json_reader.h" | 17 #include "base/json/json_reader.h" |
18 #include "base/memory/ref_counted.h" | 18 #include "base/memory/ref_counted.h" |
19 #include "base/metrics/histogram.h" | 19 #include "base/metrics/histogram.h" |
20 #include "base/path_service.h" | 20 #include "base/path_service.h" |
21 #include "base/threading/thread.h" | 21 #include "base/threading/thread.h" |
22 #include "base/threading/thread_restrictions.h" | 22 #include "base/threading/thread_restrictions.h" |
23 #include "base/utf_string_conversions.h" | 23 #include "base/utf_string_conversions.h" |
24 #include "base/values.h" | 24 #include "base/values.h" |
25 #include "chrome/browser/browser_process.h" | 25 #include "chrome/browser/browser_process.h" |
26 #include "chrome/browser/platform_util.h" | 26 #include "chrome/browser/platform_util.h" |
27 #include "chrome/browser/prefs/pref_service.h" | 27 #include "chrome/browser/prefs/pref_service.h" |
28 #include "chrome/browser/printing/background_printing_manager.h" | |
29 #include "chrome/browser/printing/cloud_print/cloud_print_url.h" | 28 #include "chrome/browser/printing/cloud_print/cloud_print_url.h" |
30 #include "chrome/browser/printing/print_dialog_cloud.h" | 29 #include "chrome/browser/printing/print_dialog_cloud.h" |
31 #include "chrome/browser/printing/print_job_manager.h" | 30 #include "chrome/browser/printing/print_job_manager.h" |
32 #include "chrome/browser/printing/print_preview_tab_controller.h" | 31 #include "chrome/browser/printing/print_preview_tab_controller.h" |
33 #include "chrome/browser/printing/print_system_task_proxy.h" | 32 #include "chrome/browser/printing/print_system_task_proxy.h" |
34 #include "chrome/browser/printing/print_view_manager.h" | 33 #include "chrome/browser/printing/print_view_manager.h" |
35 #include "chrome/browser/printing/printer_manager_dialog.h" | 34 #include "chrome/browser/printing/printer_manager_dialog.h" |
36 #include "chrome/browser/profiles/profile.h" | 35 #include "chrome/browser/profiles/profile.h" |
37 #include "chrome/browser/sessions/restore_tab_helper.h" | |
38 #include "chrome/browser/tabs/tab_strip_model.h" | |
39 #include "chrome/browser/ui/browser_list.h" | 36 #include "chrome/browser/ui/browser_list.h" |
40 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 37 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
41 #include "chrome/browser/ui/webui/cloud_print_signin_dialog.h" | 38 #include "chrome/browser/ui/webui/cloud_print_signin_dialog.h" |
42 #include "chrome/browser/ui/webui/print_preview_ui.h" | 39 #include "chrome/browser/ui/webui/print_preview_ui.h" |
43 #include "chrome/common/chrome_paths.h" | 40 #include "chrome/common/chrome_paths.h" |
44 #include "chrome/common/pref_names.h" | 41 #include "chrome/common/pref_names.h" |
45 #include "chrome/common/print_messages.h" | 42 #include "chrome/common/print_messages.h" |
46 #include "content/browser/renderer_host/render_view_host.h" | 43 #include "content/browser/renderer_host/render_view_host.h" |
47 #include "content/browser/tab_contents/tab_contents.h" | 44 #include "content/browser/tab_contents/tab_contents.h" |
48 #include "content/public/browser/browser_thread.h" | 45 #include "content/public/browser/browser_thread.h" |
(...skipping 11 matching lines...) Expand all Loading... |
60 | 57 |
61 namespace { | 58 namespace { |
62 | 59 |
63 enum UserActionBuckets { | 60 enum UserActionBuckets { |
64 PRINT_TO_PRINTER, | 61 PRINT_TO_PRINTER, |
65 PRINT_TO_PDF, | 62 PRINT_TO_PDF, |
66 CANCEL, | 63 CANCEL, |
67 FALLBACK_TO_ADVANCED_SETTINGS_DIALOG, | 64 FALLBACK_TO_ADVANCED_SETTINGS_DIALOG, |
68 PREVIEW_FAILED, | 65 PREVIEW_FAILED, |
69 PREVIEW_STARTED, | 66 PREVIEW_STARTED, |
70 INITIATOR_TAB_CRASHED, | 67 INITIATOR_TAB_CRASHED, // UNUSED |
71 INITIATOR_TAB_CLOSED, | 68 INITIATOR_TAB_CLOSED, |
72 PRINT_WITH_CLOUD_PRINT, | 69 PRINT_WITH_CLOUD_PRINT, |
73 USERACTION_BUCKET_BOUNDARY | 70 USERACTION_BUCKET_BOUNDARY |
74 }; | 71 }; |
75 | 72 |
76 enum PrintSettingsBuckets { | 73 enum PrintSettingsBuckets { |
77 LANDSCAPE, | 74 LANDSCAPE, |
78 PORTRAIT, | 75 PORTRAIT, |
79 COLOR, | 76 COLOR, |
80 BLACK_AND_WHITE, | 77 BLACK_AND_WHITE, |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 if (settings.GetInteger(printing::kSettingDuplexMode, &duplex_mode)) | 152 if (settings.GetInteger(printing::kSettingDuplexMode, &duplex_mode)) |
156 ReportPrintSettingHistogram(duplex_mode ? DUPLEX : SIMPLEX); | 153 ReportPrintSettingHistogram(duplex_mode ? DUPLEX : SIMPLEX); |
157 | 154 |
158 int color_mode; | 155 int color_mode; |
159 if (settings.GetInteger(printing::kSettingColor, &color_mode)) { | 156 if (settings.GetInteger(printing::kSettingColor, &color_mode)) { |
160 ReportPrintSettingHistogram( | 157 ReportPrintSettingHistogram( |
161 printing::isColorModelSelected(color_mode) ? COLOR : BLACK_AND_WHITE); | 158 printing::isColorModelSelected(color_mode) ? COLOR : BLACK_AND_WHITE); |
162 } | 159 } |
163 } | 160 } |
164 | 161 |
165 printing::BackgroundPrintingManager* GetBackgroundPrintingManager() { | |
166 return g_browser_process->background_printing_manager(); | |
167 } | |
168 | |
169 } // namespace | 162 } // namespace |
170 | 163 |
171 // A Task implementation that stores a PDF file on disk. | 164 // A Task implementation that stores a PDF file on disk. |
172 class PrintToPdfTask : public Task { | 165 class PrintToPdfTask : public Task { |
173 public: | 166 public: |
174 // Takes ownership of |metafile|. | 167 // Takes ownership of |metafile|. |
175 PrintToPdfTask(printing::Metafile* metafile, const FilePath& path) | 168 PrintToPdfTask(printing::Metafile* metafile, const FilePath& path) |
176 : metafile_(metafile), path_(path) { | 169 : metafile_(metafile), path_(path) { |
177 DCHECK(metafile); | 170 DCHECK(metafile); |
178 } | 171 } |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 base::Unretained(this))); | 231 base::Unretained(this))); |
239 web_ui_->RegisterMessageCallback("signIn", | 232 web_ui_->RegisterMessageCallback("signIn", |
240 base::Bind(&PrintPreviewHandler::HandleSignin, | 233 base::Bind(&PrintPreviewHandler::HandleSignin, |
241 base::Unretained(this))); | 234 base::Unretained(this))); |
242 web_ui_->RegisterMessageCallback("manageCloudPrinters", | 235 web_ui_->RegisterMessageCallback("manageCloudPrinters", |
243 base::Bind(&PrintPreviewHandler::HandleManageCloudPrint, | 236 base::Bind(&PrintPreviewHandler::HandleManageCloudPrint, |
244 base::Unretained(this))); | 237 base::Unretained(this))); |
245 web_ui_->RegisterMessageCallback("manageLocalPrinters", | 238 web_ui_->RegisterMessageCallback("manageLocalPrinters", |
246 base::Bind(&PrintPreviewHandler::HandleManagePrinters, | 239 base::Bind(&PrintPreviewHandler::HandleManagePrinters, |
247 base::Unretained(this))); | 240 base::Unretained(this))); |
248 web_ui_->RegisterMessageCallback("reloadCrashedInitiatorTab", | |
249 base::Bind(&PrintPreviewHandler::HandleReloadCrashedInitiatorTab, | |
250 base::Unretained(this))); | |
251 web_ui_->RegisterMessageCallback("closePrintPreviewTab", | 241 web_ui_->RegisterMessageCallback("closePrintPreviewTab", |
252 base::Bind(&PrintPreviewHandler::HandleClosePreviewTab, | 242 base::Bind(&PrintPreviewHandler::HandleClosePreviewTab, |
253 base::Unretained(this))); | 243 base::Unretained(this))); |
254 web_ui_->RegisterMessageCallback("hidePreview", | 244 web_ui_->RegisterMessageCallback("hidePreview", |
255 base::Bind(&PrintPreviewHandler::HandleHidePreview, | 245 base::Bind(&PrintPreviewHandler::HandleHidePreview, |
256 base::Unretained(this))); | 246 base::Unretained(this))); |
257 web_ui_->RegisterMessageCallback("cancelPendingPrintRequest", | 247 web_ui_->RegisterMessageCallback("cancelPendingPrintRequest", |
258 base::Bind(&PrintPreviewHandler::HandleCancelPendingPrintRequest, | 248 base::Bind(&PrintPreviewHandler::HandleCancelPendingPrintRequest, |
259 base::Unretained(this))); | 249 base::Unretained(this))); |
260 web_ui_->RegisterMessageCallback("saveLastPrinter", | 250 web_ui_->RegisterMessageCallback("saveLastPrinter", |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 // thread. | 304 // thread. |
315 settings->SetString(printing::kPreviewUIAddr, | 305 settings->SetString(printing::kPreviewUIAddr, |
316 print_preview_ui->GetPrintPreviewUIAddress()); | 306 print_preview_ui->GetPrintPreviewUIAddress()); |
317 | 307 |
318 // Increment request count. | 308 // Increment request count. |
319 ++regenerate_preview_request_count_; | 309 ++regenerate_preview_request_count_; |
320 | 310 |
321 TabContentsWrapper* initiator_tab = GetInitiatorTab(); | 311 TabContentsWrapper* initiator_tab = GetInitiatorTab(); |
322 if (!initiator_tab) { | 312 if (!initiator_tab) { |
323 ReportUserActionHistogram(INITIATOR_TAB_CLOSED); | 313 ReportUserActionHistogram(INITIATOR_TAB_CLOSED); |
324 print_preview_ui->OnInitiatorTabClosed(); | 314 print_preview_ui->OnClosePrintPreviewTab(); |
325 return; | 315 return; |
326 } | 316 } |
327 | 317 |
328 // Retrieve the page title and url and send it to the renderer process if | 318 // Retrieve the page title and url and send it to the renderer process if |
329 // headers and footers are to be displayed. | 319 // headers and footers are to be displayed. |
330 bool display_header_footer = false; | 320 bool display_header_footer = false; |
331 if (!settings->GetBoolean(printing::kSettingHeaderFooterEnabled, | 321 if (!settings->GetBoolean(printing::kSettingHeaderFooterEnabled, |
332 &display_header_footer)) { | 322 &display_header_footer)) { |
333 NOTREACHED(); | 323 NOTREACHED(); |
334 } | 324 } |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
409 } else if (is_cloud_dialog) { | 399 } else if (is_cloud_dialog) { |
410 HandlePrintWithCloudPrint(); | 400 HandlePrintWithCloudPrint(); |
411 } else { | 401 } else { |
412 ReportPrintSettingsStats(*settings); | 402 ReportPrintSettingsStats(*settings); |
413 ReportUserActionHistogram(PRINT_TO_PRINTER); | 403 ReportUserActionHistogram(PRINT_TO_PRINTER); |
414 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPrinter", | 404 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPrinter", |
415 GetPageCountFromSettingsDictionary(*settings)); | 405 GetPageCountFromSettingsDictionary(*settings)); |
416 | 406 |
417 // This tries to activate the initiator tab as well, so do not clear the | 407 // This tries to activate the initiator tab as well, so do not clear the |
418 // association with the initiator tab yet. | 408 // association with the initiator tab yet. |
419 HidePreviewTab(); | 409 PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(web_ui_); |
| 410 print_preview_ui->OnHidePreviewTab(); |
420 | 411 |
421 // Do this so the initiator tab can open a new print preview tab. | 412 // Do this so the initiator tab can open a new print preview tab. |
422 ClearInitiatorTabDetails(); | 413 ClearInitiatorTabDetails(); |
423 | 414 |
424 // The PDF being printed contains only the pages that the user selected, | 415 // The PDF being printed contains only the pages that the user selected, |
425 // so ignore the page range and print all pages. | 416 // so ignore the page range and print all pages. |
426 settings->Remove(printing::kSettingPageRange, NULL); | 417 settings->Remove(printing::kSettingPageRange, NULL); |
427 RenderViewHost* rvh = web_ui_->tab_contents()->render_view_host(); | 418 RenderViewHost* rvh = web_ui_->tab_contents()->render_view_host(); |
428 rvh->Send(new PrintMsg_PrintForPrintPreview(rvh->routing_id(), *settings)); | 419 rvh->Send(new PrintMsg_PrintForPrintPreview(rvh->routing_id(), *settings)); |
429 } | 420 } |
(...skipping 23 matching lines...) Expand all Loading... |
453 file_util::ReplaceIllegalCharactersInPath(&print_job_title, '_'); | 444 file_util::ReplaceIllegalCharactersInPath(&print_job_title, '_'); |
454 FilePath default_filename(print_job_title); | 445 FilePath default_filename(print_job_title); |
455 default_filename = | 446 default_filename = |
456 default_filename.ReplaceExtension(FILE_PATH_LITERAL("pdf")); | 447 default_filename.ReplaceExtension(FILE_PATH_LITERAL("pdf")); |
457 | 448 |
458 SelectFile(default_filename); | 449 SelectFile(default_filename); |
459 } | 450 } |
460 } | 451 } |
461 | 452 |
462 void PrintPreviewHandler::HandleHidePreview(const ListValue* /*args*/) { | 453 void PrintPreviewHandler::HandleHidePreview(const ListValue* /*args*/) { |
463 HidePreviewTab(); | 454 PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(web_ui_); |
| 455 print_preview_ui->OnHidePreviewTab(); |
464 } | 456 } |
465 | 457 |
466 void PrintPreviewHandler::HandleCancelPendingPrintRequest( | 458 void PrintPreviewHandler::HandleCancelPendingPrintRequest( |
467 const ListValue* /*args*/) { | 459 const ListValue* /*args*/) { |
468 TabContentsWrapper* initiator_tab = GetInitiatorTab(); | 460 TabContentsWrapper* initiator_tab = GetInitiatorTab(); |
469 if (initiator_tab) { | 461 if (initiator_tab) { |
470 ClearInitiatorTabDetails(); | 462 ClearInitiatorTabDetails(); |
471 } else { | 463 } else { |
472 // Initiator tab does not exists. Get the wrapper contents of current tab. | 464 // Initiator tab does not exists. Get the wrapper contents of current tab. |
473 Browser* browser = BrowserList::GetLastActive(); | 465 Browser* browser = BrowserList::GetLastActive(); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
564 // Cancel the pending preview request if exists. | 556 // Cancel the pending preview request if exists. |
565 PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(web_ui_); | 557 PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(web_ui_); |
566 print_preview_ui->OnCancelPendingPreviewRequest(); | 558 print_preview_ui->OnCancelPendingPreviewRequest(); |
567 } | 559 } |
568 | 560 |
569 void PrintPreviewHandler::HandleManagePrinters(const ListValue* /*args*/) { | 561 void PrintPreviewHandler::HandleManagePrinters(const ListValue* /*args*/) { |
570 ++manage_printers_dialog_request_count_; | 562 ++manage_printers_dialog_request_count_; |
571 printing::PrinterManagerDialog::ShowPrinterManagerDialog(); | 563 printing::PrinterManagerDialog::ShowPrinterManagerDialog(); |
572 } | 564 } |
573 | 565 |
574 void PrintPreviewHandler::HandleReloadCrashedInitiatorTab( | |
575 const ListValue* /*args*/) { | |
576 ReportStats(); | |
577 ReportUserActionHistogram(INITIATOR_TAB_CRASHED); | |
578 | |
579 TabContentsWrapper* initiator_tab = GetInitiatorTab(); | |
580 if (!initiator_tab) | |
581 return; | |
582 | |
583 TabContents* contents = initiator_tab->tab_contents(); | |
584 contents->OpenURL(contents->GetURL(), GURL(), CURRENT_TAB, | |
585 content::PAGE_TRANSITION_RELOAD); | |
586 ActivateInitiatorTabAndClosePreviewTab(); | |
587 } | |
588 | |
589 void PrintPreviewHandler::HandleClosePreviewTab(const ListValue* /*args*/) { | 566 void PrintPreviewHandler::HandleClosePreviewTab(const ListValue* /*args*/) { |
590 ReportStats(); | 567 ReportStats(); |
591 ReportUserActionHistogram(CANCEL); | 568 ReportUserActionHistogram(CANCEL); |
592 | 569 |
593 // Record the number of times the user requests to regenerate preview data | 570 // Record the number of times the user requests to regenerate preview data |
594 // before cancelling. | 571 // before cancelling. |
595 UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforeCancel", | 572 UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforeCancel", |
596 regenerate_preview_request_count_); | 573 regenerate_preview_request_count_); |
597 | |
598 ActivateInitiatorTabAndClosePreviewTab(); | |
599 } | 574 } |
600 | 575 |
601 void PrintPreviewHandler::ReportStats() { | 576 void PrintPreviewHandler::ReportStats() { |
602 UMA_HISTOGRAM_COUNTS("PrintPreview.ManagePrinters", | 577 UMA_HISTOGRAM_COUNTS("PrintPreview.ManagePrinters", |
603 manage_printers_dialog_request_count_); | 578 manage_printers_dialog_request_count_); |
604 } | 579 } |
605 | 580 |
606 void PrintPreviewHandler::HandleGetInitiatorTabTitle( | 581 void PrintPreviewHandler::HandleGetInitiatorTabTitle( |
607 const ListValue* /*args*/) { | 582 const ListValue* /*args*/) { |
608 PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(web_ui_); | 583 PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(web_ui_); |
(...skipping 21 matching lines...) Expand all Loading... |
630 number_format, | 605 number_format, |
631 system); | 606 system); |
632 } | 607 } |
633 | 608 |
634 void PrintPreviewHandler::ActivateInitiatorTabAndClosePreviewTab() { | 609 void PrintPreviewHandler::ActivateInitiatorTabAndClosePreviewTab() { |
635 TabContentsWrapper* initiator_tab = GetInitiatorTab(); | 610 TabContentsWrapper* initiator_tab = GetInitiatorTab(); |
636 if (initiator_tab) { | 611 if (initiator_tab) { |
637 static_cast<RenderViewHostDelegate*>( | 612 static_cast<RenderViewHostDelegate*>( |
638 initiator_tab->tab_contents())->Activate(); | 613 initiator_tab->tab_contents())->Activate(); |
639 } | 614 } |
640 ClosePrintPreviewTab(); | 615 PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(web_ui_); |
| 616 print_preview_ui->OnClosePrintPreviewTab(); |
641 } | 617 } |
642 | 618 |
643 void PrintPreviewHandler::SendPrinterCapabilities( | 619 void PrintPreviewHandler::SendPrinterCapabilities( |
644 const DictionaryValue& settings_info) { | 620 const DictionaryValue& settings_info) { |
645 VLOG(1) << "Get printer capabilities finished"; | 621 VLOG(1) << "Get printer capabilities finished"; |
646 web_ui_->CallJavascriptFunction("updateWithPrinterCapabilities", | 622 web_ui_->CallJavascriptFunction("updateWithPrinterCapabilities", |
647 settings_info); | 623 settings_info); |
648 } | 624 } |
649 | 625 |
650 void PrintPreviewHandler::SendDefaultPrinter( | 626 void PrintPreviewHandler::SendDefaultPrinter( |
(...skipping 26 matching lines...) Expand all Loading... |
677 print_preview_ui->GetPrintPreviewDataForIndex( | 653 print_preview_ui->GetPrintPreviewDataForIndex( |
678 printing::COMPLETE_PREVIEW_DOCUMENT_INDEX, &data); | 654 printing::COMPLETE_PREVIEW_DOCUMENT_INDEX, &data); |
679 CHECK(data.get()); | 655 CHECK(data.get()); |
680 DCHECK_GT(data->size(), 0U); | 656 DCHECK_GT(data->size(), 0U); |
681 | 657 |
682 string16 print_job_title_utf16 = | 658 string16 print_job_title_utf16 = |
683 preview_tab_wrapper()->print_view_manager()->RenderSourceName(); | 659 preview_tab_wrapper()->print_view_manager()->RenderSourceName(); |
684 std::string print_job_title = UTF16ToUTF8(print_job_title_utf16); | 660 std::string print_job_title = UTF16ToUTF8(print_job_title_utf16); |
685 std::string printer_id; | 661 std::string printer_id; |
686 settings.GetString(printing::kSettingCloudPrintId, &printer_id); | 662 settings.GetString(printing::kSettingCloudPrintId, &printer_id); |
687 // BASE64 encode the job data. | 663 // BASE64 encode the job data. |
688 std::string raw_data(reinterpret_cast<const char*>(data->front()), | 664 std::string raw_data(reinterpret_cast<const char*>(data->front()), |
689 data->size()); | 665 data->size()); |
690 std::string base64_data; | 666 std::string base64_data; |
691 if (!base::Base64Encode(raw_data, &base64_data)) { | 667 if (!base::Base64Encode(raw_data, &base64_data)) { |
692 NOTREACHED() << "Base64 encoding PDF data."; | 668 NOTREACHED() << "Base64 encoding PDF data."; |
693 } | 669 } |
694 | 670 |
695 const char boundary[] = "----CloudPrintFormBoundaryjc9wuprokl8i"; | 671 const char boundary[] = "----CloudPrintFormBoundaryjc9wuprokl8i"; |
696 const char prolog[] = "--%s\r\n" | 672 const char prolog[] = "--%s\r\n" |
697 "Content-Disposition: form-data; name=\"capabilities\"\r\n\r\n%s\r\n" | 673 "Content-Disposition: form-data; name=\"capabilities\"\r\n\r\n%s\r\n" |
698 "--%s\r\n" | 674 "--%s\r\n" |
699 "Content-Disposition: form-data; name=\"contentType\"\r\n\r\ndataUrl\r\n" | 675 "Content-Disposition: form-data; name=\"contentType\"\r\n\r\ndataUrl\r\n" |
700 "--%s\r\n" | 676 "--%s\r\n" |
701 "Content-Disposition: form-data; name=\"title\"\r\n\r\n%s\r\n" | 677 "Content-Disposition: form-data; name=\"title\"\r\n\r\n%s\r\n" |
702 "--%s\r\n" | 678 "--%s\r\n" |
703 "Content-Disposition: form-data; name=\"printerid\"\r\n\r\n%s\r\n" | 679 "Content-Disposition: form-data; name=\"printerid\"\r\n\r\n%s\r\n" |
704 "--%s\r\n" | 680 "--%s\r\n" |
705 "Content-Disposition: form-data; name=\"content\"\r\n\r\n" | 681 "Content-Disposition: form-data; name=\"content\"\r\n\r\n" |
706 "data:application/pdf;base64,%s\r\n" | 682 "data:application/pdf;base64,%s\r\n" |
707 "--%s\r\n"; | 683 "--%s\r\n"; |
708 | 684 |
709 // TODO(abodenha@chromium.org) This implies a large copy operation. | 685 // TODO(abodenha@chromium.org) This implies a large copy operation. |
710 // Profile this and optimize if necessary. | 686 // Profile this and optimize if necessary. |
711 std::string final_data; | 687 std::string final_data; |
712 base::SStringPrintf(&final_data, | 688 base::SStringPrintf(&final_data, |
713 prolog, | 689 prolog, |
714 boundary, | 690 boundary, |
715 print_ticket.c_str(), | 691 print_ticket.c_str(), |
716 boundary, | 692 boundary, |
717 boundary, | 693 boundary, |
718 print_job_title.c_str(), | 694 print_job_title.c_str(), |
719 boundary, | 695 boundary, |
720 printer_id.c_str(), | 696 printer_id.c_str(), |
721 boundary, | 697 boundary, |
722 base64_data.c_str(), | 698 base64_data.c_str(), |
723 boundary); | 699 boundary); |
724 | 700 |
725 StringValue data_value(final_data); | 701 StringValue data_value(final_data); |
726 | 702 |
727 web_ui_->CallJavascriptFunction("printToCloud", | 703 web_ui_->CallJavascriptFunction("printToCloud", |
728 data_value); | 704 data_value); |
729 } | 705 } |
730 | 706 |
731 TabContentsWrapper* PrintPreviewHandler::GetInitiatorTab() const { | 707 TabContentsWrapper* PrintPreviewHandler::GetInitiatorTab() const { |
732 printing::PrintPreviewTabController* tab_controller = | 708 printing::PrintPreviewTabController* tab_controller = |
733 printing::PrintPreviewTabController::GetInstance(); | 709 printing::PrintPreviewTabController::GetInstance(); |
734 if (!tab_controller) | 710 if (!tab_controller) |
735 return NULL; | 711 return NULL; |
736 return tab_controller->GetInitiatorTab(preview_tab_wrapper()); | 712 return tab_controller->GetInitiatorTab(preview_tab_wrapper()); |
737 } | 713 } |
738 | 714 |
739 void PrintPreviewHandler::ClosePrintPreviewTab() { | |
740 TabContentsWrapper* tab = | |
741 TabContentsWrapper::GetCurrentWrapperForContents(preview_tab()); | |
742 if (!tab) | |
743 return; | |
744 Browser* preview_tab_browser = BrowserList::FindBrowserWithID( | |
745 tab->restore_tab_helper()->window_id().id()); | |
746 if (!preview_tab_browser) | |
747 return; | |
748 TabStripModel* tabstrip = preview_tab_browser->tabstrip_model(); | |
749 int index = tabstrip->GetIndexOfTabContents(tab); | |
750 if (index == TabStripModel::kNoTab) | |
751 return; | |
752 | |
753 // Keep print preview tab out of the recently closed tab list, because | |
754 // re-opening that page will just display a non-functional print preview page. | |
755 tabstrip->CloseTabContentsAt(index, TabStripModel::CLOSE_NONE); | |
756 } | |
757 | |
758 void PrintPreviewHandler::OnPrintDialogShown() { | 715 void PrintPreviewHandler::OnPrintDialogShown() { |
759 ActivateInitiatorTabAndClosePreviewTab(); | 716 ActivateInitiatorTabAndClosePreviewTab(); |
760 } | 717 } |
761 | 718 |
762 void PrintPreviewHandler::SelectFile(const FilePath& default_filename) { | 719 void PrintPreviewHandler::SelectFile(const FilePath& default_filename) { |
763 SelectFileDialog::FileTypeInfo file_type_info; | 720 SelectFileDialog::FileTypeInfo file_type_info; |
764 file_type_info.extensions.resize(1); | 721 file_type_info.extensions.resize(1); |
765 file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("pdf")); | 722 file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("pdf")); |
766 | 723 |
767 // Initializing last_saved_path_ if it is not already initialized. | 724 // Initializing last_saved_path_ if it is not already initialized. |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
836 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, task); | 793 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, task); |
837 print_to_pdf_path_.reset(); | 794 print_to_pdf_path_.reset(); |
838 ActivateInitiatorTabAndClosePreviewTab(); | 795 ActivateInitiatorTabAndClosePreviewTab(); |
839 } | 796 } |
840 | 797 |
841 void PrintPreviewHandler::FileSelectionCanceled(void* params) { | 798 void PrintPreviewHandler::FileSelectionCanceled(void* params) { |
842 PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(web_ui_); | 799 PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(web_ui_); |
843 print_preview_ui->OnFileSelectionCancelled(); | 800 print_preview_ui->OnFileSelectionCancelled(); |
844 } | 801 } |
845 | 802 |
846 void PrintPreviewHandler::HidePreviewTab() { | |
847 if (GetBackgroundPrintingManager()->HasPrintPreviewTab(preview_tab_wrapper())) | |
848 return; | |
849 GetBackgroundPrintingManager()->OwnPrintPreviewTab(preview_tab_wrapper()); | |
850 } | |
851 | |
852 void PrintPreviewHandler::ClearInitiatorTabDetails() { | 803 void PrintPreviewHandler::ClearInitiatorTabDetails() { |
853 TabContentsWrapper* initiator_tab = GetInitiatorTab(); | 804 TabContentsWrapper* initiator_tab = GetInitiatorTab(); |
854 if (!initiator_tab) | 805 if (!initiator_tab) |
855 return; | 806 return; |
856 | 807 |
857 // We no longer require the initiator tab details. Remove those details | 808 // We no longer require the initiator tab details. Remove those details |
858 // associated with the preview tab to allow the initiator tab to create | 809 // associated with the preview tab to allow the initiator tab to create |
859 // another preview tab. | 810 // another preview tab. |
860 printing::PrintPreviewTabController* tab_controller = | 811 printing::PrintPreviewTabController* tab_controller = |
861 printing::PrintPreviewTabController::GetInstance(); | 812 printing::PrintPreviewTabController::GetInstance(); |
862 if (tab_controller) | 813 if (tab_controller) |
863 tab_controller->EraseInitiatorTabInfo(preview_tab_wrapper()); | 814 tab_controller->EraseInitiatorTabInfo(preview_tab_wrapper()); |
864 } | 815 } |
OLD | NEW |