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 6d7bc1c2d5914df345f3d0b1f652f12e57f0b036..0853b810f285e20279f88a58764a037a4db1d903 100644 |
--- a/content/browser/indexed_db/indexed_db_cursor.cc |
+++ b/content/browser/indexed_db/indexed_db_cursor.cc |
@@ -108,8 +108,7 @@ void IndexedDBCursor::CursorPrefetchIterationOperation( |
std::vector<IndexedDBKey> found_primary_keys; |
std::vector<std::string> found_values; |
- if (cursor_) |
- saved_cursor_.reset(cursor_->Clone()); |
+ saved_cursor_.reset(); |
const size_t max_size_estimate = 10 * 1024 * 1024; |
size_t size_estimate = 0; |
@@ -119,6 +118,12 @@ void IndexedDBCursor::CursorPrefetchIterationOperation( |
break; |
} |
+ if (i == 0) { |
+ // First prefetched result is always used, so that's the position |
+ // a cursor should be reset to if the prefetch is invalidated. |
+ saved_cursor_.reset(cursor_->Clone()); |
+ } |
+ |
found_keys.push_back(cursor_->key()); |
found_primary_keys.push_back(cursor_->primary_key()); |
@@ -152,7 +157,8 @@ void IndexedDBCursor::CursorPrefetchIterationOperation( |
found_keys, found_primary_keys, found_values); |
} |
-void IndexedDBCursor::PrefetchReset(int used_prefetches, int) { |
+void IndexedDBCursor::PrefetchReset(int used_prefetches, |
+ int /* unused_prefetches */) { |
IDB_TRACE("IndexedDBCursor::PrefetchReset"); |
cursor_.swap(saved_cursor_); |
saved_cursor_.reset(); |
@@ -160,7 +166,9 @@ void IndexedDBCursor::PrefetchReset(int used_prefetches, int) { |
if (closed_) |
return; |
if (cursor_) { |
- for (int i = 0; i < used_prefetches; ++i) { |
+ // First prefetched result is always used. |
+ DCHECK_GT(used_prefetches, 0); |
+ for (int i = 0; i < used_prefetches - 1; ++i) { |
bool ok = cursor_->Continue(); |
DCHECK(ok); |
} |