Chromium Code Reviews| 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..fe4d32e9ffa5ea3fd9063129fbad4a1689fe8f82 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,11 @@ void IndexedDBCursor::CursorPrefetchIterationOperation( |
| break; |
| } |
| + if (i == 0) { |
| + // First prefetched result is always used and can't be reset. |
| + saved_cursor_.reset(cursor_->Clone()); |
| + } |
| + |
| found_keys.push_back(cursor_->key()); |
| found_primary_keys.push_back(cursor_->primary_key()); |
| @@ -152,15 +156,29 @@ 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"); |
| + transaction_->ScheduleTask( |
|
jsbell
2014/01/03 23:05:11
I haven't convinced myself one way or another whet
jsbell
2014/01/06 17:51:55
After further reflection, this shouldn't be necess
|
| + task_type_, |
| + base::Bind(&IndexedDBCursor::CursorPrefetchResetOperation, |
| + this, |
| + used_prefetches)); |
| +} |
| + |
| +void IndexedDBCursor::CursorPrefetchResetOperation( |
| + int used_prefetches, |
| + IndexedDBTransaction* /*transaction*/) { |
| + IDB_TRACE("IndexedDBCursor::CursorPrefetchIterationOperation"); |
| + |
| cursor_.swap(saved_cursor_); |
| saved_cursor_.reset(); |
| if (closed_) |
| return; |
| if (cursor_) { |
| - for (int i = 0; i < used_prefetches; ++i) { |
| + DCHECK_GT(used_prefetches, 0); |
| + for (int i = 0; i < used_prefetches - 1; ++i) { |
| bool ok = cursor_->Continue(); |
| DCHECK(ok); |
| } |