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

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

Issue 8585017: PrintPreview: Honor the print media page size and margin values. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: refactoring++ Created 9 years 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 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 bool PrintMsg_Print_Params_IsEqual( 119 bool PrintMsg_Print_Params_IsEqual(
120 const PrintMsg_PrintPages_Params& oldParams, 120 const PrintMsg_PrintPages_Params& oldParams,
121 const PrintMsg_PrintPages_Params& newParams) { 121 const PrintMsg_PrintPages_Params& newParams) {
122 return PageLayoutIsEqual(oldParams, newParams) && 122 return PageLayoutIsEqual(oldParams, newParams) &&
123 oldParams.params.max_shrink == newParams.params.max_shrink && 123 oldParams.params.max_shrink == newParams.params.max_shrink &&
124 oldParams.params.min_shrink == newParams.params.min_shrink && 124 oldParams.params.min_shrink == newParams.params.min_shrink &&
125 oldParams.params.selection_only == newParams.params.selection_only && 125 oldParams.params.selection_only == newParams.params.selection_only &&
126 oldParams.params.supports_alpha_blend == 126 oldParams.params.supports_alpha_blend ==
127 newParams.params.supports_alpha_blend && 127 newParams.params.supports_alpha_blend &&
128 oldParams.pages.size() == newParams.pages.size() && 128 oldParams.pages.size() == newParams.pages.size() &&
129 oldParams.params.print_to_pdf == newParams.params.print_to_pdf &&
129 oldParams.params.display_header_footer == 130 oldParams.params.display_header_footer ==
130 newParams.params.display_header_footer && 131 newParams.params.display_header_footer &&
131 oldParams.params.date == newParams.params.date && 132 oldParams.params.date == newParams.params.date &&
132 oldParams.params.title == newParams.params.title && 133 oldParams.params.title == newParams.params.title &&
133 oldParams.params.url == newParams.params.url && 134 oldParams.params.url == newParams.params.url &&
134 std::equal(oldParams.pages.begin(), oldParams.pages.end(), 135 std::equal(oldParams.pages.begin(), oldParams.pages.end(),
135 newParams.pages.begin()); 136 newParams.pages.begin());
136 } 137 }
137 138
138 void CalculatePrintCanvasSize(const PrintMsg_Print_Params& print_params, 139 void CalculatePrintCanvasSize(const PrintMsg_Print_Params& print_params,
139 gfx::Size* result) { 140 gfx::Size* result) {
140 int dpi = GetDPI(&print_params); 141 int dpi = GetDPI(&print_params);
141 result->set_width(ConvertUnit(print_params.printable_size.width(), dpi, 142 result->set_width(ConvertUnit(print_params.printable_size.width(), dpi,
142 print_params.desired_dpi)); 143 print_params.desired_dpi));
143 144
144 result->set_height(ConvertUnit(print_params.printable_size.height(), dpi, 145 result->set_height(ConvertUnit(print_params.printable_size.height(), dpi,
145 print_params.desired_dpi)); 146 print_params.desired_dpi));
146 } 147 }
147 148
148 bool PrintingNodeOrPdfFrame(const WebFrame* frame, const WebNode& node) { 149 bool PrintingNodeOrPdfFrame(const WebFrame* frame, const WebNode& node) {
149 if (!node.isNull()) 150 if (!node.isNull())
150 return true; 151 return true;
151 std::string mime(frame->dataSource()->response().mimeType().utf8()); 152 std::string mime(frame->dataSource()->response().mimeType().utf8());
152 return mime == "application/pdf"; 153 return mime == "application/pdf";
153 } 154 }
154 155
156 bool PrintingFrameHasPageSizeStyle(WebFrame* frame) {
157 if (!frame)
158 return false;
159 return frame->hasCustomPageSizeStyle(0);
160 }
161
155 printing::MarginType GetMarginsForPdf(WebFrame* frame, const WebNode& node) { 162 printing::MarginType GetMarginsForPdf(WebFrame* frame, const WebNode& node) {
156 if (frame->isPrintScalingDisabledForPlugin(node)) 163 if (frame->isPrintScalingDisabledForPlugin(node))
157 return printing::NO_MARGINS; 164 return printing::NO_MARGINS;
158 else 165 else
159 return printing::PRINTABLE_AREA_MARGINS; 166 return printing::PRINTABLE_AREA_MARGINS;
160 } 167 }
161 168
162 // Get the (x, y) coordinate from where printing of the current text should 169 // Get the (x, y) coordinate from where printing of the current text should
163 // start depending on the horizontal alignment (LEFT, RIGHT, CENTER) and 170 // start depending on the horizontal alignment (LEFT, RIGHT, CENTER) and
164 // vertical alignment (TOP, BOTTOM). 171 // vertical alignment (TOP, BOTTOM).
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 web_frame->setScrollOffset(prev_scroll_offset_); 440 web_frame->setScrollOffset(prev_scroll_offset_);
434 } 441 }
435 } 442 }
436 443
437 PrintWebViewHelper::PrintWebViewHelper(content::RenderView* render_view) 444 PrintWebViewHelper::PrintWebViewHelper(content::RenderView* render_view)
438 : content::RenderViewObserver(render_view), 445 : content::RenderViewObserver(render_view),
439 content::RenderViewObserverTracker<PrintWebViewHelper>(render_view), 446 content::RenderViewObserverTracker<PrintWebViewHelper>(render_view),
440 print_web_view_(NULL), 447 print_web_view_(NULL),
441 is_preview_enabled_(switches::IsPrintPreviewEnabled()), 448 is_preview_enabled_(switches::IsPrintPreviewEnabled()),
442 is_print_ready_metafile_sent_(false), 449 is_print_ready_metafile_sent_(false),
450 ignore_frame_margins_css_(false),
451 fit_to_page_(true),
443 user_cancelled_scripted_print_count_(0), 452 user_cancelled_scripted_print_count_(0),
444 notify_browser_of_print_failure_(true) { 453 notify_browser_of_print_failure_(true) {
445 } 454 }
446 455
447 PrintWebViewHelper::~PrintWebViewHelper() {} 456 PrintWebViewHelper::~PrintWebViewHelper() {}
448 457
449 // Prints |frame| which called window.print(). 458 // Prints |frame| which called window.print().
450 void PrintWebViewHelper::PrintPage(WebKit::WebFrame* frame) { 459 void PrintWebViewHelper::PrintPage(WebKit::WebFrame* frame) {
451 DCHECK(frame); 460 DCHECK(frame);
452 461
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 void PrintWebViewHelper::OnPrintForSystemDialog() { 560 void PrintWebViewHelper::OnPrintForSystemDialog() {
552 WebFrame* frame = print_preview_context_.frame(); 561 WebFrame* frame = print_preview_context_.frame();
553 if (!frame) { 562 if (!frame) {
554 NOTREACHED(); 563 NOTREACHED();
555 return; 564 return;
556 } 565 }
557 566
558 Print(frame, print_preview_context_.node()); 567 Print(frame, print_preview_context_.node());
559 } 568 }
560 569
570 void PrintWebViewHelper::UpdateFrameMarginsCssInfo(
571 const DictionaryValue& settings) {
572 int margins_type = 0;
573 if (!settings.GetInteger(printing::kSettingMarginsType, &margins_type))
574 margins_type = printing::DEFAULT_MARGINS;
575 ignore_frame_margins_css_ = margins_type != printing::DEFAULT_MARGINS;
576 }
577
578 bool PrintWebViewHelper::IsPrintToPdfRequested(
579 const DictionaryValue& job_settings) {
580 bool print_to_pdf = false;
581 if (!job_settings.GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf))
582 NOTREACHED();
583 return print_to_pdf;
584 }
585
561 void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { 586 void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) {
562 DCHECK(is_preview_enabled_); 587 DCHECK(is_preview_enabled_);
563 print_preview_context_.OnPrintPreview(); 588 print_preview_context_.OnPrintPreview();
564 589
565 if (!UpdatePrintSettings(print_preview_context_.frame(), 590 if (!UpdatePrintSettings(print_preview_context_.frame(),
566 print_preview_context_.node(), settings, false)) { 591 print_preview_context_.node(), settings, false)) {
567 if (print_preview_context_.last_error() != PREVIEW_ERROR_BAD_SETTING) { 592 if (print_preview_context_.last_error() != PREVIEW_ERROR_BAD_SETTING) {
568 Send(new PrintHostMsg_PrintPreviewInvalidPrinterSettings( 593 Send(new PrintHostMsg_PrintPreviewInvalidPrinterSettings(
569 routing_id(), print_pages_params_->params.document_cookie)); 594 routing_id(), print_pages_params_->params.document_cookie));
570 notify_browser_of_print_failure_ = false; // Already sent. 595 notify_browser_of_print_failure_ = false; // Already sent.
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
611 } else { 636 } else {
612 if (notify_browser_of_print_failure_) 637 if (notify_browser_of_print_failure_)
613 LOG(ERROR) << "CreatePreviewDocument failed"; 638 LOG(ERROR) << "CreatePreviewDocument failed";
614 DidFinishPrinting(FAIL_PREVIEW); 639 DidFinishPrinting(FAIL_PREVIEW);
615 } 640 }
616 } 641 }
617 642
618 bool PrintWebViewHelper::CreatePreviewDocument() { 643 bool PrintWebViewHelper::CreatePreviewDocument() {
619 PrintMsg_Print_Params print_params = print_pages_params_->params; 644 PrintMsg_Print_Params print_params = print_pages_params_->params;
620 const std::vector<int>& pages = print_pages_params_->pages; 645 const std::vector<int>& pages = print_pages_params_->pages;
621 if (!print_preview_context_.CreatePreviewDocument(&print_params, pages)) 646 if (!print_preview_context_.CreatePreviewDocument(
647 &print_params, pages, ignore_frame_margins_css_,
648 fit_to_page_)) {
622 return false; 649 return false;
650 }
651
652 PageSizeMargins default_page_layout;
653 GetPageSizeAndMarginsInPoints(print_preview_context_.frame(), 0, print_params,
654 ignore_frame_margins_css_, fit_to_page_, NULL, &default_page_layout);
655 if (!old_print_pages_params_.get() ||
656 !PageLayoutIsEqual(*old_print_pages_params_, *print_pages_params_)) {
657 bool has_page_size_style = PrintingFrameHasPageSizeStyle(
658 print_preview_context_.frame());
659 // Margins: Send default page layout to browser process.
660 Send(new PrintHostMsg_DidGetDefaultPageLayout(
661 routing_id(), default_page_layout, has_page_size_style));
662 }
663
623 PrintHostMsg_DidGetPreviewPageCount_Params params; 664 PrintHostMsg_DidGetPreviewPageCount_Params params;
624 params.page_count = print_preview_context_.total_page_count(); 665 params.page_count = print_preview_context_.total_page_count();
625 params.is_modifiable = print_preview_context_.IsModifiable(); 666 params.is_modifiable = print_preview_context_.IsModifiable();
626 params.document_cookie = print_pages_params_->params.document_cookie; 667 params.document_cookie = print_pages_params_->params.document_cookie;
627 params.preview_request_id = print_pages_params_->params.preview_request_id; 668 params.preview_request_id = print_pages_params_->params.preview_request_id;
628 params.clear_preview_data = print_preview_context_.generate_draft_pages(); 669 params.clear_preview_data = print_preview_context_.generate_draft_pages();
629 Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), params)); 670 Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), params));
630 if (CheckForCancel()) 671 if (CheckForCancel())
631 return false; 672 return false;
632 673
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
833 return true; 874 return true;
834 } 875 }
835 876
836 #if defined(OS_MACOSX) || defined(OS_WIN) 877 #if defined(OS_MACOSX) || defined(OS_WIN)
837 bool PrintWebViewHelper::PrintPages(const PrintMsg_PrintPages_Params& params, 878 bool PrintWebViewHelper::PrintPages(const PrintMsg_PrintPages_Params& params,
838 WebFrame* frame, 879 WebFrame* frame,
839 const WebNode& node) { 880 const WebNode& node) {
840 PrintMsg_Print_Params print_params = params.params; 881 PrintMsg_Print_Params print_params = params.params;
841 PrepareFrameAndViewForPrint prep_frame_view(print_params, frame, node); 882 PrepareFrameAndViewForPrint prep_frame_view(print_params, frame, node);
842 UpdatePrintableSizeInPrintParameters(frame, node, &prep_frame_view, 883 UpdatePrintableSizeInPrintParameters(frame, node, &prep_frame_view,
843 &print_params); 884 &print_params, ignore_frame_margins_css_,
885 fit_to_page_);
844 886
845 int page_count = prep_frame_view.GetExpectedPageCount(); 887 int page_count = prep_frame_view.GetExpectedPageCount();
846 if (!page_count) 888 if (!page_count)
847 return false; 889 return false;
848 Send(new PrintHostMsg_DidGetPrintedPagesCount(routing_id(), 890 Send(new PrintHostMsg_DidGetPrintedPagesCount(routing_id(),
849 print_params.document_cookie, 891 print_params.document_cookie,
850 page_count)); 892 page_count));
851 893
852 const gfx::Size& canvas_size = prep_frame_view.GetPrintCanvasSize(); 894 const gfx::Size& canvas_size = prep_frame_view.GetPrintCanvasSize();
853 PrintMsg_PrintPage_Params page_params; 895 PrintMsg_PrintPage_Params page_params;
(...skipping 19 matching lines...) Expand all
873 PrintMsg_PrintPages_Params* params = print_pages_params_.get(); 915 PrintMsg_PrintPages_Params* params = print_pages_params_.get();
874 DCHECK(params != NULL); 916 DCHECK(params != NULL);
875 PrintPages(*params, print_web_view_->mainFrame(), WebNode()); 917 PrintPages(*params, print_web_view_->mainFrame(), WebNode());
876 } 918 }
877 919
878 // static - Not anonymous so that platform implementations can use it. 920 // static - Not anonymous so that platform implementations can use it.
879 void PrintWebViewHelper::GetPageSizeAndMarginsInPoints( 921 void PrintWebViewHelper::GetPageSizeAndMarginsInPoints(
880 WebFrame* frame, 922 WebFrame* frame,
881 int page_index, 923 int page_index,
882 const PrintMsg_Print_Params& default_params, 924 const PrintMsg_Print_Params& default_params,
925 bool ignore_frame_margins_css,
926 bool fit_to_page,
927 double* scale_factor,
883 PageSizeMargins* page_layout_in_points) { 928 PageSizeMargins* page_layout_in_points) {
884 int dpi = GetDPI(&default_params); 929 int dpi = GetDPI(&default_params);
885 930
886 WebSize page_size_in_pixels( 931 WebSize page_size_in_pixels(
887 ConvertUnit(default_params.page_size.width(), 932 ConvertUnit(default_params.page_size.width(),
888 dpi, printing::kPixelsPerInch), 933 dpi, printing::kPixelsPerInch),
889 ConvertUnit(default_params.page_size.height(), 934 ConvertUnit(default_params.page_size.height(),
890 dpi, printing::kPixelsPerInch)); 935 dpi, printing::kPixelsPerInch));
891 int margin_top_in_pixels = ConvertUnit( 936 int margin_top_in_pixels = ConvertUnit(
892 default_params.margin_top, 937 default_params.margin_top,
893 dpi, printing::kPixelsPerInch); 938 dpi, printing::kPixelsPerInch);
894 int margin_right_in_pixels = ConvertUnit( 939 int margin_right_in_pixels = ConvertUnit(
895 default_params.page_size.width() - 940 default_params.page_size.width() -
896 default_params.printable_size.width() - default_params.margin_left, 941 default_params.printable_size.width() - default_params.margin_left,
897 dpi, printing::kPixelsPerInch); 942 dpi, printing::kPixelsPerInch);
898 int margin_bottom_in_pixels = ConvertUnit( 943 int margin_bottom_in_pixels = ConvertUnit(
899 default_params.page_size.height() - 944 default_params.page_size.height() -
900 default_params.printable_size.height() - default_params.margin_top, 945 default_params.printable_size.height() - default_params.margin_top,
901 dpi, printing::kPixelsPerInch); 946 dpi, printing::kPixelsPerInch);
902 int margin_left_in_pixels = ConvertUnit( 947 int margin_left_in_pixels = ConvertUnit(
903 default_params.margin_left, 948 default_params.margin_left,
904 dpi, printing::kPixelsPerInch); 949 dpi, printing::kPixelsPerInch);
905 950
906 if (frame) { 951 if (frame) {
vandebo (ex-Chrome) 2011/12/02 01:28:19 If I'm reading this correctly, if ignore_frame_mar
kmadhusu 2011/12/02 23:33:19 Done.
952 int old_margin_top_in_pixels = margin_top_in_pixels;
953 int old_margin_bottom_in_pixels = margin_bottom_in_pixels;
954 int old_margin_left_in_pixels = margin_left_in_pixels;
955 int old_margin_right_in_pixels = margin_right_in_pixels;
956
907 frame->pageSizeAndMarginsInPixels(page_index, 957 frame->pageSizeAndMarginsInPixels(page_index,
908 page_size_in_pixels, 958 page_size_in_pixels,
909 margin_top_in_pixels, 959 margin_top_in_pixels,
910 margin_right_in_pixels, 960 margin_right_in_pixels,
911 margin_bottom_in_pixels, 961 margin_bottom_in_pixels,
912 margin_left_in_pixels); 962 margin_left_in_pixels);
963 if (ignore_frame_margins_css) {
964 margin_top_in_pixels = old_margin_top_in_pixels;
965 margin_bottom_in_pixels = old_margin_bottom_in_pixels;
966 margin_left_in_pixels = old_margin_left_in_pixels;
967 margin_right_in_pixels = old_margin_right_in_pixels;
968 }
913 } 969 }
914 970
915 page_layout_in_points->content_width = 971 double new_printable_width =
vandebo (ex-Chrome) 2011/12/02 01:28:19 is this printable width, page width, or content wi
kmadhusu 2011/12/02 23:33:19 Done.
916 ConvertPixelsToPoint(page_size_in_pixels.width - 972 ConvertPixelsToPoint(page_size_in_pixels.width -
917 margin_left_in_pixels - 973 margin_left_in_pixels - margin_right_in_pixels);
918 margin_right_in_pixels); 974 double new_printable_height =
919 page_layout_in_points->content_height =
920 ConvertPixelsToPoint(page_size_in_pixels.height - 975 ConvertPixelsToPoint(page_size_in_pixels.height -
921 margin_top_in_pixels - 976 margin_top_in_pixels - margin_bottom_in_pixels);
922 margin_bottom_in_pixels); 977 double default_printable_width =
978 ConvertUnit(default_params.printable_size.width(),
979 dpi, printing::kPointsPerInch);
980 double default_printable_height =
981 ConvertUnit(default_params.printable_size.height(),
982 dpi, printing::kPointsPerInch);
983
984 if (ignore_frame_margins_css && fit_to_page) {
985 new_printable_width = default_printable_width;
986 new_printable_height = default_printable_height;
987 }
923 988
924 // Invalid page size and/or margins. We just use the default setting. 989 // Invalid page size and/or margins. We just use the default setting.
925 if (page_layout_in_points->content_width < 1.0 || 990 if (new_printable_width < 1.0 || new_printable_height < 1.0) {
926 page_layout_in_points->content_height < 1.0) {
927 CHECK(frame != NULL); 991 CHECK(frame != NULL);
928 GetPageSizeAndMarginsInPoints(NULL, page_index, default_params, 992 GetPageSizeAndMarginsInPoints(NULL, page_index, default_params, false,
929 page_layout_in_points); 993 false, NULL, page_layout_in_points);
930 return; 994 return;
931 } 995 }
996 double margin_top_in_points =
997 ConvertPixelsToPointDouble(margin_top_in_pixels);
998 double margin_right_in_points =
999 ConvertPixelsToPointDouble(margin_right_in_pixels);
1000 double margin_left_in_points =
1001 ConvertPixelsToPointDouble(margin_left_in_pixels);
1002 double margin_bottom_in_points =
1003 ConvertPixelsToPointDouble(margin_bottom_in_pixels);
1004 double content_width = new_printable_width;
1005 double content_height = new_printable_height;
932 1006
933 page_layout_in_points->margin_top = 1007 if (fit_to_page && (default_printable_height != new_printable_height ||
934 ConvertPixelsToPointDouble(margin_top_in_pixels); 1008 default_printable_width != new_printable_width)) {
935 page_layout_in_points->margin_right = 1009 double default_page_size_height =
936 ConvertPixelsToPointDouble(margin_right_in_pixels); 1010 ConvertUnit(default_params.page_size.height(), dpi,
937 page_layout_in_points->margin_bottom = 1011 printing::kPointsPerInch);
938 ConvertPixelsToPointDouble(margin_bottom_in_pixels); 1012 double default_page_size_width =
939 page_layout_in_points->margin_left = 1013 ConvertUnit(default_params.page_size.width(), dpi,
940 ConvertPixelsToPointDouble(margin_left_in_pixels); 1014 printing::kPointsPerInch);
1015 if (default_printable_width < new_printable_width ||
1016 default_printable_height < new_printable_height) {
1017 double ratio_width = default_printable_width / new_printable_width;
vandebo (ex-Chrome) 2011/12/02 01:28:19 I think we want to scale the CSS page box into the
kmadhusu 2011/12/02 23:33:19 Done.
kmadhusu 2011/12/02 23:33:19 Done.
1018 double ratio_height = default_printable_height / new_printable_height;
1019 double factor = ratio_width < ratio_height ? ratio_width : ratio_height;
1020 if (scale_factor)
1021 *scale_factor = factor;
1022
1023 content_width *= factor;
1024 content_height *= factor;
1025 margin_top_in_points = default_page_size_height/2 - content_height/2;
vandebo (ex-Chrome) 2011/12/02 01:28:19 (default_page_size_height - content_height) / 2;
vandebo (ex-Chrome) 2011/12/02 01:28:19 If we scale the CSS page box into the printable ar
kmadhusu 2011/12/02 23:33:19 Done.
1026 margin_left_in_points = default_page_size_width/2 - content_width/2;
1027 margin_right_in_points = default_page_size_width -
1028 margin_left_in_points - content_width;
1029 margin_bottom_in_points = default_page_size_height -
1030 margin_top_in_points - content_height;
1031 } else {
1032 int margin_top_bottom = margin_top_in_points + margin_bottom_in_points;
vandebo (ex-Chrome) 2011/12/02 01:28:19 This doesn't seem to work out. The formula we wor
kmadhusu 2011/12/02 23:33:19 This is the formula for scaling. I have also updat
1033 int margin_left_right = margin_left_in_points + margin_right_in_points;
1034 double ratio_y = 1.0f, ratio_x = 1.0f;
1035 if (margin_top_bottom > 0) {
1036 ratio_y = (default_page_size_height - new_printable_height) /
1037 margin_top_bottom;
1038 }
1039 if (margin_left_right > 0) {
1040 ratio_x = (default_page_size_width - new_printable_width) /
1041 margin_left_right;
1042 }
1043 margin_top_in_points *= ratio_y;
1044 margin_left_in_points *= ratio_x;
1045 margin_right_in_points *= ratio_x;
1046 margin_bottom_in_points *= ratio_y;
1047 }
1048 }
1049 page_layout_in_points->content_width = content_width;
1050 page_layout_in_points->content_height = content_height;
1051 page_layout_in_points->margin_top = margin_top_in_points;
1052 page_layout_in_points->margin_right = margin_right_in_points;
1053 page_layout_in_points->margin_bottom = margin_bottom_in_points;
1054 page_layout_in_points->margin_left = margin_left_in_points;
941 } 1055 }
942 1056
943 // static - Not anonymous so that platform implementations can use it. 1057 // static - Not anonymous so that platform implementations can use it.
944 void PrintWebViewHelper::UpdatePrintableSizeInPrintParameters( 1058 void PrintWebViewHelper::UpdatePrintableSizeInPrintParameters(
945 WebFrame* frame, 1059 WebFrame* frame,
946 const WebNode& node, 1060 const WebNode& node,
947 PrepareFrameAndViewForPrint* prepare, 1061 PrepareFrameAndViewForPrint* prepare,
948 PrintMsg_Print_Params* params) { 1062 PrintMsg_Print_Params* params,
vandebo (ex-Chrome) 2011/12/02 01:28:19 pass by value, since we want to change it in the b
kmadhusu 2011/12/02 23:33:19 Done.
1063 bool ignore_frame_margins_css,
1064 bool fit_to_page) {
949 if (PrintingNodeOrPdfFrame(frame, node)) 1065 if (PrintingNodeOrPdfFrame(frame, node))
950 return; 1066 return;
951 PageSizeMargins page_layout_in_points; 1067 PageSizeMargins page_layout_in_points;
952 PrintWebViewHelper::GetPageSizeAndMarginsInPoints(frame, 0, *params, 1068 PrintMsg_Print_Params current_params = *params;
953 &page_layout_in_points); 1069 PrintWebViewHelper::GetPageSizeAndMarginsInPoints(frame, 0, current_params,
1070 ignore_frame_margins_css, false, NULL, &page_layout_in_points);
954 int dpi = GetDPI(params); 1071 int dpi = GetDPI(params);
955 params->printable_size = gfx::Size( 1072 current_params.printable_size = gfx::Size(
956 static_cast<int>(ConvertUnitDouble( 1073 static_cast<int>(ConvertUnitDouble(
957 page_layout_in_points.content_width, 1074 page_layout_in_points.content_width,
958 printing::kPointsPerInch, dpi)), 1075 printing::kPointsPerInch, dpi)),
959 static_cast<int>(ConvertUnitDouble( 1076 static_cast<int>(ConvertUnitDouble(
960 page_layout_in_points.content_height, 1077 page_layout_in_points.content_height,
961 printing::kPointsPerInch, dpi))); 1078 printing::kPointsPerInch, dpi)));
962
963 double page_width_in_points = 1079 double page_width_in_points =
964 page_layout_in_points.content_width + 1080 page_layout_in_points.content_width +
965 page_layout_in_points.margin_left + 1081 page_layout_in_points.margin_left +
966 page_layout_in_points.margin_right; 1082 page_layout_in_points.margin_right;
967 double page_height_in_points = 1083 double page_height_in_points =
968 page_layout_in_points.content_height + 1084 page_layout_in_points.content_height +
969 page_layout_in_points.margin_top + 1085 page_layout_in_points.margin_top +
970 page_layout_in_points.margin_bottom; 1086 page_layout_in_points.margin_bottom;
971 1087
972 params->page_size = gfx::Size( 1088 current_params.page_size = gfx::Size(
973 static_cast<int>(ConvertUnitDouble( 1089 static_cast<int>(ConvertUnitDouble(
974 page_width_in_points, printing::kPointsPerInch, dpi)), 1090 page_width_in_points, printing::kPointsPerInch, dpi)),
975 static_cast<int>(ConvertUnitDouble( 1091 static_cast<int>(ConvertUnitDouble(
976 page_height_in_points, printing::kPointsPerInch, dpi))); 1092 page_height_in_points, printing::kPointsPerInch, dpi)));
977 1093 current_params.margin_top =
978 params->margin_top = static_cast<int>(ConvertUnitDouble( 1094 static_cast<int>(ConvertUnitDouble(
979 page_layout_in_points.margin_top, printing::kPointsPerInch, dpi)); 1095 page_layout_in_points.margin_top, printing::kPointsPerInch, dpi));
980 params->margin_left = static_cast<int>(ConvertUnitDouble( 1096 current_params.margin_left = static_cast<int>(ConvertUnitDouble(
981 page_layout_in_points.margin_left, printing::kPointsPerInch, dpi)); 1097 page_layout_in_points.margin_left, printing::kPointsPerInch, dpi));
982 1098 prepare->UpdatePrintParams(current_params);
983 prepare->UpdatePrintParams(*params);
984 } 1099 }
985 1100
986 bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame, 1101 bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame,
987 const WebKit::WebNode& node) { 1102 const WebKit::WebNode& node) {
988 DCHECK(frame); 1103 DCHECK(frame);
989 PrintMsg_PrintPages_Params settings; 1104 PrintMsg_PrintPages_Params settings;
990 1105
991 Send(new PrintHostMsg_GetDefaultPrintSettings(routing_id(), 1106 Send(new PrintHostMsg_GetDefaultPrintSettings(routing_id(),
992 &settings.params)); 1107 &settings.params));
993 // Check if the printer returned any settings, if the settings is empty, we 1108 // Check if the printer returned any settings, if the settings is empty, we
(...skipping 23 matching lines...) Expand all
1017 bool PrintWebViewHelper::InitPrintSettingsAndPrepareFrame( 1132 bool PrintWebViewHelper::InitPrintSettingsAndPrepareFrame(
1018 WebKit::WebFrame* frame, const WebKit::WebNode& node, 1133 WebKit::WebFrame* frame, const WebKit::WebNode& node,
1019 scoped_ptr<PrepareFrameAndViewForPrint>* prepare) { 1134 scoped_ptr<PrepareFrameAndViewForPrint>* prepare) {
1020 if (!InitPrintSettings(frame, node)) 1135 if (!InitPrintSettings(frame, node))
1021 return false; 1136 return false;
1022 1137
1023 DCHECK(!prepare->get()); 1138 DCHECK(!prepare->get());
1024 prepare->reset(new PrepareFrameAndViewForPrint(print_pages_params_->params, 1139 prepare->reset(new PrepareFrameAndViewForPrint(print_pages_params_->params,
1025 frame, node)); 1140 frame, node));
1026 UpdatePrintableSizeInPrintParameters(frame, node, prepare->get(), 1141 UpdatePrintableSizeInPrintParameters(frame, node, prepare->get(),
1027 &print_pages_params_->params); 1142 &print_pages_params_->params,
1143 ignore_frame_margins_css_,
1144 fit_to_page_);
1028 Send(new PrintHostMsg_DidGetDocumentCookie( 1145 Send(new PrintHostMsg_DidGetDocumentCookie(
1029 routing_id(), print_pages_params_->params.document_cookie)); 1146 routing_id(), print_pages_params_->params.document_cookie));
1030 return true; 1147 return true;
1031 } 1148 }
1032 1149
1033 bool PrintWebViewHelper::UpdatePrintSettings( 1150 bool PrintWebViewHelper::UpdatePrintSettings(
1034 WebKit::WebFrame* frame, const WebKit::WebNode& node, 1151 WebKit::WebFrame* frame, const WebKit::WebNode& node,
1035 const DictionaryValue& passed_job_settings, bool print_for_preview) { 1152 const DictionaryValue& passed_job_settings, bool print_for_preview) {
1036 DCHECK(is_preview_enabled_); 1153 DCHECK(is_preview_enabled_);
1037 const DictionaryValue* job_settings = &passed_job_settings; 1154 const DictionaryValue* job_settings = &passed_job_settings;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1071 bool get_margins_from_pdf = false; 1188 bool get_margins_from_pdf = false;
1072 #endif 1189 #endif
1073 1190
1074 printing::MarginType margin_type = printing::NO_MARGINS; 1191 printing::MarginType margin_type = printing::NO_MARGINS;
1075 if (get_margins_from_pdf) 1192 if (get_margins_from_pdf)
1076 margin_type = GetMarginsForPdf(frame, node); 1193 margin_type = GetMarginsForPdf(frame, node);
1077 modified_job_settings.SetInteger(printing::kSettingMarginsType, 1194 modified_job_settings.SetInteger(printing::kSettingMarginsType,
1078 margin_type); 1195 margin_type);
1079 job_settings = &modified_job_settings; 1196 job_settings = &modified_job_settings;
1080 } 1197 }
1198 UpdateFrameMarginsCssInfo(*job_settings);
vandebo (ex-Chrome) 2011/12/02 01:28:19 You can put both of these lines in a !print_for_pr
kmadhusu 2011/12/02 23:33:19 Done.
1199 fit_to_page_ = !print_for_preview && source_is_html &&
1200 !IsPrintToPdfRequested(*job_settings);
1081 1201
1082 // Send the cookie so that UpdatePrintSettings can reuse PrinterQuery when 1202 // Send the cookie so that UpdatePrintSettings can reuse PrinterQuery when
1083 // possible. 1203 // possible.
1084 int cookie = print_pages_params_.get() ? 1204 int cookie = print_pages_params_.get() ?
1085 print_pages_params_->params.document_cookie : 0; 1205 print_pages_params_->params.document_cookie : 0;
1086 PrintMsg_PrintPages_Params settings; 1206 PrintMsg_PrintPages_Params settings;
1087 Send(new PrintHostMsg_UpdatePrintSettings(routing_id(), 1207 Send(new PrintHostMsg_UpdatePrintSettings(routing_id(),
1088 cookie, *job_settings, &settings)); 1208 cookie, *job_settings, &settings));
1089 print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); 1209 print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings));
1090 1210
(...skipping 27 matching lines...) Expand all
1118 &(settings.params.preview_ui_addr)) || 1238 &(settings.params.preview_ui_addr)) ||
1119 !job_settings->GetInteger(printing::kPreviewRequestID, 1239 !job_settings->GetInteger(printing::kPreviewRequestID,
1120 &(settings.params.preview_request_id)) || 1240 &(settings.params.preview_request_id)) ||
1121 !job_settings->GetBoolean(printing::kIsFirstRequest, 1241 !job_settings->GetBoolean(printing::kIsFirstRequest,
1122 &(settings.params.is_first_request))) { 1242 &(settings.params.is_first_request))) {
1123 NOTREACHED(); 1243 NOTREACHED();
1124 print_preview_context_.set_error(PREVIEW_ERROR_BAD_SETTING); 1244 print_preview_context_.set_error(PREVIEW_ERROR_BAD_SETTING);
1125 return false; 1245 return false;
1126 } 1246 }
1127 1247
1128 // Margins: Send default page layout to browser process. 1248 settings.params.print_to_pdf = IsPrintToPdfRequested(*job_settings);
vandebo (ex-Chrome) 2011/12/02 01:28:19 I think this can go inside the !print_for_preview
kmadhusu 2011/12/02 23:33:19 It is already within that block.
1129 PageSizeMargins default_page_layout;
1130 GetPageSizeAndMarginsInPoints(NULL, -1, settings.params,
1131 &default_page_layout);
1132 if (!old_print_pages_params_.get() ||
1133 !PageLayoutIsEqual(*old_print_pages_params_, settings)) {
1134 Send(new PrintHostMsg_DidGetDefaultPageLayout(routing_id(),
1135 default_page_layout));
1136 }
1137 1249
1138 // Header/Footer: Set |header_footer_info_|. 1250 // Header/Footer: Set |header_footer_info_|.
1139 if (settings.params.display_header_footer) { 1251 if (settings.params.display_header_footer) {
1140 header_footer_info_.reset(new DictionaryValue()); 1252 header_footer_info_.reset(new DictionaryValue());
1141 header_footer_info_->SetString(printing::kSettingHeaderFooterDate, 1253 header_footer_info_->SetString(printing::kSettingHeaderFooterDate,
1142 settings.params.date); 1254 settings.params.date);
1143 header_footer_info_->SetString(printing::kSettingHeaderFooterURL, 1255 header_footer_info_->SetString(printing::kSettingHeaderFooterURL,
1144 settings.params.url); 1256 settings.params.url);
1145 header_footer_info_->SetString(printing::kSettingHeaderFooterTitle, 1257 header_footer_info_->SetString(printing::kSettingHeaderFooterTitle,
1146 settings.params.title); 1258 settings.params.title);
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
1364 node_ = web_node; 1476 node_ = web_node;
1365 } 1477 }
1366 1478
1367 void PrintWebViewHelper::PrintPreviewContext::OnPrintPreview() { 1479 void PrintWebViewHelper::PrintPreviewContext::OnPrintPreview() {
1368 DCHECK_EQ(INITIALIZED, state_); 1480 DCHECK_EQ(INITIALIZED, state_);
1369 ClearContext(); 1481 ClearContext();
1370 } 1482 }
1371 1483
1372 bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument( 1484 bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument(
1373 PrintMsg_Print_Params* print_params, 1485 PrintMsg_Print_Params* print_params,
1374 const std::vector<int>& pages) { 1486 const std::vector<int>& pages,
1487 bool ignore_frame_margins_css,
1488 bool fit_to_page) {
1375 DCHECK_EQ(INITIALIZED, state_); 1489 DCHECK_EQ(INITIALIZED, state_);
1376 state_ = RENDERING; 1490 state_ = RENDERING;
1377 1491
1378 metafile_.reset(new printing::PreviewMetafile); 1492 metafile_.reset(new printing::PreviewMetafile);
1379 if (!metafile_->Init()) { 1493 if (!metafile_->Init()) {
1380 set_error(PREVIEW_ERROR_METAFILE_INIT_FAILED); 1494 set_error(PREVIEW_ERROR_METAFILE_INIT_FAILED);
1381 LOG(ERROR) << "PreviewMetafile Init failed"; 1495 LOG(ERROR) << "PreviewMetafile Init failed";
1382 return false; 1496 return false;
1383 } 1497 }
1384 1498
1385 // Need to make sure old object gets destroyed first. 1499 // Need to make sure old object gets destroyed first.
1386 prep_frame_view_.reset(new PrepareFrameAndViewForPrint(*print_params, frame(), 1500 prep_frame_view_.reset(new PrepareFrameAndViewForPrint(*print_params, frame(),
1387 node())); 1501 node()));
1388 UpdatePrintableSizeInPrintParameters(frame_, node_, 1502 UpdatePrintableSizeInPrintParameters(frame_, node_,
1389 prep_frame_view_.get(), print_params); 1503 prep_frame_view_.get(), print_params,
1504 ignore_frame_margins_css,
1505 fit_to_page);
1390 1506
1391 print_params_.reset(new PrintMsg_Print_Params(*print_params)); 1507 print_params_.reset(new PrintMsg_Print_Params(*print_params));
1392 1508
1393 total_page_count_ = prep_frame_view_->GetExpectedPageCount(); 1509 total_page_count_ = prep_frame_view_->GetExpectedPageCount();
1394 if (total_page_count_ == 0) { 1510 if (total_page_count_ == 0) {
1395 LOG(ERROR) << "CreatePreviewDocument got 0 page count"; 1511 LOG(ERROR) << "CreatePreviewDocument got 0 page count";
1396 set_error(PREVIEW_ERROR_ZERO_PAGES); 1512 set_error(PREVIEW_ERROR_ZERO_PAGES);
1397 return false; 1513 return false;
1398 } 1514 }
1399 1515
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
1555 DCHECK(IsRendering()); 1671 DCHECK(IsRendering());
1556 return prep_frame_view_->GetPrintCanvasSize(); 1672 return prep_frame_view_->GetPrintCanvasSize();
1557 } 1673 }
1558 1674
1559 void PrintWebViewHelper::PrintPreviewContext::ClearContext() { 1675 void PrintWebViewHelper::PrintPreviewContext::ClearContext() {
1560 prep_frame_view_.reset(); 1676 prep_frame_view_.reset();
1561 metafile_.reset(); 1677 metafile_.reset();
1562 pages_to_render_.clear(); 1678 pages_to_render_.clear();
1563 error_ = PREVIEW_ERROR_NONE; 1679 error_ = PREVIEW_ERROR_NONE;
1564 } 1680 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698