blob: 6272231ab73b14c445d1e8f60580969edf15823a [file]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/command_line.h"
#include "chrome/browser/devtools/chrome_devtools_manager_delegate.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "components/infobars/content/content_infobar_manager.h"
#include "components/infobars/core/infobar.h"
#include "content/public/common/content_switches.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/test_navigation_observer.h"
#include "url/gurl.h"
class DevToolsRemoteServerInfobarBrowserTest : public InProcessBrowserTest {
protected:
DevToolsRemoteServerInfobarBrowserTest() {
set_exit_when_last_browser_closes(false);
}
void SetUpCommandLine(base::CommandLine* command_line) override {
InProcessBrowserTest::SetUpCommandLine(command_line);
command_line->AppendSwitchASCII(switches::kRemoteDebuggingPort, "0");
}
infobars::ContentInfoBarManager* GetInfoBarManager(Browser* browser) {
return infobars::ContentInfoBarManager::FromWebContents(
browser->tab_strip_model()->GetActiveWebContents());
}
};
IN_PROC_BROWSER_TEST_F(DevToolsRemoteServerInfobarBrowserTest,
NoCrashWhenAllBrowsersClosedBeforeDisconnect) {
ChromeDevToolsManagerDelegate* delegate =
ChromeDevToolsManagerDelegate::GetInstance();
ASSERT_TRUE(delegate);
delegate->SetActiveWebSocketConnections(1);
CloseBrowserSynchronously(browser());
SetBrowser(nullptr);
delegate->SetActiveWebSocketConnections(0);
}
IN_PROC_BROWSER_TEST_F(DevToolsRemoteServerInfobarBrowserTest,
AcceptAfterBrowserClosedUsesActiveBrowser) {
ChromeDevToolsManagerDelegate* delegate =
ChromeDevToolsManagerDelegate::GetInstance();
ASSERT_TRUE(delegate);
delegate->SetActiveWebSocketConnections(1);
Browser* second_browser = CreateBrowser(browser()->profile());
ASSERT_TRUE(second_browser);
CloseBrowserSynchronously(browser());
SetBrowser(second_browser);
infobars::ContentInfoBarManager* manager = GetInfoBarManager(second_browser);
ASSERT_EQ(1u, manager->infobars().size());
content::TestNavigationObserver navigation_observer(
GURL("chrome://inspect#remote-debugging"));
navigation_observer.StartWatchingNewWebContents();
auto* confirm =
manager->infobars()[0]->delegate()->AsConfirmInfoBarDelegate();
ASSERT_TRUE(confirm);
EXPECT_TRUE(confirm->Accept());
navigation_observer.Wait();
EXPECT_EQ(2, second_browser->tab_strip_model()->count());
EXPECT_EQ(GURL("chrome://inspect#remote-debugging"),
second_browser->tab_strip_model()
->GetActiveWebContents()
->GetVisibleURL());
}