blob: f183e34aea52efce5411430874d15bf4bbcddbd3 [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 "chrome/test/base/chrome_test_utils.h"
#include "chrome/test/base/platform_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 "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
namespace {
class ChromeContentBrowserClientPlatformBrowserTest
: public PlatformBrowserTest {
public:
void SetUpOnMainThread() override {
PlatformBrowserTest::SetUpOnMainThread();
host_resolver()->AddRule("*", "127.0.0.1");
ASSERT_TRUE(embedded_test_server()->Start());
}
content::WebContents* web_contents() {
return chrome_test_utils::GetActiveWebContents(this);
}
};
// window.open() with the 'background' window feature from ordinary web content
// must not be allowed to open a new window, even with transient user
// activation.
IN_PROC_BROWSER_TEST_F(ChromeContentBrowserClientPlatformBrowserTest,
BackgroundFeatureFromOrdinaryWebContentIsBlocked) {
ASSERT_TRUE(content::NavigateToURL(
web_contents(), embedded_test_server()->GetURL("/title1.html")));
const size_t initial_web_contents_count = content::GetAllWebContents().size();
// 1. Attempt to open a window with the 'background' feature.
// Using default EvalJs options executes with user_gesture = true, which is
// critical: without a user gesture, the standard popup blocker would reject
// the call before reaching ChromeContentBrowserClient::CanCreateWindow().
// Even with user activation, ordinary web content lacks extension background
// permissions and must be refused when requesting 'background' window
// features.
EXPECT_EQ(true,
content::EvalJs(
web_contents(),
"window.open('/title2.html', '', 'background') === null"));
// Verify browser-side state: no new WebContents or tab was created.
EXPECT_EQ(initial_web_contents_count, content::GetAllWebContents().size());
// 2. Control assertion: verify that an ordinary popup without 'background'
// succeeds with transient user activation, proving that the failure above
// was specifically due to the 'background' window feature and not because
// popups are globally disabled in the test environment.
EXPECT_EQ(true,
content::EvalJs(web_contents(),
"window.open('/title2.html', '', '') !== null"));
// Verify that exactly one new WebContents was created by the control popup.
EXPECT_EQ(initial_web_contents_count + 1,
content::GetAllWebContents().size());
}
} // namespace