| Index: content/child/indexed_db/webidbcursor_impl.cc
|
| diff --git a/content/child/indexed_db/webidbcursor_impl.cc b/content/child/indexed_db/webidbcursor_impl.cc
|
| deleted file mode 100644
|
| index 11294b688390ceab11b5412084c2ce9bf829687e..0000000000000000000000000000000000000000
|
| --- a/content/child/indexed_db/webidbcursor_impl.cc
|
| +++ /dev/null
|
| @@ -1,217 +0,0 @@
|
| -// Copyright 2013 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "content/child/indexed_db/webidbcursor_impl.h"
|
| -
|
| -#include <stddef.h>
|
| -
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "content/child/indexed_db/indexed_db_dispatcher.h"
|
| -#include "content/child/indexed_db/indexed_db_key_builders.h"
|
| -#include "content/child/thread_safe_sender.h"
|
| -#include "content/common/indexed_db/indexed_db_messages.h"
|
| -#include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBValue.h"
|
| -
|
| -using blink::WebBlobInfo;
|
| -using blink::WebData;
|
| -using blink::WebIDBCallbacks;
|
| -using blink::WebIDBKey;
|
| -using blink::WebIDBValue;
|
| -
|
| -namespace content {
|
| -
|
| -WebIDBCursorImpl::WebIDBCursorImpl(int32_t ipc_cursor_id,
|
| - int64_t transaction_id,
|
| - ThreadSafeSender* thread_safe_sender)
|
| - : ipc_cursor_id_(ipc_cursor_id),
|
| - transaction_id_(transaction_id),
|
| - continue_count_(0),
|
| - used_prefetches_(0),
|
| - pending_onsuccess_callbacks_(0),
|
| - prefetch_amount_(kMinPrefetchAmount),
|
| - thread_safe_sender_(thread_safe_sender) {}
|
| -
|
| -WebIDBCursorImpl::~WebIDBCursorImpl() {
|
| - // It's not possible for there to be pending callbacks that address this
|
| - // object since inside WebKit, they hold a reference to the object which owns
|
| - // this object. But, if that ever changed, then we'd need to invalidate
|
| - // any such pointers.
|
| -
|
| - if (ipc_cursor_id_ != kInvalidCursorId) {
|
| - // Invalid ID used in tests to avoid really sending this message.
|
| - thread_safe_sender_->Send(
|
| - new IndexedDBHostMsg_CursorDestroyed(ipc_cursor_id_));
|
| - }
|
| - IndexedDBDispatcher* dispatcher =
|
| - IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
|
| - dispatcher->CursorDestroyed(ipc_cursor_id_);
|
| -}
|
| -
|
| -void WebIDBCursorImpl::advance(unsigned long count,
|
| - WebIDBCallbacks* callbacks_ptr) {
|
| - IndexedDBDispatcher* dispatcher =
|
| - IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
|
| - std::unique_ptr<WebIDBCallbacks> callbacks(callbacks_ptr);
|
| - if (count <= prefetch_keys_.size()) {
|
| - CachedAdvance(count, callbacks.get());
|
| - return;
|
| - }
|
| - ResetPrefetchCache();
|
| - dispatcher->RequestIDBCursorAdvance(
|
| - count, callbacks.release(), ipc_cursor_id_, transaction_id_);
|
| -}
|
| -
|
| -void WebIDBCursorImpl::continueFunction(const WebIDBKey& key,
|
| - WebIDBCallbacks* callbacks_ptr) {
|
| - continueFunction(key, WebIDBKey::createNull(), callbacks_ptr);
|
| -}
|
| -
|
| -void WebIDBCursorImpl::continueFunction(const WebIDBKey& key,
|
| - const WebIDBKey& primary_key,
|
| - WebIDBCallbacks* callbacks_ptr) {
|
| - IndexedDBDispatcher* dispatcher =
|
| - IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
|
| - std::unique_ptr<WebIDBCallbacks> callbacks(callbacks_ptr);
|
| -
|
| - if (key.keyType() == blink::WebIDBKeyTypeNull &&
|
| - primary_key.keyType() == blink::WebIDBKeyTypeNull) {
|
| - // No key(s), so this would qualify for a prefetch.
|
| - ++continue_count_;
|
| -
|
| - if (!prefetch_keys_.empty()) {
|
| - // We have a prefetch cache, so serve the result from that.
|
| - CachedContinue(callbacks.get());
|
| - return;
|
| - }
|
| -
|
| - if (continue_count_ > kPrefetchContinueThreshold) {
|
| - // Request pre-fetch.
|
| - ++pending_onsuccess_callbacks_;
|
| - dispatcher->RequestIDBCursorPrefetch(
|
| - prefetch_amount_, callbacks.release(), ipc_cursor_id_);
|
| -
|
| - // Increase prefetch_amount_ exponentially.
|
| - prefetch_amount_ *= 2;
|
| - if (prefetch_amount_ > kMaxPrefetchAmount)
|
| - prefetch_amount_ = kMaxPrefetchAmount;
|
| -
|
| - return;
|
| - }
|
| - } else {
|
| - // Key argument supplied. We couldn't prefetch this.
|
| - ResetPrefetchCache();
|
| - }
|
| -
|
| - dispatcher->RequestIDBCursorContinue(IndexedDBKeyBuilder::Build(key),
|
| - IndexedDBKeyBuilder::Build(primary_key),
|
| - callbacks.release(),
|
| - ipc_cursor_id_,
|
| - transaction_id_);
|
| -}
|
| -
|
| -void WebIDBCursorImpl::postSuccessHandlerCallback() {
|
| - pending_onsuccess_callbacks_--;
|
| -
|
| - // If the onsuccess callback called continue()/advance() on the cursor
|
| - // again, and that request was served by the prefetch cache, then
|
| - // pending_onsuccess_callbacks_ would be incremented. If not, it means the
|
| - // callback did something else, or nothing at all, in which case we need to
|
| - // reset the cache.
|
| -
|
| - if (pending_onsuccess_callbacks_ == 0)
|
| - ResetPrefetchCache();
|
| -}
|
| -
|
| -void WebIDBCursorImpl::SetPrefetchData(
|
| - const std::vector<IndexedDBKey>& keys,
|
| - const std::vector<IndexedDBKey>& primary_keys,
|
| - const std::vector<WebIDBValue>& values) {
|
| - prefetch_keys_.assign(keys.begin(), keys.end());
|
| - prefetch_primary_keys_.assign(primary_keys.begin(), primary_keys.end());
|
| - prefetch_values_.assign(values.begin(), values.end());
|
| -
|
| - used_prefetches_ = 0;
|
| - pending_onsuccess_callbacks_ = 0;
|
| -}
|
| -
|
| -void WebIDBCursorImpl::CachedAdvance(unsigned long count,
|
| - WebIDBCallbacks* callbacks) {
|
| - DCHECK_GE(prefetch_keys_.size(), count);
|
| - DCHECK_EQ(prefetch_primary_keys_.size(), prefetch_keys_.size());
|
| - DCHECK_EQ(prefetch_values_.size(), prefetch_keys_.size());
|
| -
|
| - while (count > 1) {
|
| - prefetch_keys_.pop_front();
|
| - prefetch_primary_keys_.pop_front();
|
| - prefetch_values_.pop_front();
|
| - ++used_prefetches_;
|
| - --count;
|
| - }
|
| -
|
| - CachedContinue(callbacks);
|
| -}
|
| -
|
| -void WebIDBCursorImpl::CachedContinue(WebIDBCallbacks* callbacks) {
|
| - DCHECK_GT(prefetch_keys_.size(), 0ul);
|
| - DCHECK_EQ(prefetch_primary_keys_.size(), prefetch_keys_.size());
|
| - DCHECK_EQ(prefetch_values_.size(), prefetch_keys_.size());
|
| -
|
| - IndexedDBKey key = prefetch_keys_.front();
|
| - IndexedDBKey primary_key = prefetch_primary_keys_.front();
|
| - WebIDBValue value = prefetch_values_.front();
|
| -
|
| - prefetch_keys_.pop_front();
|
| - prefetch_primary_keys_.pop_front();
|
| - prefetch_values_.pop_front();
|
| - ++used_prefetches_;
|
| -
|
| - ++pending_onsuccess_callbacks_;
|
| -
|
| - if (!continue_count_) {
|
| - // The cache was invalidated by a call to ResetPrefetchCache()
|
| - // after the RequestIDBCursorPrefetch() was made. Now that the
|
| - // initiating continue() call has been satisfied, discard
|
| - // the rest of the cache.
|
| - ResetPrefetchCache();
|
| - }
|
| -
|
| - callbacks->onSuccess(WebIDBKeyBuilder::Build(key),
|
| - WebIDBKeyBuilder::Build(primary_key), value);
|
| -}
|
| -
|
| -void WebIDBCursorImpl::ResetPrefetchCache() {
|
| - continue_count_ = 0;
|
| - prefetch_amount_ = kMinPrefetchAmount;
|
| -
|
| - if (prefetch_keys_.empty()) {
|
| - // No prefetch cache, so no need to reset the cursor in the back-end.
|
| - return;
|
| - }
|
| -
|
| - // Ack any unused blobs.
|
| - std::vector<std::string> uuids;
|
| - for (const auto& value : prefetch_values_) {
|
| - for (size_t i = 0, size = value.webBlobInfo.size(); i < size; ++i)
|
| - uuids.push_back(value.webBlobInfo[i].uuid().latin1());
|
| - }
|
| - if (!uuids.empty())
|
| - thread_safe_sender_->Send(new IndexedDBHostMsg_AckReceivedBlobs(uuids));
|
| -
|
| - // Reset the back-end cursor.
|
| - IndexedDBDispatcher* dispatcher =
|
| - IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
|
| - dispatcher->RequestIDBCursorPrefetchReset(
|
| - used_prefetches_, prefetch_keys_.size(), ipc_cursor_id_);
|
| -
|
| - // Reset the prefetch cache.
|
| - prefetch_keys_.clear();
|
| - prefetch_primary_keys_.clear();
|
| - prefetch_values_.clear();
|
| -
|
| - pending_onsuccess_callbacks_ = 0;
|
| -}
|
| -
|
| -} // namespace content
|
|
|