[PWA] Register install dialogs as secure to prevent extension popups

This CL registers the different PWA install dialogs to be treated as
"secure" dialogs from the extension system so that extension dialogs do
not occlude the PWA install dialog.

Tested using the PoC files linked in the bug.

Fixed: 406023321
Change-Id: I21817060ebfdb6fcc06698a5acf78e10e657e676
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6395316
Reviewed-by: Daniel Murphy <dmurph@chromium.org>
Commit-Queue: Dibyajyoti Pal <dibyapal@chromium.org>
Reviewed-by: May Siem <msiem@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1438474}
diff --git a/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.cc b/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.cc
index f1b1b438..5fbea47 100644
--- a/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.cc
@@ -484,7 +484,7 @@
     delegate_weak_ptr->CloseDialogAsIgnored();
     return;
   }
-  delegate_weak_ptr->StartObservingWidgetForChanges(detailed_dialog_widget);
+  delegate_weak_ptr->OnWidgetShownStartTracking(detailed_dialog_widget);
 
   base::RecordAction(base::UserMetricsAction("WebAppDetailedInstallShown"));
 
diff --git a/chrome/browser/ui/views/web_apps/web_app_diy_install_dialog.cc b/chrome/browser/ui/views/web_apps/web_app_diy_install_dialog.cc
index f791b25c..a4a9e00 100644
--- a/chrome/browser/ui/views/web_apps/web_app_diy_install_dialog.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_diy_install_dialog.cc
@@ -165,7 +165,7 @@
     delegate_weak_ptr->CloseDialogAsIgnored();
     return;
   }
-  delegate_weak_ptr->StartObservingWidgetForChanges(diy_dialog_widget);
+  delegate_weak_ptr->OnWidgetShownStartTracking(diy_dialog_widget);
 
   base::RecordAction(base::UserMetricsAction("WebAppDiyInstallShown"));
   if (g_auto_accept_diy_dialog_for_testing) {
diff --git a/chrome/browser/ui/views/web_apps/web_app_install_dialog_delegate.cc b/chrome/browser/ui/views/web_apps/web_app_install_dialog_delegate.cc
index 414b625e..52c735b6 100644
--- a/chrome/browser/ui/views/web_apps/web_app_install_dialog_delegate.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_install_dialog_delegate.cc
@@ -15,6 +15,7 @@
 #include "chrome/browser/picture_in_picture/picture_in_picture_window_manager.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/page_action/page_action_icon_type.h"
+#include "chrome/browser/ui/views/extensions/security_dialog_tracker.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/frame/toolbar_button_provider.h"
 #include "chrome/browser/ui/views/page_action/page_action_icon_view.h"
@@ -128,10 +129,12 @@
   }
 }
 
-void WebAppInstallDialogDelegate::StartObservingWidgetForChanges(
+void WebAppInstallDialogDelegate::OnWidgetShownStartTracking(
     views::Widget* install_dialog_widget) {
   occlusion_observation_.Observe(install_dialog_widget);
   widget_observation_.Observe(install_dialog_widget);
+  extensions::SecurityDialogTracker::GetInstance()->AddSecurityDialog(
+      install_dialog_widget);
 }
 
 void WebAppInstallDialogDelegate::OnAccept() {
diff --git a/chrome/browser/ui/views/web_apps/web_app_install_dialog_delegate.h b/chrome/browser/ui/views/web_apps/web_app_install_dialog_delegate.h
index 67ad43a..459d47e 100644
--- a/chrome/browser/ui/views/web_apps/web_app_install_dialog_delegate.h
+++ b/chrome/browser/ui/views/web_apps/web_app_install_dialog_delegate.h
@@ -96,9 +96,12 @@
 
   ~WebAppInstallDialogDelegate() override;
 
-  // Starts observing the install dialog's widget for picture in picture
-  // occlusion or size changes if any.
-  void StartObservingWidgetForChanges(views::Widget* install_dialog_widget);
+  // Once the install dialog is shown, start tracking the widget for:
+  // 1. Observing it to prevent picture in picture occlusion.
+  // 2. Observing it for size changes so that it can be closed if needed.
+  // 3. Tracking it as a security dialog so that extension popups do not appear
+  // over it.
+  void OnWidgetShownStartTracking(views::Widget* install_dialog_widget);
 
   void OnAccept();
   void OnCancel();
diff --git a/chrome/browser/ui/views/web_apps/web_app_simple_install_dialog.cc b/chrome/browser/ui/views/web_apps/web_app_simple_install_dialog.cc
index 79b009e..62ac8de 100644
--- a/chrome/browser/ui/views/web_apps/web_app_simple_install_dialog.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_simple_install_dialog.cc
@@ -140,7 +140,7 @@
     delegate_weak_ptr->CloseDialogAsIgnored();
     return;
   }
-  delegate_weak_ptr->StartObservingWidgetForChanges(simple_dialog_widget);
+  delegate_weak_ptr->OnWidgetShownStartTracking(simple_dialog_widget);
 
   base::RecordAction(base::UserMetricsAction("WebAppInstallShown"));
   if (g_auto_accept_pwa_for_testing) {