summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoravi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-08 22:14:49 +0000
committeravi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-08 22:14:49 +0000
commit87de04b08fb5e31c49f1d5db78b3eddb5ece97b2 (patch)
tree2347e7a405f15f2dffa9414893e4ac5bf372a2ec
parente983101fbc683ac9b53b5075ab18c4a08c48ccb4 (diff)
downloadchromium_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
-rw-r--r--content/browser/frame_host/render_frame_host_delegate.h14
-rw-r--r--content/browser/frame_host/render_frame_host_impl.cc66
-rw-r--r--content/browser/frame_host/render_frame_host_impl.h17
-rw-r--r--content/browser/frame_host/render_frame_host_manager_unittest.cc15
-rw-r--r--content/browser/renderer_host/render_view_host_delegate.h15
-rw-r--r--content/browser/renderer_host/render_view_host_impl.cc62
-rw-r--r--content/browser/renderer_host/render_view_host_impl.h18
-rw-r--r--content/browser/web_contents/web_contents_impl.cc166
-rw-r--r--content/browser/web_contents/web_contents_impl.h29
-rw-r--r--content/browser/web_contents/web_contents_impl_unittest.cc8
-rw-r--r--content/common/frame_messages.h24
-rw-r--r--content/common/view_messages.h20
-rw-r--r--content/public/renderer/render_view.h5
-rw-r--r--content/public/test/mock_render_thread.cc11
-rw-r--r--content/public/test/mock_render_thread.h5
-rw-r--r--content/renderer/render_frame_impl.cc78
-rw-r--r--content/renderer/render_frame_impl.h14
-rw-r--r--content/renderer/render_view_impl.cc93
-rw-r--r--content/renderer/render_view_impl.h23
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);