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