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

Unified Diff: chrome/renderer/printing/print_web_view_helper.cc

Issue 11953010: Cleanup of PrepareFrameAndViewForPrint code. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/printing/print_web_view_helper.cc
diff --git a/chrome/renderer/printing/print_web_view_helper.cc b/chrome/renderer/printing/print_web_view_helper.cc
index 9a5a4876a4eab6aca748b43f76f04d06cf8ec742..6d7af3b8e6b2eb565fba65b395912692e83cbefa 100644
--- a/chrome/renderer/printing/print_web_view_helper.cc
+++ b/chrome/renderer/printing/print_web_view_helper.cc
@@ -475,61 +475,75 @@ float PrintWebViewHelper::RenderPageContent(WebKit::WebFrame* frame,
return frame->printPage(page_number, canvas);
}
-PrepareFrameAndViewForPrint::PrepareFrameAndViewForPrint(
- const PrintMsg_Print_Params& print_params,
- WebKit::WebFrame* frame,
- const WebKit::WebNode& node)
- : frame_(frame),
- node_to_print_(node),
- web_view_(frame->view()),
- expected_pages_count_(0),
- use_browser_overlays_(true),
- finished_(false),
- should_print_backgrounds_(print_params.should_print_backgrounds) {
- WebKit::WebPrintParams webkit_print_params;
- ComputeWebKitPrintParamsInDesiredDpi(print_params, &webkit_print_params);
-
- if (WebKit::WebFrame* web_frame = web_view_->mainFrame())
- prev_scroll_offset_ = web_frame->scrollOffset();
- prev_view_size_ = web_view_->size();
+// Class that calls the Begin and End print functions on the frame and changes
+// the size of the view temporarily to support full page printing..
+// Do not serve any events in the time between construction and destruction of
+// this class because it will cause flicker.
+class PrepareFrameAndViewForPrint {
+ public:
+ // Prints |frame|. If |node| is not NULL, then only that node will be
+ // printed.
+ PrepareFrameAndViewForPrint(const PrintMsg_Print_Params& params,
+ WebKit::WebFrame* frame,
+ const WebKit::WebNode& node,
+ bool ignore_css_margins);
+ ~PrepareFrameAndViewForPrint();
+
+ void StartPrinting();
+
+ int GetExpectedPageCount() const {
+ return expected_pages_count_;
+ }
- StartPrinting(webkit_print_params);
-}
+ gfx::Size GetPrintCanvasSize() const;
-PrepareFrameAndViewForPrint::~PrepareFrameAndViewForPrint() {
- FinishPrinting();
-}
+ void FinishPrinting();
-void PrepareFrameAndViewForPrint::UpdatePrintParams(
- const PrintMsg_Print_Params& print_params) {
- DCHECK(!finished_);
- WebKit::WebPrintParams webkit_print_params;
- ComputeWebKitPrintParamsInDesiredDpi(print_params, &webkit_print_params);
+ private:
+ WebKit::WebFrame* frame_;
+ WebKit::WebNode node_to_print_;
+ WebKit::WebPrintParams web_print_params_;
+ gfx::Size prev_view_size_;
+ gfx::Size prev_scroll_offset_;
+ int expected_pages_count_;
+ bool should_print_backgrounds_;
- should_print_backgrounds_ = print_params.should_print_backgrounds;
+ DISALLOW_COPY_AND_ASSIGN(PrepareFrameAndViewForPrint);
+};
- if (webkit_print_params.printContentArea ==
- web_print_params_.printContentArea &&
- webkit_print_params.printableArea == web_print_params_.printableArea &&
- webkit_print_params.paperSize == web_print_params_.paperSize &&
- webkit_print_params.printScalingOption ==
- web_print_params_.printScalingOption) {
- return;
+
+PrepareFrameAndViewForPrint::PrepareFrameAndViewForPrint(
+ const PrintMsg_Print_Params& params,
+ WebKit::WebFrame* frame,
+ const WebKit::WebNode& node,
+ bool ignore_css_margins)
+ : frame_(frame),
+ node_to_print_(node),
+ expected_pages_count_(0),
+ should_print_backgrounds_(params.should_print_backgrounds) {
+ PrintMsg_Print_Params print_params = params;
+
+ if (WebKit::WebFrame* web_frame = frame->view()->mainFrame())
+ prev_scroll_offset_ = web_frame->scrollOffset();
+ prev_view_size_ = frame->view()->size();
+
+ if (!PrintingNodeOrPdfFrame(frame_, node_to_print_)) {
+ bool fit_to_page = ignore_css_margins &&
+ print_params.print_scaling_option ==
+ WebKit::WebPrintScalingOptionFitToPrintableArea;
+ print_params = CalculatePrintParamsForCss(frame_, 0, print_params,
+ ignore_css_margins, fit_to_page,
+ NULL);
}
- frame_->printEnd();
- StartPrinting(webkit_print_params);
+ ComputeWebKitPrintParamsInDesiredDpi(print_params, &web_print_params_);
}
-gfx::Size PrepareFrameAndViewForPrint::GetPrintCanvasSize() const {
- return gfx::Size(web_print_params_.printContentArea.width,
- web_print_params_.printContentArea.height);
+PrepareFrameAndViewForPrint::~PrepareFrameAndViewForPrint() {
+ FinishPrinting();
}
-void PrepareFrameAndViewForPrint::StartPrinting(
- const WebKit::WebPrintParams& webkit_print_params) {
- web_print_params_ = webkit_print_params;
-
+void PrepareFrameAndViewForPrint::StartPrinting() {
// Layout page according to printer page size. Since WebKit shrinks the
// size of the page automatically (from 125% to 200%) we trick it to
// think the page is 125% larger so the size of the page is correct for
@@ -540,24 +554,31 @@ void PrepareFrameAndViewForPrint::StartPrinting(
print_layout_size.set_height(static_cast<int>(
static_cast<double>(print_layout_size.height()) * 1.25));
- web_view_->resize(print_layout_size);
+ WebKit::WebView* web_view = frame_->view();
+ web_view->resize(print_layout_size);
+ web_view->settings()->setShouldPrintBackgrounds(should_print_backgrounds_);
- expected_pages_count_ = frame_->printBegin(web_print_params_,
- node_to_print_,
- &use_browser_overlays_);
+ // TODO(vitalybuka): Update call after
+ // https://bugs.webkit.org/show_bug.cgi?id=107718 is fixed.
+ expected_pages_count_ = frame_->printBegin(web_print_params_, node_to_print_,
+ NULL);
+}
- web_view_->settings()->setShouldPrintBackgrounds(should_print_backgrounds_);
+gfx::Size PrepareFrameAndViewForPrint::GetPrintCanvasSize() const {
+ return gfx::Size(web_print_params_.printContentArea.width,
+ web_print_params_.printContentArea.height);
}
void PrepareFrameAndViewForPrint::FinishPrinting() {
- if (!finished_) {
- finished_ = true;
+ if (frame_) {
frame_->printEnd();
- web_view_->resize(prev_view_size_);
- if (WebKit::WebFrame* web_frame = web_view_->mainFrame())
+ WebKit::WebView* web_view = frame_->view();
+ web_view->resize(prev_view_size_);
+ if (WebKit::WebFrame* web_frame = web_view->mainFrame())
web_frame->setScrollOffset(prev_scroll_offset_);
- web_view_->settings()->setShouldPrintBackgrounds(false);
+ web_view->settings()->setShouldPrintBackgrounds(false);
}
+ frame_ = NULL;
}
PrintWebViewHelper::PrintWebViewHelper(content::RenderView* render_view)
@@ -1009,24 +1030,12 @@ void PrintWebViewHelper::Print(WebKit::WebFrame* frame,
if (print_web_view_)
return;
- // Initialize print settings.
- scoped_ptr<PrepareFrameAndViewForPrint> prepare;
- if (!InitPrintSettingsAndPrepareFrame(frame, node, &prepare)) {
+ int expected_page_count = 0;
+ if (!CalculateNumberOfPages(frame, node, &expected_page_count)) {
DidFinishPrinting(FAIL_PRINT_INIT);
return; // Failed to init print page settings.
}
- int expected_page_count = 0;
- bool use_browser_overlays = true;
-
- expected_page_count = prepare->GetExpectedPageCount();
- if (expected_page_count)
- use_browser_overlays = prepare->ShouldUseBrowserOverlays();
-
- // Release the prepare before going any further, since we are going to
- // show UI and wait for the user.
- prepare.reset();
-
// Some full screen plugins can say they don't want to print.
if (!expected_page_count) {
DidFinishPrinting(FAIL_PRINT);
@@ -1034,8 +1043,7 @@ void PrintWebViewHelper::Print(WebKit::WebFrame* frame,
}
// Ask the browser to show UI to retrieve the final print settings.
- if (!GetPrintSettingsFromUser(frame, node, expected_page_count,
- use_browser_overlays)) {
+ if (!GetPrintSettingsFromUser(frame, node, expected_page_count)) {
DidFinishPrinting(OK); // Release resources and fail silently.
return;
}
@@ -1119,25 +1127,38 @@ bool PrintWebViewHelper::CopyAndPrint(WebKit::WebFrame* web_frame) {
return true;
}
-#if defined(OS_MACOSX) || defined(OS_WIN)
bool PrintWebViewHelper::PrintPages(WebKit::WebFrame* frame,
const WebKit::WebNode& node) {
const PrintMsg_PrintPages_Params& params = *print_pages_params_;
const PrintMsg_Print_Params& print_params = params.params;
- PrepareFrameAndViewForPrint prep_frame_view(print_params, frame, node);
- UpdateFrameAndViewFromCssPageLayout(frame, node, &prep_frame_view,
- print_params, ignore_css_margins_);
+ PrepareFrameAndViewForPrint prep_frame_view(print_params, frame, node,
+ ignore_css_margins_);
+ prep_frame_view.StartPrinting();
int page_count = prep_frame_view.GetExpectedPageCount();
if (!page_count)
return false;
+
+#if !defined(OS_CHROMEOS)
// TODO(vitalybuka): should be page_count or valid pages from params.pages.
// See http://crbug.com/161576
Send(new PrintHostMsg_DidGetPrintedPagesCount(routing_id(),
print_params.document_cookie,
page_count));
+#endif
+
+ return PrintPagesNative(frame, node, page_count,
+ prep_frame_view.GetPrintCanvasSize());
+}
+
+#if defined(OS_MACOSX) || defined(OS_WIN)
+bool PrintWebViewHelper::PrintPagesNative(WebKit::WebFrame* frame,
+ const WebKit::WebNode& node,
+ int page_count,
+ const gfx::Size& canvas_size) {
+ const PrintMsg_PrintPages_Params& params = *print_pages_params_;
+ const PrintMsg_Print_Params& print_params = params.params;
- const gfx::Size& canvas_size = prep_frame_view.GetPrintCanvasSize();
PrintMsg_PrintPage_Params page_params;
page_params.params = print_params;
if (params.pages.empty()) {
@@ -1155,6 +1176,7 @@ bool PrintWebViewHelper::PrintPages(WebKit::WebFrame* frame,
}
return true;
}
+
#endif // OS_MACOSX || OS_WIN
void PrintWebViewHelper::didStopLoading() {
@@ -1177,23 +1199,6 @@ void PrintWebViewHelper::ComputePageLayoutInPointsForCss(
CalculatePageLayoutFromPrintParams(params, page_layout_in_points);
}
-// static - Not anonymous so that platform implementations can use it.
-void PrintWebViewHelper::UpdateFrameAndViewFromCssPageLayout(
- WebKit::WebFrame* frame,
- const WebKit::WebNode& node,
- PrepareFrameAndViewForPrint* prepare,
- const PrintMsg_Print_Params& params,
- bool ignore_css_margins) {
- if (PrintingNodeOrPdfFrame(frame, node))
- return;
- bool fit_to_page = ignore_css_margins &&
- params.print_scaling_option ==
- WebKit::WebPrintScalingOptionFitToPrintableArea;
- PrintMsg_Print_Params print_params = CalculatePrintParamsForCss(
- frame, 0, params, ignore_css_margins, fit_to_page, NULL);
- prepare->UpdatePrintParams(print_params);
-}
-
bool PrintWebViewHelper::InitPrintSettings(bool fit_to_paper_size) {
PrintMsg_PrintPages_Params settings;
Send(new PrintHostMsg_GetDefaultPrintSettings(routing_id(),
@@ -1227,12 +1232,10 @@ bool PrintWebViewHelper::InitPrintSettings(bool fit_to_paper_size) {
return result;
}
-bool PrintWebViewHelper::InitPrintSettingsAndPrepareFrame(
- WebKit::WebFrame* frame,
- const WebKit::WebNode& node,
- scoped_ptr<PrepareFrameAndViewForPrint>* prepare) {
+bool PrintWebViewHelper::CalculateNumberOfPages(WebKit::WebFrame* frame,
+ const WebKit::WebNode& node,
+ int* number_of_pages) {
DCHECK(frame);
-
bool fit_to_paper_size = !(PrintingNodeOrPdfFrame(frame, node));
if (!InitPrintSettings(fit_to_paper_size)) {
notify_browser_of_print_failure_ = false;
@@ -1242,14 +1245,13 @@ bool PrintWebViewHelper::InitPrintSettingsAndPrepareFrame(
return false;
}
- DCHECK(!prepare->get());
- prepare->reset(new PrepareFrameAndViewForPrint(print_pages_params_->params,
- frame, node));
- UpdateFrameAndViewFromCssPageLayout(frame, node, prepare->get(),
- print_pages_params_->params,
- ignore_css_margins_);
- Send(new PrintHostMsg_DidGetDocumentCookie(
- routing_id(), print_pages_params_->params.document_cookie));
+ const PrintMsg_Print_Params& params = print_pages_params_->params;
+ PrepareFrameAndViewForPrint prepare(params, frame, node, ignore_css_margins_);
+ prepare.StartPrinting();
+
+ Send(new PrintHostMsg_DidGetDocumentCookie(routing_id(),
+ params.document_cookie));
+ *number_of_pages = prepare.GetExpectedPageCount();
return true;
}
@@ -1354,8 +1356,7 @@ bool PrintWebViewHelper::UpdatePrintSettings(
bool PrintWebViewHelper::GetPrintSettingsFromUser(WebKit::WebFrame* frame,
const WebKit::WebNode& node,
- int expected_pages_count,
- bool use_browser_overlays) {
+ int expected_pages_count) {
PrintHostMsg_ScriptedPrint_Params params;
PrintMsg_PrintPages_Params print_settings;
@@ -1388,8 +1389,10 @@ bool PrintWebViewHelper::GetPrintSettingsFromUser(WebKit::WebFrame* frame,
bool PrintWebViewHelper::RenderPagesForPrint(
WebKit::WebFrame* frame,
const WebKit::WebNode& node) {
- if (print_pages_params_->params.selection_only)
+ if (print_pages_params_->params.selection_only) {
+ DCHECK(print_pages_params_->pages.empty());
return CopyAndPrint(frame);
+ }
return PrintPages(frame, node);
}
@@ -1592,11 +1595,11 @@ bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument(
return false;
}
- // Need to make sure old object gets destroyed first.
- prep_frame_view_.reset(new PrepareFrameAndViewForPrint(print_params, frame(),
- node()));
- UpdateFrameAndViewFromCssPageLayout(frame_, node_, prep_frame_view_.get(),
- print_params, ignore_css_margins);
+ // Need to make sure old object gets destroyed first.
+ prep_frame_view_.reset(
+ new PrepareFrameAndViewForPrint(print_params, frame(), node(),
+ ignore_css_margins));
+ prep_frame_view_->StartPrinting();
total_page_count_ = prep_frame_view_->GetExpectedPageCount();
if (total_page_count_ == 0) {
« no previous file with comments | « chrome/renderer/printing/print_web_view_helper.h ('k') | chrome/renderer/printing/print_web_view_helper_linux.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698