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

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

Issue 300843013: Install and launch kiosk app from cached crx file at start up. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix ExternalProviderImplChromeOSTest.AppMode test case. Created 6 years, 5 months 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_cache.h" 5 #include "chrome/browser/chromeos/extensions/external_cache.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/file_util.h" 10 #include "base/file_util.h"
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 ExternalCache::~ExternalCache() { 51 ExternalCache::~ExternalCache() {
52 } 52 }
53 53
54 void ExternalCache::Shutdown(const base::Closure& callback) { 54 void ExternalCache::Shutdown(const base::Closure& callback) {
55 local_cache_.Shutdown(callback); 55 local_cache_.Shutdown(callback);
56 } 56 }
57 57
58 void ExternalCache::UpdateExtensionsList( 58 void ExternalCache::UpdateExtensionsList(
59 scoped_ptr<base::DictionaryValue> prefs) { 59 scoped_ptr<base::DictionaryValue> prefs) {
60 extensions_ = prefs.Pass(); 60 extensions_ = prefs.Pass();
61 extensions_status_.clear();
61 62
62 if (extensions_->empty()) { 63 if (extensions_->empty()) {
63 // If list of know extensions is empty, don't init cache on disk. It is 64 // If list of know extensions is empty, don't init cache on disk. It is
64 // important shortcut for test to don't wait forever for cache dir 65 // important shortcut for test to don't wait forever for cache dir
65 // initialization that should happen outside of Chrome on real device. 66 // initialization that should happen outside of Chrome on real device.
66 cached_extensions_->Clear(); 67 cached_extensions_->Clear();
67 UpdateExtensionLoader(); 68 UpdateExtensionLoader();
68 return; 69 return;
69 } 70 }
70 71
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 145
145 void ExternalCache::OnExtensionDownloadFailed( 146 void ExternalCache::OnExtensionDownloadFailed(
146 const std::string& id, 147 const std::string& id,
147 extensions::ExtensionDownloaderDelegate::Error error, 148 extensions::ExtensionDownloaderDelegate::Error error,
148 const extensions::ExtensionDownloaderDelegate::PingResult& ping_result, 149 const extensions::ExtensionDownloaderDelegate::PingResult& ping_result,
149 const std::set<int>& request_ids) { 150 const std::set<int>& request_ids) {
150 if (error == NO_UPDATE_AVAILABLE) { 151 if (error == NO_UPDATE_AVAILABLE) {
151 if (!cached_extensions_->HasKey(id)) { 152 if (!cached_extensions_->HasKey(id)) {
152 LOG(ERROR) << "ExternalCache extension " << id 153 LOG(ERROR) << "ExternalCache extension " << id
153 << " not found on update server"; 154 << " not found on update server";
155 extensions_status_[id] = DOWNLOAD_FAILED;
154 delegate_->OnExtensionDownloadFailed(id, error); 156 delegate_->OnExtensionDownloadFailed(id, error);
155 } else { 157 } else {
158 // No version update for an already cached extension.
159 extensions_status_[id] = DOWNLOAD_SUCCEEDED;
156 delegate_->OnExtensionLoadedInCache(id); 160 delegate_->OnExtensionLoadedInCache(id);
157 } 161 }
158 } else { 162 } else {
159 LOG(ERROR) << "ExternalCache failed to download extension " << id 163 LOG(ERROR) << "ExternalCache failed to download extension " << id
160 << ", error " << error; 164 << ", error " << error;
165 extensions_status_[id] = DOWNLOAD_FAILED;
161 delegate_->OnExtensionDownloadFailed(id, error); 166 delegate_->OnExtensionDownloadFailed(id, error);
162 } 167 }
163 } 168 }
164 169
165 void ExternalCache::OnExtensionDownloadFinished( 170 void ExternalCache::OnExtensionDownloadFinished(
166 const std::string& id, 171 const std::string& id,
167 const base::FilePath& path, 172 const base::FilePath& path,
168 bool file_ownership_passed, 173 bool file_ownership_passed,
169 const GURL& download_url, 174 const GURL& download_url,
170 const std::string& version, 175 const std::string& version,
(...skipping 18 matching lines...) Expand all
189 if (extension_dictionary->GetString( 194 if (extension_dictionary->GetString(
190 extensions::ExternalProviderImpl::kExternalVersion, version)) { 195 extensions::ExternalProviderImpl::kExternalVersion, version)) {
191 return true; 196 return true;
192 } 197 }
193 *version = delegate_->GetInstalledExtensionVersion(id); 198 *version = delegate_->GetInstalledExtensionVersion(id);
194 return !version->empty(); 199 return !version->empty();
195 } 200 }
196 return false; 201 return false;
197 } 202 }
198 203
204 bool ExternalCache::IsExtensionPendingForUpdateCheck(const std::string& id) {
205 return extensions_->HasKey(id) && cached_extensions_->HasKey(id) &&
206 extensions_status_.find(id) != extensions_status_.end() &&
207 extensions_status_[id] == DOWNLOAD_PENDING;
208 }
209
210 bool ExternalCache::IsExtensionDownloadFailed(const std::string& id) {
211 return extensions_status_.find(id) != extensions_status_.end() &&
212 extensions_status_[id] == DOWNLOAD_FAILED;
213 }
214
199 void ExternalCache::UpdateExtensionLoader() { 215 void ExternalCache::UpdateExtensionLoader() {
200 VLOG(1) << "Notify ExternalCache delegate about cache update"; 216 VLOG(1) << "Notify ExternalCache delegate about cache update";
201 if (delegate_) 217 if (delegate_)
202 delegate_->OnExtensionListsUpdated(cached_extensions_.get()); 218 delegate_->OnExtensionListsUpdated(cached_extensions_.get());
203 } 219 }
204 220
205 void ExternalCache::CheckCache() { 221 void ExternalCache::CheckCache() {
206 if (local_cache_.is_shutdown()) 222 if (local_cache_.is_shutdown())
207 return; 223 return;
208 224
209 // If request_context_ is missing we can't download anything. 225 // If request_context_ is missing we can't download anything.
210 if (!downloader_ && request_context_) { 226 if (!downloader_ && request_context_) {
211 downloader_.reset( 227 downloader_.reset(
212 new extensions::ExtensionDownloader(this, request_context_)); 228 new extensions::ExtensionDownloader(this, request_context_));
213 } 229 }
214 230
215 cached_extensions_->Clear(); 231 cached_extensions_->Clear();
232 extensions_status_.clear();
216 for (base::DictionaryValue::Iterator it(*extensions_.get()); 233 for (base::DictionaryValue::Iterator it(*extensions_.get());
217 !it.IsAtEnd(); it.Advance()) { 234 !it.IsAtEnd(); it.Advance()) {
218 const base::DictionaryValue* entry = NULL; 235 const base::DictionaryValue* entry = NULL;
219 if (!it.value().GetAsDictionary(&entry)) { 236 if (!it.value().GetAsDictionary(&entry)) {
220 LOG(ERROR) << "ExternalCache found bad entry with type " 237 LOG(ERROR) << "ExternalCache found bad entry with type "
221 << it.value().GetType(); 238 << it.value().GetType();
222 continue; 239 continue;
223 } 240 }
224 241
225 bool keep_if_present = 242 bool keep_if_present =
226 entry->HasKey(extensions::ExternalProviderImpl::kKeepIfPresent); 243 entry->HasKey(extensions::ExternalProviderImpl::kKeepIfPresent);
227 std::string external_update_url; 244 std::string external_update_url;
228 entry->GetString(extensions::ExternalProviderImpl::kExternalUpdateUrl, 245 entry->GetString(extensions::ExternalProviderImpl::kExternalUpdateUrl,
229 &external_update_url); 246 &external_update_url);
230 if (downloader_ && !keep_if_present) { 247 if (downloader_ && !keep_if_present) {
231 GURL update_url; 248 GURL update_url;
232 if (!external_update_url.empty()) 249 if (!external_update_url.empty())
233 update_url = GURL(external_update_url); 250 update_url = GURL(external_update_url);
234 else if (always_check_updates_) 251 else if (always_check_updates_)
235 update_url = extension_urls::GetWebstoreUpdateUrl(); 252 update_url = extension_urls::GetWebstoreUpdateUrl();
236 253
237 if (update_url.is_valid()) 254 if (update_url.is_valid()) {
238 downloader_->AddPendingExtension(it.key(), update_url, 0); 255 downloader_->AddPendingExtension(it.key(), update_url, 0);
256 extensions_status_[it.key()] = DOWNLOAD_PENDING;
257 }
239 } 258 }
240 259
241 base::FilePath file_path; 260 base::FilePath file_path;
242 std::string version; 261 std::string version;
243 if (local_cache_.GetExtension(it.key(), &file_path, &version)) { 262 if (local_cache_.GetExtension(it.key(), &file_path, &version)) {
244 // Copy entry to don't modify it inside extensions_. 263 // Copy entry to don't modify it inside extensions_.
245 base::DictionaryValue* entry_copy = entry->DeepCopy(); 264 base::DictionaryValue* entry_copy = entry->DeepCopy();
246 265
247 if (extension_urls::IsWebstoreUpdateUrl(GURL(external_update_url))) { 266 if (extension_urls::IsWebstoreUpdateUrl(GURL(external_update_url))) {
248 entry_copy->SetBoolean( 267 entry_copy->SetBoolean(
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 &update_url) && 327 &update_url) &&
309 extension_urls::IsWebstoreUpdateUrl(GURL(update_url))) { 328 extension_urls::IsWebstoreUpdateUrl(GURL(update_url))) {
310 entry->SetBoolean(extensions::ExternalProviderImpl::kIsFromWebstore, true); 329 entry->SetBoolean(extensions::ExternalProviderImpl::kIsFromWebstore, true);
311 } 330 }
312 entry->Remove(extensions::ExternalProviderImpl::kExternalUpdateUrl, NULL); 331 entry->Remove(extensions::ExternalProviderImpl::kExternalUpdateUrl, NULL);
313 entry->SetString(extensions::ExternalProviderImpl::kExternalVersion, version); 332 entry->SetString(extensions::ExternalProviderImpl::kExternalVersion, version);
314 entry->SetString(extensions::ExternalProviderImpl::kExternalCrx, 333 entry->SetString(extensions::ExternalProviderImpl::kExternalCrx,
315 file_path.value()); 334 file_path.value());
316 335
317 cached_extensions_->Set(id, entry); 336 cached_extensions_->Set(id, entry);
337 extensions_status_[id] = DOWNLOAD_SUCCEEDED;
318 if (delegate_) 338 if (delegate_)
319 delegate_->OnExtensionLoadedInCache(id); 339 delegate_->OnExtensionLoadedInCache(id);
320 UpdateExtensionLoader(); 340 UpdateExtensionLoader();
321 } 341 }
322 342
323 std::string ExternalCache::Delegate::GetInstalledExtensionVersion( 343 std::string ExternalCache::Delegate::GetInstalledExtensionVersion(
324 const std::string& id) { 344 const std::string& id) {
325 return std::string(); 345 return std::string();
326 } 346 }
327 347
328 } // namespace chromeos 348 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698