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 |