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

Side by Side Diff: content/browser/appcache/appcache_update_job.cc

Issue 1471163002: AppCache: fix a browser crashing bug that can happen during updates. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2564
Patch Set: Created 5 years 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
« no previous file with comments | « content/browser/appcache/appcache_update_job.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "content/browser/appcache/appcache_update_job.h" 5 #include "content/browser/appcache/appcache_update_job.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/compiler_specific.h" 9 #include "base/compiler_specific.h"
10 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 weak_factory_(this) { 398 weak_factory_(this) {
399 service_->AddObserver(this); 399 service_->AddObserver(this);
400 } 400 }
401 401
402 AppCacheUpdateJob::~AppCacheUpdateJob() { 402 AppCacheUpdateJob::~AppCacheUpdateJob() {
403 if (service_) 403 if (service_)
404 service_->RemoveObserver(this); 404 service_->RemoveObserver(this);
405 if (internal_state_ != COMPLETED) 405 if (internal_state_ != COMPLETED)
406 Cancel(); 406 Cancel();
407 407
408 DCHECK(!manifest_fetcher_);
409 DCHECK(pending_url_fetches_.empty());
410 DCHECK(!inprogress_cache_.get()); 408 DCHECK(!inprogress_cache_.get());
411 DCHECK(pending_master_entries_.empty()); 409 DCHECK(pending_master_entries_.empty());
412 DCHECK(master_entry_fetches_.empty()); 410
411 // The job must not outlive any of its fetchers.
412 CHECK(!manifest_fetcher_);
413 CHECK(pending_url_fetches_.empty());
414 CHECK(master_entry_fetches_.empty());
413 415
414 if (group_) 416 if (group_)
415 group_->SetUpdateAppCacheStatus(AppCacheGroup::IDLE); 417 group_->SetUpdateAppCacheStatus(AppCacheGroup::IDLE);
416 } 418 }
417 419
418 void AppCacheUpdateJob::StartUpdate(AppCacheHost* host, 420 void AppCacheUpdateJob::StartUpdate(AppCacheHost* host,
419 const GURL& new_master_resource) { 421 const GURL& new_master_resource) {
420 DCHECK(group_->update_job() == this); 422 DCHECK(group_->update_job() == this);
421 DCHECK(!group_->is_obsolete()); 423 DCHECK(!group_->is_obsolete());
422 424
423 bool is_new_pending_master_entry = false; 425 bool is_new_pending_master_entry = false;
424 if (!new_master_resource.is_empty()) { 426 if (!new_master_resource.is_empty()) {
425 DCHECK(new_master_resource == host->pending_master_entry_url()); 427 DCHECK(new_master_resource == host->pending_master_entry_url());
426 DCHECK(!new_master_resource.has_ref()); 428 DCHECK(!new_master_resource.has_ref());
427 DCHECK(new_master_resource.GetOrigin() == manifest_url_.GetOrigin()); 429 DCHECK(new_master_resource.GetOrigin() == manifest_url_.GetOrigin());
428 430
431 if (ContainsKey(failed_master_entries_, new_master_resource))
432 return;
433
429 // Cannot add more to this update if already terminating. 434 // Cannot add more to this update if already terminating.
430 if (IsTerminating()) { 435 if (IsTerminating()) {
431 group_->QueueUpdate(host, new_master_resource); 436 group_->QueueUpdate(host, new_master_resource);
432 return; 437 return;
433 } 438 }
434 439
435 std::pair<PendingMasters::iterator, bool> ret = 440 std::pair<PendingMasters::iterator, bool> ret =
436 pending_master_entries_.insert( 441 pending_master_entries_.insert(
437 PendingMasters::value_type(new_master_resource, PendingHosts())); 442 PendingMasters::value_type(new_master_resource, PendingHosts()));
438 is_new_pending_master_entry = ret.second; 443 is_new_pending_master_entry = ret.second;
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after
856 host_notifier.AddHost(host); 861 host_notifier.AddHost(host);
857 862
858 // In downloading case, disassociate host from inprogress cache. 863 // In downloading case, disassociate host from inprogress cache.
859 if (inprogress_cache_.get()) 864 if (inprogress_cache_.get())
860 host->AssociateNoCache(GURL()); 865 host->AssociateNoCache(GURL());
861 866
862 host->RemoveObserver(this); 867 host->RemoveObserver(this);
863 } 868 }
864 hosts.clear(); 869 hosts.clear();
865 870
871 failed_master_entries_.insert(url);
872
866 const char* kFormatString = "Manifest fetch failed (%d) %s"; 873 const char* kFormatString = "Manifest fetch failed (%d) %s";
867 std::string message = FormatUrlErrorMessage( 874 std::string message = FormatUrlErrorMessage(
868 kFormatString, request->url(), fetcher->result(), response_code); 875 kFormatString, request->url(), fetcher->result(), response_code);
869 host_notifier.SendErrorNotifications( 876 host_notifier.SendErrorNotifications(
870 AppCacheErrorDetails(message, 877 AppCacheErrorDetails(message,
871 APPCACHE_MANIFEST_ERROR, 878 APPCACHE_MANIFEST_ERROR,
872 request->url(), 879 request->url(),
873 response_code, 880 response_code,
874 false /*is_cross_origin*/)); 881 false /*is_cross_origin*/));
875 882
(...skipping 822 matching lines...) Expand 10 before | Expand all | Expand 10 after
1698 // on this object after we've posted a task to delete ourselves. 1705 // on this object after we've posted a task to delete ourselves.
1699 if (group_) { 1706 if (group_) {
1700 group_->SetUpdateAppCacheStatus(AppCacheGroup::IDLE); 1707 group_->SetUpdateAppCacheStatus(AppCacheGroup::IDLE);
1701 group_ = NULL; 1708 group_ = NULL;
1702 } 1709 }
1703 1710
1704 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); 1711 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
1705 } 1712 }
1706 1713
1707 } // namespace content 1714 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/appcache/appcache_update_job.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698