[go: nahoru, domu]

[Merge to 6312] Fix crash in LoginHandlerViews.

The destructor of WebContents can trigger
WebContentsObserver::DidFinishNavigation. This in turn can trigger the
LoginTabHelper process for showing a Loginhandler. At this point, the
WebContentsModalDialogManager has already been destroyed so the http
auth dialog can no longer be shown.

(cherry picked from commit 6ce85a09d6a6435735bd774fba7ff508e2fddce1)

Change-Id: I5577a1d2cbeae034ad2217f1de546f459eb4885f
Bug: 328388128, 328462789
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5355654
Reviewed-by: Peter Boström <pbos@chromium.org>
Commit-Queue: Erik Chen <erikchen@chromium.org>
Cr-Original-Commit-Position: refs/heads/main@{#1270490}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5362262
Cr-Commit-Position: refs/branch-heads/6312@{#534}
Cr-Branched-From: 6711dcdae48edaf98cbc6964f90fac85b7d9986e-refs/heads/main@{#1262506}
diff --git a/chrome/browser/ui/views/login_handler_views.cc b/chrome/browser/ui/views/login_handler_views.cc
index 77d96175..10d03cc 100644
--- a/chrome/browser/ui/views/login_handler_views.cc
+++ b/chrome/browser/ui/views/login_handler_views.cc
@@ -14,6 +14,7 @@
 #include "components/constrained_window/constrained_window_views.h"
 #include "components/password_manager/core/browser/password_manager.h"
 #include "components/strings/grit/components_strings.h"
+#include "components/web_modal/web_contents_modal_dialog_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/web_contents.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -52,6 +53,14 @@
     DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
     DCHECK(!dialog_);
 
+    // A WebContentsModalDialogManager is necessary to show the Dialog. A
+    // manager may not be available during the shutdown process of the
+    // WebContents, which can trigger DidFinishNavigation events.
+    // See https://crbug.com/328462789.
+    if (!web_modal::WebContentsModalDialogManager::FromWebContents(
+            constrained_window::GetTopLevelWebContents(web_contents()))) {
+      return false;
+    }
     dialog_ = new Dialog(this, web_contents(), authority, explanation,
                          login_model_data);
     return true;