| Index: chrome/browser/extensions/menu_manager.cc
|
| diff --git a/chrome/browser/extensions/menu_manager.cc b/chrome/browser/extensions/menu_manager.cc
|
| index 096518a66f4e021a7018a0b5cb6f7724ca24dc65..061529761327747eec15940625dfe37615a7560e 100644
|
| --- a/chrome/browser/extensions/menu_manager.cc
|
| +++ b/chrome/browser/extensions/menu_manager.cc
|
| @@ -18,12 +18,14 @@
|
| #include "chrome/browser/extensions/extension_service.h"
|
| #include "chrome/browser/extensions/extension_system.h"
|
| #include "chrome/browser/extensions/extension_tab_util.h"
|
| +#include "chrome/browser/extensions/menu_manager_factory.h"
|
| #include "chrome/browser/extensions/state_store.h"
|
| #include "chrome/browser/extensions/tab_helper.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/common/extensions/api/context_menus.h"
|
| #include "chrome/common/extensions/extension.h"
|
| #include "content/public/browser/notification_details.h"
|
| +#include "content/public/browser/notification_service.h"
|
| #include "content/public/browser/notification_source.h"
|
| #include "content/public/browser/web_contents.h"
|
| #include "content/public/common/context_menu_params.h"
|
| @@ -292,16 +294,16 @@ bool MenuItem::PopulateURLPatterns(
|
| return true;
|
| }
|
|
|
| -MenuManager::MenuManager(Profile* profile)
|
| - : profile_(profile) {
|
| +MenuManager::MenuManager(Profile* profile, StateStore* store)
|
| + : profile_(profile), store_(store) {
|
| registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED,
|
| content::Source<Profile>(profile));
|
| registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
|
| content::Source<Profile>(profile));
|
| -
|
| - StateStore* store = ExtensionSystem::Get(profile_)->state_store();
|
| - if (store)
|
| - store->RegisterKey(kContextMenusKey);
|
| + registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED,
|
| + content::NotificationService::AllSources());
|
| + if (store_)
|
| + store_->RegisterKey(kContextMenusKey);
|
| }
|
|
|
| MenuManager::~MenuManager() {
|
| @@ -311,6 +313,11 @@ MenuManager::~MenuManager() {
|
| }
|
| }
|
|
|
| +// static
|
| +MenuManager* MenuManager::Get(Profile* profile) {
|
| + return MenuManagerFactory::GetForProfile(profile);
|
| +}
|
| +
|
| std::set<std::string> MenuManager::ExtensionIds() {
|
| std::set<std::string> id_set;
|
| for (MenuItemMap::const_iterator i = context_items_.begin();
|
| @@ -760,10 +767,9 @@ void MenuManager::WriteToStorage(const Extension* extension) {
|
| }
|
| }
|
|
|
| - StateStore* store = ExtensionSystem::Get(profile_)->state_store();
|
| - if (store)
|
| - store->SetExtensionValue(extension->id(), kContextMenusKey,
|
| - MenuItemsToValue(all_items));
|
| + if (store_)
|
| + store_->SetExtensionValue(extension->id(), kContextMenusKey,
|
| + MenuItemsToValue(all_items));
|
| }
|
|
|
| void MenuManager::ReadFromStorage(const std::string& extension_id,
|
| @@ -793,22 +799,40 @@ void MenuManager::ReadFromStorage(const std::string& extension_id,
|
| void MenuManager::Observe(int type,
|
| const content::NotificationSource& source,
|
| const content::NotificationDetails& details) {
|
| - if (type == chrome::NOTIFICATION_EXTENSION_UNLOADED) {
|
| - // Remove menu items for disabled/uninstalled extensions.
|
| - const Extension* extension =
|
| - content::Details<UnloadedExtensionInfo>(details)->extension;
|
| - if (ContainsKey(context_items_, extension->id())) {
|
| - RemoveAllContextItems(extension->id());
|
| + switch (type) {
|
| + case chrome::NOTIFICATION_EXTENSION_UNLOADED: {
|
| + // Remove menu items for disabled/uninstalled extensions.
|
| + const Extension* extension =
|
| + content::Details<UnloadedExtensionInfo>(details)->extension;
|
| + if (ContainsKey(context_items_, extension->id())) {
|
| + RemoveAllContextItems(extension->id());
|
| + }
|
| + break;
|
| }
|
| - } else if (type == chrome::NOTIFICATION_EXTENSION_LOADED) {
|
| - const Extension* extension =
|
| - content::Details<const Extension>(details).ptr();
|
| - StateStore* store = ExtensionSystem::Get(profile_)->state_store();
|
| - if (store && BackgroundInfo::HasLazyBackgroundPage(extension)) {
|
| - store->GetExtensionValue(extension->id(), kContextMenusKey,
|
| - base::Bind(&MenuManager::ReadFromStorage,
|
| - AsWeakPtr(), extension->id()));
|
| + case chrome::NOTIFICATION_EXTENSION_LOADED: {
|
| + const Extension* extension =
|
| + content::Details<const Extension>(details).ptr();
|
| + if (store_ && BackgroundInfo::HasLazyBackgroundPage(extension)) {
|
| + store_->GetExtensionValue(extension->id(), kContextMenusKey,
|
| + base::Bind(&MenuManager::ReadFromStorage,
|
| + AsWeakPtr(), extension->id()));
|
| + }
|
| + break;
|
| + }
|
| + case chrome::NOTIFICATION_PROFILE_DESTROYED: {
|
| + Profile* profile = content::Source<Profile>(source).ptr();
|
| + // We cannot use profile_->HasOffTheRecordProfile as it may already be
|
| + // false at this point, if for example the incognito profile was destroyed
|
| + // using DestroyOffTheRecordProfile.
|
| + if (profile->GetOriginalProfile() == profile_ &&
|
| + profile->GetOriginalProfile() != profile) {
|
| + RemoveAllIncognitoContextItems();
|
| + }
|
| + break;
|
| }
|
| + default:
|
| + NOTREACHED();
|
| + break;
|
| }
|
| }
|
|
|
|
|