blob: d6eb602f8c7ac5a906003adfac86cfe4c4cf1066 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/extensions/settings_overridden_params_providers.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_service_test_base.h"
#include "chrome/browser/extensions/extension_web_ui.h"
#include "chrome/browser/extensions/extension_web_ui_override_registrar.h"
#include "chrome/browser/search_engines/template_url_service_factory.h"
#include "chrome/common/webui_url_constants.h"
#include "chrome/test/base/search_test_utils.h"
#include "components/search_engines/template_url_service.h"
#include "extensions/common/extension_builder.h"
#include "extensions/common/value_builder.h"
class SettingsOverriddenParamsProvidersUnitTest
: public extensions::ExtensionServiceTestBase {
public:
void SetUp() override {
extensions::ExtensionServiceTestBase::SetUp();
InitializeEmptyExtensionService();
// The NtpOverriddenDialogController rellies on ExtensionWebUI; ensure one
// exists.
extensions::ExtensionWebUIOverrideRegistrar::GetFactoryInstance()
->SetTestingFactoryAndUse(
profile(),
base::BindRepeating([](content::BrowserContext* context)
-> std::unique_ptr<KeyedService> {
return std::make_unique<
extensions::ExtensionWebUIOverrideRegistrar>(context);
}));
auto* template_url_service = static_cast<TemplateURLService*>(
TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse(
profile(),
base::BindRepeating(&TemplateURLServiceFactory::BuildInstanceFor)));
search_test_utils::WaitForTemplateURLServiceToLoad(template_url_service);
}
// Adds a new extension that overrides the NTP.
const extensions::Extension* AddExtensionControllingNewTab(
const char* name = "ntp override") {
std::unique_ptr<base::Value> chrome_url_overrides =
extensions::DictionaryBuilder().Set("newtab", "newtab.html").Build();
scoped_refptr<const extensions::Extension> extension =
extensions::ExtensionBuilder(name)
.SetLocation(extensions::mojom::ManifestLocation::kInternal)
.SetManifestKey("chrome_url_overrides",
std::move(chrome_url_overrides))
.Build();
service()->AddExtension(extension.get());
EXPECT_EQ(extension, ExtensionWebUI::GetExtensionControllingURL(
GURL(chrome::kChromeUINewTabURL), profile()));
return extension.get();
}
};
TEST_F(SettingsOverriddenParamsProvidersUnitTest,
GetExtensionControllingNewTab) {
// With no extensions installed, there should be no controlling extension.
EXPECT_EQ(base::nullopt,
settings_overridden_params::GetNtpOverriddenParams(profile()));
// Install an extension, but not one that overrides the NTP. There should
// still be no controlling extension.
scoped_refptr<const extensions::Extension> regular_extension =
extensions::ExtensionBuilder("regular").Build();
service()->AddExtension(regular_extension.get());
EXPECT_EQ(base::nullopt,
settings_overridden_params::GetNtpOverriddenParams(profile()));
// Finally, install an extension that overrides the NTP. It should be the
// controlling extension.
const extensions::Extension* ntp_extension = AddExtensionControllingNewTab();
base::Optional<ExtensionSettingsOverriddenDialog::Params> params =
settings_overridden_params::GetNtpOverriddenParams(profile());
ASSERT_TRUE(params);
EXPECT_EQ(ntp_extension->id(), params->controlling_extension_id);
// In this case, disabling the extension would go back to the default NTP, so
// a specific message should show.
EXPECT_EQ("Change back to Google?", base::UTF16ToUTF8(params->dialog_title));
}
TEST_F(SettingsOverriddenParamsProvidersUnitTest,
DialogStringsWhenMultipleNtpOverrides_MultipleExtensions) {
const extensions::Extension* extension1 =
AddExtensionControllingNewTab("uno");
const extensions::Extension* extension2 =
AddExtensionControllingNewTab("dos");
EXPECT_NE(extension1->id(), extension2->id());
// When there are multiple extensions that could override the NTP, we should
// show a generic dialog (rather than prompting to go back to the default
// NTP), because the other extension would just take over.
base::Optional<ExtensionSettingsOverriddenDialog::Params> params =
settings_overridden_params::GetNtpOverriddenParams(profile());
ASSERT_TRUE(params);
EXPECT_EQ(extension2->id(), params->controlling_extension_id);
EXPECT_EQ("Did you mean to change this page?",
base::UTF16ToUTF8(params->dialog_title));
}