Index: chrome/browser/ui/extensions/extension_message_bubble_factory.cc |
diff --git a/chrome/browser/ui/extensions/extension_message_bubble_factory.cc b/chrome/browser/ui/extensions/extension_message_bubble_factory.cc |
index b4a67c183501b2aad73be436984849385bf32baa..f079253088747dac81796a9dc7021a2ac5aa9947 100644 |
--- a/chrome/browser/ui/extensions/extension_message_bubble_factory.cc |
+++ b/chrome/browser/ui/extensions/extension_message_bubble_factory.cc |
@@ -4,14 +4,20 @@ |
#include "chrome/browser/ui/extensions/extension_message_bubble_factory.h" |
+#include "base/command_line.h" |
#include "base/lazy_instance.h" |
+#include "base/metrics/field_trial.h" |
#include "chrome/browser/extensions/dev_mode_bubble_controller.h" |
#include "chrome/browser/extensions/extension_message_bubble_controller.h" |
+#include "chrome/browser/extensions/install_verifier.h" |
#include "chrome/browser/extensions/proxy_overridden_bubble_controller.h" |
#include "chrome/browser/extensions/settings_api_bubble_controller.h" |
#include "chrome/browser/extensions/settings_api_helpers.h" |
#include "chrome/browser/extensions/suspicious_extension_bubble_controller.h" |
#include "chrome/browser/profiles/profile.h" |
+#include "chrome/common/chrome_switches.h" |
+#include "chrome/common/chrome_version_info.h" |
+#include "extensions/common/feature_switch.h" |
namespace { |
@@ -21,13 +27,59 @@ namespace { |
base::LazyInstance<std::set<Profile*> > g_profiles_evaluated = |
LAZY_INSTANCE_INITIALIZER; |
-// Currently, we only show these bubbles on windows platforms. This can be |
-// overridden for testing purposes. |
+// This is used to turn on all bubbles for testing. |
+bool g_enabled_for_tests = false; |
+ |
+const char kEnableDevModeWarningExperimentName[] = |
+ "ExtensionDeveloperModeWarning"; |
+ |
+const char kEnableProxyWarningExperimentName[] = "ExtensionProxyWarning"; |
+ |
+bool IsExperimentEnabled(const char* experiment_name) { |
+ // Don't allow turning it off via command line. |
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
+ if (command_line->HasSwitch(switches::kForceFieldTrials)) { |
+ std::string forced_trials = |
+ command_line->GetSwitchValueASCII(switches::kForceFieldTrials); |
+ if (forced_trials.find(experiment_name)) |
+ return true; |
+ } |
+ return base::FieldTrialList::FindFullName(experiment_name) == "Enabled"; |
+} |
+ |
+bool EnableSuspiciousExtensionsBubble() { |
+ return g_enabled_for_tests || extensions::InstallVerifier::ShouldEnforce(); |
+} |
+ |
+bool EnableSettingsApiBubble() { |
#if defined(OS_WIN) |
-bool g_enabled = true; |
+ return true; |
#else |
-bool g_enabled = false; |
+ return g_enabled_for_tests; |
#endif |
+} |
+ |
+bool EnableProxyOverrideBubble() { |
+#if defined(OS_WIN) |
+ return true; |
+#else |
+ return g_enabled_for_tests || |
+ IsExperimentEnabled(kEnableProxyWarningExperimentName); |
+#endif |
+} |
+ |
+bool EnableDevModeBubble() { |
+ if (extensions::FeatureSwitch::force_dev_mode_highlighting()->IsEnabled()) |
+ return true; |
+ |
+#if defined(OS_WIN) |
+ if (chrome::VersionInfo::GetChannel() >= chrome::VersionInfo::CHANNEL_BETA) |
+ return true; |
+#endif |
+ |
+ return g_enabled_for_tests || |
+ IsExperimentEnabled(kEnableDevModeWarningExperimentName); |
+} |
} // namespace |
@@ -40,9 +92,6 @@ ExtensionMessageBubbleFactory::~ExtensionMessageBubbleFactory() { |
scoped_ptr<extensions::ExtensionMessageBubbleController> |
ExtensionMessageBubbleFactory::GetController() { |
- if (!g_enabled) |
- return scoped_ptr<extensions::ExtensionMessageBubbleController>(); |
- |
Profile* original_profile = profile_->GetOriginalProfile(); |
std::set<Profile*>& profiles_evaluated = g_profiles_evaluated.Get(); |
bool is_initial_check = profiles_evaluated.count(original_profile) == 0; |
@@ -56,14 +105,14 @@ ExtensionMessageBubbleFactory::GetController() { |
// The dev mode bubble is not time sensitive like the other two so we'll catch |
// the dev mode extensions on the next startup/next window that opens. That |
// way, we're not too spammy with the bubbles. |
- { |
+ if (EnableSuspiciousExtensionsBubble()) { |
scoped_ptr<extensions::SuspiciousExtensionBubbleController> controller( |
new extensions::SuspiciousExtensionBubbleController(profile_)); |
if (controller->ShouldShow()) |
return controller.Pass(); |
} |
- { |
+ if (EnableSettingsApiBubble()) { |
// No use showing this if it's not the startup of the profile. |
if (is_initial_check) { |
scoped_ptr<extensions::SettingsApiBubbleController> controller( |
@@ -74,7 +123,7 @@ ExtensionMessageBubbleFactory::GetController() { |
} |
} |
- { |
+ if (EnableProxyOverrideBubble()) { |
// TODO(devlin): Move the "GetExtensionOverridingProxy" part into the |
// proxy bubble controller. |
const extensions::Extension* extension = |
@@ -87,7 +136,7 @@ ExtensionMessageBubbleFactory::GetController() { |
} |
} |
- { |
+ if (EnableDevModeBubble()) { |
scoped_ptr<extensions::DevModeBubbleController> controller( |
new extensions::DevModeBubbleController(profile_)); |
if (controller->ShouldShow()) |
@@ -99,5 +148,5 @@ ExtensionMessageBubbleFactory::GetController() { |
// static |
void ExtensionMessageBubbleFactory::set_enabled_for_tests(bool enabled) { |
- g_enabled = enabled; |
+ g_enabled_for_tests = enabled; |
} |