diff options
author | kmadhusu@chromium.org <kmadhusu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-25 18:23:47 +0000 |
---|---|---|
committer | kmadhusu@chromium.org <kmadhusu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-25 18:23:47 +0000 |
commit | 212a49ddb69f673f93e4cdc4dcb6add56dc966c0 (patch) | |
tree | 253c1cae2fc3d72aee50f5d095658b1eb805377c /chrome/renderer | |
parent | e340dd3131637817f78de99896f9a2fccfc6dbba (diff) | |
download | chromium_src-212a49ddb69f673f93e4cdc4dcb6add56dc966c0.zip chromium_src-212a49ddb69f673f93e4cdc4dcb6add56dc966c0.tar.gz chromium_src-212a49ddb69f673f93e4cdc4dcb6add56dc966c0.tar.bz2 |
Refactor printing workflow to handle print preview.
BUG=57894
TEST=None
Review URL: http://codereview.chromium.org/3749005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@63753 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r-- | chrome/renderer/print_web_view_helper.cc | 240 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper.h | 21 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper_linux.cc | 6 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper_mac.mm | 6 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper_win.cc | 6 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 30 | ||||
-rw-r--r-- | chrome/renderer/render_view.h | 3 |
7 files changed, 194 insertions, 118 deletions
diff --git a/chrome/renderer/print_web_view_helper.cc b/chrome/renderer/print_web_view_helper.cc index b776699..3dcc1b9 100644 --- a/chrome/renderer/print_web_view_helper.cc +++ b/chrome/renderer/print_web_view_helper.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -81,11 +81,14 @@ PrepareFrameAndViewForPrint::~PrepareFrameAndViewForPrint() { PrintWebViewHelper::PrintWebViewHelper(RenderView* render_view) : render_view_(render_view), print_web_view_(NULL), - user_cancelled_scripted_print_count_(0) {} + user_cancelled_scripted_print_count_(0), + is_preview_(false) {} PrintWebViewHelper::~PrintWebViewHelper() {} -void PrintWebViewHelper::Print(WebFrame* frame, bool script_initiated) { +void PrintWebViewHelper::Print(WebFrame* frame, + bool script_initiated, + bool is_preview) { const int kMinSecondsToIgnoreJavascriptInitiatedPrint = 2; const int kMaxSecondsToIgnoreJavascriptInitiatedPrint = 2 * 60; // 2 Minutes. @@ -114,113 +117,56 @@ void PrintWebViewHelper::Print(WebFrame* frame, bool script_initiated) { } } - // Retrieve the default print settings to calculate the expected number of - // pages. - ViewMsg_Print_Params default_settings; bool print_cancelled = false; + is_preview_ = is_preview; + + // Initialize print settings. + if (!InitPrintSettings(frame)) + return; // Failed to init print page settings. + + int expected_pages_count = 0; + bool use_browser_overlays = true; + + // Prepare once to calculate the estimated page count. This must be in + // a scope for itself (see comments on PrepareFrameAndViewForPrint). + { + PrepareFrameAndViewForPrint prep_frame_view( + (*print_pages_params_).params, frame, frame->view()); + expected_pages_count = prep_frame_view.GetExpectedPageCount(); + if (expected_pages_count) + use_browser_overlays = prep_frame_view.ShouldUseBrowserOverlays(); + } - IPC::SyncMessage* msg = - new ViewHostMsg_GetDefaultPrintSettings(routing_id(), &default_settings); - if (Send(msg)) { - msg = NULL; - // Check if the printer returned any settings, if the settings is empty, we - // can safely assume there are no printer drivers configured. So we safely - // terminate. - if (default_settings.IsEmpty()) { - // TODO: Create an async alert (http://crbug.com/14918). - render_view_->runModalAlertDialog(frame, - l10n_util::GetStringUTF16(IDS_DEFAULT_PRINTER_NOT_FOUND_WARNING)); - return; + // Some full screen plugins can say they don't want to print. + if (expected_pages_count) { + if (!is_preview_) { + // Ask the browser to show UI to retrieve the final print settings. + if (!GetPrintSettingsFromUser( + frame, expected_pages_count, use_browser_overlays)) + print_cancelled = true; } - // Continue only if the settings are valid. - if (default_settings.dpi && default_settings.document_cookie) { - UpdatePrintableSizeInPrintParameters(frame, &default_settings); - int expected_pages_count = 0; - bool use_browser_overlays = true; - - // Prepare once to calculate the estimated page count. This must be in - // a scope for itself (see comments on PrepareFrameAndViewForPrint). - { - PrepareFrameAndViewForPrint prep_frame_view(default_settings, - frame, - frame->view()); - expected_pages_count = prep_frame_view.GetExpectedPageCount(); - if (expected_pages_count) - use_browser_overlays = prep_frame_view.ShouldUseBrowserOverlays(); - } - - // Some full screen plugins can say they don't want to print. - if (expected_pages_count) { - // Ask the browser to show UI to retrieve the final print settings. - ViewMsg_PrintPages_Params print_settings; - - ViewHostMsg_ScriptedPrint_Params params; - - // The routing id is sent across as it is needed to look up the - // corresponding RenderViewHost instance to signal and reset the - // pump messages event. - params.routing_id = routing_id(); - // host_window_ may be NULL at this point if the current window is a - // popup and the print() command has been issued from the parent. The - // receiver of this message has to deal with this. - params.host_window_id = render_view_->host_window(); - params.cookie = default_settings.document_cookie; - params.has_selection = frame->hasSelection(); - params.expected_pages_count = expected_pages_count; - params.use_overlays = use_browser_overlays; - - msg = new ViewHostMsg_ScriptedPrint(routing_id(), params, - &print_settings); - msg->EnableMessagePumping(); - if (Send(msg)) { - msg = NULL; - - // If the settings are invalid, early quit. - if (print_settings.params.dpi && - print_settings.params.document_cookie) { - if (print_settings.params.selection_only) { - CopyAndPrint(print_settings, frame); - } else { - // TODO: Always copy before printing. - PrintPages(print_settings, frame); - } - - // Reset cancel counter on first successful print. - user_cancelled_scripted_print_count_ = 0; - return; // All went well. - } else { - // User cancelled print. - print_cancelled = true; - if (script_initiated) { - ++user_cancelled_scripted_print_count_; - last_cancelled_script_print_ = base::Time::Now(); - } - } - } else { - // Send() failed. - NOTREACHED(); - } - } else { - // Nothing to print. - print_cancelled = true; - } + // Render Pages for printing. + if (!print_cancelled && RenderPagesForPrint(frame)) { + // Reset cancel counter on first successful print. + user_cancelled_scripted_print_count_ = 0; + return; // All went well. } else { - // Failed to get default settings. - NOTREACHED(); + if (script_initiated) { + ++user_cancelled_scripted_print_count_; + last_cancelled_script_print_ = base::Time::Now(); + } } } else { - // Send() failed. - NOTREACHED(); + // Nothing to print. + print_cancelled = true; } // When |print_cancelled| is true, we treat it as success so that - // DidFinishPrinting() won't show any error alert. - // If |print_cancelled| is false and we reach here, there must be - // something wrong and hence is not success, DidFinishPrinting() should show - // an error alert. - // In both cases, we have to call DidFinishPrinting() here to release - // printing resources, since we don't need them anymore. - DidFinishPrinting(print_cancelled); + // DidFinishPrinting() won't show any error alert. we call + // DidFinishPrinting() here to release printing resources, since + // we don't need them anymore. + if (print_cancelled) + DidFinishPrinting(print_cancelled); } void PrintWebViewHelper::DidFinishPrinting(bool success) { @@ -229,7 +175,6 @@ void PrintWebViewHelper::DidFinishPrinting(bool success) { if (!web_view) web_view = render_view_->webview(); - // TODO: Create an async alert (http://crbug.com/14918). render_view_->runModalAlertDialog( web_view->mainFrame(), WideToUTF16Hack( @@ -239,12 +184,11 @@ void PrintWebViewHelper::DidFinishPrinting(bool success) { if (print_web_view_) { print_web_view_->close(); print_web_view_ = NULL; - print_pages_params_.reset(); } + print_pages_params_.reset(); } -bool PrintWebViewHelper::CopyAndPrint(const ViewMsg_PrintPages_Params& params, - WebFrame* web_frame) { +bool PrintWebViewHelper::CopyAndPrint(WebFrame* web_frame) { // Create a new WebView with the same settings as the current display one. // Except that we disable javascript (don't want any active content running // on the page). @@ -256,7 +200,6 @@ bool PrintWebViewHelper::CopyAndPrint(const ViewMsg_PrintPages_Params& params, prefs.Apply(print_web_view_); print_web_view_->initializeMainFrame(this); - print_pages_params_.reset(new ViewMsg_PrintPages_Params(params)); print_pages_params_->pages.clear(); // Print all pages of selection. std::string html = web_frame->selectionAsMarkup().utf8(); @@ -422,3 +365,88 @@ void PrintWebViewHelper::UpdatePrintableSizeInPrintParameters( content_height_in_points, printing::kPointsPerInch, params->dpi))); #endif } + +bool PrintWebViewHelper::InitPrintSettings(WebFrame* frame) { + ViewMsg_PrintPages_Params settings; + if (GetDefaultPrintSettings(frame, &settings.params)) { + print_pages_params_.reset(new ViewMsg_PrintPages_Params(settings)); + print_pages_params_->pages.clear(); + return true; + } + return false; +} + +bool PrintWebViewHelper::GetDefaultPrintSettings( + WebFrame* frame, ViewMsg_Print_Params* params) { + IPC::SyncMessage* msg = + new ViewHostMsg_GetDefaultPrintSettings(routing_id(), params); + if (!Send(msg)) { + NOTREACHED(); + return false; + } + // Check if the printer returned any settings, if the settings is empty, we + // can safely assume there are no printer drivers configured. So we safely + // terminate. + if (params->IsEmpty()) { + render_view_->runModalAlertDialog( + frame, + l10n_util::GetStringUTF16(IDS_DEFAULT_PRINTER_NOT_FOUND_WARNING)); + return false; + } + if (!(params->dpi && params->document_cookie)) { + // Invalid print page settings. + NOTREACHED(); + return false; + } + UpdatePrintableSizeInPrintParameters(frame, params); + return true; +} + +bool PrintWebViewHelper::GetPrintSettingsFromUser(WebFrame* frame, + int expected_pages_count, + bool use_browser_overlays) { + ViewHostMsg_ScriptedPrint_Params params; + ViewMsg_PrintPages_Params print_settings; + + // The routing id is sent across as it is needed to look up the + // corresponding RenderViewHost instance to signal and reset the + // pump messages event. + params.routing_id = routing_id(); + // host_window_ may be NULL at this point if the current window is a + // popup and the print() command has been issued from the parent. The + // receiver of this message has to deal with this. + params.host_window_id = render_view_->host_window(); + params.cookie = (*print_pages_params_).params.document_cookie; + params.has_selection = frame->hasSelection(); + params.expected_pages_count = expected_pages_count; + params.use_overlays = use_browser_overlays; + + print_pages_params_.reset(); + IPC::SyncMessage* msg = + new ViewHostMsg_ScriptedPrint(routing_id(), params, &print_settings); + msg->EnableMessagePumping(); + if (Send(msg)) { + print_pages_params_.reset(new ViewMsg_PrintPages_Params(print_settings)); + } else { + // Send() failed. + NOTREACHED(); + return false; + } + return true; +} + +bool PrintWebViewHelper::RenderPagesForPrint(WebFrame *frame) { + ViewMsg_PrintPages_Params print_settings = *print_pages_params_; + // If the settings are invalid, early quit. + if (print_settings.params.dpi && print_settings.params.document_cookie) { + if (print_settings.params.selection_only) { + CopyAndPrint(frame); + } else { + // TODO: Always copy before printing. + PrintPages(print_settings, frame); + } + return true; + } + NOTREACHED(); + return false; +} diff --git a/chrome/renderer/print_web_view_helper.h b/chrome/renderer/print_web_view_helper.h index d4feb4a..55c006b 100644 --- a/chrome/renderer/print_web_view_helper.h +++ b/chrome/renderer/print_web_view_helper.h @@ -78,7 +78,7 @@ class PrintWebViewHelper : public WebKit::WebViewClient, explicit PrintWebViewHelper(RenderView* render_view); virtual ~PrintWebViewHelper(); - void Print(WebKit::WebFrame* frame, bool script_initiated); + void Print(WebKit::WebFrame* frame, bool script_initiated, bool is_preview); // Is there a background print in progress? bool IsPrinting() { @@ -89,8 +89,7 @@ class PrintWebViewHelper : public WebKit::WebViewClient, void DidFinishPrinting(bool success); protected: - bool CopyAndPrint(const ViewMsg_PrintPages_Params& params, - WebKit::WebFrame* web_frame); + bool CopyAndPrint(WebKit::WebFrame* web_frame); // Prints the page listed in |params|. #if defined(USE_X11) @@ -132,11 +131,27 @@ class PrintWebViewHelper : public WebKit::WebViewClient, void UpdatePrintableSizeInPrintParameters(WebKit::WebFrame* frame, ViewMsg_Print_Params* params); + // Initialize print page settings with default settings. + bool InitPrintSettings(WebKit::WebFrame* frame); + + // Get the default printer settings. + bool GetDefaultPrintSettings(WebKit::WebFrame* frame, + ViewMsg_Print_Params* params); + + // Get final print settings from the user. + bool GetPrintSettingsFromUser(WebKit::WebFrame* frame, + int expected_pages_count, + bool use_browser_overlays); + + // Render the frame for printing. + bool RenderPagesForPrint(WebKit::WebFrame* frame); + RenderView* render_view_; WebKit::WebView* print_web_view_; scoped_ptr<ViewMsg_PrintPages_Params> print_pages_params_; base::Time last_cancelled_script_print_; int user_cancelled_scripted_print_count_; + bool is_preview_; private: DISALLOW_COPY_AND_ASSIGN(PrintWebViewHelper); diff --git a/chrome/renderer/print_web_view_helper_linux.cc b/chrome/renderer/print_web_view_helper_linux.cc index b7fbdb8..9ecc802 100644 --- a/chrome/renderer/print_web_view_helper_linux.cc +++ b/chrome/renderer/print_web_view_helper_linux.cc @@ -51,12 +51,16 @@ void PrintWebViewHelper::PrintPages(const ViewMsg_PrintPages_Params& params, metafile.Close(); + int fd_in_browser = -1; + if (is_preview_) { + Send(new ViewHostMsg_PagesReadyForPreview(routing_id(), fd_in_browser)); + return; + } // Get the size of the resulting metafile. uint32 buf_size = metafile.GetDataSize(); DCHECK_GT(buf_size, 0u); base::FileDescriptor fd; - int fd_in_browser = -1; // Ask the browser to open a file for us. if (!Send(new ViewHostMsg_AllocateTempFileForPrinting(&fd, diff --git a/chrome/renderer/print_web_view_helper_mac.mm b/chrome/renderer/print_web_view_helper_mac.mm index 3864b31..5d3ebe8 100644 --- a/chrome/renderer/print_web_view_helper_mac.mm +++ b/chrome/renderer/print_web_view_helper_mac.mm @@ -101,6 +101,10 @@ void PrintWebViewHelper::PrintPage(const ViewMsg_PrintPage_Params& params, NOTREACHED() << "Browser allocation request message failed"; } - Send(new ViewHostMsg_DidPrintPage(routing_id(), page_params)); + if (is_preview_) { + Send(new ViewHostMsg_PageReadyForPreview(routing_id(), page_params)); + } else { + Send(new ViewHostMsg_DidPrintPage(routing_id(), page_params)); + } } diff --git a/chrome/renderer/print_web_view_helper_win.cc b/chrome/renderer/print_web_view_helper_win.cc index 6815b94..97dc5ff 100644 --- a/chrome/renderer/print_web_view_helper_win.cc +++ b/chrome/renderer/print_web_view_helper_win.cc @@ -163,6 +163,10 @@ void PrintWebViewHelper::PrintPage(const ViewMsg_PrintPage_Params& params, routing_id(), page_params.metafile_data_handle, &page_params.metafile_data_handle))) { - Send(new ViewHostMsg_DidPrintPage(routing_id(), page_params)); + if (is_preview_) { + Send(new ViewHostMsg_PageReadyForPreview(routing_id(), page_params)); + } else { + Send(new ViewHostMsg_DidPrintPage(routing_id(), page_params)); + } } } diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index 6989661..2b1615d0 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -844,6 +844,7 @@ void RenderView::OnMessageReceived(const IPC::Message& message) { IPC_MESSAGE_HANDLER(ViewMsg_AccessibilityNotifications_ACK, OnAccessibilityNotificationsAck) IPC_MESSAGE_HANDLER(ViewMsg_AsyncOpenFile_ACK, OnAsyncFileOpened) + IPC_MESSAGE_HANDLER(ViewMsg_PrintPreview, OnPrintPreview) // Have the super handle all other messages. IPC_MESSAGE_UNHANDLED(RenderWidget::OnMessageReceived(message)) @@ -897,9 +898,9 @@ void RenderView::OnPrintPages() { // If the user has selected text in the currently focused frame we print // only that frame (this makes print selection work for multiple frames). if (webview()->focusedFrame()->hasSelection()) - Print(webview()->focusedFrame(), false); + Print(webview()->focusedFrame(), false, false); else - Print(webview()->mainFrame(), false); + Print(webview()->mainFrame(), false, false); } } @@ -912,6 +913,18 @@ void RenderView::OnPrintingDone(int document_cookie, bool success) { } } +void RenderView::OnPrintPreview() { + DCHECK(webview()); + if (webview()) { + // If the user has selected text in the currently focused frame we print + // only that frame (this makes print selection work for multiple frames). + if (webview()->focusedFrame()->hasSelection()) + Print(webview()->focusedFrame(), false, true); + else + Print(webview()->focusedFrame(), false, true); + } +} + void RenderView::CapturePageInfo(int load_id, bool preliminary_capture) { if (load_id != page_id_) return; // this capture call is no longer relevant due to navigation @@ -1853,7 +1866,12 @@ void RenderView::didAddMessageToConsole( void RenderView::printPage(WebFrame* frame) { DCHECK(frame); - Print(frame, true); + if (CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnablePrintPreview)) { + Print(frame, true, true); + } else { + Print(frame, true, false); + } } WebKit::WebNotificationPresenter* RenderView::notificationPresenter() { @@ -5709,12 +5727,14 @@ void RenderView::postAccessibilityNotification( } } -void RenderView::Print(WebFrame* frame, bool script_initiated) { +void RenderView::Print(WebFrame* frame, + bool script_initiated, + bool is_preview) { DCHECK(frame); if (print_helper_.get() == NULL) { print_helper_.reset(new PrintWebViewHelper(this)); } - print_helper_->Print(frame, script_initiated); + print_helper_->Print(frame, script_initiated, is_preview); } void RenderView::OnSetEditCommandsForNextKeyEvent( diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h index 8944931..0821aef 100644 --- a/chrome/renderer/render_view.h +++ b/chrome/renderer/render_view.h @@ -843,6 +843,7 @@ class RenderView : public RenderWidget, #endif void OnPrintingDone(int document_cookie, bool success); void OnPrintPages(); + void OnPrintPreview(); void OnRedo(); void OnReloadFrame(); void OnReplace(const string16& text); @@ -1020,7 +1021,7 @@ class RenderView : public RenderWidget, const WebKit::WebURLError& error, bool replace); - void Print(WebKit::WebFrame* frame, bool script_initiated); + void Print(WebKit::WebFrame* frame, bool script_initiated, bool is_preview); // Returns whether the page associated with |document| is a candidate for // translation. Some pages can explictly specify (via a meta-tag) that they |