OLD | NEW |
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 Loading... |
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 |
OLD | NEW |