| OLD | NEW |
| 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 "webkit/browser/appcache/appcache_service.h" | 5 #include "webkit/browser/appcache/appcache_service.h" |
| 6 | 6 |
| 7 #include <functional> | 7 #include <functional> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| (...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 check_result = AppCacheHistograms::UNEXPECTED_DATA_SIZE; | 418 check_result = AppCacheHistograms::UNEXPECTED_DATA_SIZE; |
| 419 else | 419 else |
| 420 check_result = AppCacheHistograms::RESPONSE_OK; | 420 check_result = AppCacheHistograms::RESPONSE_OK; |
| 421 AppCacheHistograms::CountCheckResponseResult(check_result); | 421 AppCacheHistograms::CountCheckResponseResult(check_result); |
| 422 | 422 |
| 423 if (check_result != AppCacheHistograms::RESPONSE_OK) | 423 if (check_result != AppCacheHistograms::RESPONSE_OK) |
| 424 service_->DeleteAppCacheGroup(manifest_url_, net::CompletionCallback()); | 424 service_->DeleteAppCacheGroup(manifest_url_, net::CompletionCallback()); |
| 425 delete this; | 425 delete this; |
| 426 } | 426 } |
| 427 | 427 |
| 428 | |
| 429 // AppCacheStorageReference ------ | 428 // AppCacheStorageReference ------ |
| 430 | 429 |
| 431 AppCacheStorageReference::AppCacheStorageReference( | 430 AppCacheStorageReference::AppCacheStorageReference( |
| 432 scoped_ptr<AppCacheStorage> storage) | 431 scoped_ptr<AppCacheStorage> storage) |
| 433 : storage_(storage.Pass()) {} | 432 : storage_(storage.Pass()) {} |
| 434 AppCacheStorageReference::~AppCacheStorageReference() {} | 433 AppCacheStorageReference::~AppCacheStorageReference() {} |
| 435 | 434 |
| 436 // AppCacheService ------- | 435 // AppCacheService ------- |
| 437 | 436 |
| 438 AppCacheService::AppCacheService(quota::QuotaManagerProxy* quota_manager_proxy) | 437 AppCacheService::AppCacheService(quota::QuotaManagerProxy* quota_manager_proxy) |
| 439 : appcache_policy_(NULL), quota_client_(NULL), handler_factory_(NULL), | 438 : appcache_policy_(NULL), quota_client_(NULL), handler_factory_(NULL), |
| 440 quota_manager_proxy_(quota_manager_proxy), | 439 quota_manager_proxy_(quota_manager_proxy), |
| 441 request_context_(NULL), | 440 request_context_(NULL), |
| 442 force_keep_session_state_(false), | 441 force_keep_session_state_(false) { |
| 443 was_reinitialized_(false) { | |
| 444 if (quota_manager_proxy_.get()) { | 442 if (quota_manager_proxy_.get()) { |
| 445 quota_client_ = new AppCacheQuotaClient(this); | 443 quota_client_ = new AppCacheQuotaClient(this); |
| 446 quota_manager_proxy_->RegisterClient(quota_client_); | 444 quota_manager_proxy_->RegisterClient(quota_client_); |
| 447 } | 445 } |
| 448 } | 446 } |
| 449 | 447 |
| 450 AppCacheService::~AppCacheService() { | 448 AppCacheService::~AppCacheService() { |
| 451 DCHECK(backends_.empty()); | 449 DCHECK(backends_.empty()); |
| 452 std::for_each(pending_helpers_.begin(), | 450 std::for_each(pending_helpers_.begin(), |
| 453 pending_helpers_.end(), | 451 pending_helpers_.end(), |
| (...skipping 12 matching lines...) Expand all Loading... |
| 466 base::MessageLoopProxy* cache_thread) { | 464 base::MessageLoopProxy* cache_thread) { |
| 467 DCHECK(!storage_.get()); | 465 DCHECK(!storage_.get()); |
| 468 cache_directory_ = cache_directory; | 466 cache_directory_ = cache_directory; |
| 469 db_thread_ = db_thread; | 467 db_thread_ = db_thread; |
| 470 cache_thread_ = cache_thread; | 468 cache_thread_ = cache_thread; |
| 471 AppCacheStorageImpl* storage = new AppCacheStorageImpl(this); | 469 AppCacheStorageImpl* storage = new AppCacheStorageImpl(this); |
| 472 storage->Initialize(cache_directory, db_thread, cache_thread); | 470 storage->Initialize(cache_directory, db_thread, cache_thread); |
| 473 storage_.reset(storage); | 471 storage_.reset(storage); |
| 474 } | 472 } |
| 475 | 473 |
| 474 void AppCacheService::ScheduleReinitialize() { |
| 475 if (reinit_timer_.IsRunning()) |
| 476 return; |
| 477 |
| 478 // Reinitialization only happens when corruption has been noticed. |
| 479 // We don't want to thrash the disk but we also don't want to |
| 480 // leave the appcache disabled for an indefinite period of time. Some |
| 481 // users never shutdown the browser. |
| 482 |
| 483 const base::TimeDelta kZeroDelta; |
| 484 const base::TimeDelta kOneHour(base::TimeDelta::FromHours(1)); |
| 485 const base::TimeDelta k30Seconds(base::TimeDelta::FromSeconds(30)); |
| 486 |
| 487 // If the system managed to stay up for long enough, reset the |
| 488 // delay so a new failure won't incur a long wait to get going again. |
| 489 base::TimeDelta up_time = base::Time::Now() - last_reinit_time_; |
| 490 if (next_reinit_delay_ != kZeroDelta && up_time > kOneHour) |
| 491 next_reinit_delay_ = kZeroDelta; |
| 492 |
| 493 reinit_timer_.Start(FROM_HERE, next_reinit_delay_, |
| 494 this, &AppCacheService::Reinitialize); |
| 495 |
| 496 // Adjust the delay for next time. |
| 497 base::TimeDelta increment = std::max(k30Seconds, next_reinit_delay_); |
| 498 next_reinit_delay_ = std::min(next_reinit_delay_ + increment, kOneHour); |
| 499 } |
| 500 |
| 476 void AppCacheService::Reinitialize() { | 501 void AppCacheService::Reinitialize() { |
| 477 AppCacheHistograms::CountReinitAttempt(was_reinitialized_); | 502 AppCacheHistograms::CountReinitAttempt(!last_reinit_time_.is_null()); |
| 478 | 503 last_reinit_time_ = base::Time::Now(); |
| 479 // To avoid thrashing, we only do this once. | |
| 480 if (was_reinitialized_) | |
| 481 return; | |
| 482 was_reinitialized_ = true; | |
| 483 | 504 |
| 484 // Inform observers of about this and give them a chance to | 505 // Inform observers of about this and give them a chance to |
| 485 // defer deletion of the old storage object. | 506 // defer deletion of the old storage object. |
| 486 scoped_refptr<AppCacheStorageReference> | 507 scoped_refptr<AppCacheStorageReference> |
| 487 old_storage_ref(new AppCacheStorageReference(storage_.Pass())); | 508 old_storage_ref(new AppCacheStorageReference(storage_.Pass())); |
| 488 FOR_EACH_OBSERVER(Observer, observers_, | 509 FOR_EACH_OBSERVER(Observer, observers_, |
| 489 OnServiceReinitialized(old_storage_ref.get())); | 510 OnServiceReinitialized(old_storage_ref.get())); |
| 490 | 511 |
| 491 Initialize(cache_directory_, db_thread_, cache_thread_); | 512 Initialize(cache_directory_, db_thread_, cache_thread_); |
| 492 } | 513 } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 540 backends_.insert( | 561 backends_.insert( |
| 541 BackendMap::value_type(backend_impl->process_id(), backend_impl)); | 562 BackendMap::value_type(backend_impl->process_id(), backend_impl)); |
| 542 } | 563 } |
| 543 | 564 |
| 544 void AppCacheService::UnregisterBackend( | 565 void AppCacheService::UnregisterBackend( |
| 545 AppCacheBackendImpl* backend_impl) { | 566 AppCacheBackendImpl* backend_impl) { |
| 546 backends_.erase(backend_impl->process_id()); | 567 backends_.erase(backend_impl->process_id()); |
| 547 } | 568 } |
| 548 | 569 |
| 549 } // namespace appcache | 570 } // namespace appcache |
| OLD | NEW |