Chromium Code Reviews| Index: chrome/browser/extensions/extension_action_manager.cc |
| diff --git a/chrome/browser/extensions/extension_action_manager.cc b/chrome/browser/extensions/extension_action_manager.cc |
| index c92cad2015c047e9ffc311ba5c7ca548e73e4707..ade5095fde7ca2eed6585bfb2959f8f474523de6 100644 |
| --- a/chrome/browser/extensions/extension_action_manager.cc |
| +++ b/chrome/browser/extensions/extension_action_manager.cc |
| @@ -8,6 +8,7 @@ |
| #include "chrome/browser/extensions/api/system_indicator/system_indicator_manager.h" |
| #include "chrome/browser/extensions/api/system_indicator/system_indicator_manager_factory.h" |
| #include "chrome/browser/extensions/extension_action.h" |
| +#include "chrome/browser/extensions/extension_service.h" |
| #include "chrome/browser/extensions/extension_system.h" |
| #include "chrome/browser/profiles/incognito_helpers.h" |
| #include "chrome/browser/profiles/profile.h" |
| @@ -106,13 +107,24 @@ ExtensionAction* GetOrCreateOrNull( |
| std::map<std::string, linked_ptr<ExtensionAction> >* map, |
| const std::string& extension_id, |
| ActionInfo::Type action_type, |
| - const ActionInfo* action_info) { |
| + const ActionInfo* action_info, |
| + Profile* profile) { |
| std::map<std::string, linked_ptr<ExtensionAction> >::const_iterator it = |
| map->find(extension_id); |
| if (it != map->end()) |
| return it->second.get(); |
| if (!action_info) |
| return NULL; |
| + |
| + // Only create action info for enabled extensions. |
| + // This avoids bugs where actions are recreated just after being removed |
|
Jeffrey Yasskin
2013/07/30 00:25:22
Argh, use after free. :( Do you know which code pa
|
| + // in response to NOTIFICATION_EXTENSION_UNLOADED in |
| + // ExtensionActionManager::Observe() |
| + ExtensionService* service = |
| + ExtensionSystem::Get(profile)->extension_service(); |
| + if (!service->GetExtensionById(extension_id, false)) |
| + return NULL; |
| + |
| linked_ptr<ExtensionAction> action(new ExtensionAction( |
| extension_id, action_type, *action_info)); |
| (*map)[extension_id] = action; |
| @@ -129,7 +141,8 @@ ExtensionAction* ExtensionActionManager::GetPageAction( |
| return NULL; |
| return GetOrCreateOrNull(&page_actions_, extension.id(), |
| ActionInfo::TYPE_PAGE, |
| - ActionInfo::GetPageActionInfo(&extension)); |
| + ActionInfo::GetPageActionInfo(&extension), |
| + profile_); |
| } |
| ExtensionAction* ExtensionActionManager::GetBrowserAction( |
| @@ -144,7 +157,7 @@ ExtensionAction* ExtensionActionManager::GetBrowserAction( |
| action_type = ActionInfo::TYPE_PAGE; |
| } |
| return GetOrCreateOrNull(&browser_actions_, extension.id(), |
| - action_type, action_info); |
| + action_type, action_info, profile_); |
| } |
| ExtensionAction* ExtensionActionManager::GetSystemIndicator( |
| @@ -158,14 +171,16 @@ ExtensionAction* ExtensionActionManager::GetSystemIndicator( |
| return GetOrCreateOrNull(&system_indicators_, extension.id(), |
| ActionInfo::TYPE_SYSTEM_INDICATOR, |
| - ActionInfo::GetSystemIndicatorInfo(&extension)); |
| + ActionInfo::GetSystemIndicatorInfo(&extension), |
| + profile_); |
| } |
| ExtensionAction* ExtensionActionManager::GetScriptBadge( |
| const extensions::Extension& extension) const { |
| return GetOrCreateOrNull(&script_badges_, extension.id(), |
| ActionInfo::TYPE_SCRIPT_BADGE, |
| - ActionInfo::GetScriptBadgeInfo(&extension)); |
| + ActionInfo::GetScriptBadgeInfo(&extension), |
| + profile_); |
| } |
| } // namespace extensions |