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

Side by Side Diff: chrome/renderer/print_web_view_helper.cc

Issue 7831041: Fix print preview workflow to reflect settings of selected printer. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Update per code review Created 9 years, 3 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/renderer/print_web_view_helper.h" 5 #include "chrome/renderer/print_web_view_helper.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 561
562 WebDocument document = main_frame->document(); 562 WebDocument document = main_frame->document();
563 // <object> with id="pdf-viewer" is created in 563 // <object> with id="pdf-viewer" is created in
564 // chrome/browser/resources/print_preview/print_preview.js 564 // chrome/browser/resources/print_preview/print_preview.js
565 WebElement pdf_element = document.getElementById("pdf-viewer"); 565 WebElement pdf_element = document.getElementById("pdf-viewer");
566 if (pdf_element.isNull()) { 566 if (pdf_element.isNull()) {
567 NOTREACHED(); 567 NOTREACHED();
568 return; 568 return;
569 } 569 }
570 570
571 WebFrame* pdf_frame = pdf_element.document().frame(); 571 if (!print_pages_params_.get())
572 scoped_ptr<PrepareFrameAndViewForPrint> prepare; 572 print_pages_params_.reset(new PrintMsg_PrintPages_Params());
kmadhusu 2011/09/14 01:37:25 lines 571 & 572 are not required. Any specific rea
arthurhsu 2011/09/16 18:23:01 Done.
573 if (!InitPrintSettingsAndPrepareFrame(pdf_frame, &pdf_element, &prepare)) {
574 LOG(ERROR) << "Failed to initialize print page settings";
575 return;
576 }
577 573
578 if (!UpdatePrintSettings(job_settings, false)) { 574 if (!UpdatePrintSettings(job_settings, false)) {
579 LOG(ERROR) << "UpdatePrintSettings failed"; 575 LOG(ERROR) << "UpdatePrintSettings failed";
580 DidFinishPrinting(FAIL_PRINT); 576 DidFinishPrinting(FAIL_PRINT);
581 return; 577 return;
582 } 578 }
583 579
580 WebFrame* pdf_frame = pdf_element.document().frame();
581 scoped_ptr<PrepareFrameAndViewForPrint> prepare;
582 if (!PrepareFrame(pdf_frame, &pdf_element, &prepare)) {
583 LOG(ERROR) << "Failed to initialize print page settings";
kmadhusu 2011/09/14 01:37:25 You need to call DidFinishPrinting(FAIL_PRINT);
arthurhsu 2011/09/16 18:23:01 Done.
584 return;
585 }
586
584 // Render Pages for printing. 587 // Render Pages for printing.
585 if (!RenderPagesForPrint(pdf_frame, &pdf_element, prepare.get())) { 588 if (!RenderPagesForPrint(pdf_frame, &pdf_element, prepare.get())) {
586 LOG(ERROR) << "RenderPagesForPrint failed"; 589 LOG(ERROR) << "RenderPagesForPrint failed";
587 DidFinishPrinting(FAIL_PRINT); 590 DidFinishPrinting(FAIL_PRINT);
588 } 591 }
589 } 592 }
590 593
591 bool PrintWebViewHelper::GetPrintFrame(WebKit::WebFrame** frame) { 594 bool PrintWebViewHelper::GetPrintFrame(WebKit::WebFrame** frame) {
592 DCHECK(frame); 595 DCHECK(frame);
593 DCHECK(render_view()->webview()); 596 DCHECK(render_view()->webview());
(...skipping 29 matching lines...) Expand all
623 // copy when the print preview tab closes. 626 // copy when the print preview tab closes.
624 WebNode duplicate_node(*node); 627 WebNode duplicate_node(*node);
625 Print(frame, &duplicate_node); 628 Print(frame, &duplicate_node);
626 } 629 }
627 } 630 }
628 631
629 void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { 632 void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) {
630 DCHECK(is_preview_); 633 DCHECK(is_preview_);
631 print_preview_context_.OnPrintPreview(); 634 print_preview_context_.OnPrintPreview();
632 635
633 if (!InitPrintSettings(print_preview_context_.frame(), 636 if (!UpdatePrintSettings(settings, true)) {
634 print_preview_context_.node(),
635 true)) {
636 Send(new PrintHostMsg_PrintPreviewInvalidPrinterSettings( 637 Send(new PrintHostMsg_PrintPreviewInvalidPrinterSettings(
637 routing_id(), 638 routing_id(),
638 print_pages_params_->params.document_cookie)); 639 print_pages_params_->params.document_cookie));
640 print_pages_params_.reset(new PrintMsg_PrintPages_Params());
kmadhusu 2011/09/14 01:37:25 Just release the previous settings. print_pages_p
arthurhsu 2011/09/16 18:23:01 This line is actually wrong. It shall issue failu
639 return; 641 return;
640 } 642 }
641 643
642 if (!UpdatePrintSettings(settings, true)) {
643 LOG(ERROR) << "UpdatePrintSettings failed";
644 DidFinishPrinting(FAIL_PREVIEW);
645 return;
646 }
647
648 if (!print_pages_params_->params.is_first_request && 644 if (!print_pages_params_->params.is_first_request &&
649 old_print_pages_params_.get() && 645 old_print_pages_params_.get() &&
650 PrintMsg_Print_Params_IsEqual(*old_print_pages_params_, 646 PrintMsg_Print_Params_IsEqual(*old_print_pages_params_,
651 *print_pages_params_)) { 647 *print_pages_params_)) {
652 PrintHostMsg_DidPreviewDocument_Params preview_params; 648 PrintHostMsg_DidPreviewDocument_Params preview_params;
653 preview_params.reuse_existing_data = true; 649 preview_params.reuse_existing_data = true;
654 preview_params.data_size = 0; 650 preview_params.data_size = 0;
655 preview_params.document_cookie = 651 preview_params.document_cookie =
656 print_pages_params_->params.document_cookie; 652 print_pages_params_->params.document_cookie;
657 preview_params.expected_pages_count = 653 preview_params.expected_pages_count =
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 } 794 }
799 } 795 }
800 796
801 void PrintWebViewHelper::Print(WebKit::WebFrame* frame, WebKit::WebNode* node) { 797 void PrintWebViewHelper::Print(WebKit::WebFrame* frame, WebKit::WebNode* node) {
802 // If still not finished with earlier print request simply ignore. 798 // If still not finished with earlier print request simply ignore.
803 if (print_web_view_) 799 if (print_web_view_)
804 return; 800 return;
805 801
806 // Initialize print settings. 802 // Initialize print settings.
807 scoped_ptr<PrepareFrameAndViewForPrint> prepare; 803 scoped_ptr<PrepareFrameAndViewForPrint> prepare;
808 if (!InitPrintSettingsAndPrepareFrame(frame, node, &prepare)) 804 if (!InitPrintSettings(frame) ||
805 !PrepareFrame(frame, node, &prepare))
kmadhusu 2011/09/14 01:37:25 nit: {} required
kmadhusu 2011/09/14 01:37:25 When PrepareFrame() fails, you need to call DidFin
arthurhsu 2011/09/16 18:23:01 Done.
arthurhsu 2011/09/16 18:23:01 Done.
809 return; // Failed to init print page settings. 806 return; // Failed to init print page settings.
810 807
811 int expected_page_count = 0; 808 int expected_page_count = 0;
812 bool use_browser_overlays = true; 809 bool use_browser_overlays = true;
813 810
814 expected_page_count = prepare->GetExpectedPageCount(); 811 expected_page_count = prepare->GetExpectedPageCount();
815 if (expected_page_count) 812 if (expected_page_count)
816 use_browser_overlays = prepare->ShouldUseBrowserOverlays(); 813 use_browser_overlays = prepare->ShouldUseBrowserOverlays();
817 814
818 // Release the prepare before going any further, since we are going to 815 // Release the prepare before going any further, since we are going to
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
1048 page_height_in_points, printing::kPointsPerInch, dpi))); 1045 page_height_in_points, printing::kPointsPerInch, dpi)));
1049 1046
1050 params->margin_top = static_cast<int>(ConvertUnitDouble( 1047 params->margin_top = static_cast<int>(ConvertUnitDouble(
1051 page_layout_in_points.margin_top, printing::kPointsPerInch, dpi)); 1048 page_layout_in_points.margin_top, printing::kPointsPerInch, dpi));
1052 params->margin_left = static_cast<int>(ConvertUnitDouble( 1049 params->margin_left = static_cast<int>(ConvertUnitDouble(
1053 page_layout_in_points.margin_left, printing::kPointsPerInch, dpi)); 1050 page_layout_in_points.margin_left, printing::kPointsPerInch, dpi));
1054 1051
1055 prepare->UpdatePrintParams(*params); 1052 prepare->UpdatePrintParams(*params);
1056 } 1053 }
1057 1054
1058 bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame, 1055 bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame) {
1059 WebKit::WebNode* node,
1060 bool is_preview) {
1061 DCHECK(frame); 1056 DCHECK(frame);
1062 PrintMsg_PrintPages_Params settings; 1057 PrintMsg_PrintPages_Params settings;
1063 1058
1064 Send(new PrintHostMsg_GetDefaultPrintSettings(routing_id(), 1059 Send(new PrintHostMsg_GetDefaultPrintSettings(routing_id(),
1065 &settings.params)); 1060 &settings.params));
1066 // Check if the printer returned any settings, if the settings is empty, we 1061 // Check if the printer returned any settings, if the settings is empty, we
1067 // can safely assume there are no printer drivers configured. So we safely 1062 // can safely assume there are no printer drivers configured. So we safely
1068 // terminate. 1063 // terminate.
1069 bool result = true; 1064 bool result = true;
1070 if (PrintMsg_Print_Params_IsEmpty(settings.params)) { 1065 if (PrintMsg_Print_Params_IsEmpty(settings.params)) {
1071 if (!is_preview) { 1066 render_view()->runModalAlertDialog(
1072 render_view()->runModalAlertDialog( 1067 frame,
1073 frame, 1068 l10n_util::GetStringUTF16(
1074 l10n_util::GetStringUTF16( 1069 IDS_PRINT_PREVIEW_INVALID_PRINTER_SETTINGS));
1075 IDS_PRINT_PREVIEW_INVALID_PRINTER_SETTINGS));
1076 }
1077 result = false; 1070 result = false;
1078 } 1071 }
1079 1072
1080 if (result && 1073 if (result &&
1081 (settings.params.dpi < kMinDpi || settings.params.document_cookie == 0)) { 1074 (settings.params.dpi < kMinDpi || settings.params.document_cookie == 0)) {
1082 // Invalid print page settings. 1075 // Invalid print page settings.
1083 NOTREACHED(); 1076 NOTREACHED();
1084 result = false; 1077 result = false;
1085 } 1078 }
1086 1079
1087 settings.pages.clear(); 1080 settings.pages.clear();
1088 print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); 1081 print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings));
1089 return result; 1082 return result;
1090 } 1083 }
1091 1084
1092 bool PrintWebViewHelper::InitPrintSettingsAndPrepareFrame( 1085 bool PrintWebViewHelper::PrepareFrame(
1093 WebKit::WebFrame* frame, WebKit::WebNode* node, 1086 WebKit::WebFrame* frame, WebKit::WebNode* node,
1094 scoped_ptr<PrepareFrameAndViewForPrint>* prepare) { 1087 scoped_ptr<PrepareFrameAndViewForPrint>* prepare) {
1095 if (!InitPrintSettings(frame, node, false))
1096 return false;
1097
1098 DCHECK(!prepare->get()); 1088 DCHECK(!prepare->get());
1099 prepare->reset(new PrepareFrameAndViewForPrint(print_pages_params_->params, 1089 prepare->reset(new PrepareFrameAndViewForPrint(print_pages_params_->params,
1100 frame, node)); 1090 frame, node));
1101 UpdatePrintableSizeInPrintParameters(frame, node, prepare->get(), 1091 UpdatePrintableSizeInPrintParameters(frame, node, prepare->get(),
1102 &print_pages_params_->params); 1092 &print_pages_params_->params);
1103 Send(new PrintHostMsg_DidGetDocumentCookie( 1093 Send(new PrintHostMsg_DidGetDocumentCookie(
1104 routing_id(), print_pages_params_->params.document_cookie)); 1094 routing_id(), print_pages_params_->params.document_cookie));
1105 return true; 1095 return true;
1106 } 1096 }
1107 1097
1108 bool PrintWebViewHelper::UpdatePrintSettings( 1098 bool PrintWebViewHelper::UpdatePrintSettings(
1109 const DictionaryValue& job_settings, bool is_preview) { 1099 const DictionaryValue& job_settings, bool is_preview) {
1110 PrintMsg_PrintPages_Params settings; 1100 PrintMsg_PrintPages_Params settings;
1111 1101
1102 if (!is_preview) {
1103 Send(new PrintHostMsg_DidGetDocumentCookie(
1104 routing_id(), print_pages_params_->params.document_cookie));
1105 } else if (!print_pages_params_.get()) {
1106 print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings));
1107 }
1112 Send(new PrintHostMsg_UpdatePrintSettings(routing_id(), 1108 Send(new PrintHostMsg_UpdatePrintSettings(routing_id(),
1113 print_pages_params_->params.document_cookie, job_settings, &settings)); 1109 print_pages_params_->params.document_cookie, job_settings, &settings));
kmadhusu 2011/09/14 01:37:25 As we discussed, you can remove print_pages_params
arthurhsu 2011/09/16 18:23:01 Done.
1110
1111 if (PrintMsg_Print_Params_IsEmpty(settings.params)) {
1112 if (!is_preview) {
1113 render_view()->runModalAlertDialog(
1114 print_preview_context_.frame(),
1115 l10n_util::GetStringUTF16(
1116 IDS_PRINT_PREVIEW_INVALID_PRINTER_SETTINGS));
1117 }
1118 return false;
1119 }
1120
1114 if (settings.params.dpi < kMinDpi || !settings.params.document_cookie) { 1121 if (settings.params.dpi < kMinDpi || !settings.params.document_cookie) {
1115 print_preview_context_.set_error(PREVIEW_ERROR_UPDATING_PRINT_SETTINGS); 1122 print_preview_context_.set_error(PREVIEW_ERROR_UPDATING_PRINT_SETTINGS);
1116 return false; 1123 return false;
1117 } 1124 }
1118 1125
1119 if (is_preview) { 1126 if (is_preview) {
1120 // Validate expected print preview settings. 1127 // Validate expected print preview settings.
1121 if (!job_settings.GetString(printing::kPreviewUIAddr, 1128 if (!job_settings.GetString(printing::kPreviewUIAddr,
1122 &(settings.params.preview_ui_addr)) || 1129 &(settings.params.preview_ui_addr)) ||
1123 !job_settings.GetInteger(printing::kPreviewRequestID, 1130 !job_settings.GetInteger(printing::kPreviewRequestID,
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after
1550 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { 1557 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const {
1551 return prep_frame_view_->GetPrintCanvasSize(); 1558 return prep_frame_view_->GetPrintCanvasSize();
1552 } 1559 }
1553 1560
1554 void PrintWebViewHelper::PrintPreviewContext::ClearContext() { 1561 void PrintWebViewHelper::PrintPreviewContext::ClearContext() {
1555 prep_frame_view_.reset(); 1562 prep_frame_view_.reset();
1556 metafile_.reset(); 1563 metafile_.reset();
1557 pages_to_render_.clear(); 1564 pages_to_render_.clear();
1558 error_ = PREVIEW_ERROR_NONE; 1565 error_ = PREVIEW_ERROR_NONE;
1559 } 1566 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698