diff options
author | michaeln <michaeln@chromium.org> | 2015-11-20 16:41:58 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-21 00:43:17 +0000 |
commit | e5c298b780737c53fa9aae44d6fef522931d88b0 (patch) | |
tree | 424f9b0f1ccdfbc604ecfc7f0895990777d661aa /content/browser/appcache | |
parent | d4e148a23edb5edda2028d572092f447048c750c (diff) | |
download | chromium_src-e5c298b780737c53fa9aae44d6fef522931d88b0.zip chromium_src-e5c298b780737c53fa9aae44d6fef522931d88b0.tar.gz chromium_src-e5c298b780737c53fa9aae44d6fef522931d88b0.tar.bz2 |
AppCache: fix a browser crashing bug that can happen during updates.
BUG=558589
Review URL: https://codereview.chromium.org/1463463003
Cr-Commit-Position: refs/heads/master@{#360967}
Diffstat (limited to 'content/browser/appcache')
-rw-r--r-- | content/browser/appcache/appcache_update_job.cc | 13 | ||||
-rw-r--r-- | content/browser/appcache/appcache_update_job.h | 1 |
2 files changed, 11 insertions, 3 deletions
diff --git a/content/browser/appcache/appcache_update_job.cc b/content/browser/appcache/appcache_update_job.cc index e0c2372..4b0d922 100644 --- a/content/browser/appcache/appcache_update_job.cc +++ b/content/browser/appcache/appcache_update_job.cc @@ -406,11 +406,13 @@ AppCacheUpdateJob::~AppCacheUpdateJob() { if (internal_state_ != COMPLETED) Cancel(); - DCHECK(!manifest_fetcher_); - DCHECK(pending_url_fetches_.empty()); DCHECK(!inprogress_cache_.get()); DCHECK(pending_master_entries_.empty()); - DCHECK(master_entry_fetches_.empty()); + + // The job must not outlive any of its fetchers. + CHECK(!manifest_fetcher_); + CHECK(pending_url_fetches_.empty()); + CHECK(master_entry_fetches_.empty()); if (group_) group_->SetUpdateAppCacheStatus(AppCacheGroup::IDLE); @@ -427,6 +429,9 @@ void AppCacheUpdateJob::StartUpdate(AppCacheHost* host, DCHECK(!new_master_resource.has_ref()); DCHECK(new_master_resource.GetOrigin() == manifest_url_.GetOrigin()); + if (ContainsKey(failed_master_entries_, new_master_resource)) + return; + // Cannot add more to this update if already terminating. if (IsTerminating()) { group_->QueueUpdate(host, new_master_resource); @@ -864,6 +869,8 @@ void AppCacheUpdateJob::HandleMasterEntryFetchCompleted( } hosts.clear(); + failed_master_entries_.insert(url); + const char* kFormatString = "Manifest fetch failed (%d) %s"; std::string message = FormatUrlErrorMessage( kFormatString, request->url(), fetcher->result(), response_code); diff --git a/content/browser/appcache/appcache_update_job.h b/content/browser/appcache/appcache_update_job.h index e876ad0..eaee83b 100644 --- a/content/browser/appcache/appcache_update_job.h +++ b/content/browser/appcache/appcache_update_job.h @@ -283,6 +283,7 @@ class CONTENT_EXPORT AppCacheUpdateJob PendingMasters pending_master_entries_; size_t master_entries_completed_; + std::set<GURL> failed_master_entries_; // TODO(jennb): Delete when update no longer fetches master entries directly. // Helper containers to track which pending master entries have yet to be |