| Index: chrome/browser/extensions/api/declarative/rules_registry_service.cc
|
| diff --git a/chrome/browser/extensions/api/declarative/rules_registry_service.cc b/chrome/browser/extensions/api/declarative/rules_registry_service.cc
|
| index a5c150980fc24cb9d1d71a8ae1a75805ea2e2dc8..40d5c123b16df4c56ef2331046470cc650cb5089 100644
|
| --- a/chrome/browser/extensions/api/declarative/rules_registry_service.cc
|
| +++ b/chrome/browser/extensions/api/declarative/rules_registry_service.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "chrome/browser/extensions/api/declarative/rules_registry_service.h"
|
|
|
| +#include "base/bind.h"
|
| #include "base/logging.h"
|
| #include "chrome/browser/extensions/api/declarative/initializing_rules_registry.h"
|
| #include "chrome/common/chrome_notification_types.h"
|
| @@ -14,33 +15,49 @@
|
| namespace extensions {
|
|
|
| RulesRegistryService::RulesRegistryService(Profile* profile) {
|
| - registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
|
| - content::Source<Profile>(profile));
|
| + if (profile) {
|
| + registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
|
| + content::Source<Profile>(profile));
|
| + }
|
| }
|
|
|
| RulesRegistryService::~RulesRegistryService() {}
|
|
|
| void RulesRegistryService::RegisterRulesRegistry(
|
| const std::string& event_name,
|
| - scoped_ptr<RulesRegistry> rule_registry) {
|
| + scoped_refptr<RulesRegistry> rule_registry) {
|
| DCHECK(rule_registries_.find(event_name) == rule_registries_.end());
|
| rule_registries_[event_name] =
|
| - make_linked_ptr(new InitializingRulesRegistry(rule_registry.Pass()));
|
| + make_scoped_refptr(new InitializingRulesRegistry(rule_registry));
|
| }
|
|
|
| -RulesRegistry* RulesRegistryService::GetRulesRegistry(
|
| +scoped_refptr<RulesRegistry> RulesRegistryService::GetRulesRegistry(
|
| const std::string& event_name) const {
|
| RulesRegistryMap::const_iterator i = rule_registries_.find(event_name);
|
| if (i == rule_registries_.end())
|
| - return NULL;
|
| - return i->second.get();
|
| + return scoped_refptr<RulesRegistry>();
|
| + return i->second;
|
| +}
|
| +
|
| +void RulesRegistryService::SimulateExtensionUnloaded(
|
| + const std::string& extension_id) {
|
| + OnExtensionUnloaded(extension_id);
|
| }
|
|
|
| void RulesRegistryService::OnExtensionUnloaded(
|
| const std::string& extension_id) {
|
| RulesRegistryMap::iterator i;
|
| - for (i = rule_registries_.begin(); i != rule_registries_.end(); ++i)
|
| - i->second->OnExtensionUnloaded(extension_id);
|
| + for (i = rule_registries_.begin(); i != rule_registries_.end(); ++i) {
|
| + scoped_refptr<RulesRegistry> registry = i->second;
|
| + if (content::BrowserThread::CurrentlyOn(registry->GetOwnerThread())) {
|
| + registry->OnExtensionUnloaded(extension_id);
|
| + } else {
|
| + content::BrowserThread::PostTask(
|
| + registry->GetOwnerThread(), FROM_HERE,
|
| + base::Bind(&RulesRegistry::OnExtensionUnloaded, registry,
|
| + extension_id));
|
| + }
|
| + }
|
| }
|
|
|
| void RulesRegistryService::Observe(
|
| @@ -54,8 +71,9 @@ void RulesRegistryService::Observe(
|
| OnExtensionUnloaded(extension->id());
|
| break;
|
| }
|
| - default:
|
| - NOTREACHED();
|
| + default:
|
| + NOTREACHED();
|
| + break;
|
| }
|
| }
|
|
|
|
|