Commit f4332f96 authored by Evan Stade's avatar Evan Stade Committed by Commit Bot

Speculative fix for app modal dialog crash

Cancel JS dialogs when a WebContents's delegate is set to null, as the
dialog can't show without a WebContentsDelegate.

Bug: 1060986
Change-Id: I5272faa23d5461fc8251887d9bc02f03c54e37e3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2283388Reviewed-by: default avatarAvi Drissman <avi@chromium.org>
Commit-Queue: Evan Stade <estade@chromium.org>
Cr-Commit-Position: refs/heads/master@{#785954}
parent c9e213f4
...@@ -1102,6 +1102,11 @@ void WebContentsImpl::SetDelegate(WebContentsDelegate* delegate) { ...@@ -1102,6 +1102,11 @@ void WebContentsImpl::SetDelegate(WebContentsDelegate* delegate) {
return; return;
if (delegate_) if (delegate_)
delegate_->Detach(this); delegate_->Detach(this);
CancelActiveAndPendingDialogs();
// Since |dialog_manager_| was provided by |delegate_|, reset it.
dialog_manager_ = nullptr;
delegate_ = delegate; delegate_ = delegate;
if (delegate_) { if (delegate_) {
delegate_->Attach(this); delegate_->Attach(this);
...@@ -1179,9 +1184,8 @@ RenderViewHostImpl* WebContentsImpl::GetRenderViewHost() { ...@@ -1179,9 +1184,8 @@ RenderViewHostImpl* WebContentsImpl::GetRenderViewHost() {
} }
void WebContentsImpl::CancelActiveAndPendingDialogs() { void WebContentsImpl::CancelActiveAndPendingDialogs() {
if (dialog_manager_) { if (dialog_manager_)
dialog_manager_->CancelDialogs(this, /*reset_state=*/false); dialog_manager_->CancelDialogs(this, /*reset_state=*/false);
}
if (browser_plugin_embedder_) if (browser_plugin_embedder_)
browser_plugin_embedder_->CancelGuestDialogs(); browser_plugin_embedder_->CancelGuestDialogs();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment