Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/printing/print_web_view_helper.h" | 5 #include "chrome/renderer/printing/print_web_view_helper.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 468 content_area.size().width() / scale_factor, | 468 content_area.size().width() / scale_factor, |
| 469 content_area.size().height() / scale_factor)); | 469 content_area.size().height() / scale_factor)); |
| 470 SkIRect clip_int_rect; | 470 SkIRect clip_int_rect; |
| 471 clip_rect.roundOut(&clip_int_rect); | 471 clip_rect.roundOut(&clip_int_rect); |
| 472 SkRegion clip_region(clip_int_rect); | 472 SkRegion clip_region(clip_int_rect); |
| 473 canvas->setClipRegion(clip_region); | 473 canvas->setClipRegion(clip_region); |
| 474 } | 474 } |
| 475 return frame->printPage(page_number, canvas); | 475 return frame->printPage(page_number, canvas); |
| 476 } | 476 } |
| 477 | 477 |
| 478 // Class that calls the Begin and End print functions on the frame and changes | |
| 479 // the size of the view temporarily to support full page printing.. | |
| 480 // Do not serve any events in the time between construction and destruction of | |
| 481 // this class because it will cause flicker. | |
| 482 class PrepareFrameAndViewForPrint { | |
| 483 public: | |
| 484 // Prints |frame|. If |node| is not NULL, then only that node will be | |
| 485 // printed. | |
| 486 PrepareFrameAndViewForPrint(const PrintMsg_Print_Params& params, | |
| 487 WebKit::WebFrame* frame, | |
| 488 const WebKit::WebNode& node, | |
| 489 bool ignore_css_margins); | |
| 490 ~PrepareFrameAndViewForPrint(); | |
| 491 | |
| 492 bool StartPrinting(); | |
|
Lei Zhang
2013/01/23 08:31:38
Why return a bool if you never check it?
Vitaly Buka (NO REVIEWS)
2013/01/23 09:32:31
Done.
| |
| 493 | |
| 494 int GetExpectedPageCount() const { | |
| 495 return expected_pages_count_; | |
| 496 } | |
| 497 | |
| 498 gfx::Size GetPrintCanvasSize() const; | |
| 499 | |
| 500 void FinishPrinting(); | |
| 501 | |
| 502 private: | |
| 503 WebKit::WebFrame* frame_; | |
| 504 WebKit::WebNode node_to_print_; | |
| 505 WebKit::WebView* web_view_; | |
| 506 WebKit::WebPrintParams web_print_params_; | |
| 507 gfx::Size prev_view_size_; | |
| 508 gfx::Size prev_scroll_offset_; | |
| 509 int expected_pages_count_; | |
| 510 bool should_print_backgrounds_; | |
| 511 | |
| 512 DISALLOW_COPY_AND_ASSIGN(PrepareFrameAndViewForPrint); | |
| 513 }; | |
| 514 | |
| 515 | |
| 478 PrepareFrameAndViewForPrint::PrepareFrameAndViewForPrint( | 516 PrepareFrameAndViewForPrint::PrepareFrameAndViewForPrint( |
| 479 const PrintMsg_Print_Params& print_params, | 517 const PrintMsg_Print_Params& params, |
| 480 WebKit::WebFrame* frame, | 518 WebKit::WebFrame* frame, |
| 481 const WebKit::WebNode& node) | 519 const WebKit::WebNode& node, |
| 482 : frame_(frame), | 520 bool ignore_css_margins) |
| 483 node_to_print_(node), | 521 : frame_(frame), |
| 484 web_view_(frame->view()), | 522 node_to_print_(node), |
| 485 expected_pages_count_(0), | 523 web_view_(frame->view()), |
| 486 use_browser_overlays_(true), | 524 expected_pages_count_(0), |
| 487 finished_(false), | 525 should_print_backgrounds_(params.should_print_backgrounds) { |
| 488 should_print_backgrounds_(print_params.should_print_backgrounds) { | 526 PrintMsg_Print_Params print_params = params; |
| 489 WebKit::WebPrintParams webkit_print_params; | |
| 490 ComputeWebKitPrintParamsInDesiredDpi(print_params, &webkit_print_params); | |
| 491 | 527 |
| 492 if (WebKit::WebFrame* web_frame = web_view_->mainFrame()) | 528 if (WebKit::WebFrame* web_frame = web_view_->mainFrame()) |
| 493 prev_scroll_offset_ = web_frame->scrollOffset(); | 529 prev_scroll_offset_ = web_frame->scrollOffset(); |
| 494 prev_view_size_ = web_view_->size(); | 530 prev_view_size_ = web_view_->size(); |
| 495 | 531 |
| 496 StartPrinting(webkit_print_params); | 532 if (!PrintingNodeOrPdfFrame(frame_, node_to_print_)) { |
| 533 bool fit_to_page = ignore_css_margins && | |
| 534 print_params.print_scaling_option == | |
| 535 WebKit::WebPrintScalingOptionFitToPrintableArea; | |
| 536 print_params = CalculatePrintParamsForCss(frame_, 0, print_params, | |
| 537 ignore_css_margins, fit_to_page, | |
| 538 NULL); | |
| 539 } | |
| 540 | |
| 541 ComputeWebKitPrintParamsInDesiredDpi(print_params, &web_print_params_); | |
| 497 } | 542 } |
| 498 | 543 |
| 499 PrepareFrameAndViewForPrint::~PrepareFrameAndViewForPrint() { | 544 PrepareFrameAndViewForPrint::~PrepareFrameAndViewForPrint() { |
| 500 FinishPrinting(); | 545 FinishPrinting(); |
| 501 } | 546 } |
| 502 | 547 |
| 503 void PrepareFrameAndViewForPrint::UpdatePrintParams( | 548 bool PrepareFrameAndViewForPrint::StartPrinting() { |
| 504 const PrintMsg_Print_Params& print_params) { | |
| 505 DCHECK(!finished_); | |
| 506 WebKit::WebPrintParams webkit_print_params; | |
| 507 ComputeWebKitPrintParamsInDesiredDpi(print_params, &webkit_print_params); | |
| 508 | |
| 509 should_print_backgrounds_ = print_params.should_print_backgrounds; | |
| 510 | |
| 511 if (webkit_print_params.printContentArea == | |
| 512 web_print_params_.printContentArea && | |
| 513 webkit_print_params.printableArea == web_print_params_.printableArea && | |
| 514 webkit_print_params.paperSize == web_print_params_.paperSize && | |
| 515 webkit_print_params.printScalingOption == | |
| 516 web_print_params_.printScalingOption) { | |
| 517 return; | |
| 518 } | |
| 519 | |
| 520 frame_->printEnd(); | |
| 521 StartPrinting(webkit_print_params); | |
| 522 } | |
| 523 | |
| 524 gfx::Size PrepareFrameAndViewForPrint::GetPrintCanvasSize() const { | |
| 525 return gfx::Size(web_print_params_.printContentArea.width, | |
| 526 web_print_params_.printContentArea.height); | |
| 527 } | |
| 528 | |
| 529 void PrepareFrameAndViewForPrint::StartPrinting( | |
| 530 const WebKit::WebPrintParams& webkit_print_params) { | |
| 531 web_print_params_ = webkit_print_params; | |
| 532 | |
| 533 // Layout page according to printer page size. Since WebKit shrinks the | 549 // Layout page according to printer page size. Since WebKit shrinks the |
| 534 // size of the page automatically (from 125% to 200%) we trick it to | 550 // size of the page automatically (from 125% to 200%) we trick it to |
| 535 // think the page is 125% larger so the size of the page is correct for | 551 // think the page is 125% larger so the size of the page is correct for |
| 536 // minimum (default) scaling. | 552 // minimum (default) scaling. |
| 537 // This is important for sites that try to fill the page. | 553 // This is important for sites that try to fill the page. |
| 538 gfx::Size print_layout_size(web_print_params_.printContentArea.width, | 554 gfx::Size print_layout_size(web_print_params_.printContentArea.width, |
| 539 web_print_params_.printContentArea.height); | 555 web_print_params_.printContentArea.height); |
| 540 print_layout_size.set_height(static_cast<int>( | 556 print_layout_size.set_height(static_cast<int>( |
| 541 static_cast<double>(print_layout_size.height()) * 1.25)); | 557 static_cast<double>(print_layout_size.height()) * 1.25)); |
| 542 | 558 |
| 543 web_view_->resize(print_layout_size); | 559 web_view_->resize(print_layout_size); |
| 560 web_view_->settings()->setShouldPrintBackgrounds(should_print_backgrounds_); | |
| 544 | 561 |
| 545 expected_pages_count_ = frame_->printBegin(web_print_params_, | 562 expected_pages_count_ = frame_->printBegin(web_print_params_, node_to_print_, |
| 546 node_to_print_, | 563 NULL); |
|
Lei Zhang
2013/01/23 08:31:38
|use_browser_overlays_| has been disconnected for
Vitaly Buka (NO REVIEWS)
2013/01/23 09:32:31
I am not assuming, just see that it's not used any
Lei Zhang
2013/01/23 19:50:24
Thanks. Please do that and add a TODO here referri
Vitaly Buka (NO REVIEWS)
2013/01/23 20:25:58
Done.
| |
| 547 &use_browser_overlays_); | 564 return expected_pages_count_ > 0; |
| 565 } | |
| 548 | 566 |
| 549 web_view_->settings()->setShouldPrintBackgrounds(should_print_backgrounds_); | 567 gfx::Size PrepareFrameAndViewForPrint::GetPrintCanvasSize() const { |
| 568 return gfx::Size(web_print_params_.printContentArea.width, | |
| 569 web_print_params_.printContentArea.height); | |
| 550 } | 570 } |
| 551 | 571 |
| 552 void PrepareFrameAndViewForPrint::FinishPrinting() { | 572 void PrepareFrameAndViewForPrint::FinishPrinting() { |
| 553 if (!finished_) { | 573 if (frame_) |
|
Lei Zhang
2013/01/23 08:31:38
If you get rid of |finished_|, you may want to doc
Vitaly Buka (NO REVIEWS)
2013/01/23 09:32:31
Actually only frame is necessary.
On 2013/01/23 0
| |
| 554 finished_ = true; | |
| 555 frame_->printEnd(); | 574 frame_->printEnd(); |
| 575 if (web_view_) { | |
| 556 web_view_->resize(prev_view_size_); | 576 web_view_->resize(prev_view_size_); |
| 557 if (WebKit::WebFrame* web_frame = web_view_->mainFrame()) | 577 if (WebKit::WebFrame* web_frame = web_view_->mainFrame()) |
| 558 web_frame->setScrollOffset(prev_scroll_offset_); | 578 web_frame->setScrollOffset(prev_scroll_offset_); |
| 559 web_view_->settings()->setShouldPrintBackgrounds(false); | 579 web_view_->settings()->setShouldPrintBackgrounds(false); |
| 560 } | 580 } |
| 581 frame_ = NULL; | |
| 582 web_view_ = NULL; | |
| 561 } | 583 } |
| 562 | 584 |
| 563 PrintWebViewHelper::PrintWebViewHelper(content::RenderView* render_view) | 585 PrintWebViewHelper::PrintWebViewHelper(content::RenderView* render_view) |
| 564 : content::RenderViewObserver(render_view), | 586 : content::RenderViewObserver(render_view), |
| 565 content::RenderViewObserverTracker<PrintWebViewHelper>(render_view), | 587 content::RenderViewObserverTracker<PrintWebViewHelper>(render_view), |
| 566 print_web_view_(NULL), | 588 print_web_view_(NULL), |
| 567 is_preview_enabled_(IsPrintPreviewEnabled()), | 589 is_preview_enabled_(IsPrintPreviewEnabled()), |
| 568 is_scripted_print_throttling_disabled_(IsPrintThrottlingDisabled()), | 590 is_scripted_print_throttling_disabled_(IsPrintThrottlingDisabled()), |
| 569 is_print_ready_metafile_sent_(false), | 591 is_print_ready_metafile_sent_(false), |
| 570 ignore_css_margins_(false), | 592 ignore_css_margins_(false), |
| (...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1002 | 1024 |
| 1003 print_node_in_progress_ = false; | 1025 print_node_in_progress_ = false; |
| 1004 } | 1026 } |
| 1005 | 1027 |
| 1006 void PrintWebViewHelper::Print(WebKit::WebFrame* frame, | 1028 void PrintWebViewHelper::Print(WebKit::WebFrame* frame, |
| 1007 const WebKit::WebNode& node) { | 1029 const WebKit::WebNode& node) { |
| 1008 // If still not finished with earlier print request simply ignore. | 1030 // If still not finished with earlier print request simply ignore. |
| 1009 if (print_web_view_) | 1031 if (print_web_view_) |
| 1010 return; | 1032 return; |
| 1011 | 1033 |
| 1012 // Initialize print settings. | 1034 int expected_page_count = 0; |
| 1013 scoped_ptr<PrepareFrameAndViewForPrint> prepare; | 1035 if (!CalculateNumberOfPages(frame, node, &expected_page_count)) { |
| 1014 if (!InitPrintSettingsAndPrepareFrame(frame, node, &prepare)) { | |
| 1015 DidFinishPrinting(FAIL_PRINT_INIT); | 1036 DidFinishPrinting(FAIL_PRINT_INIT); |
| 1016 return; // Failed to init print page settings. | 1037 return; // Failed to init print page settings. |
| 1017 } | 1038 } |
| 1018 | 1039 |
| 1019 int expected_page_count = 0; | |
| 1020 bool use_browser_overlays = true; | |
| 1021 | |
| 1022 expected_page_count = prepare->GetExpectedPageCount(); | |
| 1023 if (expected_page_count) | |
| 1024 use_browser_overlays = prepare->ShouldUseBrowserOverlays(); | |
| 1025 | |
| 1026 // Release the prepare before going any further, since we are going to | |
| 1027 // show UI and wait for the user. | |
| 1028 prepare.reset(); | |
| 1029 | |
| 1030 // Some full screen plugins can say they don't want to print. | 1040 // Some full screen plugins can say they don't want to print. |
| 1031 if (!expected_page_count) { | 1041 if (!expected_page_count) { |
| 1032 DidFinishPrinting(FAIL_PRINT); | 1042 DidFinishPrinting(FAIL_PRINT); |
| 1033 return; | 1043 return; |
| 1034 } | 1044 } |
| 1035 | 1045 |
| 1036 // Ask the browser to show UI to retrieve the final print settings. | 1046 // Ask the browser to show UI to retrieve the final print settings. |
| 1037 if (!GetPrintSettingsFromUser(frame, node, expected_page_count, | 1047 if (!GetPrintSettingsFromUser(frame, node, expected_page_count)) { |
| 1038 use_browser_overlays)) { | |
| 1039 DidFinishPrinting(OK); // Release resources and fail silently. | 1048 DidFinishPrinting(OK); // Release resources and fail silently. |
| 1040 return; | 1049 return; |
| 1041 } | 1050 } |
| 1042 | 1051 |
| 1043 // Render Pages for printing. | 1052 // Render Pages for printing. |
| 1044 if (!RenderPagesForPrint(frame, node)) { | 1053 if (!RenderPagesForPrint(frame, node)) { |
| 1045 LOG(ERROR) << "RenderPagesForPrint failed"; | 1054 LOG(ERROR) << "RenderPagesForPrint failed"; |
| 1046 DidFinishPrinting(FAIL_PRINT); | 1055 DidFinishPrinting(FAIL_PRINT); |
| 1047 } | 1056 } |
| 1048 ResetScriptedPrintCount(); | 1057 ResetScriptedPrintCount(); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1112 url_str.append(html); | 1121 url_str.append(html); |
| 1113 GURL url(url_str); | 1122 GURL url(url_str); |
| 1114 | 1123 |
| 1115 // When loading is done this will call didStopLoading() and that will do the | 1124 // When loading is done this will call didStopLoading() and that will do the |
| 1116 // actual printing. | 1125 // actual printing. |
| 1117 print_web_view_->mainFrame()->loadRequest(WebKit::WebURLRequest(url)); | 1126 print_web_view_->mainFrame()->loadRequest(WebKit::WebURLRequest(url)); |
| 1118 | 1127 |
| 1119 return true; | 1128 return true; |
| 1120 } | 1129 } |
| 1121 | 1130 |
| 1122 #if defined(OS_MACOSX) || defined(OS_WIN) | |
| 1123 bool PrintWebViewHelper::PrintPages(WebKit::WebFrame* frame, | 1131 bool PrintWebViewHelper::PrintPages(WebKit::WebFrame* frame, |
| 1124 const WebKit::WebNode& node) { | 1132 const WebKit::WebNode& node) { |
| 1125 const PrintMsg_PrintPages_Params& params = *print_pages_params_; | 1133 const PrintMsg_PrintPages_Params& params = *print_pages_params_; |
| 1126 const PrintMsg_Print_Params& print_params = params.params; | 1134 const PrintMsg_Print_Params& print_params = params.params; |
| 1127 PrepareFrameAndViewForPrint prep_frame_view(print_params, frame, node); | 1135 PrepareFrameAndViewForPrint prep_frame_view(print_params, frame, node, |
| 1128 UpdateFrameAndViewFromCssPageLayout(frame, node, &prep_frame_view, | 1136 ignore_css_margins_); |
| 1129 print_params, ignore_css_margins_); | 1137 prep_frame_view.StartPrinting(); |
| 1130 | 1138 |
| 1131 int page_count = prep_frame_view.GetExpectedPageCount(); | 1139 int page_count = prep_frame_view.GetExpectedPageCount(); |
| 1132 if (!page_count) | 1140 if (!page_count) |
| 1133 return false; | 1141 return false; |
| 1142 | |
| 1143 #if !defined(OS_CHROMEOS) | |
| 1134 // TODO(vitalybuka): should be page_count or valid pages from params.pages. | 1144 // TODO(vitalybuka): should be page_count or valid pages from params.pages. |
| 1135 // See http://crbug.com/161576 | 1145 // See http://crbug.com/161576 |
| 1136 Send(new PrintHostMsg_DidGetPrintedPagesCount(routing_id(), | 1146 Send(new PrintHostMsg_DidGetPrintedPagesCount(routing_id(), |
| 1137 print_params.document_cookie, | 1147 print_params.document_cookie, |
| 1138 page_count)); | 1148 page_count)); |
| 1149 #endif | |
| 1139 | 1150 |
| 1140 const gfx::Size& canvas_size = prep_frame_view.GetPrintCanvasSize(); | 1151 return PrintPagesNative(frame, node, page_count, |
| 1152 prep_frame_view.GetPrintCanvasSize()); | |
| 1153 } | |
| 1154 | |
| 1155 #if defined(OS_MACOSX) || defined(OS_WIN) | |
| 1156 bool PrintWebViewHelper::PrintPagesNative(WebKit::WebFrame* frame, | |
| 1157 const WebKit::WebNode& node, | |
| 1158 int page_count, | |
| 1159 const gfx::Size& canvas_size) { | |
| 1160 const PrintMsg_PrintPages_Params& params = *print_pages_params_; | |
| 1161 const PrintMsg_Print_Params& print_params = params.params; | |
| 1162 | |
| 1141 PrintMsg_PrintPage_Params page_params; | 1163 PrintMsg_PrintPage_Params page_params; |
| 1142 page_params.params = print_params; | 1164 page_params.params = print_params; |
| 1143 if (params.pages.empty()) { | 1165 if (params.pages.empty()) { |
| 1144 for (int i = 0; i < page_count; ++i) { | 1166 for (int i = 0; i < page_count; ++i) { |
| 1145 page_params.page_number = i; | 1167 page_params.page_number = i; |
| 1146 PrintPageInternal(page_params, canvas_size, frame); | 1168 PrintPageInternal(page_params, canvas_size, frame); |
| 1147 } | 1169 } |
| 1148 } else { | 1170 } else { |
| 1149 for (size_t i = 0; i < params.pages.size(); ++i) { | 1171 for (size_t i = 0; i < params.pages.size(); ++i) { |
| 1150 if (params.pages[i] >= page_count) | 1172 if (params.pages[i] >= page_count) |
| 1151 break; | 1173 break; |
| 1152 page_params.page_number = params.pages[i]; | 1174 page_params.page_number = params.pages[i]; |
| 1153 PrintPageInternal(page_params, canvas_size, frame); | 1175 PrintPageInternal(page_params, canvas_size, frame); |
| 1154 } | 1176 } |
| 1155 } | 1177 } |
| 1156 return true; | 1178 return true; |
| 1157 } | 1179 } |
| 1180 | |
| 1158 #endif // OS_MACOSX || OS_WIN | 1181 #endif // OS_MACOSX || OS_WIN |
| 1159 | 1182 |
| 1160 void PrintWebViewHelper::didStopLoading() { | 1183 void PrintWebViewHelper::didStopLoading() { |
| 1161 PrintPages(print_web_view_->mainFrame(), WebKit::WebNode()); | 1184 PrintPages(print_web_view_->mainFrame(), WebKit::WebNode()); |
| 1162 } | 1185 } |
| 1163 | 1186 |
| 1164 // static - Not anonymous so that platform implementations can use it. | 1187 // static - Not anonymous so that platform implementations can use it. |
| 1165 void PrintWebViewHelper::ComputePageLayoutInPointsForCss( | 1188 void PrintWebViewHelper::ComputePageLayoutInPointsForCss( |
| 1166 WebKit::WebFrame* frame, | 1189 WebKit::WebFrame* frame, |
| 1167 int page_index, | 1190 int page_index, |
| 1168 const PrintMsg_Print_Params& page_params, | 1191 const PrintMsg_Print_Params& page_params, |
| 1169 bool ignore_css_margins, | 1192 bool ignore_css_margins, |
| 1170 double* scale_factor, | 1193 double* scale_factor, |
| 1171 PageSizeMargins* page_layout_in_points) { | 1194 PageSizeMargins* page_layout_in_points) { |
| 1172 PrintMsg_Print_Params params = CalculatePrintParamsForCss( | 1195 PrintMsg_Print_Params params = CalculatePrintParamsForCss( |
| 1173 frame, page_index, page_params, ignore_css_margins, | 1196 frame, page_index, page_params, ignore_css_margins, |
| 1174 page_params.print_scaling_option == | 1197 page_params.print_scaling_option == |
| 1175 WebKit::WebPrintScalingOptionFitToPrintableArea, | 1198 WebKit::WebPrintScalingOptionFitToPrintableArea, |
| 1176 scale_factor); | 1199 scale_factor); |
| 1177 CalculatePageLayoutFromPrintParams(params, page_layout_in_points); | 1200 CalculatePageLayoutFromPrintParams(params, page_layout_in_points); |
| 1178 } | 1201 } |
| 1179 | 1202 |
| 1180 // static - Not anonymous so that platform implementations can use it. | |
| 1181 void PrintWebViewHelper::UpdateFrameAndViewFromCssPageLayout( | |
| 1182 WebKit::WebFrame* frame, | |
| 1183 const WebKit::WebNode& node, | |
| 1184 PrepareFrameAndViewForPrint* prepare, | |
| 1185 const PrintMsg_Print_Params& params, | |
| 1186 bool ignore_css_margins) { | |
| 1187 if (PrintingNodeOrPdfFrame(frame, node)) | |
| 1188 return; | |
| 1189 bool fit_to_page = ignore_css_margins && | |
| 1190 params.print_scaling_option == | |
| 1191 WebKit::WebPrintScalingOptionFitToPrintableArea; | |
| 1192 PrintMsg_Print_Params print_params = CalculatePrintParamsForCss( | |
| 1193 frame, 0, params, ignore_css_margins, fit_to_page, NULL); | |
| 1194 prepare->UpdatePrintParams(print_params); | |
| 1195 } | |
| 1196 | |
| 1197 bool PrintWebViewHelper::InitPrintSettings(bool fit_to_paper_size) { | 1203 bool PrintWebViewHelper::InitPrintSettings(bool fit_to_paper_size) { |
| 1198 PrintMsg_PrintPages_Params settings; | 1204 PrintMsg_PrintPages_Params settings; |
| 1199 Send(new PrintHostMsg_GetDefaultPrintSettings(routing_id(), | 1205 Send(new PrintHostMsg_GetDefaultPrintSettings(routing_id(), |
| 1200 &settings.params)); | 1206 &settings.params)); |
| 1201 // Check if the printer returned any settings, if the settings is empty, we | 1207 // Check if the printer returned any settings, if the settings is empty, we |
| 1202 // can safely assume there are no printer drivers configured. So we safely | 1208 // can safely assume there are no printer drivers configured. So we safely |
| 1203 // terminate. | 1209 // terminate. |
| 1204 bool result = true; | 1210 bool result = true; |
| 1205 if (!PrintMsg_Print_Params_IsValid(settings.params)) | 1211 if (!PrintMsg_Print_Params_IsValid(settings.params)) |
| 1206 result = false; | 1212 result = false; |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 1220 WebKit::WebPrintScalingOptionSourceSize; | 1226 WebKit::WebPrintScalingOptionSourceSize; |
| 1221 if (fit_to_paper_size) { | 1227 if (fit_to_paper_size) { |
| 1222 settings.params.print_scaling_option = | 1228 settings.params.print_scaling_option = |
| 1223 WebKit::WebPrintScalingOptionFitToPrintableArea; | 1229 WebKit::WebPrintScalingOptionFitToPrintableArea; |
| 1224 } | 1230 } |
| 1225 | 1231 |
| 1226 print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); | 1232 print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); |
| 1227 return result; | 1233 return result; |
| 1228 } | 1234 } |
| 1229 | 1235 |
| 1230 bool PrintWebViewHelper::InitPrintSettingsAndPrepareFrame( | 1236 bool PrintWebViewHelper::CalculateNumberOfPages(WebKit::WebFrame* frame, |
| 1231 WebKit::WebFrame* frame, | 1237 const WebKit::WebNode& node, |
| 1232 const WebKit::WebNode& node, | 1238 int* number_of_pages) { |
| 1233 scoped_ptr<PrepareFrameAndViewForPrint>* prepare) { | |
| 1234 DCHECK(frame); | 1239 DCHECK(frame); |
| 1235 | 1240 |
| 1236 bool fit_to_paper_size = !(PrintingNodeOrPdfFrame(frame, node)); | 1241 bool fit_to_paper_size = !(PrintingNodeOrPdfFrame(frame, node)); |
| 1237 if (!InitPrintSettings(fit_to_paper_size)) { | 1242 if (!InitPrintSettings(fit_to_paper_size)) { |
| 1238 notify_browser_of_print_failure_ = false; | 1243 notify_browser_of_print_failure_ = false; |
| 1239 render_view()->RunModalAlertDialog( | 1244 render_view()->RunModalAlertDialog( |
| 1240 frame, | 1245 frame, |
| 1241 l10n_util::GetStringUTF16(IDS_PRINT_PREVIEW_INVALID_PRINTER_SETTINGS)); | 1246 l10n_util::GetStringUTF16(IDS_PRINT_PREVIEW_INVALID_PRINTER_SETTINGS)); |
| 1242 return false; | 1247 return false; |
| 1243 } | 1248 } |
| 1244 | 1249 |
| 1245 DCHECK(!prepare->get()); | 1250 PrepareFrameAndViewForPrint prepare(print_pages_params_->params, frame, node, |
| 1246 prepare->reset(new PrepareFrameAndViewForPrint(print_pages_params_->params, | |
| 1247 frame, node)); | |
| 1248 UpdateFrameAndViewFromCssPageLayout(frame, node, prepare->get(), | |
| 1249 print_pages_params_->params, | |
| 1250 ignore_css_margins_); | 1251 ignore_css_margins_); |
| 1252 prepare.StartPrinting(); | |
| 1251 Send(new PrintHostMsg_DidGetDocumentCookie( | 1253 Send(new PrintHostMsg_DidGetDocumentCookie( |
| 1252 routing_id(), print_pages_params_->params.document_cookie)); | 1254 routing_id(), print_pages_params_->params.document_cookie)); |
| 1255 *number_of_pages = prepare.GetExpectedPageCount(); | |
| 1253 return true; | 1256 return true; |
| 1254 } | 1257 } |
| 1255 | 1258 |
| 1256 bool PrintWebViewHelper::UpdatePrintSettings( | 1259 bool PrintWebViewHelper::UpdatePrintSettings( |
| 1257 WebKit::WebFrame* frame, | 1260 WebKit::WebFrame* frame, |
| 1258 const WebKit::WebNode& node, | 1261 const WebKit::WebNode& node, |
| 1259 const DictionaryValue& passed_job_settings) { | 1262 const DictionaryValue& passed_job_settings) { |
| 1260 DCHECK(is_preview_enabled_); | 1263 DCHECK(is_preview_enabled_); |
| 1261 const DictionaryValue* job_settings = &passed_job_settings; | 1264 const DictionaryValue* job_settings = &passed_job_settings; |
| 1262 DictionaryValue modified_job_settings; | 1265 DictionaryValue modified_job_settings; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1347 | 1350 |
| 1348 print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); | 1351 print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); |
| 1349 Send(new PrintHostMsg_DidGetDocumentCookie(routing_id(), | 1352 Send(new PrintHostMsg_DidGetDocumentCookie(routing_id(), |
| 1350 settings.params.document_cookie)); | 1353 settings.params.document_cookie)); |
| 1351 | 1354 |
| 1352 return true; | 1355 return true; |
| 1353 } | 1356 } |
| 1354 | 1357 |
| 1355 bool PrintWebViewHelper::GetPrintSettingsFromUser(WebKit::WebFrame* frame, | 1358 bool PrintWebViewHelper::GetPrintSettingsFromUser(WebKit::WebFrame* frame, |
| 1356 const WebKit::WebNode& node, | 1359 const WebKit::WebNode& node, |
| 1357 int expected_pages_count, | 1360 int expected_pages_count) { |
| 1358 bool use_browser_overlays) { | |
| 1359 PrintHostMsg_ScriptedPrint_Params params; | 1361 PrintHostMsg_ScriptedPrint_Params params; |
| 1360 PrintMsg_PrintPages_Params print_settings; | 1362 PrintMsg_PrintPages_Params print_settings; |
| 1361 | 1363 |
| 1362 params.cookie = print_pages_params_->params.document_cookie; | 1364 params.cookie = print_pages_params_->params.document_cookie; |
| 1363 params.has_selection = frame->hasSelection(); | 1365 params.has_selection = frame->hasSelection(); |
| 1364 params.expected_pages_count = expected_pages_count; | 1366 params.expected_pages_count = expected_pages_count; |
| 1365 MarginType margin_type = DEFAULT_MARGINS; | 1367 MarginType margin_type = DEFAULT_MARGINS; |
| 1366 if (PrintingNodeOrPdfFrame(frame, node)) | 1368 if (PrintingNodeOrPdfFrame(frame, node)) |
| 1367 margin_type = GetMarginsForPdf(frame, node); | 1369 margin_type = GetMarginsForPdf(frame, node); |
| 1368 params.margin_type = margin_type; | 1370 params.margin_type = margin_type; |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 1381 Send(msg); | 1383 Send(msg); |
| 1382 print_pages_params_.reset(new PrintMsg_PrintPages_Params(print_settings)); | 1384 print_pages_params_.reset(new PrintMsg_PrintPages_Params(print_settings)); |
| 1383 | 1385 |
| 1384 print_pages_params_->params.print_scaling_option = scaling_option; | 1386 print_pages_params_->params.print_scaling_option = scaling_option; |
| 1385 return (print_settings.params.dpi && print_settings.params.document_cookie); | 1387 return (print_settings.params.dpi && print_settings.params.document_cookie); |
| 1386 } | 1388 } |
| 1387 | 1389 |
| 1388 bool PrintWebViewHelper::RenderPagesForPrint( | 1390 bool PrintWebViewHelper::RenderPagesForPrint( |
| 1389 WebKit::WebFrame* frame, | 1391 WebKit::WebFrame* frame, |
| 1390 const WebKit::WebNode& node) { | 1392 const WebKit::WebNode& node) { |
| 1391 if (print_pages_params_->params.selection_only) | 1393 if (print_pages_params_->params.selection_only) { |
| 1394 DCHECK(print_pages_params_->pages.empty()); | |
| 1392 return CopyAndPrint(frame); | 1395 return CopyAndPrint(frame); |
| 1396 } | |
| 1393 return PrintPages(frame, node); | 1397 return PrintPages(frame, node); |
| 1394 } | 1398 } |
| 1395 | 1399 |
| 1396 #if defined(OS_POSIX) | 1400 #if defined(OS_POSIX) |
| 1397 bool PrintWebViewHelper::CopyMetafileDataToSharedMem( | 1401 bool PrintWebViewHelper::CopyMetafileDataToSharedMem( |
| 1398 Metafile* metafile, | 1402 Metafile* metafile, |
| 1399 base::SharedMemoryHandle* shared_mem_handle) { | 1403 base::SharedMemoryHandle* shared_mem_handle) { |
| 1400 uint32 buf_size = metafile->GetDataSize(); | 1404 uint32 buf_size = metafile->GetDataSize(); |
| 1401 scoped_ptr<base::SharedMemory> shared_buf( | 1405 scoped_ptr<base::SharedMemory> shared_buf( |
| 1402 content::RenderThread::Get()->HostAllocateSharedMemoryBuffer( | 1406 content::RenderThread::Get()->HostAllocateSharedMemoryBuffer( |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1585 DCHECK_EQ(INITIALIZED, state_); | 1589 DCHECK_EQ(INITIALIZED, state_); |
| 1586 state_ = RENDERING; | 1590 state_ = RENDERING; |
| 1587 | 1591 |
| 1588 metafile_.reset(new PreviewMetafile); | 1592 metafile_.reset(new PreviewMetafile); |
| 1589 if (!metafile_->Init()) { | 1593 if (!metafile_->Init()) { |
| 1590 set_error(PREVIEW_ERROR_METAFILE_INIT_FAILED); | 1594 set_error(PREVIEW_ERROR_METAFILE_INIT_FAILED); |
| 1591 LOG(ERROR) << "PreviewMetafile Init failed"; | 1595 LOG(ERROR) << "PreviewMetafile Init failed"; |
| 1592 return false; | 1596 return false; |
| 1593 } | 1597 } |
| 1594 | 1598 |
| 1595 // Need to make sure old object gets destroyed first. | 1599 // Need to make sure old object gets destroyed first. |
| 1596 prep_frame_view_.reset(new PrepareFrameAndViewForPrint(print_params, frame(), | 1600 prep_frame_view_.reset( |
| 1597 node())); | 1601 new PrepareFrameAndViewForPrint(print_params, frame(), node(), |
| 1598 UpdateFrameAndViewFromCssPageLayout(frame_, node_, prep_frame_view_.get(), | 1602 ignore_css_margins)); |
| 1599 print_params, ignore_css_margins); | 1603 prep_frame_view_->StartPrinting(); |
| 1600 | 1604 |
| 1601 total_page_count_ = prep_frame_view_->GetExpectedPageCount(); | 1605 total_page_count_ = prep_frame_view_->GetExpectedPageCount(); |
| 1602 if (total_page_count_ == 0) { | 1606 if (total_page_count_ == 0) { |
| 1603 LOG(ERROR) << "CreatePreviewDocument got 0 page count"; | 1607 LOG(ERROR) << "CreatePreviewDocument got 0 page count"; |
| 1604 set_error(PREVIEW_ERROR_ZERO_PAGES); | 1608 set_error(PREVIEW_ERROR_ZERO_PAGES); |
| 1605 return false; | 1609 return false; |
| 1606 } | 1610 } |
| 1607 | 1611 |
| 1608 int selected_page_count = pages.size(); | 1612 int selected_page_count = pages.size(); |
| 1609 current_page_index_ = 0; | 1613 current_page_index_ = 0; |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1757 } | 1761 } |
| 1758 | 1762 |
| 1759 void PrintWebViewHelper::PrintPreviewContext::ClearContext() { | 1763 void PrintWebViewHelper::PrintPreviewContext::ClearContext() { |
| 1760 prep_frame_view_.reset(); | 1764 prep_frame_view_.reset(); |
| 1761 metafile_.reset(); | 1765 metafile_.reset(); |
| 1762 pages_to_render_.clear(); | 1766 pages_to_render_.clear(); |
| 1763 error_ = PREVIEW_ERROR_NONE; | 1767 error_ = PREVIEW_ERROR_NONE; |
| 1764 } | 1768 } |
| 1765 | 1769 |
| 1766 } // namespace printing | 1770 } // namespace printing |
| OLD | NEW |