| Index: chrome/renderer/print_web_view_helper.cc
|
| diff --git a/chrome/renderer/print_web_view_helper.cc b/chrome/renderer/print_web_view_helper.cc
|
| index c46a383165995a6e00ffcc8c042480b9cb26b5f5..e016c3b48003f3e146b2e98d1d63e1bf8434c9e4 100644
|
| --- a/chrome/renderer/print_web_view_helper.cc
|
| +++ b/chrome/renderer/print_web_view_helper.cc
|
| @@ -13,6 +13,7 @@
|
| #include "chrome/common/render_messages_params.h"
|
| #include "chrome/renderer/render_view.h"
|
| #include "grit/generated_resources.h"
|
| +#include "printing/page_range.h"
|
| #include "printing/units.h"
|
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebConsoleMessage.h"
|
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h"
|
| @@ -32,6 +33,8 @@ using printing::ConvertPixelsToPointDouble;
|
| using printing::ConvertUnit;
|
| using printing::ConvertUnitDouble;
|
| using WebKit::WebConsoleMessage;
|
| +using WebKit::WebDocument;
|
| +using WebKit::WebElement;
|
| using WebKit::WebFrame;
|
| using WebKit::WebNode;
|
| using WebKit::WebRect;
|
| @@ -105,13 +108,19 @@ void PrintWebViewHelper::PrintFrame(WebFrame* frame,
|
|
|
| void PrintWebViewHelper::PrintNode(WebNode* node,
|
| bool script_initiated,
|
| - bool is_preview) {
|
| - Print(node->document().frame(), node, script_initiated, is_preview);
|
| + bool is_preview,
|
| + bool is_print_for_print_preview) {
|
| + if (is_print_for_print_preview)
|
| + PrintForPrintPreview(node->document().frame(), node);
|
| + else
|
| + Print(node->document().frame(), node, script_initiated, is_preview);
|
| }
|
|
|
| bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) {
|
| bool handled = true;
|
| IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message)
|
| + IPC_MESSAGE_HANDLER(ViewMsg_PrintForPrintPreview,
|
| + OnPrintForPrintPreview)
|
| IPC_MESSAGE_HANDLER(ViewMsg_PrintPages, OnPrintPages)
|
| IPC_MESSAGE_HANDLER(ViewMsg_PrintingDone, OnPrintingDone)
|
| IPC_MESSAGE_HANDLER(ViewMsg_PrintPreview, OnPrintPreview)
|
| @@ -158,7 +167,47 @@ void PrintWebViewHelper::OnPrintNodeUnderContextMenu() {
|
| // Make a copy of the node, since we will do a sync call to the browser and
|
| // during that time OnContextMenuClosed might reset context_menu_node_.
|
| WebNode context_menu_node(render_view()->context_menu_node());
|
| - PrintNode(&context_menu_node, false, false);
|
| + PrintNode(&context_menu_node, false, false, false);
|
| +}
|
| +
|
| +void PrintWebViewHelper::OnPrintForPrintPreview(
|
| + const std::string& job_settings) {
|
| +#if defined(OS_MACOSX)
|
| + WebFrame* main_frame = render_view()->webview() ?
|
| + render_view()->webview()->mainFrame() : NULL;
|
| + if (!main_frame)
|
| + return;
|
| +
|
| + WebDocument document = main_frame->document();
|
| + // <object> with id="pdf-viewer" is created in
|
| + // chrome/browser/resources/print_preview.js
|
| + WebElement element = document.getElementById("pdf-viewer");
|
| + if (element.isNull()) {
|
| + NOTREACHED();
|
| + return;
|
| + }
|
| + InitPrintSettings(element.document().frame(), &element,
|
| + PrintWebViewHelper::DEFAULT);
|
| + UpdatePrintSettings(job_settings);
|
| + PrintNode(&element, false, false, true);
|
| +#endif
|
| +}
|
| +
|
| +void PrintWebViewHelper::PrintForPrintPreview(WebKit::WebFrame* frame,
|
| + WebNode* node) {
|
| + // If still not finished with earlier print request simply ignore.
|
| + if (print_web_view_)
|
| + return;
|
| +
|
| + // Initialize print params with current print settings.
|
| + if (!InitPrintSettings(frame, node, PrintWebViewHelper::CURRENT)) {
|
| + NOTREACHED();
|
| + DidFinishPrinting(true); // Release all printing resources.
|
| + return; // Failed to init print page settings.
|
| + }
|
| +
|
| + // Render Pages for printing.
|
| + RenderPagesForPrint(frame, node);
|
| }
|
|
|
| void PrintWebViewHelper::Print(WebKit::WebFrame* frame,
|
| @@ -197,7 +246,7 @@ void PrintWebViewHelper::Print(WebKit::WebFrame* frame,
|
| is_preview_ = is_preview;
|
|
|
| // Initialize print settings.
|
| - if (!InitPrintSettings(frame, node))
|
| + if (!InitPrintSettings(frame, node, PrintWebViewHelper::DEFAULT))
|
| return; // Failed to init print page settings.
|
|
|
| int expected_pages_count = 0;
|
| @@ -464,9 +513,10 @@ void PrintWebViewHelper::UpdatePrintableSizeInPrintParameters(
|
| }
|
|
|
| bool PrintWebViewHelper::InitPrintSettings(WebFrame* frame,
|
| - WebNode* node) {
|
| + WebNode* node,
|
| + GetSettingsParam setting_type) {
|
| ViewMsg_PrintPages_Params settings;
|
| - if (GetDefaultPrintSettings(frame, node, &settings.params)) {
|
| + if (GetPrintSettings(frame, node, setting_type, &settings.params)) {
|
| print_pages_params_.reset(new ViewMsg_PrintPages_Params(settings));
|
| print_pages_params_->pages.clear();
|
| return true;
|
| @@ -474,12 +524,32 @@ bool PrintWebViewHelper::InitPrintSettings(WebFrame* frame,
|
| return false;
|
| }
|
|
|
| -bool PrintWebViewHelper::GetDefaultPrintSettings(
|
| - WebFrame* frame,
|
| - WebNode* node,
|
| - ViewMsg_Print_Params* params) {
|
| - if (!render_view()->Send(new ViewHostMsg_GetDefaultPrintSettings(
|
| - render_view()->routing_id(), params))) {
|
| +bool PrintWebViewHelper::UpdatePrintSettings(const std::string& job_settings) {
|
| + ViewMsg_PrintPages_Params settings;
|
| + IPC::SyncMessage* msg = new ViewHostMsg_UpdatePrintSettings(
|
| + render_view()->routing_id(),
|
| + (*print_pages_params_).params.document_cookie,
|
| + job_settings, &settings.params);
|
| + if (!render_view()->Send(msg)) {
|
| + NOTREACHED();
|
| + return false;
|
| + }
|
| + print_pages_params_.reset(new ViewMsg_PrintPages_Params(settings));
|
| + return true;
|
| +}
|
| +
|
| +bool PrintWebViewHelper::GetPrintSettings(WebFrame* frame, WebNode* node,
|
| + GetSettingsParam setting_type, ViewMsg_Print_Params* params) {
|
| + IPC::SyncMessage* msg = NULL;
|
| + if (setting_type == CURRENT) {
|
| + msg = new ViewHostMsg_GetCurrentPrintSettings(render_view()->routing_id(),
|
| + (*print_pages_params_).params.document_cookie,
|
| + params);
|
| + } else {
|
| + msg = new ViewHostMsg_GetDefaultPrintSettings(render_view()->routing_id(),
|
| + params);
|
| + }
|
| + if (!render_view()->Send(msg)) {
|
| NOTREACHED();
|
| return false;
|
| }
|
|
|