Index: webkit/browser/fileapi/quota/quota_reservation.cc |
diff --git a/webkit/browser/fileapi/quota/quota_reservation.cc b/webkit/browser/fileapi/quota/quota_reservation.cc |
index c5a22ab261429eb13faa72d64b455b297c8dc70d..da4ef9581a6a9899a7a0f2381907ce790c57404f 100644 |
--- a/webkit/browser/fileapi/quota/quota_reservation.cc |
+++ b/webkit/browser/fileapi/quota/quota_reservation.cc |
@@ -15,6 +15,7 @@ void QuotaReservation::RefreshReservation( |
const StatusCallback& callback) { |
DCHECK(sequence_checker_.CalledOnValidSequencedThread()); |
DCHECK(!running_refresh_request_); |
+ DCHECK(!client_crashed_); |
if (!reservation_manager()) |
return; |
@@ -33,11 +34,13 @@ void QuotaReservation::RefreshReservation( |
scoped_ptr<OpenFileHandle> QuotaReservation::GetOpenFileHandle( |
const base::FilePath& platform_path) { |
DCHECK(sequence_checker_.CalledOnValidSequencedThread()); |
+ DCHECK(!client_crashed_); |
return reservation_buffer_->GetOpenFileHandle(this, platform_path); |
} |
void QuotaReservation::OnClientCrash() { |
DCHECK(sequence_checker_.CalledOnValidSequencedThread()); |
+ client_crashed_ = true; |
if (remaining_quota_) { |
reservation_buffer_->PutReservationToBuffer(remaining_quota_); |
@@ -48,7 +51,9 @@ void QuotaReservation::OnClientCrash() { |
void QuotaReservation::ConsumeReservation(int64 size) { |
DCHECK(sequence_checker_.CalledOnValidSequencedThread()); |
DCHECK_LT(0, size); |
- DCHECK_LT(size, remaining_quota_); |
+ DCHECK_LE(size, remaining_quota_); |
+ if (client_crashed_) |
+ return; |
remaining_quota_ -= size; |
reservation_buffer_->PutReservationToBuffer(size); |
@@ -68,7 +73,8 @@ FileSystemType QuotaReservation::type() const { |
QuotaReservation::QuotaReservation( |
QuotaReservationBuffer* reservation_buffer) |
- : running_refresh_request_(false), |
+ : client_crashed_(false), |
+ running_refresh_request_(false), |
remaining_quota_(0), |
reservation_buffer_(reservation_buffer), |
weak_ptr_factory_(this) { |
@@ -93,11 +99,11 @@ bool QuotaReservation::AdaptDidUpdateReservedQuota( |
if (!reservation) |
return false; |
- reservation->DidUpdateReservedQuota(new_reserved_size, callback, error); |
- return true; |
+ return reservation->DidUpdateReservedQuota( |
+ new_reserved_size, callback, error); |
} |
-void QuotaReservation::DidUpdateReservedQuota( |
+bool QuotaReservation::DidUpdateReservedQuota( |
int64 new_reserved_size, |
const StatusCallback& callback, |
base::PlatformFileError error) { |
@@ -105,9 +111,15 @@ void QuotaReservation::DidUpdateReservedQuota( |
DCHECK(running_refresh_request_); |
running_refresh_request_ = false; |
+ if (client_crashed_) { |
+ callback.Run(base::PLATFORM_FILE_ERROR_ABORT); |
+ return false; |
+ } |
+ |
if (error == base::PLATFORM_FILE_OK) |
remaining_quota_ = new_reserved_size; |
callback.Run(error); |
+ return true; |
} |
} // namespace fileapi |