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

Unified Diff: content/browser/indexed_db/indexed_db_cursor.cc

Issue 237143006: Make iterating over a corrupted IndexedDB fail. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 8 months 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/indexed_db/indexed_db_cursor.cc
diff --git a/content/browser/indexed_db/indexed_db_cursor.cc b/content/browser/indexed_db/indexed_db_cursor.cc
index b32c7c2a0f14d2e848ac66591bb6f7b0e45f0160..e741234e66dabe0ba14c35b960e5d992a4b1744c 100644
--- a/content/browser/indexed_db/indexed_db_cursor.cc
+++ b/content/browser/indexed_db/indexed_db_cursor.cc
@@ -60,12 +60,20 @@ void IndexedDBCursor::CursorAdvanceOperation(
scoped_refptr<IndexedDBCallbacks> callbacks,
IndexedDBTransaction* /*transaction*/) {
IDB_TRACE("IndexedDBCursor::CursorAdvanceOperation");
- if (!cursor_ || !cursor_->Advance(count)) {
+ leveldb::Status s;
+ if (!cursor_ || !cursor_->Advance(count, s)) {
cursor_.reset();
callbacks->OnSuccess(static_cast<IndexedDBValue*>(NULL));
return;
}
+ if (!s.ok()) {
jsbell 2014/04/14 20:44:20 Won't Advance() return false if !s.ok() ?
cmumford 2014/04/14 23:39:23 Done.
+ // TODO(cmumford): Handle corruption
+ if (s.IsCorruption()) {
jsbell 2014/04/14 20:44:20 Remove this placeholder code, make the TODO more v
cmumford 2014/04/14 23:39:23 Yeah, I shouldn't have left this block in there. I
+ }
+ return;
jsbell 2014/04/14 20:44:20 Wouldn't this mean that the callbacks (i.e. reques
cmumford 2014/04/14 23:39:23 Done.
+ }
+
callbacks->OnSuccess(key(), primary_key(), Value());
}
@@ -75,9 +83,11 @@ void IndexedDBCursor::CursorIterationOperation(
scoped_refptr<IndexedDBCallbacks> callbacks,
IndexedDBTransaction* /*transaction*/) {
IDB_TRACE("IndexedDBCursor::CursorIterationOperation");
- if (!cursor_ ||
- !cursor_->Continue(
- key.get(), primary_key.get(), IndexedDBBackingStore::Cursor::SEEK)) {
+ leveldb::Status s;
+ if (!cursor_ || !cursor_->Continue(key.get(),
+ primary_key.get(),
+ IndexedDBBackingStore::Cursor::SEEK,
+ s)) {
jsbell 2014/04/14 20:44:20 Does this need a corresponding check for s.ok() ?
cmumford 2014/04/14 23:39:23 Done. Also added TODO for handling of corrupted db
cursor_.reset();
callbacks->OnSuccess(static_cast<IndexedDBValue*>(NULL));
return;
@@ -112,9 +122,10 @@ void IndexedDBCursor::CursorPrefetchIterationOperation(
saved_cursor_.reset();
const size_t max_size_estimate = 10 * 1024 * 1024;
size_t size_estimate = 0;
+ leveldb::Status s;
for (int i = 0; i < number_to_fetch; ++i) {
- if (!cursor_ || !cursor_->Continue()) {
+ if (!cursor_ || !cursor_->Continue(s)) {
cursor_.reset();
break;
}
@@ -149,6 +160,13 @@ void IndexedDBCursor::CursorPrefetchIterationOperation(
break;
}
+ if (!s.ok()) {
jsbell 2014/04/14 20:44:20 As above.
cmumford 2014/04/14 23:39:23 Done.
+ // TODO(cmumford): Handle corruption
+ if (s.IsCorruption()) {
+ }
+ return;
+ }
+
if (!found_keys.size()) {
callbacks->OnSuccess(static_cast<IndexedDBValue*>(NULL));
return;
@@ -158,22 +176,25 @@ void IndexedDBCursor::CursorPrefetchIterationOperation(
found_keys, found_primary_keys, found_values);
}
-void IndexedDBCursor::PrefetchReset(int used_prefetches,
- int /* unused_prefetches */) {
+leveldb::Status IndexedDBCursor::PrefetchReset(int used_prefetches,
+ int /* unused_prefetches */) {
IDB_TRACE("IndexedDBCursor::PrefetchReset");
cursor_.swap(saved_cursor_);
saved_cursor_.reset();
+ leveldb::Status s;
jsbell 2014/04/14 20:44:20 Initialized to the default here (i.e. OK), but els
cmumford 2014/04/14 23:39:23 Else where I've been setting to Status::OK() only
if (closed_)
- return;
+ return s;
if (cursor_) {
// First prefetched result is always used.
DCHECK_GT(used_prefetches, 0);
for (int i = 0; i < used_prefetches - 1; ++i) {
- bool ok = cursor_->Continue();
+ bool ok = cursor_->Continue(s);
DCHECK(ok);
jsbell 2014/04/14 20:44:20 Is this DCHECK is invalid in the face of corruptio
cmumford 2014/04/14 23:39:23 Yes, but false is also returned on other errors. I
}
}
+
+ return s;
}
void IndexedDBCursor::Close() {

Powered by Google App Engine
This is Rietveld 408576698