summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authorkmadhusu@chromium.org <kmadhusu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-25 18:23:47 +0000
committerkmadhusu@chromium.org <kmadhusu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-25 18:23:47 +0000
commit212a49ddb69f673f93e4cdc4dcb6add56dc966c0 (patch)
tree253c1cae2fc3d72aee50f5d095658b1eb805377c /chrome/renderer
parente340dd3131637817f78de99896f9a2fccfc6dbba (diff)
downloadchromium_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.cc240
-rw-r--r--chrome/renderer/print_web_view_helper.h21
-rw-r--r--chrome/renderer/print_web_view_helper_linux.cc6
-rw-r--r--chrome/renderer/print_web_view_helper_mac.mm6
-rw-r--r--chrome/renderer/print_web_view_helper_win.cc6
-rw-r--r--chrome/renderer/render_view.cc30
-rw-r--r--chrome/renderer/render_view.h3
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