summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-15 00:10:10 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-15 00:10:10 +0000
commit521b248f7ce021f99932c9150461744b3edf3067 (patch)
tree150e68cc2479305324d14161ef1c11c719c3ab4d /chrome
parent80ece4b0ee41cba5e00ab7d582c4d1373e982e1c (diff)
downloadchromium_src-521b248f7ce021f99932c9150461744b3edf3067.zip
chromium_src-521b248f7ce021f99932c9150461744b3edf3067.tar.gz
chromium_src-521b248f7ce021f99932c9150461744b3edf3067.tar.bz2
Allow printing/saving a plugin through right click menu, even if it's in a frame or an embed element.
BUG=50285 Review URL: http://codereview.chromium.org/6142013 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@71519 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/renderer_host/render_view_host.cc8
-rw-r--r--chrome/browser/renderer_host/render_view_host.h6
-rw-r--r--chrome/browser/tab_contents/render_view_context_menu.cc28
-rw-r--r--chrome/browser/tab_contents/render_view_context_menu.h2
-rw-r--r--chrome/browser/ui/cocoa/menu_controller.h3
-rw-r--r--chrome/browser/ui/cocoa/menu_controller.mm5
-rw-r--r--chrome/browser/ui/gtk/menu_gtk.cc1
-rw-r--r--chrome/common/render_messages_internal.h6
-rw-r--r--chrome/renderer/print_web_view_helper.cc66
-rw-r--r--chrome/renderer/print_web_view_helper.h27
-rw-r--r--chrome/renderer/print_web_view_helper_linux.cc5
-rw-r--r--chrome/renderer/print_web_view_helper_mac.mm4
-rw-r--r--chrome/renderer/render_view.cc31
-rw-r--r--chrome/renderer/render_view.h11
14 files changed, 166 insertions, 37 deletions
diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc
index 35a394e..6e3cc74 100644
--- a/chrome/browser/renderer_host/render_view_host.cc
+++ b/chrome/browser/renderer_host/render_view_host.cc
@@ -1363,6 +1363,14 @@ void RenderViewHost::MediaPlayerActionAt(const gfx::Point& location,
Send(new ViewMsg_MediaPlayerActionAt(routing_id(), location, action));
}
+void RenderViewHost::ContextMenuClosed() {
+ Send(new ViewMsg_ContextMenuClosed(routing_id()));
+}
+
+void RenderViewHost::PrintNodeUnderContextMenu() {
+ Send(new ViewMsg_PrintNodeUnderContextMenu(routing_id()));
+}
+
void RenderViewHost::OnMsgPasswordFormsFound(
const std::vector<PasswordForm>& forms) {
delegate_->PasswordFormsFound(forms);
diff --git a/chrome/browser/renderer_host/render_view_host.h b/chrome/browser/renderer_host/render_view_host.h
index 4959c847..49a90a4 100644
--- a/chrome/browser/renderer_host/render_view_host.h
+++ b/chrome/browser/renderer_host/render_view_host.h
@@ -326,6 +326,12 @@ class RenderViewHost : public RenderWidgetHost {
void MediaPlayerActionAt(const gfx::Point& location,
const WebKit::WebMediaPlayerAction& action);
+ // Notifies the renderer that the context menu has closed.
+ void ContextMenuClosed();
+
+ // Prints the node that's under the context menu.
+ void PrintNodeUnderContextMenu();
+
// Copies the image at the specified point.
void CopyImageAt(int x, int y);
diff --git a/chrome/browser/tab_contents/render_view_context_menu.cc b/chrome/browser/tab_contents/render_view_context_menu.cc
index cf826bd..9f6f00c 100644
--- a/chrome/browser/tab_contents/render_view_context_menu.cc
+++ b/chrome/browser/tab_contents/render_view_context_menu.cc
@@ -399,7 +399,8 @@ void RenderViewContextMenu::InitMenu() {
case WebContextMenuData::MediaTypeAudio:
AppendAudioItems();
break;
- default:
+ case WebContextMenuData::MediaTypePlugin:
+ AppendPluginItems();
break;
}
@@ -526,6 +527,18 @@ void RenderViewContextMenu::AppendMediaItems() {
IDS_CONTENT_CONTEXT_CONTROLS);
}
+void RenderViewContextMenu::AppendPluginItems() {
+ if (params_.page_url == params_.src_url) {
+ // Full page plugin, so show page menu items.
+ if (params_.link_url.is_empty() && params_.selection_text.empty())
+ AppendPageItems();
+ } else {
+ menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVEAVAS,
+ IDS_CONTENT_CONTEXT_SAVEPAGEAS);
+ menu_model_.AddItemWithStringId(IDC_PRINT, IDS_CONTENT_CONTEXT_PRINT);
+ }
+}
+
void RenderViewContextMenu::AppendPageItems() {
menu_model_.AddItemWithStringId(IDC_BACK, IDS_CONTENT_CONTEXT_BACK);
menu_model_.AddItemWithStringId(IDC_FORWARD, IDS_CONTENT_CONTEXT_FORWARD);
@@ -937,6 +950,9 @@ bool RenderViewContextMenu::IsCommandIdEnabled(int id) const {
return !params_.misspelled_word.empty();
case IDC_PRINT:
+ return params_.media_type == WebContextMenuData::MediaTypeNone ||
+ params_.media_flags & WebContextMenuData::MediaCanPrint;
+
case IDC_CONTENT_CONTEXT_SEARCHWEBFOR:
case IDC_CONTENT_CONTEXT_GOTOURL:
case IDC_SPELLCHECK_SUGGESTION_0:
@@ -1214,7 +1230,11 @@ void RenderViewContextMenu::ExecuteCommand(int id) {
break;
case IDC_PRINT:
- source_tab_contents_->PrintPreview();
+ if (params_.media_type == WebContextMenuData::MediaTypeNone) {
+ source_tab_contents_->PrintPreview();
+ } else {
+ source_tab_contents_->render_view_host()->PrintNodeUnderContextMenu();
+ }
break;
case IDC_VIEW_SOURCE:
@@ -1378,6 +1398,10 @@ void RenderViewContextMenu::ExecuteCommand(int id) {
}
}
+void RenderViewContextMenu::MenuClosed() {
+ source_tab_contents_->render_view_host()->ContextMenuClosed();
+}
+
bool RenderViewContextMenu::IsDevCommandEnabled(int id) const {
const CommandLine& command_line = *CommandLine::ForCurrentProcess();
if (command_line.HasSwitch(switches::kAlwaysEnableDevTools))
diff --git a/chrome/browser/tab_contents/render_view_context_menu.h b/chrome/browser/tab_contents/render_view_context_menu.h
index ac10e8c..2aac2407 100644
--- a/chrome/browser/tab_contents/render_view_context_menu.h
+++ b/chrome/browser/tab_contents/render_view_context_menu.h
@@ -47,6 +47,7 @@ class RenderViewContextMenu : public ui::SimpleMenuModel::Delegate {
virtual bool IsCommandIdChecked(int command_id) const;
virtual bool IsCommandIdEnabled(int command_id) const;
virtual void ExecuteCommand(int command_id);
+ virtual void MenuClosed();
protected:
void InitMenu();
@@ -85,6 +86,7 @@ class RenderViewContextMenu : public ui::SimpleMenuModel::Delegate {
void AppendAudioItems();
void AppendVideoItems();
void AppendMediaItems();
+ void AppendPluginItems();
void AppendPageItems();
void AppendFrameItems();
void AppendCopyItem();
diff --git a/chrome/browser/ui/cocoa/menu_controller.h b/chrome/browser/ui/cocoa/menu_controller.h
index 4be9b0d..f0ac080 100644
--- a/chrome/browser/ui/cocoa/menu_controller.h
+++ b/chrome/browser/ui/cocoa/menu_controller.h
@@ -8,6 +8,7 @@
#import <Cocoa/Cocoa.h>
+#import "base/mac/cocoa_protocols.h"
#include "base/scoped_nsobject.h"
namespace ui {
@@ -20,7 +21,7 @@ class MenuModel;
// allow for hierarchical menus). The tag is the index into that model for
// that particular item. It is important that the model outlives this object
// as it only maintains weak references.
-@interface MenuController : NSObject {
+@interface MenuController : NSObject<NSMenuDelegate> {
@protected
ui::MenuModel* model_; // weak
scoped_nsobject<NSMenu> menu_;
diff --git a/chrome/browser/ui/cocoa/menu_controller.mm b/chrome/browser/ui/cocoa/menu_controller.mm
index 9a1d5a8..c13b4fe 100644
--- a/chrome/browser/ui/cocoa/menu_controller.mm
+++ b/chrome/browser/ui/cocoa/menu_controller.mm
@@ -175,6 +175,7 @@
- (NSMenu*)menu {
if (!menu_ && model_) {
menu_.reset([[self menuFromModel:model_] retain]);
+ [menu_ setDelegate:self];
// If this is to be used with a NSPopUpButtonCell, add an item at the 0th
// position that's empty. Doing it after the menu has been constructed won't
// complicate creation logic, and since the tags are model indexes, they
@@ -188,4 +189,8 @@
return menu_.get();
}
+- (void)menuDidClose:(NSMenu*)menu {
+ model_->MenuClosed();
+}
+
@end
diff --git a/chrome/browser/ui/gtk/menu_gtk.cc b/chrome/browser/ui/gtk/menu_gtk.cc
index 08f836e..af8ae5c 100644
--- a/chrome/browser/ui/gtk/menu_gtk.cc
+++ b/chrome/browser/ui/gtk/menu_gtk.cc
@@ -734,6 +734,7 @@ void MenuGtk::OnMenuShow(GtkWidget* widget) {
void MenuGtk::OnMenuHidden(GtkWidget* widget) {
if (delegate_)
delegate_->StoppedShowing();
+ model_->MenuClosed();
}
// static
diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h
index 4759242..f726e0b 100644
--- a/chrome/common/render_messages_internal.h
+++ b/chrome/common/render_messages_internal.h
@@ -126,6 +126,8 @@ IPC_MESSAGE_ROUTED2(ViewMsg_MediaPlayerActionAt,
gfx::Point, /* location */
WebKit::WebMediaPlayerAction)
+IPC_MESSAGE_ROUTED0(ViewMsg_PrintNodeUnderContextMenu)
+
// Tells the render view to close.
IPC_MESSAGE_ROUTED0(ViewMsg_Close)
@@ -1081,6 +1083,10 @@ IPC_MESSAGE_ROUTED4(ViewMsg_PepperConnectTcpACK,
PP_Flash_NetAddress /* local_addr */,
PP_Flash_NetAddress /* remote_addr */)
+// Sent in response to a ViewHostMsg_ContextMenu to let the renderer know that
+// the menu has been closed.
+IPC_MESSAGE_ROUTED0(ViewMsg_ContextMenuClosed)
+
//-----------------------------------------------------------------------------
// TabContents messages
// These are messages sent from the renderer to the browser process.
diff --git a/chrome/renderer/print_web_view_helper.cc b/chrome/renderer/print_web_view_helper.cc
index 6c1f32a..a38389c 100644
--- a/chrome/renderer/print_web_view_helper.cc
+++ b/chrome/renderer/print_web_view_helper.cc
@@ -14,7 +14,10 @@
#include "grit/generated_resources.h"
#include "printing/units.h"
#include "third_party/WebKit/WebKit/chromium/public/WebConsoleMessage.h"
+#include "third_party/WebKit/WebKit/chromium/public/WebDocument.h"
+#include "third_party/WebKit/WebKit/chromium/public/WebElement.h"
#include "third_party/WebKit/WebKit/chromium/public/WebFrame.h"
+#include "third_party/WebKit/WebKit/chromium/public/WebNode.h"
#include "third_party/WebKit/WebKit/chromium/public/WebRect.h"
#include "third_party/WebKit/WebKit/chromium/public/WebScreenInfo.h"
#include "third_party/WebKit/WebKit/chromium/public/WebSize.h"
@@ -39,6 +42,7 @@ using WebKit::WebView;
PrepareFrameAndViewForPrint::PrepareFrameAndViewForPrint(
const ViewMsg_Print_Params& print_params,
WebFrame* frame,
+ WebNode* node,
WebView* web_view)
: frame_(frame), web_view_(web_view), expected_pages_count_(0),
use_browser_overlays_(true) {
@@ -69,15 +73,12 @@ PrepareFrameAndViewForPrint::PrepareFrameAndViewForPrint(
web_view->resize(print_layout_size);
-#if defined(WEBFRAME_PRINTBEGIN_TAKES_NODE)
+ WebNode node_to_print;
+ if (node)
+ node_to_print = *node;
expected_pages_count_ = frame->printBegin(
- print_canvas_size_, WebNode(), static_cast<int>(print_params.dpi),
+ print_canvas_size_, node_to_print, static_cast<int>(print_params.dpi),
&use_browser_overlays_);
-#else
- expected_pages_count_ = frame->printBegin(
- print_canvas_size_, static_cast<int>(print_params.dpi),
- &use_browser_overlays_);
-#endif
}
PrepareFrameAndViewForPrint::~PrepareFrameAndViewForPrint() {
@@ -94,7 +95,20 @@ PrintWebViewHelper::PrintWebViewHelper(RenderView* render_view)
PrintWebViewHelper::~PrintWebViewHelper() {}
-void PrintWebViewHelper::Print(WebFrame* frame,
+void PrintWebViewHelper::PrintFrame(WebFrame* frame,
+ bool script_initiated,
+ bool is_preview) {
+ Print(frame, NULL, script_initiated, is_preview);
+}
+
+void PrintWebViewHelper::PrintNode(WebNode* node,
+ bool script_initiated,
+ bool is_preview) {
+ Print(node->document().frame(), node, script_initiated, is_preview);
+}
+
+void PrintWebViewHelper::Print(WebKit::WebFrame* frame,
+ WebNode* node,
bool script_initiated,
bool is_preview) {
const int kMinSecondsToIgnoreJavascriptInitiatedPrint = 2;
@@ -129,7 +143,7 @@ void PrintWebViewHelper::Print(WebFrame* frame,
is_preview_ = is_preview;
// Initialize print settings.
- if (!InitPrintSettings(frame))
+ if (!InitPrintSettings(frame, node))
return; // Failed to init print page settings.
int expected_pages_count = 0;
@@ -139,7 +153,7 @@ void PrintWebViewHelper::Print(WebFrame* frame,
// a scope for itself (see comments on PrepareFrameAndViewForPrint).
{
PrepareFrameAndViewForPrint prep_frame_view(
- (*print_pages_params_).params, frame, frame->view());
+ (*print_pages_params_).params, frame, node, frame->view());
expected_pages_count = prep_frame_view.GetExpectedPageCount();
if (expected_pages_count)
use_browser_overlays = prep_frame_view.ShouldUseBrowserOverlays();
@@ -160,7 +174,7 @@ void PrintWebViewHelper::Print(WebFrame* frame,
if (is_preview_)
RenderPagesForPreview(frame);
else
- RenderPagesForPrint(frame);
+ RenderPagesForPrint(frame, node);
// Reset cancel counter on first successful print.
user_cancelled_scripted_print_count_ = 0;
@@ -229,12 +243,14 @@ bool PrintWebViewHelper::CopyAndPrint(WebFrame* web_frame) {
#if defined(OS_MACOSX) || defined(OS_WIN)
void PrintWebViewHelper::PrintPages(const ViewMsg_PrintPages_Params& params,
- WebFrame* frame) {
+ WebFrame* frame,
+ WebNode* node) {
ViewMsg_Print_Params printParams = params.params;
- UpdatePrintableSizeInPrintParameters(frame, &printParams);
+ UpdatePrintableSizeInPrintParameters(frame, node, &printParams);
PrepareFrameAndViewForPrint prep_frame_view(printParams,
frame,
+ node,
frame->view());
int page_count = prep_frame_view.GetExpectedPageCount();
@@ -273,7 +289,7 @@ int32 PrintWebViewHelper::routing_id() {
void PrintWebViewHelper::didStopLoading() {
DCHECK(print_pages_params_.get() != NULL);
- PrintPages(*print_pages_params_.get(), print_web_view_->mainFrame());
+ PrintPages(*print_pages_params_.get(), print_web_view_->mainFrame(), NULL);
}
void PrintWebViewHelper::GetPageSizeAndMarginsInPoints(
@@ -358,14 +374,16 @@ void PrintWebViewHelper::GetPageSizeAndMarginsInPoints(
}
void PrintWebViewHelper::UpdatePrintableSizeInPrintParameters(
- WebFrame* frame, ViewMsg_Print_Params* params) {
+ WebFrame* frame,
+ WebNode* node,
+ ViewMsg_Print_Params* params) {
double content_width_in_points;
double content_height_in_points;
double margin_top_in_points;
double margin_right_in_points;
double margin_bottom_in_points;
double margin_left_in_points;
- PrepareFrameAndViewForPrint prepare(*params, frame, frame->view());
+ PrepareFrameAndViewForPrint prepare(*params, frame, node, frame->view());
PrintWebViewHelper::GetPageSizeAndMarginsInPoints(frame, 0, *params,
&content_width_in_points, &content_height_in_points,
&margin_top_in_points, &margin_right_in_points,
@@ -397,9 +415,10 @@ void PrintWebViewHelper::UpdatePrintableSizeInPrintParameters(
margin_left_in_points, printing::kPointsPerInch, dpi));
}
-bool PrintWebViewHelper::InitPrintSettings(WebFrame* frame) {
+bool PrintWebViewHelper::InitPrintSettings(WebFrame* frame,
+ WebNode* node) {
ViewMsg_PrintPages_Params settings;
- if (GetDefaultPrintSettings(frame, &settings.params)) {
+ if (GetDefaultPrintSettings(frame, node, &settings.params)) {
print_pages_params_.reset(new ViewMsg_PrintPages_Params(settings));
print_pages_params_->pages.clear();
return true;
@@ -408,7 +427,9 @@ bool PrintWebViewHelper::InitPrintSettings(WebFrame* frame) {
}
bool PrintWebViewHelper::GetDefaultPrintSettings(
- WebFrame* frame, ViewMsg_Print_Params* params) {
+ WebFrame* frame,
+ WebNode* node,
+ ViewMsg_Print_Params* params) {
IPC::SyncMessage* msg =
new ViewHostMsg_GetDefaultPrintSettings(routing_id(), params);
if (!Send(msg)) {
@@ -429,7 +450,7 @@ bool PrintWebViewHelper::GetDefaultPrintSettings(
NOTREACHED();
return false;
}
- UpdatePrintableSizeInPrintParameters(frame, params);
+ UpdatePrintableSizeInPrintParameters(frame, node, params);
return true;
}
@@ -466,13 +487,14 @@ bool PrintWebViewHelper::GetPrintSettingsFromUser(WebFrame* frame,
return (print_settings.params.dpi && print_settings.params.document_cookie);
}
-void PrintWebViewHelper::RenderPagesForPrint(WebFrame *frame) {
+void PrintWebViewHelper::RenderPagesForPrint(WebFrame* frame,
+ WebNode* node) {
ViewMsg_PrintPages_Params print_settings = *print_pages_params_;
if (print_settings.params.selection_only) {
CopyAndPrint(frame);
} else {
// TODO: Always copy before printing.
- PrintPages(print_settings, frame);
+ PrintPages(print_settings, frame, node);
}
}
diff --git a/chrome/renderer/print_web_view_helper.h b/chrome/renderer/print_web_view_helper.h
index 447e024..3aa329b 100644
--- a/chrome/renderer/print_web_view_helper.h
+++ b/chrome/renderer/print_web_view_helper.h
@@ -45,8 +45,11 @@ struct ViewHostMsg_DidPreviewDocument_Params;
// 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 ViewMsg_Print_Params& print_params,
WebKit::WebFrame* frame,
+ WebKit::WebNode* node,
WebKit::WebView* web_view);
~PrepareFrameAndViewForPrint();
@@ -83,7 +86,13 @@ class PrintWebViewHelper : public WebKit::WebViewClient,
explicit PrintWebViewHelper(RenderView* render_view);
virtual ~PrintWebViewHelper();
- void Print(WebKit::WebFrame* frame, bool script_initiated, bool is_preview);
+ void PrintFrame(WebKit::WebFrame* frame,
+ bool script_initiated,
+ bool is_preview);
+
+ void PrintNode(WebKit::WebNode* node,
+ bool script_initiated,
+ bool is_preview);
// Is there a background print in progress?
bool IsPrinting() {
@@ -112,7 +121,8 @@ class PrintWebViewHelper : public WebKit::WebViewClient,
// Prints all the pages listed in |params|.
// It will implicitly revert the document to display CSS media type.
void PrintPages(const ViewMsg_PrintPages_Params& params,
- WebKit::WebFrame* frame);
+ WebKit::WebFrame* frame,
+ WebKit::WebNode* node);
// IPC::Message::Sender
bool Send(IPC::Message* msg);
@@ -134,14 +144,22 @@ class PrintWebViewHelper : public WebKit::WebViewClient,
double* margin_bottom_in_points,
double* margin_left_in_points);
+ void Print(WebKit::WebFrame* frame,
+ WebKit::WebNode* node,
+ bool script_initiated,
+ bool is_preview);
+
void UpdatePrintableSizeInPrintParameters(WebKit::WebFrame* frame,
+ WebKit::WebNode* node,
ViewMsg_Print_Params* params);
// Initialize print page settings with default settings.
- bool InitPrintSettings(WebKit::WebFrame* frame);
+ bool InitPrintSettings(WebKit::WebFrame* frame,
+ WebKit::WebNode* node);
// Get the default printer settings.
bool GetDefaultPrintSettings(WebKit::WebFrame* frame,
+ WebKit::WebNode* node,
ViewMsg_Print_Params* params);
// Get final print settings from the user.
@@ -151,7 +169,8 @@ class PrintWebViewHelper : public WebKit::WebViewClient,
bool use_browser_overlays);
// Render the frame for printing.
- void RenderPagesForPrint(WebKit::WebFrame* frame);
+ void RenderPagesForPrint(WebKit::WebFrame* frame,
+ WebKit::WebNode* node);
// Render the frame for preview.
void RenderPagesForPreview(WebKit::WebFrame* frame);
diff --git a/chrome/renderer/print_web_view_helper_linux.cc b/chrome/renderer/print_web_view_helper_linux.cc
index 9e4811a..242d228 100644
--- a/chrome/renderer/print_web_view_helper_linux.cc
+++ b/chrome/renderer/print_web_view_helper_linux.cc
@@ -15,10 +15,12 @@
using printing::NativeMetafile;
using WebKit::WebFrame;
+using WebKit::WebNode;
using WebKit::WebSize;
void PrintWebViewHelper::PrintPages(const ViewMsg_PrintPages_Params& params,
- WebFrame* frame) {
+ WebFrame* frame,
+ WebNode* node) {
// We only can use PDF in the renderer because Cairo needs to create a
// temporary file for a PostScript surface.
printing::NativeMetafile metafile(printing::NativeMetafile::PDF);
@@ -33,6 +35,7 @@ void PrintWebViewHelper::PrintPages(const ViewMsg_PrintPages_Params& params,
// story.
PrepareFrameAndViewForPrint prep_frame_view(params.params,
frame,
+ node,
frame->view());
page_count = prep_frame_view.GetExpectedPageCount();
diff --git a/chrome/renderer/print_web_view_helper_mac.mm b/chrome/renderer/print_web_view_helper_mac.mm
index 592ff38..c398c2f 100644
--- a/chrome/renderer/print_web_view_helper_mac.mm
+++ b/chrome/renderer/print_web_view_helper_mac.mm
@@ -71,10 +71,10 @@ void PrintWebViewHelper::CreatePreviewDocument(
WebFrame* frame,
ViewHostMsg_DidPreviewDocument_Params* print_params) {
ViewMsg_Print_Params printParams = params.params;
- UpdatePrintableSizeInPrintParameters(frame, &printParams);
+ UpdatePrintableSizeInPrintParameters(frame, NULL, &printParams);
PrepareFrameAndViewForPrint prep_frame_view(printParams,
- frame, frame->view());
+ frame, NULL, frame->view());
int page_count = prep_frame_view.GetExpectedPageCount();
if (!page_count)
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index a2ca602..9395eca 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -984,6 +984,9 @@ bool RenderView::OnMessageReceived(const IPC::Message& message) {
IPC_MESSAGE_HANDLER(ViewMsg_CaptureSnapshot, OnCaptureSnapshot)
IPC_MESSAGE_HANDLER(ViewMsg_PrintPages, OnPrintPages)
IPC_MESSAGE_HANDLER(ViewMsg_PrintingDone, OnPrintingDone)
+ IPC_MESSAGE_HANDLER(ViewMsg_PrintPreview, OnPrintPreview)
+ IPC_MESSAGE_HANDLER(ViewMsg_PrintNodeUnderContextMenu,
+ OnPrintNodeUnderContextMenu)
IPC_MESSAGE_HANDLER(ViewMsg_Navigate, OnNavigate)
IPC_MESSAGE_HANDLER(ViewMsg_Stop, OnStop)
IPC_MESSAGE_HANDLER(ViewMsg_ReloadFrame, OnReloadFrame)
@@ -1107,9 +1110,9 @@ bool RenderView::OnMessageReceived(const IPC::Message& message) {
#if defined(OS_MACOSX)
IPC_MESSAGE_HANDLER(ViewMsg_SelectPopupMenuItem, OnSelectPopupMenuItem)
#endif
- IPC_MESSAGE_HANDLER(ViewMsg_PrintPreview, OnPrintPreview)
IPC_MESSAGE_HANDLER(ViewMsg_JavaScriptStressTestControl,
OnJavaScriptStressTestControl)
+ IPC_MESSAGE_HANDLER(ViewMsg_ContextMenuClosed, OnContextMenuClosed)
// Have the super handle all other messages.
IPC_MESSAGE_UNHANDLED(handled = RenderWidget::OnMessageReceived(message))
@@ -1191,6 +1194,18 @@ void RenderView::OnPrintPreview() {
}
}
+void RenderView::OnPrintNodeUnderContextMenu() {
+ if (context_menu_node_.isNull()) {
+ NOTREACHED();
+ return;
+ }
+
+ // 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(context_menu_node_);
+ GetPrintWebViewHelper()->PrintNode(&context_menu_node, false, false);
+}
+
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
@@ -2460,6 +2475,7 @@ void RenderView::showContextMenu(
// data encoded images. We should have a way to save them.
if (params.src_url.spec().size() > chrome::kMaxURLChars)
params.src_url = GURL();
+ context_menu_node_ = data.node;
Send(new ViewHostMsg_ContextMenu(routing_id_, params));
}
@@ -5309,10 +5325,13 @@ void RenderView::Print(WebFrame* frame,
bool script_initiated,
bool is_preview) {
DCHECK(frame);
- if (print_helper_.get() == NULL) {
+ GetPrintWebViewHelper()->PrintFrame(frame, script_initiated, is_preview);
+}
+
+PrintWebViewHelper* RenderView::GetPrintWebViewHelper() {
+ if (print_helper_.get() == NULL)
print_helper_.reset(new PrintWebViewHelper(this));
- }
- print_helper_->Print(frame, script_initiated, is_preview);
+ return print_helper_.get();
}
void RenderView::OnSetEditCommandsForNextKeyEvent(
@@ -5701,3 +5720,7 @@ void RenderView::OnJavaScriptStressTestControl(int cmd, int param) {
v8::Testing::PrepareStressRun(param);
}
}
+
+void RenderView::OnContextMenuClosed() {
+ context_menu_node_.reset();
+}
diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h
index 0d91208..ed82721 100644
--- a/chrome/renderer/render_view.h
+++ b/chrome/renderer/render_view.h
@@ -41,6 +41,7 @@
#include "third_party/WebKit/WebKit/chromium/public/WebFrameClient.h"
#include "third_party/WebKit/WebKit/chromium/public/WebMediaPlayerAction.h"
#include "third_party/WebKit/WebKit/chromium/public/WebPageSerializerClient.h"
+#include "third_party/WebKit/WebKit/chromium/public/WebNode.h"
#include "third_party/WebKit/WebKit/chromium/public/WebTextDirection.h"
#include "third_party/WebKit/WebKit/chromium/public/WebViewClient.h"
#include "third_party/WebKit/WebKit/chromium/public/WebNavigationType.h"
@@ -138,7 +139,6 @@ class WebKeyboardEvent;
class WebMediaPlayer;
class WebMediaPlayerClient;
class WebMouseEvent;
-class WebNode;
class WebPlugin;
class WebSpeechInputController;
class WebSpeechInputListener;
@@ -830,6 +830,7 @@ class RenderView : public RenderWidget,
const PP_Flash_NetAddress& local_addr,
const PP_Flash_NetAddress& remote_addr);
#endif
+ void OnContextMenuClosed();
void OnCopy();
void OnCopyImageAt(int x, int y);
#if defined(OS_MACOSX)
@@ -909,6 +910,7 @@ class RenderView : public RenderWidget,
void OnPrintingDone(int document_cookie, bool success);
void OnPrintPages();
void OnPrintPreview();
+ void OnPrintNodeUnderContextMenu();
void OnRedo();
void OnReloadFrame();
void OnReplace(const string16& text);
@@ -1092,8 +1094,12 @@ class RenderView : public RenderWidget,
const WebKit::WebURLError& error,
bool replace);
+ // Prints |frame|.
void Print(WebKit::WebFrame* frame, bool script_initiated, bool is_preview);
+ // Returns the PrintWebViewHelper for this class, creating if necessary.
+ PrintWebViewHelper* GetPrintWebViewHelper();
+
// Returns whether the page associated with |document| is a candidate for
// translation. Some pages can explictly specify (via a meta-tag) that they
// should not be translated.
@@ -1467,6 +1473,9 @@ class RenderView : public RenderWidget,
// The custom menu event listener, if any.
CustomMenuListener* custom_menu_listener_;
+ // The node that the context menu was pressed over.
+ WebKit::WebNode context_menu_node_;
+
// Reports load progress to the browser.
scoped_ptr<LoadProgressTracker> load_progress_tracker_;