summaryrefslogtreecommitdiffstats
path: root/content/browser/appcache
diff options
context:
space:
mode:
authormichaeln <michaeln@chromium.org>2015-11-20 16:41:58 -0800
committerCommit bot <commit-bot@chromium.org>2015-11-21 00:43:17 +0000
commite5c298b780737c53fa9aae44d6fef522931d88b0 (patch)
tree424f9b0f1ccdfbc604ecfc7f0895990777d661aa /content/browser/appcache
parentd4e148a23edb5edda2028d572092f447048c750c (diff)
downloadchromium_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.cc13
-rw-r--r--content/browser/appcache/appcache_update_job.h1
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