| 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 |