1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/child/indexed_db/webidbcursor_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/indexed_db/indexed_db_dispatcher.h"
10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/indexed_db/indexed_db_key_builders.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/child/thread_safe_sender.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/indexed_db/indexed_db_messages.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebData;
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBCallbacks;
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKey;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)WebIDBCursorImpl::WebIDBCursorImpl(int32 ipc_cursor_id,
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   int64 transaction_id,
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   ThreadSafeSender* thread_safe_sender)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : ipc_cursor_id_(ipc_cursor_id),
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      transaction_id_(transaction_id),
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue_count_(0),
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      used_prefetches_(0),
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_onsuccess_callbacks_(0),
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      prefetch_amount_(kMinPrefetchAmount),
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      thread_safe_sender_(thread_safe_sender) {}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)WebIDBCursorImpl::~WebIDBCursorImpl() {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It's not possible for there to be pending callbacks that address this
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // object since inside WebKit, they hold a reference to the object which owns
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this object. But, if that ever changed, then we'd need to invalidate
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // any such pointers.
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ipc_cursor_id_ != kInvalidCursorId) {
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Invalid ID used in tests to avoid really sending this message.
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    thread_safe_sender_->Send(
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new IndexedDBHostMsg_CursorDestroyed(ipc_cursor_id_));
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IndexedDBDispatcher* dispatcher =
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dispatcher->CursorDestroyed(ipc_cursor_id_);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebIDBCursorImpl::advance(unsigned long count,
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               WebIDBCallbacks* callbacks_ptr) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IndexedDBDispatcher* dispatcher =
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr);
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (count <= prefetch_keys_.size()) {
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CachedAdvance(count, callbacks.get());
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetPrefetchCache();
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dispatcher->RequestIDBCursorAdvance(
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      count, callbacks.release(), ipc_cursor_id_, transaction_id_);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebIDBCursorImpl::continueFunction(const WebIDBKey& key,
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        WebIDBCallbacks* callbacks_ptr) {
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  continueFunction(key, WebIDBKey::createNull(), callbacks_ptr);
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebIDBCursorImpl::continueFunction(const WebIDBKey& key,
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        const WebIDBKey& primary_key,
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        WebIDBCallbacks* callbacks_ptr) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IndexedDBDispatcher* dispatcher =
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (key.keyType() == blink::WebIDBKeyTypeNull &&
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      primary_key.keyType() == blink::WebIDBKeyTypeNull) {
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // No key(s), so this would qualify for a prefetch.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++continue_count_;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!prefetch_keys_.empty()) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We have a prefetch cache, so serve the result from that.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CachedContinue(callbacks.get());
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (continue_count_ > kPrefetchContinueThreshold) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Request pre-fetch.
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ++pending_onsuccess_callbacks_;
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      dispatcher->RequestIDBCursorPrefetch(
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          prefetch_amount_, callbacks.release(), ipc_cursor_id_);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Increase prefetch_amount_ exponentially.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefetch_amount_ *= 2;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (prefetch_amount_ > kMaxPrefetchAmount)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefetch_amount_ = kMaxPrefetchAmount;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Key argument supplied. We couldn't prefetch this.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResetPrefetchCache();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  dispatcher->RequestIDBCursorContinue(IndexedDBKeyBuilder::Build(key),
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       IndexedDBKeyBuilder::Build(primary_key),
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       callbacks.release(),
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       ipc_cursor_id_,
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       transaction_id_);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebIDBCursorImpl::postSuccessHandlerCallback() {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_onsuccess_callbacks_--;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If the onsuccess callback called continue()/advance() on the cursor
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // again, and that request was served by the prefetch cache, then
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // pending_onsuccess_callbacks_ would be incremented. If not, it means the
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // callback did something else, or nothing at all, in which case we need to
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // reset the cache.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pending_onsuccess_callbacks_ == 0)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResetPrefetchCache();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebIDBCursorImpl::SetPrefetchData(
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<IndexedDBKey>& keys,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<IndexedDBKey>& primary_keys,
1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const std::vector<WebData>& values,
1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const std::vector<blink::WebVector<blink::WebBlobInfo> >& blob_info) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefetch_keys_.assign(keys.begin(), keys.end());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefetch_primary_keys_.assign(primary_keys.begin(), primary_keys.end());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefetch_values_.assign(values.begin(), values.end());
1305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  prefetch_blob_info_.assign(blob_info.begin(), blob_info.end());
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  used_prefetches_ = 0;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_onsuccess_callbacks_ = 0;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebIDBCursorImpl::CachedAdvance(unsigned long count,
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     WebIDBCallbacks* callbacks) {
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK_GE(prefetch_keys_.size(), count);
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK_EQ(prefetch_primary_keys_.size(), prefetch_keys_.size());
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK_EQ(prefetch_values_.size(), prefetch_keys_.size());
1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK_EQ(prefetch_blob_info_.size(), prefetch_keys_.size());
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  while (count > 1) {
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    prefetch_keys_.pop_front();
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    prefetch_primary_keys_.pop_front();
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    prefetch_values_.pop_front();
1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    prefetch_blob_info_.pop_front();
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ++used_prefetches_;
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    --count;
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CachedContinue(callbacks);
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebIDBCursorImpl::CachedContinue(WebIDBCallbacks* callbacks) {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_GT(prefetch_keys_.size(), 0ul);
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK_EQ(prefetch_primary_keys_.size(), prefetch_keys_.size());
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK_EQ(prefetch_values_.size(), prefetch_keys_.size());
1595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK_EQ(prefetch_blob_info_.size(), prefetch_keys_.size());
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IndexedDBKey key = prefetch_keys_.front();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IndexedDBKey primary_key = prefetch_primary_keys_.front();
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebData value = prefetch_values_.front();
1645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  blink::WebVector<blink::WebBlobInfo> blob_info = prefetch_blob_info_.front();
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefetch_keys_.pop_front();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefetch_primary_keys_.pop_front();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefetch_values_.pop_front();
1695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  prefetch_blob_info_.pop_front();
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ++used_prefetches_;
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ++pending_onsuccess_callbacks_;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!continue_count_) {
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // The cache was invalidated by a call to ResetPrefetchCache()
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // after the RequestIDBCursorPrefetch() was made. Now that the
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // initiating continue() call has been satisfied, discard
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // the rest of the cache.
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ResetPrefetchCache();
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  callbacks->onSuccess(WebIDBKeyBuilder::Build(key),
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       WebIDBKeyBuilder::Build(primary_key),
1845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       value,
1855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       blob_info);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebIDBCursorImpl::ResetPrefetchCache() {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  continue_count_ = 0;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefetch_amount_ = kMinPrefetchAmount;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!prefetch_keys_.size()) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // No prefetch cache, so no need to reset the cursor in the back-end.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IndexedDBDispatcher* dispatcher =
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dispatcher->RequestIDBCursorPrefetchReset(
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      used_prefetches_, prefetch_keys_.size(), ipc_cursor_id_);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefetch_keys_.clear();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefetch_primary_keys_.clear();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefetch_values_.clear();
2045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  prefetch_blob_info_.clear();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_onsuccess_callbacks_ = 0;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
210