| Index: chrome/browser/extensions/api/declarative/rules_registry_storage_delegate.cc
|
| diff --git a/chrome/browser/extensions/api/declarative/rules_registry_storage_delegate.cc b/chrome/browser/extensions/api/declarative/rules_registry_storage_delegate.cc
|
| index f2120964d3245516708549489310e9c54c51fb01..010e1409dd08ff7d9f47ee6e9de845448f4ef352 100644
|
| --- a/chrome/browser/extensions/api/declarative/rules_registry_storage_delegate.cc
|
| +++ b/chrome/browser/extensions/api/declarative/rules_registry_storage_delegate.cc
|
| @@ -52,18 +52,15 @@ std::vector<linked_ptr<RulesRegistry::Rule> > RulesFromValue(
|
| // should be used on the UI thread unless otherwise noted.
|
| class RulesRegistryStorageDelegate::Inner
|
| : public content::NotificationObserver,
|
| - public base::RefCountedThreadSafe<
|
| - Inner, content::BrowserThread::DeleteOnUIThread> {
|
| + public base::RefCountedThreadSafe<Inner> {
|
| public:
|
| Inner(Profile* profile,
|
| RulesRegistryWithCache* rules_registry,
|
| const std::string& storage_key);
|
|
|
| private:
|
| + friend class base::RefCountedThreadSafe<Inner>;
|
| friend class RulesRegistryStorageDelegate;
|
| - friend struct content::BrowserThread::DeleteOnThread<
|
| - content::BrowserThread::UI>;
|
| - friend class base::DeleteHelper<Inner>;
|
|
|
| ~Inner();
|
|
|
| @@ -93,7 +90,7 @@ class RulesRegistryStorageDelegate::Inner
|
| // Notify the RulesRegistry that we are now ready.
|
| void NotifyReadyOnRegistryThread();
|
|
|
| - content::NotificationRegistrar registrar_;
|
| + scoped_ptr<content::NotificationRegistrar> registrar_;
|
| Profile* profile_;
|
|
|
| // The key under which rules are stored.
|
| @@ -123,9 +120,10 @@ RulesRegistryStorageDelegate::~RulesRegistryStorageDelegate() {
|
| inner_->rules_registry_ = NULL;
|
| }
|
|
|
| -void RulesRegistryStorageDelegate::Init(Profile* profile,
|
| - RulesRegistryWithCache* rules_registry,
|
| - const std::string& storage_key) {
|
| +void RulesRegistryStorageDelegate::InitOnUIThread(
|
| + Profile* profile,
|
| + RulesRegistryWithCache* rules_registry,
|
| + const std::string& storage_key) {
|
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| extensions::StateStore* store = ExtensionSystem::Get(profile)->state_store();
|
| if (store)
|
| @@ -133,6 +131,11 @@ void RulesRegistryStorageDelegate::Init(Profile* profile,
|
| inner_ = new Inner(profile, rules_registry, storage_key);
|
| }
|
|
|
| +void RulesRegistryStorageDelegate::CleanupOnUIThread() {
|
| + // The registrar must be deleted on the UI thread.
|
| + inner_->registrar_.reset();
|
| +}
|
| +
|
| bool RulesRegistryStorageDelegate::IsReady() {
|
| DCHECK(content::BrowserThread::CurrentlyOn(inner_->rules_registry_thread_));
|
| return inner_->ready_;
|
| @@ -155,23 +158,27 @@ RulesRegistryStorageDelegate::Inner::Inner(
|
| Profile* profile,
|
| RulesRegistryWithCache* rules_registry,
|
| const std::string& storage_key)
|
| - : profile_(profile),
|
| + : registrar_(new content::NotificationRegistrar()),
|
| + profile_(profile),
|
| storage_key_(storage_key),
|
| rules_registry_thread_(rules_registry->GetOwnerThread()),
|
| rules_registry_(rules_registry),
|
| ready_(false) {
|
| - registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED,
|
| - content::Source<Profile>(profile));
|
| - registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY,
|
| - content::Source<Profile>(profile));
|
| + registrar_->Add(this, chrome::NOTIFICATION_EXTENSION_LOADED,
|
| + content::Source<Profile>(profile));
|
| + registrar_->Add(this, chrome::NOTIFICATION_EXTENSIONS_READY,
|
| + content::Source<Profile>(profile));
|
| }
|
|
|
| -RulesRegistryStorageDelegate::Inner::~Inner() {}
|
| +RulesRegistryStorageDelegate::Inner::~Inner() {
|
| + DCHECK(!registrar_.get());
|
| +}
|
|
|
| void RulesRegistryStorageDelegate::Inner::Observe(
|
| int type,
|
| const content::NotificationSource& source,
|
| const content::NotificationDetails& details) {
|
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| if (type == chrome::NOTIFICATION_EXTENSION_LOADED) {
|
| const extensions::Extension* extension =
|
| content::Details<const extensions::Extension>(details).ptr();
|
| @@ -188,6 +195,7 @@ void RulesRegistryStorageDelegate::Inner::Observe(
|
|
|
| void RulesRegistryStorageDelegate::Inner::ReadFromStorage(
|
| const std::string& extension_id) {
|
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| extensions::StateStore* store = ExtensionSystem::Get(profile_)->state_store();
|
| if (store) {
|
| waiting_for_extensions_.insert(extension_id);
|
|
|