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

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: clean Created 6 years, 9 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..a095604ae464f0ee665ea305dce0df27622fb97e 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -2867,6 +2867,84 @@ 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,
+ 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<RenderFrameHostImpl*>(rfh)->is_swapped_out() ||
+ 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),
+ &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(rfh, 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(
+ 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) {
+ // The reply must be sent to the RFH that sent the request.
+ rfhi->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), rfh,
+ reply_msg));
+}
+
WebContents* WebContentsImpl::GetAsWebContents() {
return this;
}
@@ -3251,7 +3329,7 @@ void WebContentsImpl::RouteMessageEvent(
Send(new ViewMsg_PostMessageEvent(GetRoutingID(), new_params));
}
-void WebContentsImpl::RunJavaScriptMessage(
+void WebContentsImpl::RunJavaScriptMessageOBSOLETE(
RenderViewHost* rvh,
const base::string16& message,
const base::string16& default_prompt,
@@ -3280,7 +3358,7 @@ void WebContentsImpl::RunJavaScriptMessage(
javascript_message_type,
message,
default_prompt,
- base::Bind(&WebContentsImpl::OnDialogClosed,
+ base::Bind(&WebContentsImpl::OnDialogClosedOBSOLETE,
base::Unretained(this),
rvh,
reply_msg),
@@ -3292,17 +3370,18 @@ void WebContentsImpl::RunJavaScriptMessage(
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());
+ OnDialogClosedOBSOLETE(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) {
+void WebContentsImpl::RunBeforeUnloadConfirmOBSOLETE(
+ RenderViewHost* rvh,
+ const base::string16& message,
+ bool is_reload,
+ IPC::Message* reply_msg) {
RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>(rvh);
if (delegate_)
delegate_->WillRunBeforeUnloadConfirm();
@@ -3322,7 +3401,9 @@ void WebContentsImpl::RunBeforeUnloadConfirm(RenderViewHost* rvh,
dialog_manager_ = delegate_->GetJavaScriptDialogManager();
dialog_manager_->RunBeforeUnloadDialog(
this, message, is_reload,
- base::Bind(&WebContentsImpl::OnDialogClosed, base::Unretained(this), rvh,
+ base::Bind(&WebContentsImpl::OnDialogClosedOBSOLETE,
+ base::Unretained(this),
+ rvh,
reply_msg));
}
@@ -3600,22 +3681,40 @@ bool WebContentsImpl::CreateRenderViewForInitialEmptyDocument() {
}
#endif
-void WebContentsImpl::OnDialogClosed(RenderViewHost* rvh,
+void WebContentsImpl::OnDialogClosedOBSOLETE(RenderViewHost* rvh,
+ IPC::Message* reply_msg,
+ bool success,
+ const base::string16& user_input) {
+ 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());
+ controller_.DiscardNonCommittedEntries();
+
+ FOR_EACH_OBSERVER(WebContentsObserver, observers_,
+ BeforeUnloadDialogCancelled());
+ }
+ is_showing_before_unload_dialog_ = false;
+ static_cast<RenderViewHostImpl*>(rvh)->
+ JavaScriptDialogClosed(reply_msg, success, user_input);
+}
+
+void WebContentsImpl::OnDialogClosed(RenderFrameHost* rfh,
IPC::Message* reply_msg,
bool success,
const base::string16& user_input) {
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);
}
void WebContentsImpl::SetEncoding(const std::string& encoding) {

Powered by Google App Engine
This is Rietveld 408576698