diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-15 00:10:10 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-15 00:10:10 +0000 |
commit | 521b248f7ce021f99932c9150461744b3edf3067 (patch) | |
tree | 150e68cc2479305324d14161ef1c11c719c3ab4d /chrome | |
parent | 80ece4b0ee41cba5e00ab7d582c4d1373e982e1c (diff) | |
download | chromium_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.cc | 8 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_view_host.h | 6 | ||||
-rw-r--r-- | chrome/browser/tab_contents/render_view_context_menu.cc | 28 | ||||
-rw-r--r-- | chrome/browser/tab_contents/render_view_context_menu.h | 2 | ||||
-rw-r--r-- | chrome/browser/ui/cocoa/menu_controller.h | 3 | ||||
-rw-r--r-- | chrome/browser/ui/cocoa/menu_controller.mm | 5 | ||||
-rw-r--r-- | chrome/browser/ui/gtk/menu_gtk.cc | 1 | ||||
-rw-r--r-- | chrome/common/render_messages_internal.h | 6 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper.cc | 66 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper.h | 27 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper_linux.cc | 5 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper_mac.mm | 4 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 31 | ||||
-rw-r--r-- | chrome/renderer/render_view.h | 11 |
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_; |