Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(233)

Side by Side Diff: chrome/browser/chromeos/extensions/external_pref_cache_loader.cc

Issue 79363004: Merge 235370 "Destroy ExternalCacheDispatcher when last External..." (Closed) Base URL: svn://svn.chromium.org/chrome/branches/1700/src/
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/extensions/external_pref_cache_loader.h" 5 #include "chrome/browser/chromeos/extensions/external_pref_cache_loader.h"
6 6
7 #include <map> 7 #include <map>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/bind_helpers.h" 11 #include "base/bind_helpers.h"
12 #include "base/memory/ref_counted.h" 12 #include "base/memory/ref_counted.h"
13 #include "base/memory/singleton.h"
14 #include "base/sequenced_task_runner.h" 13 #include "base/sequenced_task_runner.h"
15 #include "base/threading/sequenced_worker_pool.h" 14 #include "base/threading/sequenced_worker_pool.h"
16 #include "base/values.h" 15 #include "base/values.h"
17 #include "base/version.h" 16 #include "base/version.h"
18 #include "chrome/browser/browser_process.h" 17 #include "chrome/browser/browser_process.h"
19 #include "chrome/browser/chromeos/extensions/external_cache.h" 18 #include "chrome/browser/chromeos/extensions/external_cache.h"
20 #include "chrome/browser/extensions/extension_service.h" 19 #include "chrome/browser/extensions/extension_service.h"
21 #include "chrome/browser/extensions/extension_system.h" 20 #include "chrome/browser/extensions/extension_system.h"
22 #include "chrome/browser/profiles/profile.h" 21 #include "chrome/browser/profiles/profile.h"
23 #include "content/public/browser/browser_thread.h" 22 #include "content/public/browser/browser_thread.h"
24 23
25 namespace chromeos { 24 namespace chromeos {
26 25
27 namespace { 26 namespace {
28 27
29 // Directory where the extensions are cached. 28 // Directory where the extensions are cached.
30 const char kPreinstalledAppsCacheDir[] = "/var/cache/external_cache"; 29 const char kPreinstalledAppsCacheDir[] = "/var/cache/external_cache";
31 30
32 // Singleton class that holds ExternalCache and dispatches cache update events 31 } // namespace
32
33 // Ref-counted class that holds ExternalCache and dispatches cache update events
33 // to per-profile instances of ExternalPrefCacheLoader. This multiplexing 34 // to per-profile instances of ExternalPrefCacheLoader. This multiplexing
34 // is required for multi-profile case. 35 // is required for multi-profile case.
35 class ExternalCacheDispatcher : public ExternalCache::Delegate { 36 class ExternalCacheDispatcher
37 : public ExternalCache::Delegate,
38 public base::RefCounted<ExternalCacheDispatcher> {
36 public: 39 public:
37 static ExternalCacheDispatcher* GetInstance() { 40 static ExternalCacheDispatcher* GetInstance() {
38 return Singleton<ExternalCacheDispatcher>::get(); 41 if (!ExternalCacheDispatcher::instance_)
42 ExternalCacheDispatcher::instance_ = new ExternalCacheDispatcher;
43 return instance_;
39 } 44 }
40 45
41 // Implementation of ExternalCache::Delegate: 46 // Implementation of ExternalCache::Delegate:
42 virtual void OnExtensionListsUpdated( 47 virtual void OnExtensionListsUpdated(
43 const base::DictionaryValue* prefs) OVERRIDE { 48 const base::DictionaryValue* prefs) OVERRIDE {
44 is_extensions_list_ready_ = true; 49 is_extensions_list_ready_ = true;
45 for (LoadersMap::iterator it = pref_loaders_.begin(); 50 for (LoadersMap::iterator it = pref_loaders_.begin();
46 it != pref_loaders_.end(); ++it) { 51 it != pref_loaders_.end(); ++it) {
47 it->first->OnExtensionListsUpdated(prefs); 52 it->first->OnExtensionListsUpdated(prefs);
48 } 53 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 } 98 }
94 return true; 99 return true;
95 } 100 }
96 } 101 }
97 102
98 void UnregisterExternalPrefCacheLoader(ExternalPrefCacheLoader* observer) { 103 void UnregisterExternalPrefCacheLoader(ExternalPrefCacheLoader* observer) {
99 pref_loaders_.erase(observer); 104 pref_loaders_.erase(observer);
100 } 105 }
101 106
102 private: 107 private:
103 friend struct DefaultSingletonTraits<ExternalCacheDispatcher>; 108 friend class base::RefCounted<ExternalCacheDispatcher>;
104 109
105 typedef std::map<ExternalPrefCacheLoader*, Profile*> LoadersMap; 110 typedef std::map<ExternalPrefCacheLoader*, Profile*> LoadersMap;
106 111
107 ExternalCacheDispatcher() 112 ExternalCacheDispatcher()
108 : external_cache_(base::FilePath(kPreinstalledAppsCacheDir), 113 : external_cache_(base::FilePath(kPreinstalledAppsCacheDir),
109 g_browser_process->system_request_context(), 114 g_browser_process->system_request_context(),
110 content::BrowserThread::GetBlockingPool()-> 115 content::BrowserThread::GetBlockingPool()->
111 GetSequencedTaskRunnerWithShutdownBehavior( 116 GetSequencedTaskRunnerWithShutdownBehavior(
112 content::BrowserThread::GetBlockingPool()-> 117 content::BrowserThread::GetBlockingPool()->
113 GetSequenceToken(), 118 GetSequenceToken(),
114 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN), 119 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN),
115 this, 120 this,
116 true, 121 true,
117 true), 122 true),
118 base_path_id_(0), 123 base_path_id_(0),
119 is_extensions_list_ready_(false) { 124 is_extensions_list_ready_(false) {
125 DCHECK(!ExternalCacheDispatcher::instance_);
126 }
127
128 virtual ~ExternalCacheDispatcher() {
129 ExternalCacheDispatcher::instance_ = NULL;
120 } 130 }
121 131
122 ExternalCache external_cache_; 132 ExternalCache external_cache_;
123 LoadersMap pref_loaders_; 133 LoadersMap pref_loaders_;
124 int base_path_id_; 134 int base_path_id_;
125 bool is_extensions_list_ready_; 135 bool is_extensions_list_ready_;
126 136
137 static ExternalCacheDispatcher* instance_;
138
127 DISALLOW_COPY_AND_ASSIGN(ExternalCacheDispatcher); 139 DISALLOW_COPY_AND_ASSIGN(ExternalCacheDispatcher);
128 }; 140 };
129 141
130 } // namespace 142 ExternalCacheDispatcher* ExternalCacheDispatcher::instance_ = NULL;
131 143
132 ExternalPrefCacheLoader::ExternalPrefCacheLoader(int base_path_id, 144 ExternalPrefCacheLoader::ExternalPrefCacheLoader(int base_path_id,
133 Profile* profile) 145 Profile* profile)
134 : ExternalPrefLoader(base_path_id, ExternalPrefLoader::NONE), 146 : ExternalPrefLoader(base_path_id, ExternalPrefLoader::NONE),
135 profile_(profile) { 147 profile_(profile),
148 cache_dispatcher_(ExternalCacheDispatcher::GetInstance()) {
136 } 149 }
137 150
138 ExternalPrefCacheLoader::~ExternalPrefCacheLoader() { 151 ExternalPrefCacheLoader::~ExternalPrefCacheLoader() {
139 ExternalCacheDispatcher::GetInstance()->UnregisterExternalPrefCacheLoader( 152 cache_dispatcher_->UnregisterExternalPrefCacheLoader(this);
140 this);
141 } 153 }
142 154
143 void ExternalPrefCacheLoader::OnExtensionListsUpdated( 155 void ExternalPrefCacheLoader::OnExtensionListsUpdated(
144 const base::DictionaryValue* prefs) { 156 const base::DictionaryValue* prefs) {
145 prefs_.reset(prefs->DeepCopy()); 157 prefs_.reset(prefs->DeepCopy());
146 ExternalPrefLoader::LoadFinished(); 158 ExternalPrefLoader::LoadFinished();
147 } 159 }
148 160
149 void ExternalPrefCacheLoader::StartLoading() { 161 void ExternalPrefCacheLoader::StartLoading() {
150 if (!ExternalCacheDispatcher::GetInstance()->RegisterExternalPrefCacheLoader( 162 if (!cache_dispatcher_->RegisterExternalPrefCacheLoader(
151 this, base_path_id_, profile_)) { 163 this, base_path_id_, profile_)) {
152 // ExternalCacheDispatcher doesn't know list of extensions load it. 164 // ExternalCacheDispatcher doesn't know list of extensions load it.
153 ExternalPrefLoader::StartLoading(); 165 ExternalPrefLoader::StartLoading();
154 } 166 }
155 } 167 }
156 168
157 void ExternalPrefCacheLoader::LoadFinished() { 169 void ExternalPrefCacheLoader::LoadFinished() {
158 ExternalCacheDispatcher::GetInstance()->UpdateExtensionsList(prefs_.Pass()); 170 cache_dispatcher_->UpdateExtensionsList(prefs_.Pass());
159 } 171 }
160 172
161 } // namespace chromeos 173 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698