[Extensions] Move NTP overriding prefs to settings_api_bubble_helpers
The NTP overridden bubble UI is deprecated (and has been replaced by a
dialog-based approach). However, the preferences related to the UI are
currently encapsulated in the bubble code. We deliberately use the same
preferences so that users who previously acknowledged NTP-overriding
extensions with the bubble UI are not re-notified.
Move the relevant preferences out of the NTP bubble code and into the
more general settings_api_bubble_helpers code. This is the entry point
for both the bubbles and the UI code, and was the only (non-testing)
call site for the preference code.
This CL moves two preference related bits: the first is the preference
to acknowledge a given extension has overridden the NTP. The second is
a preference for whether a global acknowledgement of pre-existing
extensions has been triggered (this is used when expanding the UI to
new platforms). Move each of these to the settings_api_bubble_helpers
code.
Additionally, move the ntp_overridden_bubble_delegate_unittest code to
settings_api_bubble_helpers_unittest. Since the only unittest here was
pertaining to the acknowledgement preferences, we can easily tweak the
test to exercise the same conceptual case for the code in
settings_api_bubble_helpers.
This paves the way to remove NtpOverriddenBubbleDelegate in its
entirety.
Bug: 1186126
Change-Id: Id4c34011c7875b0f8f7414385c19984ecdbab810
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2744647
Commit-Queue: Devlin <[email protected]>
Reviewed-by: Gabriel Charette <[email protected]>
Reviewed-by: David Bertoni <[email protected]>
Cr-Commit-Position: refs/heads/master@{#864031}
diff --git a/chrome/browser/extensions/ntp_overridden_bubble_delegate.cc b/chrome/browser/extensions/ntp_overridden_bubble_delegate.cc
index 3ef616cc..bf645662 100644
--- a/chrome/browser/extensions/ntp_overridden_bubble_delegate.cc
+++ b/chrome/browser/extensions/ntp_overridden_bubble_delegate.cc
@@ -12,30 +12,15 @@
#include "chrome/browser/extensions/extension_web_ui.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/extensions/settings_api_bubble_helpers.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/generated_resources.h"
-#include "components/prefs/pref_registry.h"
-#include "components/prefs/pref_registry_simple.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h"
#include "ui/base/l10n/l10n_util.h"
namespace {
-// Whether existing NTP extensions have been automatically acknowledged.
-const char kDidAcknowledgeExistingNtpExtensions[] =
- "ack_existing_ntp_extensions";
-
-// Whether to acknowledge existing extensions overriding the NTP for the active
-// profile. Active on MacOS to rollout the NTP bubble without prompting for
-// previously-installed extensions.
-bool g_acknowledge_existing_extensions =
-#if defined(OS_MAC)
- true;
-#else
- false;
-#endif
-
base::LazyInstance<std::set<std::pair<Profile*, std::string>>>::Leaky
g_ntp_overridden_shown = LAZY_INSTANCE_INITIALIZER;
@@ -43,47 +28,14 @@
namespace extensions {
-const char NtpOverriddenBubbleDelegate::kNtpBubbleAcknowledged[] =
- "ack_ntp_bubble";
-
NtpOverriddenBubbleDelegate::NtpOverriddenBubbleDelegate(Profile* profile)
: extensions::ExtensionMessageBubbleController::Delegate(profile),
profile_(profile) {
- set_acknowledged_flag_pref_name(kNtpBubbleAcknowledged);
+ set_acknowledged_flag_pref_name(kNtpOverridingExtensionAcknowledged);
}
NtpOverriddenBubbleDelegate::~NtpOverriddenBubbleDelegate() {}
-// static
-void NtpOverriddenBubbleDelegate::RegisterPrefs(PrefRegistrySimple* registry) {
- registry->RegisterBooleanPref(kDidAcknowledgeExistingNtpExtensions, false,
- PrefRegistry::NO_REGISTRATION_FLAGS);
-}
-
-// static
-void NtpOverriddenBubbleDelegate::MaybeAcknowledgeExistingNtpExtensions(
- Profile* profile) {
- if (!g_acknowledge_existing_extensions)
- return;
-
- ExtensionRegistry* registry = ExtensionRegistry::Get(profile);
- PrefService* profile_prefs = profile->GetPrefs();
- // Only acknowledge existing extensions once per profile.
- if (profile_prefs->GetBoolean(kDidAcknowledgeExistingNtpExtensions))
- return;
-
- profile_prefs->SetBoolean(kDidAcknowledgeExistingNtpExtensions, true);
- ExtensionPrefs* prefs = ExtensionPrefs::Get(profile);
- for (const auto& extension : registry->enabled_extensions()) {
- const URLOverrides::URLOverrideMap& overrides =
- URLOverrides::GetChromeURLOverrides(extension.get());
- if (overrides.find(chrome::kChromeUINewTabHost) != overrides.end()) {
- prefs->UpdateExtensionPref(extension->id(), kNtpBubbleAcknowledged,
- std::make_unique<base::Value>(true));
- }
- }
-}
-
bool NtpOverriddenBubbleDelegate::ShouldIncludeExtension(
const extensions::Extension* extension) {
if (!extension_id_.empty() && extension_id_ != extension->id())
@@ -209,10 +161,4 @@
return true;
}
-void NtpOverriddenBubbleDelegate::
- set_acknowledge_existing_extensions_for_testing(
- bool acknowledge_existing_extensions) {
- g_acknowledge_existing_extensions = acknowledge_existing_extensions;
-}
-
} // namespace extensions
diff --git a/chrome/browser/extensions/ntp_overridden_bubble_delegate.h b/chrome/browser/extensions/ntp_overridden_bubble_delegate.h
index f27b155..c3cc1d3 100644
--- a/chrome/browser/extensions/ntp_overridden_bubble_delegate.h
+++ b/chrome/browser/extensions/ntp_overridden_bubble_delegate.h
@@ -12,31 +12,14 @@
#include "base/macros.h"
#include "chrome/browser/extensions/extension_message_bubble_controller.h"
-class PrefRegistrySimple;
-
namespace extensions {
class NtpOverriddenBubbleDelegate
: public ExtensionMessageBubbleController::Delegate {
public:
- // Name of the preference that says whether the user has been notified about
- // extension overriding the new tab page.
- static const char kNtpBubbleAcknowledged[];
-
explicit NtpOverriddenBubbleDelegate(Profile* profile);
~NtpOverriddenBubbleDelegate() override;
- // Registers associated preferences.
- static void RegisterPrefs(PrefRegistrySimple* registry);
-
- // Iterates over existing NTP-overriding extensions installed in the given
- // |profile| and marks them as acknowledged. Stores a preference indicating
- // the action was completed. Subsequent calls will *not* acknowledge more
- // extensions. This is needed to avoid prompting users with existing
- // extensions when we expand the warning to new platforms.
- // TODO(devlin): Remove this in M62.
- static void MaybeAcknowledgeExistingNtpExtensions(Profile* profile);
-
// ExtensionMessageBubbleController::Delegate methods.
bool ShouldIncludeExtension(const extensions::Extension* extension) override;
void AcknowledgeExtension(
@@ -64,9 +47,6 @@
void LogAction(ExtensionMessageBubbleController::BubbleAction) override;
bool SupportsPolicyIndicator() override;
- static void set_acknowledge_existing_extensions_for_testing(
- bool acknowledge_existing_extensions);
-
private:
Profile* profile_;
diff --git a/chrome/browser/extensions/omnibox_focus_interactive_test.cc b/chrome/browser/extensions/omnibox_focus_interactive_test.cc
index dcf4b861..da29414 100644
--- a/chrome/browser/extensions/omnibox_focus_interactive_test.cc
+++ b/chrome/browser/extensions/omnibox_focus_interactive_test.cc
@@ -6,8 +6,8 @@
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "chrome/browser/extensions/extension_browsertest.h"
-#include "chrome/browser/extensions/ntp_overridden_bubble_delegate.h"
#include "chrome/browser/ui/browser_commands.h"
+#include "chrome/browser/ui/extensions/settings_api_bubble_helpers.h"
#include "chrome/browser/ui/view_ids.h"
#include "chrome/test/base/interactive_test_utils.h"
#include "chrome/test/base/ui_test_utils.h"
@@ -51,9 +51,9 @@
// Prevent a focus-stealing focus bubble that warns the user that "An
// extension has changed what page is shown when you open a new tab."
ExtensionPrefs* prefs = ExtensionPrefs::Get(browser()->profile());
- prefs->UpdateExtensionPref(
- extension->id(), NtpOverriddenBubbleDelegate::kNtpBubbleAcknowledged,
- std::make_unique<base::Value>(true));
+ prefs->UpdateExtensionPref(extension->id(),
+ kNtpOverridingExtensionAcknowledged,
+ std::make_unique<base::Value>(true));
return extension;
}
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 7d0de78..8539c00 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -168,7 +168,7 @@
#include "chrome/browser/extensions/api/tabs/tabs_api.h"
#include "chrome/browser/extensions/default_apps.h"
#include "chrome/browser/extensions/extension_web_ui.h"
-#include "chrome/browser/extensions/ntp_overridden_bubble_delegate.h"
+#include "chrome/browser/ui/extensions/settings_api_bubble_helpers.h"
#include "chrome/browser/ui/toolbar/toolbar_actions_bar.h"
#include "chrome/browser/ui/webui/extensions/extensions_ui.h"
#include "extensions/browser/api/audio/audio_api.h"
@@ -978,8 +978,11 @@
extensions::AudioAPI::RegisterUserPrefs(registry);
extensions::ExtensionPrefs::RegisterProfilePrefs(registry);
extensions::ExtensionsUI::RegisterProfilePrefs(registry);
- extensions::NtpOverriddenBubbleDelegate::RegisterPrefs(registry);
extensions::RuntimeAPI::RegisterPrefs(registry);
+ // TODO(devlin): This would be more inline with the other calls here if it
+ // were nested in either a class or separate namespace with a simple
+ // Register[Profile]Prefs() name.
+ extensions::RegisterSettingsOverriddenUiPrefs(registry);
update_client::RegisterProfilePrefs(registry);
web_app::WebAppProvider::RegisterProfilePrefs(registry);
#endif // BUILDFLAG(ENABLE_EXTENSIONS)
diff --git a/chrome/browser/ui/extensions/settings_api_bubble_helpers.cc b/chrome/browser/ui/extensions/settings_api_bubble_helpers.cc
index f6ad4d8..cf0c003 100644
--- a/chrome/browser/ui/extensions/settings_api_bubble_helpers.cc
+++ b/chrome/browser/ui/extensions/settings_api_bubble_helpers.cc
@@ -8,9 +8,11 @@
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
+#include "chrome/browser/extensions/extension_web_ui.h"
#include "chrome/browser/extensions/ntp_overridden_bubble_delegate.h"
#include "chrome/browser/extensions/settings_api_bubble_delegate.h"
#include "chrome/browser/extensions/settings_api_helpers.h"
+#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser_dialogs.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_window.h"
@@ -22,6 +24,8 @@
#include "chrome/browser/ui/ui_features.h"
#include "chrome/common/extensions/manifest_handlers/settings_overrides_handler.h"
#include "chrome/common/url_constants.h"
+#include "components/prefs/pref_registry.h"
+#include "components/prefs/pref_registry_simple.h"
#include "content/public/browser/browser_url_handler.h"
#include "content/public/browser/navigation_entry.h"
#include "extensions/common/constants.h"
@@ -38,6 +42,24 @@
bool g_ntp_post_install_ui_enabled = false;
#endif
+// Whether to acknowledge existing extensions overriding the NTP for the active
+// profile. Active on MacOS to rollout the NTP bubble without prompting for
+// previously-installed extensions.
+// TODO(devlin): This has been rolled out on Mac for awhile; we can flip this to
+// false (and keep the logic around for when/if we decide to expand the warning
+// treatment to Linux).
+bool g_acknowledge_existing_ntp_extensions =
+#if defined(OS_MAC)
+ true;
+#else
+ false;
+#endif
+
+// The name of the preference indicating whether existing NTP extensions have
+// been automatically acknowledged.
+const char kDidAcknowledgeExistingNtpExtensions[] =
+ "ack_existing_ntp_extensions";
+
#if defined(OS_WIN) || defined(OS_MAC)
void ShowSettingsApiBubble(SettingsApiOverrideType type,
Browser* browser) {
@@ -61,10 +83,47 @@
} // namespace
+// Whether a given ntp-overriding extension has been acknowledged by the user.
+// The terse key value is because the pref has migrated between code layers.
+const char kNtpOverridingExtensionAcknowledged[] = "ack_ntp_bubble";
+
void SetNtpPostInstallUiEnabledForTesting(bool enabled) {
g_ntp_post_install_ui_enabled = enabled;
}
+base::AutoReset<bool> SetAcknowledgeExistingNtpExtensionsForTesting(
+ bool should_acknowledge) {
+ return base::AutoReset<bool>(&g_acknowledge_existing_ntp_extensions,
+ should_acknowledge);
+}
+
+void AcknowledgePreExistingNtpExtensions(Profile* profile) {
+ DCHECK(g_acknowledge_existing_ntp_extensions);
+
+ ExtensionRegistry* registry = ExtensionRegistry::Get(profile);
+ PrefService* profile_prefs = profile->GetPrefs();
+ // Only acknowledge existing extensions once per profile.
+ if (profile_prefs->GetBoolean(kDidAcknowledgeExistingNtpExtensions))
+ return;
+
+ profile_prefs->SetBoolean(kDidAcknowledgeExistingNtpExtensions, true);
+ ExtensionPrefs* prefs = ExtensionPrefs::Get(profile);
+ for (const auto& extension : registry->enabled_extensions()) {
+ const URLOverrides::URLOverrideMap& overrides =
+ URLOverrides::GetChromeURLOverrides(extension.get());
+ if (overrides.find(chrome::kChromeUINewTabHost) != overrides.end()) {
+ prefs->UpdateExtensionPref(extension->id(),
+ kNtpOverridingExtensionAcknowledged,
+ std::make_unique<base::Value>(true));
+ }
+ }
+}
+
+void RegisterSettingsOverriddenUiPrefs(PrefRegistrySimple* registry) {
+ registry->RegisterBooleanPref(kDidAcknowledgeExistingNtpExtensions, false,
+ PrefRegistry::NO_REGISTRATION_FLAGS);
+}
+
void MaybeShowExtensionControlledHomeNotification(Browser* browser) {
#if defined(OS_WIN) || defined(OS_MAC)
ShowSettingsApiBubble(BUBBLE_TYPE_HOME_PAGE, browser);
@@ -110,8 +169,8 @@
return;
// Acknowledge existing extensions if necessary.
- NtpOverriddenBubbleDelegate::MaybeAcknowledgeExistingNtpExtensions(
- browser->profile());
+ if (g_acknowledge_existing_ntp_extensions)
+ AcknowledgePreExistingNtpExtensions(browser->profile());
// Jump through a series of hoops to see if the web contents is pointing to
// an extension-controlled NTP.
diff --git a/chrome/browser/ui/extensions/settings_api_bubble_helpers.h b/chrome/browser/ui/extensions/settings_api_bubble_helpers.h
index 0d29533..547df7f 100644
--- a/chrome/browser/ui/extensions/settings_api_bubble_helpers.h
+++ b/chrome/browser/ui/extensions/settings_api_bubble_helpers.h
@@ -5,9 +5,12 @@
#ifndef CHROME_BROWSER_UI_EXTENSIONS_SETTINGS_API_BUBBLE_HELPERS_H_
#define CHROME_BROWSER_UI_EXTENSIONS_SETTINGS_API_BUBBLE_HELPERS_H_
+#include "base/auto_reset.h"
#include "components/omnibox/browser/autocomplete_match.h"
class Browser;
+class PrefRegistrySimple;
+class Profile;
namespace content {
class WebContents;
@@ -15,10 +18,27 @@
namespace extensions {
+extern const char kNtpOverridingExtensionAcknowledged[];
+
// Sets whether the NTP post-install UI is enabled for testing purposes.
// TODO(devlin): This would be cooler as a base::AutoReset<>.
void SetNtpPostInstallUiEnabledForTesting(bool enabled);
+// Testing-only method to configure if existing NTP extensions are
+// auto-acknowledged.
+base::AutoReset<bool> SetAcknowledgeExistingNtpExtensionsForTesting(
+ bool should_acknowledge);
+
+// Registers prefs related to the settings overridden UI.
+void RegisterSettingsOverriddenUiPrefs(PrefRegistrySimple* registry);
+
+// Iterates over existing NTP-overriding extensions installed in the given
+// `profile` and marks them as acknowledged. Stores a preference indicating
+// the action was completed. Subsequent calls will *not* acknowledge more
+// extensions. This is needed to avoid prompting users with existing
+// extensions when we expand the warning to new platforms.
+void AcknowledgePreExistingNtpExtensions(Profile* profile);
+
// Shows a bubble notifying the user that the homepage is controlled by an
// extension. This bubble is shown only on the first use of the Home button
// after the controlling extension takes effect.
diff --git a/chrome/browser/extensions/ntp_overridden_bubble_delegate_unittest.cc b/chrome/browser/ui/extensions/settings_api_bubble_helpers_unittest.cc
similarity index 60%
rename from chrome/browser/extensions/ntp_overridden_bubble_delegate_unittest.cc
rename to chrome/browser/ui/extensions/settings_api_bubble_helpers_unittest.cc
index 70a2e0eb..b304aae9 100644
--- a/chrome/browser/extensions/ntp_overridden_bubble_delegate_unittest.cc
+++ b/chrome/browser/ui/extensions/settings_api_bubble_helpers_unittest.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chrome/browser/extensions/ntp_overridden_bubble_delegate.h"
+#include "chrome/browser/ui/extensions/settings_api_bubble_helpers.h"
#include <memory>
@@ -41,11 +41,11 @@
} // namespace
-using NtpOverriddenBubbleDelegateTest = ExtensionServiceTestBase;
+using SettingsApiBubbleHelpersUnitTest = ExtensionServiceTestBase;
-TEST_F(NtpOverriddenBubbleDelegateTest, TestAcknowledgeExistingExtensions) {
- NtpOverriddenBubbleDelegate::set_acknowledge_existing_extensions_for_testing(
- true);
+TEST_F(SettingsApiBubbleHelpersUnitTest, TestAcknowledgeExistingExtensions) {
+ base::AutoReset<bool> ack_existing =
+ SetAcknowledgeExistingNtpExtensionsForTesting(true);
InitializeEmptyExtensionService();
ExtensionWebUIOverrideRegistrar::GetFactoryInstance()->SetTestingFactory(
@@ -58,37 +58,33 @@
scoped_refptr<const Extension> first = GetNtpExtension("first");
service()->AddExtension(first.get());
- auto include_extension = [this](const Extension* extension) {
- auto ntp_delegate =
- std::make_unique<NtpOverriddenBubbleDelegate>(profile());
- return ntp_delegate->ShouldIncludeExtension(extension);
+ auto is_acknowledged = [this](const ExtensionId& id) {
+ bool is_acked = false;
+ return ExtensionPrefs::Get(profile())->ReadPrefAsBoolean(
+ id, kNtpOverridingExtensionAcknowledged, &is_acked) &&
+ is_acked;
};
- // By default, we should warn about an extension overriding the NTP.
- EXPECT_TRUE(include_extension(first.get()));
+ // By default, the extension should not be acknowledged.
+ EXPECT_FALSE(is_acknowledged(first->id()));
- // Acknowledge existing extensions. Now, |first| should be acknowledged and
- // shouldn't be included in the bubble warning.
- NtpOverriddenBubbleDelegate::MaybeAcknowledgeExistingNtpExtensions(profile());
- EXPECT_FALSE(include_extension(first.get()));
+ // Acknowledge existing extensions. Now, `first` should be acknowledged.
+ AcknowledgePreExistingNtpExtensions(profile());
+ EXPECT_TRUE(is_acknowledged(first->id()));
- // Install a second NTP-overriding extension. As before, we should include the
- // extension.
+ // Install a second NTP-overriding extension. The new extension should not be
+ // acknowledged.
scoped_refptr<const Extension> second = GetNtpExtension("second");
service()->AddExtension(second.get());
- EXPECT_TRUE(include_extension(second.get()));
+ 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 warn about
- // the second extension.
- NtpOverriddenBubbleDelegate::MaybeAcknowledgeExistingNtpExtensions(profile());
- EXPECT_TRUE(include_extension(second.get()));
+ // this profile, this should have no effect, and we should still consider the
+ // second extension unacknowledged.
+ AcknowledgePreExistingNtpExtensions(profile());
+ EXPECT_FALSE(is_acknowledged(second->id()));
- // We should still not warn about the first.
- EXPECT_FALSE(include_extension(first.get()));
-
- // Clean up.
- NtpOverriddenBubbleDelegate::set_acknowledge_existing_extensions_for_testing(
- false);
+ // But the first should still be acknowledged.
+ EXPECT_TRUE(is_acknowledged(first->id()));
}
} // namespace extensions
diff --git a/chrome/browser/ui/extensions/settings_overridden_params_providers.cc b/chrome/browser/ui/extensions/settings_overridden_params_providers.cc
index c69d007..7e65f98 100644
--- a/chrome/browser/ui/extensions/settings_overridden_params_providers.cc
+++ b/chrome/browser/ui/extensions/settings_overridden_params_providers.cc
@@ -8,11 +8,11 @@
#include "build/branding_buildflags.h"
#include "chrome/app/vector_icons/vector_icons.h"
#include "chrome/browser/extensions/extension_web_ui.h"
-#include "chrome/browser/extensions/ntp_overridden_bubble_delegate.h"
#include "chrome/browser/extensions/settings_api_bubble_delegate.h"
#include "chrome/browser/extensions/settings_api_helpers.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/search_engines/template_url_service_factory.h"
+#include "chrome/browser/ui/extensions/settings_api_bubble_helpers.h"
#include "chrome/common/extensions/manifest_handlers/settings_overrides_handler.h"
#include "chrome/common/url_constants.h"
#include "chrome/common/webui_url_constants.h"
@@ -146,11 +146,9 @@
if (!extension)
return base::nullopt;
- // We deliberately re-use the same preference that the bubble UI uses. This
- // way, users won't see the bubble or dialog UI if they've already
- // acknowledged either version.
- const char* preference_name =
- extensions::NtpOverriddenBubbleDelegate::kNtpBubbleAcknowledged;
+ // This preference tracks whether users have acknowledged the extension's
+ // control, so that they are not warned twice about the same extension.
+ const char* preference_name = extensions::kNtpOverridingExtensionAcknowledged;
std::vector<GURL> possible_rewrites =
content::BrowserURLHandler::GetInstance()->GetPossibleRewrites(ntp_url,
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 39178885..82f1d3fa 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -4671,6 +4671,7 @@
"../browser/ui/extensions/extension_installed_waiter_unittest.cc",
"../browser/ui/extensions/extension_message_bubble_bridge_unittest.cc",
"../browser/ui/extensions/extension_settings_overridden_dialog_unittest.cc",
+ "../browser/ui/extensions/settings_api_bubble_helpers_unittest.cc",
"../browser/ui/extensions/settings_overridden_params_providers_unittest.cc",
"../browser/ui/font_access/font_access_chooser_controller_unittest.cc",
"../browser/ui/global_error/global_error_service_unittest.cc",
@@ -5413,7 +5414,6 @@
"../browser/extensions/installed_loader_unittest.cc",
"../browser/extensions/media_router_extension_access_logger_impl_unittest.cc",
"../browser/extensions/menu_manager_unittest.cc",
- "../browser/extensions/ntp_overridden_bubble_delegate_unittest.cc",
"../browser/extensions/pack_extension_unittest.cc",
"../browser/extensions/permission_message_combinations_unittest.cc",
"../browser/extensions/permission_messages_unittest.cc",