Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1313)

Unified Diff: content/child/indexed_db/webidbcursor_impl.cc

Issue 1963293002: Replacing Indexed DB Chromium IPC with Mojo Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Refactoring after Passing URLRequestContextGetter. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « content/child/indexed_db/webidbcursor_impl.h ('k') | content/child/indexed_db/webidbcursor_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698