Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1871)

Unified Diff: content/browser/web_contents/web_contents_impl.cc

Issue 226503002: Move modal dialogs from WebViewClient to WebFrameClient, part 1/3. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: last nits Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/web_contents/web_contents_impl.cc
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index a19fcd9921d563c334e361a83b4689aad1dc658e..bb84a1e60962e48d0e175f4e674e18a80877727f 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(
@@ -2867,6 +2868,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;
}
@@ -3251,81 +3328,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,
@@ -3600,22 +3602,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) {
« no previous file with comments | « content/browser/web_contents/web_contents_impl.h ('k') | content/browser/web_contents/web_contents_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698