| 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 bddc8de7b9cea9a3582fc124fc4cb921a73d0f2d..fd5f957087fba1d6200649027e6773af80937b48 100644
|
| --- a/content/browser/web_contents/web_contents_impl.cc
|
| +++ b/content/browser/web_contents/web_contents_impl.cc
|
| @@ -3080,7 +3080,8 @@ void WebContentsImpl::RunJavaScriptMessage(
|
| default_prompt,
|
| base::Bind(&WebContentsImpl::OnDialogClosed,
|
| base::Unretained(this),
|
| - rfh,
|
| + rfh->GetProcess()->GetID(),
|
| + rfh->GetRoutingID(),
|
| reply_msg,
|
| false),
|
| &suppress_this_message);
|
| @@ -3089,7 +3090,8 @@ void WebContentsImpl::RunJavaScriptMessage(
|
| 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(rfh->GetProcess()->GetID(), rfh->GetRoutingID(), reply_msg,
|
| + true, false, base::string16());
|
| }
|
|
|
| // OnDialogClosed (two lines up) may have caused deletion of this object (see
|
| @@ -3122,7 +3124,8 @@ void WebContentsImpl::RunBeforeUnloadConfirm(
|
| dialog_manager_->RunBeforeUnloadDialog(
|
| this, message, is_reload,
|
| base::Bind(&WebContentsImpl::OnDialogClosed, base::Unretained(this),
|
| - rfh, reply_msg, false));
|
| + rfh->GetProcess()->GetID(), rfh->GetRoutingID(), reply_msg,
|
| + false));
|
| }
|
|
|
| WebContents* WebContentsImpl::GetAsWebContents() {
|
| @@ -3796,17 +3799,21 @@ bool WebContentsImpl::CreateRenderViewForInitialEmptyDocument() {
|
| }
|
| #endif
|
|
|
| -void WebContentsImpl::OnDialogClosed(RenderFrameHost* rfh,
|
| +void WebContentsImpl::OnDialogClosed(int render_process_id,
|
| + int render_frame_id,
|
| IPC::Message* reply_msg,
|
| bool dialog_was_suppressed,
|
| bool success,
|
| const base::string16& user_input) {
|
| + RenderFrameHostImpl* rfh = RenderFrameHostImpl::FromID(render_process_id,
|
| + render_frame_id);
|
| 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(rfh);
|
| + if (rfh)
|
| + DidStopLoading(rfh);
|
| controller_.DiscardNonCommittedEntries();
|
|
|
| FOR_EACH_OBSERVER(WebContentsObserver, observers_,
|
| @@ -3814,8 +3821,13 @@ void WebContentsImpl::OnDialogClosed(RenderFrameHost* rfh,
|
| }
|
|
|
| is_showing_before_unload_dialog_ = false;
|
| - static_cast<RenderFrameHostImpl*>(rfh)->JavaScriptDialogClosed(
|
| - reply_msg, success, user_input, dialog_was_suppressed);
|
| + if (rfh) {
|
| + rfh->JavaScriptDialogClosed(reply_msg, success, user_input,
|
| + dialog_was_suppressed);
|
| + } else {
|
| + // Don't leak the sync IPC reply if the RFH or process is gone.
|
| + delete reply_msg;
|
| + }
|
| }
|
|
|
| void WebContentsImpl::SetEncoding(const std::string& encoding) {
|
|
|