diff options
author | avi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-08 22:14:49 +0000 |
---|---|---|
committer | avi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-08 22:14:49 +0000 |
commit | 87de04b08fb5e31c49f1d5db78b3eddb5ece97b2 (patch) | |
tree | 2347e7a405f15f2dffa9414893e4ac5bf372a2ec | |
parent | e983101fbc683ac9b53b5075ab18c4a08c48ccb4 (diff) | |
download | chromium_src-87de04b08fb5e31c49f1d5db78b3eddb5ece97b2.zip chromium_src-87de04b08fb5e31c49f1d5db78b3eddb5ece97b2.tar.gz chromium_src-87de04b08fb5e31c49f1d5db78b3eddb5ece97b2.tar.bz2 |
Move modal dialogs from WebViewClient to WebFrameClient, part 1/3.
BUG=304341
TEST=modal dialogs still work
Review URL: https://codereview.chromium.org/226503002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@262520 0039d316-1c4b-4281-b951-d872f2087c98
19 files changed, 362 insertions, 321 deletions
diff --git a/content/browser/frame_host/render_frame_host_delegate.h b/content/browser/frame_host/render_frame_host_delegate.h index efce414..8546b21 100644 --- a/content/browser/frame_host/render_frame_host_delegate.h +++ b/content/browser/frame_host/render_frame_host_delegate.h @@ -7,6 +7,7 @@ #include "base/basictypes.h" #include "content/common/content_export.h" +#include "content/public/common/javascript_message_type.h" class GURL; @@ -65,6 +66,19 @@ class CONTENT_EXPORT RenderFrameHostDelegate { virtual void ShowContextMenu(RenderFrameHost* render_frame_host, const ContextMenuParams& params) {} + // A JavaScript message, confirmation or prompt should be shown. + virtual void RunJavaScriptMessage(RenderFrameHost* rfh, + const base::string16& message, + const base::string16& default_prompt, + const GURL& frame_url, + JavaScriptMessageType type, + IPC::Message* reply_msg) {} + + virtual void RunBeforeUnloadConfirm(RenderFrameHost* rfh, + const base::string16& message, + bool is_reload, + IPC::Message* reply_msg) {} + // Return this object cast to a WebContents, if it is one. If the object is // not a WebContents, returns NULL. virtual WebContents* GetAsWebContents(); diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index ef23561..acad10c 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc @@ -259,6 +259,10 @@ bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) { IPC_MESSAGE_HANDLER(FrameHostMsg_ContextMenu, OnContextMenu) IPC_MESSAGE_HANDLER(FrameHostMsg_JavaScriptExecuteResponse, OnJavaScriptExecuteResponse) + IPC_MESSAGE_HANDLER_DELAY_REPLY(FrameHostMsg_RunJavaScriptMessage, + OnRunJavaScriptMessage) + IPC_MESSAGE_HANDLER_DELAY_REPLY(FrameHostMsg_RunBeforeUnloadConfirm, + OnRunBeforeUnloadConfirm) IPC_END_MESSAGE_MAP_EX() if (!msg_is_ok) { @@ -584,6 +588,32 @@ void RenderFrameHostImpl::OnJavaScriptExecuteResponse( } } +void RenderFrameHostImpl::OnRunJavaScriptMessage( + const base::string16& message, + const base::string16& default_prompt, + const GURL& frame_url, + JavaScriptMessageType type, + IPC::Message* reply_msg) { + // While a JS message dialog is showing, tabs in the same process shouldn't + // process input events. + GetProcess()->SetIgnoreInputEvents(true); + render_view_host_->StopHangMonitorTimeout(); + delegate_->RunJavaScriptMessage(this, message, default_prompt, + frame_url, type, reply_msg); +} + +void RenderFrameHostImpl::OnRunBeforeUnloadConfirm( + const GURL& frame_url, + const base::string16& message, + bool is_reload, + IPC::Message* reply_msg) { + // While a JS before unload dialog is showing, tabs in the same process + // shouldn't process input events. + GetProcess()->SetIgnoreInputEvents(true); + render_view_host_->StopHangMonitorTimeout(); + delegate_->RunBeforeUnloadConfirm(this, message, is_reload, reply_msg); +} + void RenderFrameHostImpl::SetPendingShutdown(const base::Closure& on_swap_out) { render_view_host_->SetPendingShutdown(on_swap_out); } @@ -663,4 +693,40 @@ void RenderFrameHostImpl::ExtendSelectionAndDelete(size_t before, Send(new FrameMsg_ExtendSelectionAndDelete(routing_id_, before, after)); } +void RenderFrameHostImpl::JavaScriptDialogClosed( + IPC::Message* reply_msg, + bool success, + const base::string16& user_input, + bool dialog_was_suppressed) { + GetProcess()->SetIgnoreInputEvents(false); + bool is_waiting = render_view_host_->is_waiting_for_beforeunload_ack() || + render_view_host_->IsWaitingForUnloadACK(); + + // If we are executing as part of (before)unload event handling, we don't + // want to use the regular hung_renderer_delay_ms_ if the user has agreed to + // leave the current page. In this case, use the regular timeout value used + // during the (before)unload handling. + if (is_waiting) { + render_view_host_->StartHangMonitorTimeout(TimeDelta::FromMilliseconds( + success ? RenderViewHostImpl::kUnloadTimeoutMS + : render_view_host_->hung_renderer_delay_ms_)); + } + + FrameHostMsg_RunJavaScriptMessage::WriteReplyParams(reply_msg, + success, user_input); + Send(reply_msg); + + // If we are waiting for an unload or beforeunload ack and the user has + // suppressed messages, kill the tab immediately; a page that's spamming + // alerts in onbeforeunload is presumably malicious, so there's no point in + // continuing to run its script and dragging out the process. + // This must be done after sending the reply since RenderView can't close + // correctly while waiting for a response. + if (is_waiting && dialog_was_suppressed) + render_view_host_->delegate_->RendererUnresponsive( + render_view_host_, + render_view_host_->is_waiting_for_beforeunload_ack(), + render_view_host_->IsWaitingForUnloadACK()); +} + } // namespace content diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h index a6bfbc9..815afeb 100644 --- a/content/browser/frame_host/render_frame_host_impl.h +++ b/content/browser/frame_host/render_frame_host_impl.h @@ -14,6 +14,7 @@ #include "base/time/time.h" #include "content/common/content_export.h" #include "content/public/browser/render_frame_host.h" +#include "content/public/common/javascript_message_type.h" #include "content/public/common/page_transition_types.h" class GURL; @@ -146,6 +147,13 @@ class CONTENT_EXPORT RenderFrameHostImpl : public RenderFrameHost { // before and after the selection or caret. void ExtendSelectionAndDelete(size_t before, size_t after); + // Notifies the RenderFrame that the JavaScript message that was shown was + // closed by the user. + void JavaScriptDialogClosed(IPC::Message* reply_msg, + bool success, + const base::string16& user_input, + bool dialog_was_suppressed); + protected: friend class RenderFrameHostFactory; @@ -191,6 +199,15 @@ class CONTENT_EXPORT RenderFrameHostImpl : public RenderFrameHost { void OnSwapOutACK(); void OnContextMenu(const ContextMenuParams& params); void OnJavaScriptExecuteResponse(int id, const base::ListValue& result); + void OnRunJavaScriptMessage(const base::string16& message, + const base::string16& default_prompt, + const GURL& frame_url, + JavaScriptMessageType type, + IPC::Message* reply_msg); + void OnRunBeforeUnloadConfirm(const GURL& frame_url, + const base::string16& message, + bool is_reload, + IPC::Message* reply_msg); // Returns whether the given URL is allowed to commit in the current process. // This is a more conservative check than RenderProcessHost::FilterURL, since diff --git a/content/browser/frame_host/render_frame_host_manager_unittest.cc b/content/browser/frame_host/render_frame_host_manager_unittest.cc index 20b4737..d43c63f 100644 --- a/content/browser/frame_host/render_frame_host_manager_unittest.cc +++ b/content/browser/frame_host/render_frame_host_manager_unittest.cc @@ -371,7 +371,7 @@ TEST_F(RenderFrameHostManagerTest, FilterMessagesWhileSwappedOut) { rvh()->GetRoutingID(), 0, icons))); EXPECT_TRUE(observer.favicon_received()); } - // Create one more view in the same SiteInstance where dest_rvh2 + // Create one more view in the same SiteInstance where ntp_rvh // exists so that it doesn't get deleted on navigation to another // site. static_cast<SiteInstanceImpl*>(ntp_rvh->GetSiteInstance())-> @@ -426,23 +426,24 @@ TEST_F(RenderFrameHostManagerTest, FilterMessagesWhileSwappedOut) { MockRenderProcessHost* ntp_process_host = static_cast<MockRenderProcessHost*>(ntp_rvh->GetProcess()); ntp_process_host->sink().ClearMessages(); + RenderFrameHost* ntp_rfh = ntp_rvh->GetMainFrame(); const base::string16 msg = base::ASCIIToUTF16("Message"); bool result = false; base::string16 unused; - ViewHostMsg_RunBeforeUnloadConfirm before_unload_msg( - rvh()->GetRoutingID(), kChromeURL, msg, false, &result, &unused); + FrameHostMsg_RunBeforeUnloadConfirm before_unload_msg( + ntp_rfh->GetRoutingID(), kChromeURL, msg, false, &result, &unused); // Enable pumping for check in BrowserMessageFilter::CheckCanDispatchOnUI. before_unload_msg.EnableMessagePumping(); - EXPECT_TRUE(ntp_rvh->OnMessageReceived(before_unload_msg)); + EXPECT_TRUE(ntp_rfh->OnMessageReceived(before_unload_msg)); EXPECT_TRUE(ntp_process_host->sink().GetUniqueMessageMatching(IPC_REPLY_ID)); // Also test RunJavaScriptMessage. ntp_process_host->sink().ClearMessages(); - ViewHostMsg_RunJavaScriptMessage js_msg( - rvh()->GetRoutingID(), msg, msg, kChromeURL, + FrameHostMsg_RunJavaScriptMessage js_msg( + ntp_rfh->GetRoutingID(), msg, msg, kChromeURL, JAVASCRIPT_MESSAGE_TYPE_CONFIRM, &result, &unused); js_msg.EnableMessagePumping(); - EXPECT_TRUE(ntp_rvh->OnMessageReceived(js_msg)); + EXPECT_TRUE(ntp_rfh->OnMessageReceived(js_msg)); EXPECT_TRUE(ntp_process_host->sink().GetUniqueMessageMatching(IPC_REPLY_ID)); } diff --git a/content/browser/renderer_host/render_view_host_delegate.h b/content/browser/renderer_host/render_view_host_delegate.h index 0e2ab50..6bf3651 100644 --- a/content/browser/renderer_host/render_view_host_delegate.h +++ b/content/browser/renderer_host/render_view_host_delegate.h @@ -13,7 +13,6 @@ #include "base/process/kill.h" #include "base/strings/string16.h" #include "content/common/content_export.h" -#include "content/public/common/javascript_message_type.h" #include "content/public/common/media_stream_request.h" #include "content/public/common/page_transition_types.h" #include "net/base/load_states.h" @@ -167,20 +166,6 @@ class CONTENT_EXPORT RenderViewHostDelegate { RenderViewHost* rvh, const ViewMsg_PostMessage_Params& params) {} - // A javascript message, confirmation or prompt should be shown. - virtual void RunJavaScriptMessage(RenderViewHost* rvh, - const base::string16& message, - const base::string16& default_prompt, - const GURL& frame_url, - JavaScriptMessageType type, - IPC::Message* reply_msg, - bool* did_suppress_message) {} - - virtual void RunBeforeUnloadConfirm(RenderViewHost* rvh, - const base::string16& message, - bool is_reload, - IPC::Message* reply_msg) {} - // Return a dummy RendererPreferences object that will be used by the renderer // associated with the owning RenderViewHost. virtual RendererPreferences GetRendererPrefs( diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index e40e973..ec5d46c 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc @@ -210,7 +210,6 @@ RenderViewHostImpl::RenderViewHostImpl( run_modal_opener_id_(MSG_ROUTING_NONE), is_waiting_for_beforeunload_ack_(false), unload_ack_is_for_cross_site_transition_(false), - are_javascript_messages_suppressed_(false), sudden_termination_allowed_(false), render_view_termination_status_(base::TERMINATION_STATUS_STILL_RUNNING), virtual_keyboard_requested_(false), @@ -848,37 +847,6 @@ void RenderViewHostImpl::DesktopNotificationPostClick(int notification_id) { Send(new DesktopNotificationMsg_PostClick(GetRoutingID(), notification_id)); } -void RenderViewHostImpl::JavaScriptDialogClosed( - IPC::Message* reply_msg, - bool success, - const base::string16& user_input) { - GetProcess()->SetIgnoreInputEvents(false); - bool is_waiting = is_waiting_for_beforeunload_ack_ || IsWaitingForUnloadACK(); - - // If we are executing as part of (before)unload event handling, we don't - // want to use the regular hung_renderer_delay_ms_ if the user has agreed to - // leave the current page. In this case, use the regular timeout value used - // during the (before)unload handling. - if (is_waiting) { - StartHangMonitorTimeout(TimeDelta::FromMilliseconds( - success ? kUnloadTimeoutMS : hung_renderer_delay_ms_)); - } - - ViewHostMsg_RunJavaScriptMessage::WriteReplyParams(reply_msg, - success, user_input); - Send(reply_msg); - - // If we are waiting for an unload or beforeunload ack and the user has - // suppressed messages, kill the tab immediately; a page that's spamming - // alerts in onbeforeunload is presumably malicious, so there's no point in - // continuing to run its script and dragging out the process. - // This must be done after sending the reply since RenderView can't close - // correctly while waiting for a response. - if (is_waiting && are_javascript_messages_suppressed_) - delegate_->RendererUnresponsive( - this, is_waiting_for_beforeunload_ack_, IsWaitingForUnloadACK()); -} - void RenderViewHostImpl::DragSourceEndedAt( int client_x, int client_y, int screen_x, int screen_y, WebDragOperation operation) { @@ -1081,10 +1049,6 @@ bool RenderViewHostImpl::OnMessageReceived(const IPC::Message& msg) { IPC_MESSAGE_HANDLER(ViewHostMsg_RouteCloseEvent, OnRouteCloseEvent) IPC_MESSAGE_HANDLER(ViewHostMsg_RouteMessageEvent, OnRouteMessageEvent) - IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunJavaScriptMessage, - OnRunJavaScriptMessage) - IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunBeforeUnloadConfirm, - OnRunBeforeUnloadConfirm) IPC_MESSAGE_HANDLER(DragHostMsg_StartDragging, OnStartDragging) IPC_MESSAGE_HANDLER(DragHostMsg_UpdateDragCursor, OnUpdateDragCursor) IPC_MESSAGE_HANDLER(DragHostMsg_TargetDrop_ACK, OnTargetDropACK) @@ -1377,32 +1341,6 @@ void RenderViewHostImpl::OnRouteMessageEvent( delegate_->RouteMessageEvent(this, params); } -void RenderViewHostImpl::OnRunJavaScriptMessage( - const base::string16& message, - const base::string16& default_prompt, - const GURL& frame_url, - JavaScriptMessageType type, - IPC::Message* reply_msg) { - // While a JS message dialog is showing, tabs in the same process shouldn't - // process input events. - GetProcess()->SetIgnoreInputEvents(true); - StopHangMonitorTimeout(); - delegate_->RunJavaScriptMessage(this, message, default_prompt, frame_url, - type, reply_msg, - &are_javascript_messages_suppressed_); -} - -void RenderViewHostImpl::OnRunBeforeUnloadConfirm(const GURL& frame_url, - const base::string16& message, - bool is_reload, - IPC::Message* reply_msg) { - // While a JS before unload dialog is showing, tabs in the same process - // shouldn't process input events. - GetProcess()->SetIgnoreInputEvents(true); - StopHangMonitorTimeout(); - delegate_->RunBeforeUnloadConfirm(this, message, is_reload, reply_msg); -} - void RenderViewHostImpl::OnStartDragging( const DropData& drop_data, WebDragOperationsMask drag_operations_mask, diff --git a/content/browser/renderer_host/render_view_host_impl.h b/content/browser/renderer_host/render_view_host_impl.h index 7db9a2a..5579cd7 100644 --- a/content/browser/renderer_host/render_view_host_impl.h +++ b/content/browser/renderer_host/render_view_host_impl.h @@ -19,7 +19,6 @@ #include "content/common/drag_event_source_info.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/render_view_host.h" -#include "content/public/common/javascript_message_type.h" #include "content/public/common/window_container_type.h" #include "net/base/load_states.h" #include "third_party/WebKit/public/web/WebAXEnums.h" @@ -342,12 +341,6 @@ class CONTENT_EXPORT RenderViewHostImpl // and cleared when we hear the response or commit. void SetHasPendingCrossSiteRequest(bool has_pending_request); - // Notifies the RenderView that the JavaScript message that was shown was - // closed by the user. - void JavaScriptDialogClosed(IPC::Message* reply_msg, - bool success, - const base::string16& user_input); - // Tells the renderer view to focus the first (last if reverse is true) node. void SetInitialFocus(bool reverse); @@ -531,15 +524,6 @@ class CONTENT_EXPORT RenderViewHostImpl void OnPasteFromSelectionClipboard(); void OnRouteCloseEvent(); void OnRouteMessageEvent(const ViewMsg_PostMessage_Params& params); - void OnRunJavaScriptMessage(const base::string16& message, - const base::string16& default_prompt, - const GURL& frame_url, - JavaScriptMessageType type, - IPC::Message* reply_msg); - void OnRunBeforeUnloadConfirm(const GURL& frame_url, - const base::string16& message, - bool is_reload, - IPC::Message* reply_msg); void OnStartDragging(const DropData& drop_data, blink::WebDragOperationsMask operations_allowed, const SkBitmap& bitmap, @@ -660,8 +644,6 @@ class CONTENT_EXPORT RenderViewHostImpl // TODO(nasko): Move to RenderFrameHost, as this is per-frame state. bool unload_ack_is_for_cross_site_transition_; - bool are_javascript_messages_suppressed_; - // Accessibility callback for testing. base::Callback<void(ui::AXEvent)> accessibility_testing_callback_; diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 2090f55..35c7b9c 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc @@ -338,7 +338,8 @@ WebContentsImpl::WebContentsImpl( color_chooser_identifier_(0), render_view_message_source_(NULL), fullscreen_widget_routing_id_(MSG_ROUTING_NONE), - is_subframe_(false) { + is_subframe_(false), + last_dialog_suppressed_(false) { for (size_t i = 0; i < g_created_callbacks.Get().size(); i++) g_created_callbacks.Get().at(i).Run(this); frame_tree_.SetFrameRemoveListener( @@ -2999,6 +3000,82 @@ void WebContentsImpl::ShowContextMenu(RenderFrameHost* render_frame_host, render_view_host_delegate_view_->ShowContextMenu(render_frame_host, params); } +void WebContentsImpl::RunJavaScriptMessage( + RenderFrameHost* rfh, + const base::string16& message, + const base::string16& default_prompt, + const GURL& frame_url, + JavaScriptMessageType javascript_message_type, + IPC::Message* reply_msg) { + // Suppress JavaScript dialogs when requested. Also suppress messages when + // showing an interstitial as it's shown over the previous page and we don't + // want the hidden page's dialogs to interfere with the interstitial. + bool suppress_this_message = + static_cast<RenderViewHostImpl*>(rfh->GetRenderViewHost())-> + IsSwappedOut() || + ShowingInterstitialPage() || + !delegate_ || + delegate_->ShouldSuppressDialogs() || + !delegate_->GetJavaScriptDialogManager(); + + if (!suppress_this_message) { + std::string accept_lang = GetContentClient()->browser()-> + GetAcceptLangs(GetBrowserContext()); + dialog_manager_ = delegate_->GetJavaScriptDialogManager(); + dialog_manager_->RunJavaScriptDialog( + this, + frame_url.GetOrigin(), + accept_lang, + javascript_message_type, + message, + default_prompt, + base::Bind(&WebContentsImpl::OnDialogClosed, + base::Unretained(this), + rfh, + reply_msg, + false), + &suppress_this_message); + } + + if (suppress_this_message) { + // If we are suppressing messages, just reply as if the user immediately + // pressed "Cancel", passing true to |dialog_was_suppressed|. + OnDialogClosed(rfh, reply_msg, true, false, base::string16()); + } + + // OnDialogClosed (two lines up) may have caused deletion of this object (see + // http://crbug.com/288961 ). The only safe thing to do here is return. +} + +void WebContentsImpl::RunBeforeUnloadConfirm( + RenderFrameHost* rfh, + const base::string16& message, + bool is_reload, + IPC::Message* reply_msg) { + RenderFrameHostImpl* rfhi = static_cast<RenderFrameHostImpl*>(rfh); + RenderViewHostImpl* rvhi = + static_cast<RenderViewHostImpl*>(rfh->GetRenderViewHost()); + if (delegate_) + delegate_->WillRunBeforeUnloadConfirm(); + + bool suppress_this_message = + rvhi->rvh_state() != RenderViewHostImpl::STATE_DEFAULT || + !delegate_ || + delegate_->ShouldSuppressDialogs() || + !delegate_->GetJavaScriptDialogManager(); + if (suppress_this_message) { + rfhi->JavaScriptDialogClosed(reply_msg, true, base::string16(), true); + return; + } + + is_showing_before_unload_dialog_ = true; + dialog_manager_ = delegate_->GetJavaScriptDialogManager(); + dialog_manager_->RunBeforeUnloadDialog( + this, message, is_reload, + base::Bind(&WebContentsImpl::OnDialogClosed, base::Unretained(this), + rfh, reply_msg, false)); +} + WebContents* WebContentsImpl::GetAsWebContents() { return this; } @@ -3383,81 +3460,6 @@ void WebContentsImpl::RouteMessageEvent( Send(new ViewMsg_PostMessageEvent(GetRoutingID(), new_params)); } -void WebContentsImpl::RunJavaScriptMessage( - RenderViewHost* rvh, - const base::string16& message, - const base::string16& default_prompt, - const GURL& frame_url, - JavaScriptMessageType javascript_message_type, - IPC::Message* reply_msg, - bool* did_suppress_message) { - // Suppress JavaScript dialogs when requested. Also suppress messages when - // showing an interstitial as it's shown over the previous page and we don't - // want the hidden page's dialogs to interfere with the interstitial. - bool suppress_this_message = - static_cast<RenderViewHostImpl*>(rvh)->IsSwappedOut() || - ShowingInterstitialPage() || - !delegate_ || - delegate_->ShouldSuppressDialogs() || - !delegate_->GetJavaScriptDialogManager(); - - if (!suppress_this_message) { - std::string accept_lang = GetContentClient()->browser()-> - GetAcceptLangs(GetBrowserContext()); - dialog_manager_ = delegate_->GetJavaScriptDialogManager(); - dialog_manager_->RunJavaScriptDialog( - this, - frame_url.GetOrigin(), - accept_lang, - javascript_message_type, - message, - default_prompt, - base::Bind(&WebContentsImpl::OnDialogClosed, - base::Unretained(this), - rvh, - reply_msg), - &suppress_this_message); - } - - *did_suppress_message = suppress_this_message; - - if (suppress_this_message) { - // If we are suppressing messages, just reply as if the user immediately - // pressed "Cancel". - OnDialogClosed(rvh, reply_msg, false, base::string16()); - } - - // OnDialogClosed (two lines up) may have caused deletion of this object (see - // http://crbug.com/288961 ). The only safe thing to do here is return. -} - -void WebContentsImpl::RunBeforeUnloadConfirm(RenderViewHost* rvh, - const base::string16& message, - bool is_reload, - IPC::Message* reply_msg) { - RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(rvh); - if (delegate_) - delegate_->WillRunBeforeUnloadConfirm(); - - bool suppress_this_message = - rvhi->rvh_state() != RenderViewHostImpl::STATE_DEFAULT || - !delegate_ || - delegate_->ShouldSuppressDialogs() || - !delegate_->GetJavaScriptDialogManager(); - if (suppress_this_message) { - // The reply must be sent to the RVH that sent the request. - rvhi->JavaScriptDialogClosed(reply_msg, true, base::string16()); - return; - } - - is_showing_before_unload_dialog_ = true; - dialog_manager_ = delegate_->GetJavaScriptDialogManager(); - dialog_manager_->RunBeforeUnloadDialog( - this, message, is_reload, - base::Bind(&WebContentsImpl::OnDialogClosed, base::Unretained(this), rvh, - reply_msg)); -} - bool WebContentsImpl::AddMessageToConsole(int32 level, const base::string16& message, int32 line_no, @@ -3732,22 +3734,26 @@ bool WebContentsImpl::CreateRenderViewForInitialEmptyDocument() { } #endif -void WebContentsImpl::OnDialogClosed(RenderViewHost* rvh, +void WebContentsImpl::OnDialogClosed(RenderFrameHost* rfh, IPC::Message* reply_msg, + bool dialog_was_suppressed, bool success, const base::string16& user_input) { + last_dialog_suppressed_ = dialog_was_suppressed; + if (is_showing_before_unload_dialog_ && !success) { // If a beforeunload dialog is canceled, we need to stop the throbber from // spinning, since we forced it to start spinning in Navigate. - DidStopLoading(rvh->GetMainFrame()); + DidStopLoading(rfh); controller_.DiscardNonCommittedEntries(); FOR_EACH_OBSERVER(WebContentsObserver, observers_, BeforeUnloadDialogCancelled()); } + is_showing_before_unload_dialog_ = false; - static_cast<RenderViewHostImpl*>( - rvh)->JavaScriptDialogClosed(reply_msg, success, user_input); + static_cast<RenderFrameHostImpl*>(rfh)->JavaScriptDialogClosed( + reply_msg, success, user_input, dialog_was_suppressed); } void WebContentsImpl::SetEncoding(const std::string& encoding) { diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index e09fcb3..88188ce 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h @@ -328,6 +328,16 @@ class CONTENT_EXPORT WebContentsImpl virtual void WorkerCrashed(RenderFrameHost* render_frame_host) OVERRIDE; virtual void ShowContextMenu(RenderFrameHost* render_frame_host, const ContextMenuParams& params) OVERRIDE; + virtual void RunJavaScriptMessage(RenderFrameHost* rfh, + const base::string16& message, + const base::string16& default_prompt, + const GURL& frame_url, + JavaScriptMessageType type, + IPC::Message* reply_msg) OVERRIDE; + virtual void RunBeforeUnloadConfirm(RenderFrameHost* rfh, + const base::string16& message, + bool is_reload, + IPC::Message* reply_msg) OVERRIDE; virtual WebContents* GetAsWebContents() OVERRIDE; // RenderViewHostDelegate ---------------------------------------------------- @@ -369,17 +379,6 @@ class CONTENT_EXPORT WebContentsImpl virtual void RouteMessageEvent( RenderViewHost* rvh, const ViewMsg_PostMessage_Params& params) OVERRIDE; - virtual void RunJavaScriptMessage(RenderViewHost* rvh, - const base::string16& message, - const base::string16& default_prompt, - const GURL& frame_url, - JavaScriptMessageType type, - IPC::Message* reply_msg, - bool* did_suppress_message) OVERRIDE; - virtual void RunBeforeUnloadConfirm(RenderViewHost* rvh, - const base::string16& message, - bool is_reload, - IPC::Message* reply_msg) OVERRIDE; virtual bool AddMessageToConsole(int32 level, const base::string16& message, int32 line_no, @@ -664,9 +663,10 @@ class CONTENT_EXPORT WebContentsImpl // watching |web_contents|. No-op if there is no such observer. void RemoveDestructionObserver(WebContentsImpl* web_contents); - // Callback function when showing JS dialogs. - void OnDialogClosed(RenderViewHost* rvh, + // Callback function when showing JavaScript dialogs. + void OnDialogClosed(RenderFrameHost* rfh, IPC::Message* reply_msg, + bool dialog_was_suppressed, bool success, const base::string16& user_input); @@ -1070,6 +1070,9 @@ class CONTENT_EXPORT WebContentsImpl // different process from its parent page. bool is_subframe_; + // Whether the last JavaScript dialog shown was suppressed. Used for testing. + bool last_dialog_suppressed_; + DISALLOW_COPY_AND_ASSIGN(WebContentsImpl); }; diff --git a/content/browser/web_contents/web_contents_impl_unittest.cc b/content/browser/web_contents/web_contents_impl_unittest.cc index 051e011..9cc1ac2 100644 --- a/content/browser/web_contents/web_contents_impl_unittest.cc +++ b/content/browser/web_contents/web_contents_impl_unittest.cc @@ -2201,13 +2201,11 @@ TEST_F(WebContentsImplTest, NoJSMessageOnInterstitials) { // While the interstitial is showing, let's simulate the hidden page // attempting to show a JS message. IPC::Message* dummy_message = new IPC::Message; - bool did_suppress_message = false; - contents()->RunJavaScriptMessage(contents()->GetRenderViewHost(), + contents()->RunJavaScriptMessage(contents()->GetMainFrame(), base::ASCIIToUTF16("This is an informative message"), base::ASCIIToUTF16("OK"), - kGURL, JAVASCRIPT_MESSAGE_TYPE_ALERT, dummy_message, - &did_suppress_message); - EXPECT_TRUE(did_suppress_message); + kGURL, JAVASCRIPT_MESSAGE_TYPE_ALERT, dummy_message); + EXPECT_TRUE(contents()->last_dialog_suppressed_); } // Makes sure that if the source passed to CopyStateFromAndPrune has an diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h index fe603b0..4206311 100644 --- a/content/common/frame_messages.h +++ b/content/common/frame_messages.h @@ -13,6 +13,7 @@ #include "content/public/common/common_param_traits.h" #include "content/public/common/context_menu_params.h" #include "content/public/common/frame_navigate_params.h" +#include "content/public/common/javascript_message_type.h" #include "content/public/common/page_state.h" #include "ipc/ipc_message_macros.h" #include "url/gurl.h" @@ -22,11 +23,13 @@ #define IPC_MESSAGE_START FrameMsgStart +IPC_ENUM_TRAITS_MIN_MAX_VALUE(content::JavaScriptMessageType, + content::JAVASCRIPT_MESSAGE_TYPE_ALERT, + content::JAVASCRIPT_MESSAGE_TYPE_PROMPT) IPC_ENUM_TRAITS_MAX_VALUE(FrameMsg_Navigate_Type::Value, FrameMsg_Navigate_Type::NAVIGATE_TYPE_LAST) IPC_ENUM_TRAITS_MAX_VALUE(blink::WebContextMenuData::MediaType, blink::WebContextMenuData::MediaTypeLast) - IPC_ENUM_TRAITS_MAX_VALUE(ui::MenuSourceType, ui::MENU_SOURCE_TYPE_LAST) IPC_STRUCT_TRAITS_BEGIN(content::ContextMenuParams) @@ -520,3 +523,22 @@ IPC_MESSAGE_ROUTED2(FrameHostMsg_InitializeChildFrame, IPC_MESSAGE_ROUTED2(FrameHostMsg_JavaScriptExecuteResponse, int /* id */, base::ListValue /* result */) + +// A request to run a JavaScript dialog. +IPC_SYNC_MESSAGE_ROUTED4_2(FrameHostMsg_RunJavaScriptMessage, + base::string16 /* in - alert message */, + base::string16 /* in - default prompt */, + GURL /* in - originating page URL */, + content::JavaScriptMessageType /* in - type */, + bool /* out - success */, + base::string16 /* out - user_input field */) + +// Displays a dialog to confirm that the user wants to navigate away from the +// page. Replies true if yes, and false otherwise. The reply string is ignored, +// but is included so that we can use OnJavaScriptMessageBoxClosed. +IPC_SYNC_MESSAGE_ROUTED3_2(FrameHostMsg_RunBeforeUnloadConfirm, + GURL, /* in - originating frame URL */ + base::string16 /* in - alert message */, + bool /* in - is a reload */, + bool /* out - success */, + base::string16 /* out - This is ignored.*/) diff --git a/content/common/view_messages.h b/content/common/view_messages.h index ac1d665..fe713a6 100644 --- a/content/common/view_messages.h +++ b/content/common/view_messages.h @@ -23,7 +23,6 @@ #include "content/public/common/common_param_traits.h" #include "content/public/common/favicon_url.h" #include "content/public/common/file_chooser_params.h" -#include "content/public/common/javascript_message_type.h" #include "content/public/common/menu_item.h" #include "content/public/common/page_state.h" #include "content/public/common/page_zoom.h" @@ -77,7 +76,6 @@ IPC_ENUM_TRAITS(blink::WebTextDirection) IPC_ENUM_TRAITS(WindowContainerType) IPC_ENUM_TRAITS(content::FaviconURL::IconType) IPC_ENUM_TRAITS(content::FileChooserParams::Mode) -IPC_ENUM_TRAITS(content::JavaScriptMessageType) IPC_ENUM_TRAITS(content::MenuItem::Type) IPC_ENUM_TRAITS(content::NavigationGesture) IPC_ENUM_TRAITS(content::PageZoom) @@ -1361,14 +1359,6 @@ IPC_MESSAGE_ROUTED0(ViewHostMsg_RouteCloseEvent) IPC_MESSAGE_ROUTED1(ViewHostMsg_RouteMessageEvent, ViewMsg_PostMessage_Params) -IPC_SYNC_MESSAGE_ROUTED4_2(ViewHostMsg_RunJavaScriptMessage, - base::string16 /* in - alert message */, - base::string16 /* in - default prompt */, - GURL /* in - originating page URL */, - content::JavaScriptMessageType /* in - type */, - bool /* out - success */, - base::string16 /* out - user_input field */) - // Notifies that the preferred size of the content changed. IPC_MESSAGE_ROUTED1(ViewHostMsg_DidContentsPreferredSizeChange, gfx::Size /* pref_size */) @@ -1566,16 +1556,6 @@ IPC_MESSAGE_ROUTED1(ViewHostMsg_TextInputStateChanged, // Required for cancelling an ongoing input method composition. IPC_MESSAGE_ROUTED0(ViewHostMsg_ImeCancelComposition) -// Displays a box to confirm that the user wants to navigate away from the -// page. Replies true if yes, false otherwise, the reply string is ignored, -// but is included so that we can use OnJavaScriptMessageBoxClosed. -IPC_SYNC_MESSAGE_ROUTED3_2(ViewHostMsg_RunBeforeUnloadConfirm, - GURL, /* in - originating frame URL */ - base::string16 /* in - alert message */, - bool /* in - is a reload */, - bool /* out - success */, - base::string16 /* out - This is ignored.*/) - // Sent when the renderer changes the zoom level for a particular url, so the // browser can update its records. If remember is true, then url is used to // update the zoom level for all pages in that site. Otherwise, the render diff --git a/content/public/renderer/render_view.h b/content/public/renderer/render_view.h index 2fe09a5..cf16901 100644 --- a/content/public/renderer/render_view.h +++ b/content/public/renderer/render_view.h @@ -105,11 +105,6 @@ class CONTENT_EXPORT RenderView : public IPC::Sender { // Returns the current visibility of the WebView. virtual blink::WebPageVisibilityState GetVisibilityState() const = 0; - // Displays a modal alert dialog containing the given message. Returns - // once the user dismisses the dialog. - virtual void RunModalAlertDialog(blink::WebLocalFrame* frame, - const blink::WebString& message) = 0; - // Used by plugins that load data in this RenderView to update the loading // notifications. virtual void DidStartLoading() = 0; diff --git a/content/public/test/mock_render_thread.cc b/content/public/test/mock_render_thread.cc index a6ee887..ba66d33 100644 --- a/content/public/test/mock_render_thread.cc +++ b/content/public/test/mock_render_thread.cc @@ -33,17 +33,6 @@ MockRenderThread::~MockRenderThread() { } } -void MockRenderThread::VerifyRunJavaScriptMessageSend( - const base::string16& expected_alert_message) { - const IPC::Message* alert_msg = - sink_.GetUniqueMessageMatching(ViewHostMsg_RunJavaScriptMessage::ID); - ASSERT_TRUE(alert_msg); - PickleIterator iter = IPC::SyncMessage::GetDataIterator(alert_msg); - ViewHostMsg_RunJavaScriptMessage::SendParam alert_param; - ASSERT_TRUE(IPC::ReadParam(alert_msg, &iter, &alert_param)); - EXPECT_EQ(expected_alert_message, alert_param.a); -} - // Called by the Widget. Used to send messages to the browser. // We short-circuit the mechanism and handle the messages right here on this // class. diff --git a/content/public/test/mock_render_thread.h b/content/public/test/mock_render_thread.h index 95a944e..3625158 100644 --- a/content/public/test/mock_render_thread.h +++ b/content/public/test/mock_render_thread.h @@ -33,11 +33,6 @@ class MockRenderThread : public RenderThread { // Provides access to the messages that have been received by this thread. IPC::TestSink& sink() { return sink_; } - // Helpers for embedders to know when content IPC messages are received, since - // they don't have access to content IPC files. - void VerifyRunJavaScriptMessageSend( - const base::string16& expected_alert_message); - // RenderThread implementation: virtual bool Send(IPC::Message* msg) OVERRIDE; virtual base::MessageLoop* GetMessageLoop() OVERRIDE; diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 357ddbf..a0ddeef 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc @@ -1091,6 +1091,28 @@ bool RenderFrameImpl::ShouldUpdateSelectionTextFromContextMenuParams( return trimmed_params_text != trimmed_selection_text; } +bool RenderFrameImpl::RunJavaScriptMessage(JavaScriptMessageType type, + const base::string16& message, + const base::string16& default_value, + const GURL& frame_url, + base::string16* result) { + // Don't allow further dialogs if we are waiting to swap out, since the + // PageGroupLoadDeferrer in our stack prevents it. + if (render_view()->suppress_dialogs_until_swap_out_) + return false; + + bool success = false; + base::string16 result_temp; + if (!result) + result = &result_temp; + + render_view()->SendAndRunNestedMessageLoop( + new FrameHostMsg_RunJavaScriptMessage( + routing_id_, message, default_value, frame_url, type, &success, + result)); + return success; +} + void RenderFrameImpl::DidCommitCompositorFrame() { if (compositing_helper_) compositing_helper_->DidCommitCompositorFrame(); @@ -2016,6 +2038,62 @@ void RenderFrameImpl::didChangeSelection(bool is_empty_selection) { #endif } +void RenderFrameImpl::runModalAlertDialog(const blink::WebString& message) { + RunJavaScriptMessage(JAVASCRIPT_MESSAGE_TYPE_ALERT, + message, + base::string16(), + frame_->document().url(), + NULL); +} + +bool RenderFrameImpl::runModalConfirmDialog(const blink::WebString& message) { + return RunJavaScriptMessage(JAVASCRIPT_MESSAGE_TYPE_CONFIRM, + message, + base::string16(), + frame_->document().url(), + NULL); +} + +bool RenderFrameImpl::runModalPromptDialog( + const blink::WebString& message, + const blink::WebString& default_value, + blink::WebString* actual_value) { + base::string16 result; + bool ok = RunJavaScriptMessage(JAVASCRIPT_MESSAGE_TYPE_PROMPT, + message, + default_value, + frame_->document().url(), + &result); + if (ok) + actual_value->assign(result); + return ok; +} + +bool RenderFrameImpl::runModalBeforeUnloadDialog( + bool is_reload, + const blink::WebString& message) { + // If we are swapping out, we have already run the beforeunload handler. + // TODO(creis): Fix OnSwapOut to clear the frame without running beforeunload + // at all, to avoid running it twice. + if (render_view()->is_swapped_out_) + return true; + + // Don't allow further dialogs if we are waiting to swap out, since the + // PageGroupLoadDeferrer in our stack prevents it. + if (render_view()->suppress_dialogs_until_swap_out_) + return false; + + bool success = false; + // This is an ignored return value, but is included so we can accept the same + // response as RunJavaScriptMessage. + base::string16 ignored_result; + render_view()->SendAndRunNestedMessageLoop( + new FrameHostMsg_RunBeforeUnloadConfirm( + routing_id_, frame_->document().url(), message, is_reload, + &success, &ignored_result)); + return success; +} + void RenderFrameImpl::showContextMenu(const blink::WebContextMenuData& data) { ContextMenuParams params = ContextMenuParamsBuilder::Build(data); params.source_type = GetRenderWidget()->context_menu_source_type(); diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index 35b24f2..0fcabde 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h @@ -14,6 +14,7 @@ #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/process/process_handle.h" +#include "content/public/common/javascript_message_type.h" #include "content/public/common/referrer.h" #include "content/public/renderer/render_frame.h" #include "content/renderer/renderer_webcookiejar_impl.h" @@ -282,6 +283,13 @@ class CONTENT_EXPORT RenderFrameImpl bool is_new_navigation); virtual void didUpdateCurrentHistoryItem(blink::WebLocalFrame* frame); virtual void didChangeSelection(bool is_empty_selection); + virtual void runModalAlertDialog(const blink::WebString& message); + virtual bool runModalConfirmDialog(const blink::WebString& message); + virtual bool runModalPromptDialog(const blink::WebString& message, + const blink::WebString& default_value, + blink::WebString* actual_value); + virtual bool runModalBeforeUnloadDialog(bool is_reload, + const blink::WebString& message); virtual void showContextMenu(const blink::WebContextMenuData& data); virtual void clearContextMenu(); virtual void willRequestAfterPreconnect(blink::WebLocalFrame* frame, @@ -445,6 +453,12 @@ class CONTENT_EXPORT RenderFrameImpl const gfx::Range& selection_range, const ContextMenuParams& params); + bool RunJavaScriptMessage(JavaScriptMessageType type, + const base::string16& message, + const base::string16& default_value, + const GURL& frame_url, + base::string16* result); + // Stores the WebLocalFrame we are associated with. blink::WebLocalFrame* frame_; diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 0d4c45e..de3df4b 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -1402,26 +1402,6 @@ void RenderViewImpl::LoadNavigationErrorPage( replace); } -bool RenderViewImpl::RunJavaScriptMessage(JavaScriptMessageType type, - const base::string16& message, - const base::string16& default_value, - const GURL& frame_url, - base::string16* result) { - // Don't allow further dialogs if we are waiting to swap out, since the - // PageGroupLoadDeferrer in our stack prevents it. - if (suppress_dialogs_until_swap_out_) - return false; - - bool success = false; - base::string16 result_temp; - if (!result) - result = &result_temp; - - SendAndRunNestedMessageLoop(new ViewHostMsg_RunJavaScriptMessage( - routing_id_, message, default_value, frame_url, type, &success, result)); - return success; -} - bool RenderViewImpl::SendAndRunNestedMessageLoop(IPC::SyncMessage* message) { // Before WebKit asks us to show an alert (etc.), it takes care of doing the // equivalent of WebView::willEnterModalLoop. In the case of showModalDialog @@ -1737,35 +1717,20 @@ bool RenderViewImpl::runFileChooser( void RenderViewImpl::runModalAlertDialog(WebLocalFrame* frame, const WebString& message) { - RunJavaScriptMessage(JAVASCRIPT_MESSAGE_TYPE_ALERT, - message, - base::string16(), - frame->document().url(), - NULL); + RenderFrameImpl::FromWebFrame(frame)->runModalAlertDialog(message); } bool RenderViewImpl::runModalConfirmDialog(WebLocalFrame* frame, const WebString& message) { - return RunJavaScriptMessage(JAVASCRIPT_MESSAGE_TYPE_CONFIRM, - message, - base::string16(), - frame->document().url(), - NULL); + return RenderFrameImpl::FromWebFrame(frame)->runModalConfirmDialog(message); } bool RenderViewImpl::runModalPromptDialog(WebLocalFrame* frame, const WebString& message, const WebString& default_value, WebString* actual_value) { - base::string16 result; - bool ok = RunJavaScriptMessage(JAVASCRIPT_MESSAGE_TYPE_PROMPT, - message, - default_value, - frame->document().url(), - &result); - if (ok) - actual_value->assign(result); - return ok; + return RenderFrameImpl::FromWebFrame(frame)-> + runModalPromptDialog(message, default_value, actual_value); } bool RenderViewImpl::runModalBeforeUnloadDialog(WebLocalFrame* frame, @@ -1774,31 +1739,34 @@ bool RenderViewImpl::runModalBeforeUnloadDialog(WebLocalFrame* frame, WebDataSource* ds = frame->provisionalDataSource(); if (ds) is_reload = (ds->navigationType() == blink::WebNavigationTypeReload); - return runModalBeforeUnloadDialog(frame, is_reload, message); + return RenderFrameImpl::FromWebFrame(frame)-> + runModalBeforeUnloadDialog(is_reload, message); } -bool RenderViewImpl::runModalBeforeUnloadDialog(WebLocalFrame* frame, - bool is_reload, - const WebString& message) { - // If we are swapping out, we have already run the beforeunload handler. - // TODO(creis): Fix OnSwapOut to clear the frame without running beforeunload - // at all, to avoid running it twice. - if (is_swapped_out_) - return true; +void RenderViewImpl::runModalAlertDialog(const WebString& message) { + /* bogus version of the function to avoid errors */ + NOTIMPLEMENTED(); +} - // Don't allow further dialogs if we are waiting to swap out, since the - // PageGroupLoadDeferrer in our stack prevents it. - if (suppress_dialogs_until_swap_out_) - return false; +bool RenderViewImpl::runModalConfirmDialog(const WebString& message) { + /* bogus version of the function to avoid errors */ + NOTIMPLEMENTED(); + return false; +} + +bool RenderViewImpl::runModalPromptDialog(const WebString& message, + const WebString& default_value, + WebString* actual_value) { + /* bogus version of the function to avoid errors */ + NOTIMPLEMENTED(); + return false; +} - bool success = false; - // This is an ignored return value, but is included so we can accept the same - // response as RunJavaScriptMessage. - base::string16 ignored_result; - SendAndRunNestedMessageLoop(new ViewHostMsg_RunBeforeUnloadConfirm( - routing_id_, frame->document().url(), message, is_reload, - &success, &ignored_result)); - return success; +bool RenderViewImpl::runModalBeforeUnloadDialog(bool is_reload, + const WebString& message) { + /* bogus version of the function to avoid errors */ + NOTIMPLEMENTED(); + return false; } void RenderViewImpl::showValidationMessage( @@ -2982,11 +2950,6 @@ blink::WebPageVisibilityState RenderViewImpl::GetVisibilityState() const { return visibilityState(); } -void RenderViewImpl::RunModalAlertDialog(blink::WebLocalFrame* frame, - const blink::WebString& message) { - return runModalAlertDialog(frame, message); -} - void RenderViewImpl::DidStartLoading() { main_render_frame_->didStartLoading(true); } diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h index 1527bca..76af0a8 100644 --- a/content/renderer/render_view_impl.h +++ b/content/renderer/render_view_impl.h @@ -28,7 +28,6 @@ #include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" #include "content/common/navigation_gesture.h" #include "content/common/view_message_enums.h" -#include "content/public/common/javascript_message_type.h" #include "content/public/common/page_zoom.h" #include "content/public/common/referrer.h" #include "content/public/common/renderer_preferences.h" @@ -450,8 +449,16 @@ class CONTENT_EXPORT RenderViewImpl const blink::WebString& default_value, blink::WebString* actual_value); virtual bool runModalBeforeUnloadDialog(blink::WebLocalFrame* frame, - bool is_reload, const blink::WebString& message); + // -- begin stub implementations -- + virtual void runModalAlertDialog(const blink::WebString& message); + virtual bool runModalConfirmDialog(const blink::WebString& message); + virtual bool runModalPromptDialog(const blink::WebString& message, + const blink::WebString& default_value, + blink::WebString* actual_value); + virtual bool runModalBeforeUnloadDialog(bool is_reload, + const blink::WebString& message); + // -- end stub implementations -- virtual void showValidationMessage(const blink::WebRect& anchor_in_root_view, const blink::WebString& main_text, const blink::WebString& sub_text, @@ -459,10 +466,6 @@ class CONTENT_EXPORT RenderViewImpl virtual void hideValidationMessage() OVERRIDE; virtual void moveValidationMessage( const blink::WebRect& anchor_in_root_view) OVERRIDE; - - // DEPRECATED - virtual bool runModalBeforeUnloadDialog(blink::WebLocalFrame* frame, - const blink::WebString& message); virtual void setStatusText(const blink::WebString& text); virtual void setMouseOverURL(const blink::WebURL& url); virtual void setKeyboardFocusURL(const blink::WebURL& url); @@ -636,8 +639,6 @@ class CONTENT_EXPORT RenderViewImpl virtual bool GetContentStateImmediately() const OVERRIDE; virtual float GetFilteredTimePerFrame() const OVERRIDE; virtual blink::WebPageVisibilityState GetVisibilityState() const OVERRIDE; - virtual void RunModalAlertDialog(blink::WebLocalFrame* frame, - const blink::WebString& message) OVERRIDE; virtual void DidStartLoading() OVERRIDE; virtual void DidStopLoading() OVERRIDE; virtual void Repaint(const gfx::Size& size) OVERRIDE; @@ -825,12 +826,6 @@ class CONTENT_EXPORT RenderViewImpl void UpdateEncoding(blink::WebFrame* frame, const std::string& encoding_name); - bool RunJavaScriptMessage(JavaScriptMessageType type, - const base::string16& message, - const base::string16& default_value, - const GURL& frame_url, - base::string16* result); - // Sends a message and runs a nested message loop. bool SendAndRunNestedMessageLoop(IPC::SyncMessage* message); |