| // Copyright 2017 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/ui/extensions/settings_api_bubble_helpers.h" |
| |
| #include <memory> |
| |
| #include "base/functional/bind.h" |
| #include "base/values.h" |
| #include "chrome/browser/extensions/extension_service_test_base.h" |
| #include "chrome/browser/extensions/extension_web_ui_override_registrar.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "components/crx_file/id_util.h" |
| #include "extensions/browser/extension_registrar.h" |
| #include "extensions/common/extension.h" |
| #include "extensions/common/extension_builder.h" |
| |
| namespace extensions { |
| |
| namespace { |
| |
| std::unique_ptr<KeyedService> BuildOverrideRegistrar( |
| content::BrowserContext* context) { |
| return std::make_unique<ExtensionWebUIOverrideRegistrar>(context); |
| } |
| |
| scoped_refptr<const Extension> GetNtpExtension(const std::string& name) { |
| return ExtensionBuilder() |
| .SetManifest(base::Value::Dict() |
| .Set("name", name) |
| .Set("version", "1.0") |
| .Set("manifest_version", 2) |
| .Set("chrome_url_overrides", |
| base::Value::Dict().Set("newtab", "newtab.html"))) |
| .SetID(crx_file::id_util::GenerateId(name)) |
| .Build(); |
| } |
| |
| } // namespace |
| |
| using SettingsApiBubbleHelpersUnitTest = ExtensionServiceTestBase; |
| |
| TEST_F(SettingsApiBubbleHelpersUnitTest, TestAcknowledgeExistingExtensions) { |
| base::AutoReset<bool> ack_existing = |
| SetAcknowledgeExistingNtpExtensionsForTesting(true); |
| |
| InitializeEmptyExtensionService(); |
| ExtensionWebUIOverrideRegistrar::GetFactoryInstance()->SetTestingFactory( |
| profile(), base::BindRepeating(&BuildOverrideRegistrar)); |
| // We need to trigger the instantiation of the WebUIOverrideRegistrar for |
| // it to be constructed, since by default it's not constructed in tests. |
| ExtensionWebUIOverrideRegistrar::GetFactoryInstance()->Get(profile()); |
| |
| // Create an extension overriding the NTP. |
| scoped_refptr<const Extension> first = GetNtpExtension("first"); |
| registrar()->AddExtension(first); |
| |
| auto is_acknowledged = [this](const ExtensionId& id) { |
| bool is_acked = false; |
| return ExtensionPrefs::Get(profile())->ReadPrefAsBoolean( |
| id, kNtpOverridingExtensionAcknowledged, &is_acked) && |
| is_acked; |
| }; |
| // By default, the extension should not be acknowledged. |
| EXPECT_FALSE(is_acknowledged(first->id())); |
| |
| // Acknowledge existing extensions. Now, `first` should be acknowledged. |
| AcknowledgePreExistingNtpExtensions(profile()); |
| EXPECT_TRUE(is_acknowledged(first->id())); |
| |
| // Install a second NTP-overriding extension. The new extension should not be |
| // acknowledged. |
| scoped_refptr<const Extension> second = GetNtpExtension("second"); |
| registrar()->AddExtension(second); |
| EXPECT_FALSE(is_acknowledged(second->id())); |
| |
| // Try acknowledging existing extensions. Since we already did this once for |
| // this profile, this should have no effect, and we should still consider the |
| // second extension unacknowledged. |
| AcknowledgePreExistingNtpExtensions(profile()); |
| EXPECT_FALSE(is_acknowledged(second->id())); |
| |
| // But the first should still be acknowledged. |
| EXPECT_TRUE(is_acknowledged(first->id())); |
| } |
| |
| } // namespace extensions |