Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(603)

Unified Diff: chrome/browser/extensions/extensions_service.cc

Issue 2819023: Reworked ExtensionsService::AddPendingExtension(). (Closed)
Patch Set: Fixed browsertest test failure Created 10 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/extensions_service.cc
diff --git a/chrome/browser/extensions/extensions_service.cc b/chrome/browser/extensions/extensions_service.cc
index 02a7366742f77b4b1792f94a1ca91adcd275be8f..ea8c9daa864a305fd0b2fcbbe92506de1bd44e72 100644
--- a/chrome/browser/extensions/extensions_service.cc
+++ b/chrome/browser/extensions/extensions_service.cc
@@ -73,19 +73,22 @@ static bool ShouldReloadExtensionManifest(const ExtensionInfo& info) {
} // namespace
PendingExtensionInfo::PendingExtensionInfo(const GURL& update_url,
- const Version& version,
bool is_theme,
- bool install_silently)
+ bool install_silently,
+ bool enable_on_install,
+ bool enable_incognito_on_install)
: update_url(update_url),
- version(version),
is_theme(is_theme),
- install_silently(install_silently) {}
+ install_silently(install_silently),
+ enable_on_install(enable_on_install),
+ enable_incognito_on_install(enable_incognito_on_install) {}
PendingExtensionInfo::PendingExtensionInfo()
: update_url(),
- version(),
is_theme(false),
- install_silently(false) {}
+ install_silently(false),
+ enable_on_install(false),
+ enable_incognito_on_install(false) {}
// ExtensionsService.
@@ -254,21 +257,25 @@ void ExtensionsService::UpdateExtension(const std::string& id,
void ExtensionsService::AddPendingExtension(
const std::string& id, const GURL& update_url,
- const Version& version, bool is_theme, bool install_silently) {
+ bool is_theme, bool install_silently,
+ bool enable_on_install, bool enable_incognito_on_install) {
if (GetExtensionByIdInternal(id, true, true)) {
LOG(DFATAL) << "Trying to add pending extension " << id
<< " which already exists";
return;
}
- AddPendingExtensionInternal(id, update_url, version,
- is_theme, install_silently);
+ AddPendingExtensionInternal(
+ id, update_url, is_theme, install_silently,
+ enable_on_install, enable_incognito_on_install);
}
void ExtensionsService::AddPendingExtensionInternal(
const std::string& id, const GURL& update_url,
- const Version& version, bool is_theme, bool install_silently) {
+ bool is_theme, bool install_silently,
+ bool enable_on_install, bool enable_incognito_on_install) {
pending_extensions_[id] =
- PendingExtensionInfo(update_url, version, is_theme, install_silently);
+ PendingExtensionInfo(update_url, is_theme, install_silently,
+ enable_on_install, enable_incognito_on_install);
}
void ExtensionsService::ReloadExtension(const std::string& extension_id) {
@@ -678,7 +685,7 @@ void ExtensionsService::SetIsIncognitoEnabled(Extension* extension,
bool ExtensionsService::AllowFileAccess(const Extension* extension) {
return (CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kDisableExtensionsFileAccessCheck) ||
+ switches::kDisableExtensionsFileAccessCheck) ||
extension_prefs_->AllowFileAccess(extension->id()));
}
@@ -888,23 +895,52 @@ void ExtensionsService::UpdateActiveExtensionsInCrashReporter() {
void ExtensionsService::OnExtensionInstalled(Extension* extension,
bool allow_privilege_increase) {
+ // Ensure extension is deleted unless we transfer ownership.
+ scoped_ptr<Extension> scoped_extension(extension);
+ Extension::State initial_state = Extension::DISABLED;
+ bool initial_enable_incognito = false;
PendingExtensionMap::iterator it =
pending_extensions_.find(extension->id());
- if (it != pending_extensions_.end() &&
- (it->second.is_theme != extension->is_theme())) {
- LOG(WARNING) << "Not installing pending extension " << extension->id()
- << " with is_theme = " << extension->is_theme()
- << "; expected is_theme = " << it->second.is_theme;
- // Delete the extension directory since we're not going to load
- // it.
- ChromeThread::PostTask(
- ChromeThread::FILE, FROM_HERE,
- NewRunnableFunction(&DeleteFileHelper, extension->path(), true));
- delete extension;
- return;
+ if (it != pending_extensions_.end()) {
+ // Set initial state from pending extension data.
+ if (it->second.is_theme != extension->is_theme()) {
+ LOG(WARNING)
+ << "Not installing pending extension " << extension->id()
+ << " with is_theme = " << extension->is_theme()
+ << "; expected is_theme = " << it->second.is_theme;
+ // Delete the extension directory since we're not going to
+ // load it.
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ NewRunnableFunction(&DeleteFileHelper, extension->path(), true));
+ return;
+ }
+ if (it->second.is_theme) {
+ DCHECK(it->second.enable_on_install);
+ initial_state = Extension::ENABLED;
+ DCHECK(!it->second.enable_incognito_on_install);
+ initial_enable_incognito = false;
+ } else {
+ initial_state =
+ it->second.enable_on_install ?
+ Extension::ENABLED : Extension::DISABLED;
+ initial_enable_incognito =
+ it->second.enable_incognito_on_install;
+ }
+
+ pending_extensions_.erase(it);
+ } else {
+ // Make sure we don't enable a disabled extension.
+ Extension::State existing_state =
+ extension_prefs_->GetExtensionState(extension->id());
+ initial_state =
+ (existing_state == Extension::DISABLED) ?
+ Extension::DISABLED : Extension::ENABLED;
+ initial_enable_incognito = false;
}
- extension_prefs_->OnExtensionInstalled(extension);
+ extension_prefs_->OnExtensionInstalled(
+ extension, initial_state, initial_enable_incognito);
// If the extension is a theme, tell the profile (and therefore ThemeProvider)
// to apply it.
@@ -920,16 +956,11 @@ void ExtensionsService::OnExtensionInstalled(Extension* extension,
Details<Extension>(extension));
}
- // Also load the extension.
- OnExtensionLoaded(extension, allow_privilege_increase);
-
- // Erase any pending extension.
- if (it != pending_extensions_.end()) {
- pending_extensions_.erase(it);
- }
-
if (profile_->GetTemplateURLModel())
profile_->GetTemplateURLModel()->RegisterExtensionKeyword(extension);
+
+ // Transfer ownership of |extension| to OnExtensionLoaded.
+ OnExtensionLoaded(scoped_extension.release(), allow_privilege_increase);
}
Extension* ExtensionsService::GetExtensionByIdInternal(const std::string& id,
« no previous file with comments | « chrome/browser/extensions/extensions_service.h ('k') | chrome/browser/extensions/extensions_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698