Index: chrome/browser/extensions/extension_service.cc |
=================================================================== |
--- chrome/browser/extensions/extension_service.cc (revision 75613) |
+++ chrome/browser/extensions/extension_service.cc (working copy) |
@@ -432,6 +432,10 @@ |
registrar_.Add(this, NotificationType::EXTENSION_PROCESS_TERMINATED, |
NotificationService::AllSources()); |
+ |
+ registrar_.Add(this, NotificationType::BROWSER_THEME_CHANGED, |
+ NotificationService::AllSources()); |
+ |
pref_change_registrar_.Init(profile->GetPrefs()); |
pref_change_registrar_.Add(prefs::kExtensionInstallAllowList, this); |
pref_change_registrar_.Add(prefs::kExtensionInstallDenyList, this); |
@@ -504,7 +508,10 @@ |
ExtensionBookmarkEventRouter::GetInstance()->Observe( |
profile_->GetBookmarkModel()); |
ExtensionCookiesEventRouter::GetInstance()->Init(); |
- ExtensionManagementEventRouter::GetInstance()->Init(); |
+ |
+ management_event_router_.reset(new ExtensionManagementEventRouter()); |
+ management_event_router_->Init(); |
+ |
ExtensionProcessesEventRouter::GetInstance()->ObserveProfile(profile_); |
ExtensionWebNavigationEventRouter::GetInstance()->Init(); |
event_routers_initialized_ = true; |
@@ -1252,6 +1259,7 @@ |
updater_->Stop(); |
} |
browser_event_router_.reset(); |
+ management_event_router_.reset(); |
pref_change_registrar_.RemoveAll(); |
profile_ = NULL; |
toolbar_model_.DestroyingProfile(); |
@@ -1705,9 +1713,9 @@ |
// Make sure we preserve enabled/disabled states. |
Extension::State existing_state = |
extension_prefs_->GetExtensionState(extension->id()); |
- initial_state = |
- (existing_state == Extension::DISABLED) ? |
- Extension::DISABLED : Extension::ENABLED; |
+ initial_state = Extension::ENABLED; |
+ if (!extension->is_theme() && existing_state == Extension::DISABLED) |
+ initial_state = Extension::DISABLED; |
initial_enable_incognito = |
extension_prefs_->IsIncognitoEnabled(extension->id()); |
} |
@@ -1723,19 +1731,10 @@ |
if (extension->location() == Extension::LOAD) |
extension_prefs_->SetAllowFileAccess(extension->id(), true); |
- // If the extension is a theme, tell the profile (and therefore ThemeProvider) |
- // to apply it. |
- if (extension->is_theme()) { |
- NotificationService::current()->Notify( |
- NotificationType::THEME_INSTALLED, |
- Source<Profile>(profile_), |
- Details<const Extension>(extension)); |
- } else { |
- NotificationService::current()->Notify( |
- NotificationType::EXTENSION_INSTALLED, |
- Source<Profile>(profile_), |
- Details<const Extension>(extension)); |
- } |
+ NotificationService::current()->Notify( |
+ NotificationType::EXTENSION_INSTALLED, |
+ Source<Profile>(profile_), |
+ Details<const Extension>(extension)); |
if (extension->is_app()) { |
ExtensionIdSet installed_ids = GetAppIds(); |
@@ -1919,6 +1918,29 @@ |
const NotificationSource& source, |
const NotificationDetails& details) { |
switch (type.value) { |
+ case NotificationType::BROWSER_THEME_CHANGED: { |
+ // Disable any other enabled themes. |
+ std::string new_theme_id; |
+ const Extension* theme = Details<const Extension>(details).ptr(); |
+ if (theme) |
+ new_theme_id = theme->id(); |
+ |
+ std::set<std::string> disable_list; |
+ for (ExtensionList::iterator i = extensions_.begin(); |
+ i != extensions_.end(); ++i) { |
+ const Extension* extension = i->get(); |
+ if (extension->is_theme() && extension->id() != new_theme_id) |
+ disable_list.insert(extension->id()); |
+ } |
+ |
+ for (std::set<std::string>::iterator i = disable_list.begin(); |
+ i != disable_list.end(); ++i) { |
+ DisableExtension(*i); |
+ } |
+ |
+ break; |
+ } |
+ |
case NotificationType::EXTENSION_PROCESS_TERMINATED: { |
if (profile_ != Source<Profile>(source).ptr()->GetOriginalProfile()) |
break; |