blob: b93c00a2e04b3c11ff504f808788249a474af099 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/public/browser/webui_config_map.h"
#include <string_view>
#include "content/public/browser/web_ui_controller.h"
#include "content/public/browser/webui_config.h"
#include "content/public/test/scoped_web_ui_controller_factory_registration.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace content {
namespace {
constexpr const char kChromeFoo[] = "chrome://foo";
constexpr const char kChromeBar[] = "chrome://bar";
constexpr const char kChromeUntrustedFoo[] = "chrome-untrusted://foo";
constexpr const char kChromeUntrustedBar[] = "chrome-untrusted://bar";
// A valid BrowserContext is not needed for these tests.
BrowserContext* kBrowserContext = nullptr;
class TestConfig : public WebUIConfig {
public:
TestConfig(std::string_view scheme, std::string_view host)
: WebUIConfig(scheme, host) {}
~TestConfig() override = default;
std::unique_ptr<WebUIController> CreateWebUIController(
WebUI* web_ui,
const GURL& url) override {
// Unused in these tests.
return nullptr;
}
};
} // namespace
TEST(WebUIConfigTest, AddAndRemoveChromeUrl) {
auto& map = WebUIConfigMap::GetInstance();
size_t initial_size = map.GetWebUIConfigList(nullptr).size();
auto chrome_config = std::make_unique<TestConfig>("chrome", "foo");
auto* chrome_config_ptr = chrome_config.get();
map.AddWebUIConfig(std::move(chrome_config));
EXPECT_EQ(initial_size + 1, map.GetWebUIConfigList(nullptr).size());
EXPECT_EQ(chrome_config_ptr,
map.GetConfig(kBrowserContext, GURL(kChromeFoo)));
EXPECT_EQ(nullptr, map.GetConfig(kBrowserContext, GURL(kChromeBar)));
EXPECT_EQ(nullptr, map.GetConfig(kBrowserContext, GURL(kChromeUntrustedFoo)));
EXPECT_EQ(nullptr, map.GetConfig(kBrowserContext, GURL(kChromeUntrustedBar)));
EXPECT_EQ(nullptr, map.RemoveConfig(GURL(kChromeBar)));
EXPECT_EQ(nullptr, map.RemoveConfig(GURL(kChromeUntrustedFoo)));
EXPECT_EQ(nullptr, map.RemoveConfig(GURL(kChromeUntrustedBar)));
auto removed_config = map.RemoveConfig(GURL(kChromeFoo));
EXPECT_EQ(removed_config.get(), chrome_config_ptr);
EXPECT_EQ(initial_size, map.GetWebUIConfigList(nullptr).size());
}
TEST(WebUIConfigTest, AddAndRemoteChromeUntrustedUrl) {
auto& map = WebUIConfigMap::GetInstance();
size_t initial_size = map.GetWebUIConfigList(nullptr).size();
auto untrusted_config =
std::make_unique<TestConfig>("chrome-untrusted", "foo");
auto* untrusted_config_ptr = untrusted_config.get();
map.AddUntrustedWebUIConfig(std::move(untrusted_config));
EXPECT_EQ(initial_size + 1, map.GetWebUIConfigList(nullptr).size());
EXPECT_EQ(untrusted_config_ptr,
map.GetConfig(kBrowserContext, GURL(kChromeUntrustedFoo)));
EXPECT_EQ(nullptr, map.GetConfig(kBrowserContext, GURL(kChromeUntrustedBar)));
EXPECT_EQ(nullptr, map.GetConfig(kBrowserContext, GURL(kChromeFoo)));
EXPECT_EQ(nullptr, map.GetConfig(kBrowserContext, GURL(kChromeBar)));
EXPECT_EQ(nullptr, map.RemoveConfig(GURL(kChromeUntrustedBar)));
EXPECT_EQ(nullptr, map.RemoveConfig(GURL(kChromeFoo)));
EXPECT_EQ(nullptr, map.RemoveConfig(GURL(kChromeBar)));
auto removed_config = map.RemoveConfig(GURL(kChromeUntrustedFoo));
EXPECT_EQ(removed_config.get(), untrusted_config_ptr);
EXPECT_EQ(initial_size, map.GetWebUIConfigList(nullptr).size());
}
class WebUiConfigDeathTest : public testing::Test,
public ::testing::WithParamInterface<const char*> {
public:
WebUiConfigDeathTest() = default;
WebUiConfigDeathTest(const WebUiConfigDeathTest&) = delete;
WebUiConfigDeathTest& operator=(const WebUiConfigDeathTest&) = delete;
~WebUiConfigDeathTest() override = default;
};
// Regression test for https://crbug.com/1464456.
TEST_P(WebUiConfigDeathTest, GetAndRemoveNonChromeUrls) {
auto& map = WebUIConfigMap::GetInstance();
ScopedWebUIConfigRegistration chrome_config(
std::make_unique<TestConfig>("chrome", "foo"));
ScopedWebUIConfigRegistration untrusted_config(
std::make_unique<TestConfig>("chrome-untrusted", "foo"));
const GURL url(GetParam());
EXPECT_EQ(nullptr, map.GetConfig(kBrowserContext, url));
EXPECT_DEATH_IF_SUPPORTED(map.RemoveConfig(url), "");
}
INSTANTIATE_TEST_SUITE_P(
/* no prefix */,
WebUiConfigDeathTest,
::testing::Values(
// filesystem: URLs
"filesystem:chrome://foo/external/file.txt",
"filesystem:chrome-untrusted://foo/external/file.txt",
// blob: URLS
"blob:chrome://foo/GUID",
"blob:chrome-untrusted://foo/GUID",
// HTTP/HTTPS URLS
"http://foo.com",
"https://foo.com"));
} // namespace content