910e62b5创建于 1月15日历史提交
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/devtools/devtools_connection_dialog.h"

#include "base/test/test_future.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "ui/events/base_event_utils.h"
#include "ui/events/event.h"
#include "ui/views/bubble/bubble_dialog_model_host.h"
#include "ui/views/controls/button/md_text_button.h"
#include "ui/views/test/button_test_api.h"
#include "ui/views/test/widget_test.h"
#include "ui/views/widget/widget.h"
#include "ui/views/window/dialog_delegate.h"

class DevToolsConnectionDialogBrowserTest : public InProcessBrowserTest {};

IN_PROC_BROWSER_TEST_F(DevToolsConnectionDialogBrowserTest, NullBrowser) {
  base::test::TestFuture<
      content::DevToolsManagerDelegate::AcceptConnectionResult>
      future;
  DevToolsConnectionDialog::Show(nullptr, future.GetCallback());
  EXPECT_EQ(future.Get(),
            content::DevToolsManagerDelegate::AcceptConnectionResult::kDeny);
}

IN_PROC_BROWSER_TEST_F(DevToolsConnectionDialogBrowserTest, Accept) {
  base::test::TestFuture<
      content::DevToolsManagerDelegate::AcceptConnectionResult>
      future;
  auto* dialog =
      DevToolsConnectionDialog::Show(browser(), future.GetCallback());
  views::Widget* widget = dialog->GetDialogWidgetForTesting().get();
  ASSERT_TRUE(widget);

  views::DialogDelegate* dialog_delegate =
      widget->widget_delegate()->AsDialogDelegate();
  ASSERT_TRUE(dialog_delegate);

  dialog_delegate->AcceptDialog();

  EXPECT_EQ(future.Get(),
            content::DevToolsManagerDelegate::AcceptConnectionResult::kAllow);
}

IN_PROC_BROWSER_TEST_F(DevToolsConnectionDialogBrowserTest, Cancel) {
  base::test::TestFuture<
      content::DevToolsManagerDelegate::AcceptConnectionResult>
      future;
  auto* dialog =
      DevToolsConnectionDialog::Show(browser(), future.GetCallback());
  views::Widget* widget = dialog->GetDialogWidgetForTesting().get();
  ASSERT_TRUE(widget);

  views::DialogDelegate* dialog_delegate =
      widget->widget_delegate()->AsDialogDelegate();
  ASSERT_TRUE(dialog_delegate);

  dialog_delegate->CancelDialog();

  EXPECT_EQ(future.Get(),
            content::DevToolsManagerDelegate::AcceptConnectionResult::kDeny);
}

IN_PROC_BROWSER_TEST_F(DevToolsConnectionDialogBrowserTest, Close) {
  base::test::TestFuture<
      content::DevToolsManagerDelegate::AcceptConnectionResult>
      future;
  auto* dialog =
      DevToolsConnectionDialog::Show(browser(), future.GetCallback());
  views::Widget* widget = dialog->GetDialogWidgetForTesting().get();
  ASSERT_TRUE(widget);

  widget->Close();

  EXPECT_EQ(future.Get(),
            content::DevToolsManagerDelegate::AcceptConnectionResult::kDeny);
}

IN_PROC_BROWSER_TEST_F(DevToolsConnectionDialogBrowserTest, Disable) {
  base::test::TestFuture<
      content::DevToolsManagerDelegate::AcceptConnectionResult>
      future;

  auto* dialog =
      DevToolsConnectionDialog::Show(browser(), future.GetCallback());
  auto* widget = dialog->GetDialogWidgetForTesting().get();
  ASSERT_TRUE(widget);

  views::BubbleDialogModelHost* dialog_model_dialog =
      static_cast<views::BubbleDialogModelHost*>(widget->widget_delegate());
  ASSERT_TRUE(dialog_model_dialog);

  content::WebContentsAddedObserver new_tab_observer;

  views::test::ButtonTestApi(
      static_cast<views::MdTextButton*>(dialog_model_dialog->GetExtraView()))
      .NotifyClick(ui::MouseEvent(ui::EventType::kMousePressed, gfx::Point(),
                                  gfx::Point(), ui::EventTimeForNow(),
                                  ui::EF_LEFT_MOUSE_BUTTON,
                                  ui::EF_LEFT_MOUSE_BUTTON));

  EXPECT_EQ(future.Get(),
            content::DevToolsManagerDelegate::AcceptConnectionResult::kDeny);

  content::WebContents* new_web_contents = new_tab_observer.GetWebContents();
  content::TestNavigationObserver(new_web_contents).Wait();
  EXPECT_EQ(new_web_contents->GetVisibleURL(),
            "chrome://inspect/#remote-debugging");
}