Move external install warning logic from ExtService to ExternalInstallManager
Move the logic to create warnings about externally-installed extensions from
ExtensionService into ExternalInstallManager.
Next step: Move tests from extension_service_unittest.
BUG=378042
BUG=351891
Review URL: https://codereview.chromium.org/308473002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@281071 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index 47076d0..42cad4f 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -109,21 +109,6 @@
namespace {
-// Histogram values for logging events related to externally installed
-// extensions.
-enum ExternalExtensionEvent {
- EXTERNAL_EXTENSION_INSTALLED = 0,
- EXTERNAL_EXTENSION_IGNORED,
- EXTERNAL_EXTENSION_REENABLED,
- EXTERNAL_EXTENSION_UNINSTALLED,
- EXTERNAL_EXTENSION_BUCKET_BOUNDARY,
-};
-
-#if defined(ENABLE_EXTENSIONS)
-// Prompt the user this many times before considering an extension acknowledged.
-const int kMaxExtensionAcknowledgePromptCount = 3;
-#endif
-
// Wait this many seconds after an extensions becomes idle before updating it.
const int kUpdateIdleDelay = 5;
@@ -297,8 +282,6 @@
browser_terminating_(false),
installs_delayed_for_gc_(false),
is_first_run_(false),
- external_install_manager_(
- new extensions::ExternalInstallManager(profile_)),
shared_module_service_(new extensions::SharedModuleService(profile_)) {
CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
@@ -364,6 +347,8 @@
error_controller_.reset(
new extensions::ExtensionErrorController(profile_, is_first_run_));
+ external_install_manager_.reset(
+ new extensions::ExternalInstallManager(profile_, is_first_run_));
#if defined(ENABLE_EXTENSIONS)
extension_action_storage_manager_.reset(
@@ -562,7 +547,7 @@
installer->set_grant_permissions(false);
creation_flags = pending_extension_info->creation_flags();
if (pending_extension_info->mark_acknowledged())
- AcknowledgeExternalExtension(id);
+ external_install_manager_->AcknowledgeExternalExtension(id);
} else if (extension) {
installer->set_install_source(extension->location());
}
@@ -746,20 +731,6 @@
system_->install_verifier()->Remove(extension->id());
- if (IsUnacknowledgedExternalExtension(extension.get())) {
- UMA_HISTOGRAM_ENUMERATION("Extensions.ExternalExtensionEvent",
- EXTERNAL_EXTENSION_UNINSTALLED,
- EXTERNAL_EXTENSION_BUCKET_BOUNDARY);
- if (extensions::ManifestURL::UpdatesFromGallery(extension.get())) {
- UMA_HISTOGRAM_ENUMERATION("Extensions.ExternalExtensionEventWebstore",
- EXTERNAL_EXTENSION_UNINSTALLED,
- EXTERNAL_EXTENSION_BUCKET_BOUNDARY);
- } else {
- UMA_HISTOGRAM_ENUMERATION("Extensions.ExternalExtensionEventNonWebstore",
- EXTERNAL_EXTENSION_UNINSTALLED,
- EXTERNAL_EXTENSION_BUCKET_BOUNDARY);
- }
- }
UMA_HISTOGRAM_ENUMERATION("Extensions.UninstallType",
extension->GetType(), 100);
RecordPermissionMessagesHistogram(extension.get(),
@@ -860,22 +831,6 @@
if (!extension)
return;
- if (IsUnacknowledgedExternalExtension(extension)) {
- UMA_HISTOGRAM_ENUMERATION("Extensions.ExternalExtensionEvent",
- EXTERNAL_EXTENSION_REENABLED,
- EXTERNAL_EXTENSION_BUCKET_BOUNDARY);
- if (extensions::ManifestURL::UpdatesFromGallery(extension)) {
- UMA_HISTOGRAM_ENUMERATION("Extensions.ExternalExtensionEventWebstore",
- EXTERNAL_EXTENSION_REENABLED,
- EXTERNAL_EXTENSION_BUCKET_BOUNDARY);
- } else {
- UMA_HISTOGRAM_ENUMERATION("Extensions.ExternalExtensionEventNonWebstore",
- EXTERNAL_EXTENSION_REENABLED,
- EXTERNAL_EXTENSION_BUCKET_BOUNDARY);
- }
- AcknowledgeExternalExtension(extension->id());
- }
-
// Move it over to the enabled list.
registry_->AddEnabled(make_scoped_refptr(extension));
registry_->RemoveDisabled(extension->id());
@@ -1288,78 +1243,10 @@
error_controller_->ShowErrorIfNeeded();
- UpdateExternalExtensionAlert();
+ external_install_manager_->UpdateExternalExtensionAlert();
#endif
}
-void ExtensionService::AcknowledgeExternalExtension(const std::string& id) {
- extension_prefs_->AcknowledgeExternalExtension(id);
- UpdateExternalExtensionAlert();
-}
-
-bool ExtensionService::IsUnacknowledgedExternalExtension(
- const Extension* extension) {
- if (!FeatureSwitch::prompt_for_external_extensions()->IsEnabled())
- return false;
-
- return (Manifest::IsExternalLocation(extension->location()) &&
- !extension_prefs_->IsExternalExtensionAcknowledged(extension->id()) &&
- !(extension_prefs_->GetDisableReasons(extension->id()) &
- Extension::DISABLE_SIDELOAD_WIPEOUT));
-}
-
-void ExtensionService::UpdateExternalExtensionAlert() {
-#if defined(ENABLE_EXTENSIONS)
- if (!FeatureSwitch::prompt_for_external_extensions()->IsEnabled())
- return;
-
- const Extension* extension = NULL;
- const ExtensionSet& disabled_extensions = registry_->disabled_extensions();
- for (ExtensionSet::const_iterator iter = disabled_extensions.begin();
- iter != disabled_extensions.end(); ++iter) {
- const Extension* e = iter->get();
- if (IsUnacknowledgedExternalExtension(e)) {
- extension = e;
- break;
- }
- }
-
- if (extension) {
- if (!external_install_manager_->HasExternalInstallError()) {
- if (extension_prefs_->IncrementAcknowledgePromptCount(extension->id()) >
- kMaxExtensionAcknowledgePromptCount) {
- // Stop prompting for this extension, and check if there's another
- // one that needs prompting.
- extension_prefs_->AcknowledgeExternalExtension(extension->id());
- UpdateExternalExtensionAlert();
- UMA_HISTOGRAM_ENUMERATION("Extensions.ExternalExtensionEvent",
- EXTERNAL_EXTENSION_IGNORED,
- EXTERNAL_EXTENSION_BUCKET_BOUNDARY);
- if (extensions::ManifestURL::UpdatesFromGallery(extension)) {
- UMA_HISTOGRAM_ENUMERATION(
- "Extensions.ExternalExtensionEventWebstore",
- EXTERNAL_EXTENSION_IGNORED,
- EXTERNAL_EXTENSION_BUCKET_BOUNDARY);
- } else {
- UMA_HISTOGRAM_ENUMERATION(
- "Extensions.ExternalExtensionEventNonWebstore",
- EXTERNAL_EXTENSION_IGNORED,
- EXTERNAL_EXTENSION_BUCKET_BOUNDARY);
- }
- return;
- }
- if (is_first_run_)
- extension_prefs_->SetExternalInstallFirstRun(extension->id());
- // first_run is true if the extension was installed during a first run
- // (even if it's post-first run now).
- bool first_run = extension_prefs_->IsExternalInstallFirstRun(
- extension->id());
- external_install_manager_->AddExternalInstallError(extension, first_run);
- }
- }
-#endif // defined(ENABLE_EXTENSIONS)
-}
-
void ExtensionService::UnloadExtension(
const std::string& extension_id,
UnloadedExtensionInfo::Reason reason) {
@@ -1775,11 +1662,6 @@
extension->location(), Manifest::NUM_LOCATIONS);
}
- // Certain extension locations are specific enough that we can
- // auto-acknowledge any extension that came from one of them.
- if (Manifest::IsPolicyLocation(extension->location()) ||
- extension->location() == Manifest::EXTERNAL_COMPONENT)
- AcknowledgeExternalExtension(extension->id());
const Extension::State initial_state =
initial_enable ? Extension::ENABLED : Extension::DISABLED;
if (ShouldDelayExtensionUpdate(
@@ -1920,8 +1802,6 @@
registry_->TriggerOnWillBeInstalled(
extension, is_update, from_ephemeral, old_name);
- bool unacknowledged_external = IsUnacknowledgedExternalExtension(extension);
-
// Unpacked extensions default to allowing file access, but if that has been
// overridden, don't reset the value.
if (Manifest::ShouldAlwaysAllowFileAccess(extension->location()) &&
@@ -1934,30 +1814,10 @@
// Notify observers that need to know when an installation is complete.
registry_->TriggerOnInstalled(extension);
- // If this is a new external extension that was disabled, alert the user
- // so he can reenable it. We do this last so that it has already been
- // added to our list of extensions.
- if (unacknowledged_external && !is_update) {
- UpdateExternalExtensionAlert();
- UMA_HISTOGRAM_ENUMERATION("Extensions.ExternalExtensionEvent",
- EXTERNAL_EXTENSION_INSTALLED,
- EXTERNAL_EXTENSION_BUCKET_BOUNDARY);
- if (extensions::ManifestURL::UpdatesFromGallery(extension)) {
- UMA_HISTOGRAM_ENUMERATION("Extensions.ExternalExtensionEventWebstore",
- EXTERNAL_EXTENSION_INSTALLED,
- EXTERNAL_EXTENSION_BUCKET_BOUNDARY);
- } else {
- UMA_HISTOGRAM_ENUMERATION("Extensions.ExternalExtensionEventNonWebstore",
- EXTERNAL_EXTENSION_INSTALLED,
- EXTERNAL_EXTENSION_BUCKET_BOUNDARY);
- }
- }
-
// Check extensions that may have been delayed only because this shared module
// was not available.
- if (SharedModuleInfo::IsSharedModule(extension)) {
+ if (SharedModuleInfo::IsSharedModule(extension))
MaybeFinishDelayedInstallations();
- }
}
void ExtensionService::PromoteEphemeralApp(
@@ -2120,7 +1980,7 @@
// notification on installation. For such extensions, mark them acknowledged
// now to suppress the notification.
if (mark_acknowledged)
- AcknowledgeExternalExtension(id);
+ external_install_manager_->AcknowledgeExternalExtension(id);
return true;
#else