Index: extensions/browser/content_verify_job.cc |
diff --git a/extensions/browser/content_verify_job.cc b/extensions/browser/content_verify_job.cc |
index e2f9f7eb9c84e0853eed096ae2656c1b6e442d47..211f5b5dfea56b160a75ba7b43c0ed9d2df86de6 100644 |
--- a/extensions/browser/content_verify_job.cc |
+++ b/extensions/browser/content_verify_job.cc |
@@ -134,17 +134,23 @@ void ContentVerifyJob::DoneReading() { |
} |
done_reading_ = true; |
if (hashes_ready_) { |
- if (!FinishBlock()) |
+ if (!FinishBlock()) { |
DispatchFailureCallback(HASH_MISMATCH); |
- else if (g_test_observer) |
+ } else if (g_test_observer) { |
g_test_observer->JobFinished(hash_reader_->extension_id(), |
- hash_reader_->relative_path(), failed_); |
+ hash_reader_->relative_path(), NONE); |
+ } |
} |
} |
bool ContentVerifyJob::FinishBlock() { |
- if (current_hash_byte_count_ <= 0) |
+ if (!done_reading_ && current_hash_byte_count_ == 0) |
return true; |
+ if (!current_hash_) { |
+ // This happens when we fail to read the resource. Compute empty content's |
+ // hash in this case. |
+ current_hash_ = crypto::SecureHash::Create(crypto::SecureHash::SHA256); |
+ } |
std::string final(crypto::kSHA256Length, 0); |
current_hash_->Finish(base::string_as_array(& final), final.size()); |
current_hash_.reset(); |
@@ -154,23 +160,33 @@ bool ContentVerifyJob::FinishBlock() { |
const std::string* expected_hash = NULL; |
if (!hash_reader_->GetHashForBlock(block, &expected_hash) || |
- *expected_hash != final) |
+ *expected_hash != final) { |
return false; |
+ } |
return true; |
} |
void ContentVerifyJob::OnHashesReady(bool success) { |
if (!success && !g_test_delegate) { |
- if (!hash_reader_->content_exists()) { |
+ // TODO(lazyboy): Make ContentHashReader::Init return an enum instead of |
+ // bool. This should make the following checks on |hash_reader_| easier |
+ // to digest and will avoid future bugs from creeping up. |
+ if (!hash_reader_->have_verified_contents() || |
+ !hash_reader_->have_computed_hashes()) { |
+ DispatchFailureCallback(MISSING_ALL_HASHES); |
+ return; |
+ } |
+ |
+ if (hash_reader_->file_missing_from_verified_contents()) { |
// Ignore verification of non-existent resources. |
+ if (g_test_observer) { |
+ g_test_observer->JobFinished(hash_reader_->extension_id(), |
+ hash_reader_->relative_path(), NONE); |
+ } |
return; |
- } else if (hash_reader_->have_verified_contents() && |
- hash_reader_->have_computed_hashes()) { |
- DispatchFailureCallback(NO_HASHES_FOR_FILE); |
- } else { |
- DispatchFailureCallback(MISSING_ALL_HASHES); |
} |
+ DispatchFailureCallback(NO_HASHES_FOR_FILE); |
return; |
} |
@@ -186,7 +202,7 @@ void ContentVerifyJob::OnHashesReady(bool success) { |
DispatchFailureCallback(HASH_MISMATCH); |
} else if (g_test_observer) { |
g_test_observer->JobFinished(hash_reader_->extension_id(), |
- hash_reader_->relative_path(), failed_); |
+ hash_reader_->relative_path(), NONE); |
} |
} |
} |
@@ -214,9 +230,10 @@ void ContentVerifyJob::DispatchFailureCallback(FailureReason reason) { |
failure_callback_.Run(reason); |
failure_callback_.Reset(); |
} |
- if (g_test_observer) |
- g_test_observer->JobFinished( |
- hash_reader_->extension_id(), hash_reader_->relative_path(), failed_); |
+ if (g_test_observer) { |
+ g_test_observer->JobFinished(hash_reader_->extension_id(), |
+ hash_reader_->relative_path(), reason); |
+ } |
} |
} // namespace extensions |