Index: content/browser/indexed_db/cursor_impl.cc |
diff --git a/content/browser/indexed_db/cursor_impl.cc b/content/browser/indexed_db/cursor_impl.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6e4d2198180248a3431960ce935652a6cb1d79a1 |
--- /dev/null |
+++ b/content/browser/indexed_db/cursor_impl.cc |
@@ -0,0 +1,128 @@ |
+// Copyright 2016 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/browser/indexed_db/cursor_impl.h" |
+ |
+#include "content/browser/indexed_db/indexed_db_callbacks.h" |
+#include "content/browser/indexed_db/indexed_db_cursor.h" |
+#include "content/browser/indexed_db/indexed_db_dispatcher_host.h" |
+ |
+namespace content { |
+ |
+class CursorImpl::IDBThreadHelper { |
+ public: |
+ explicit IDBThreadHelper(scoped_refptr<IndexedDBCursor> cursor); |
+ ~IDBThreadHelper(); |
+ |
+ void Advance(uint32_t count, scoped_refptr<IndexedDBCallbacks> callbacks); |
+ void Continue(const IndexedDBKey& key, |
+ const IndexedDBKey& primary_key, |
+ scoped_refptr<IndexedDBCallbacks> callbacks); |
+ void Prefetch(int32_t count, scoped_refptr<IndexedDBCallbacks> callbacks); |
+ void PrefetchReset(int32_t used_prefetches, int32_t unused_prefetches); |
+ |
+ private: |
+ scoped_refptr<IndexedDBDispatcherHost> dispatcher_host_; |
+ scoped_refptr<IndexedDBCursor> cursor_; |
+ const url::Origin origin_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(IDBThreadHelper); |
+}; |
+ |
+CursorImpl::CursorImpl(scoped_refptr<IndexedDBCursor> cursor, |
+ const url::Origin& origin, |
+ scoped_refptr<IndexedDBDispatcherHost> dispatcher_host) |
+ : helper_(new IDBThreadHelper(std::move(cursor))), |
+ dispatcher_host_(std::move(dispatcher_host)), |
+ origin_(origin), |
+ idb_runner_(base::ThreadTaskRunnerHandle::Get()) {} |
+ |
+CursorImpl::~CursorImpl() { |
+ idb_runner_->DeleteSoon(FROM_HERE, helper_); |
+} |
+ |
+void CursorImpl::Advance( |
+ uint32_t count, |
+ ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { |
+ scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks( |
+ dispatcher_host_.get(), origin_, std::move(callbacks_info))); |
+ idb_runner_->PostTask(FROM_HERE, base::Bind(&IDBThreadHelper::Advance, |
+ base::Unretained(helper_), count, |
+ base::Passed(&callbacks))); |
+} |
+ |
+void CursorImpl::Continue( |
+ const IndexedDBKey& key, |
+ const IndexedDBKey& primary_key, |
+ ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { |
+ scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks( |
+ dispatcher_host_.get(), origin_, std::move(callbacks_info))); |
+ idb_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&IDBThreadHelper::Continue, base::Unretained(helper_), key, |
+ primary_key, base::Passed(&callbacks))); |
+} |
+ |
+void CursorImpl::Prefetch( |
+ int32_t count, |
+ ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) { |
+ scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks( |
+ dispatcher_host_.get(), origin_, std::move(callbacks_info))); |
+ idb_runner_->PostTask(FROM_HERE, base::Bind(&IDBThreadHelper::Prefetch, |
+ base::Unretained(helper_), count, |
+ base::Passed(&callbacks))); |
+} |
+ |
+void CursorImpl::PrefetchReset( |
+ int32_t used_prefetches, |
+ int32_t unused_prefetches, |
+ const std::vector<std::string>& unused_blob_uuids) { |
+ for (const auto& uuid : unused_blob_uuids) |
+ dispatcher_host_->DropBlobData(uuid); |
+ |
+ idb_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&IDBThreadHelper::PrefetchReset, base::Unretained(helper_), |
+ used_prefetches, unused_prefetches)); |
+} |
+ |
+CursorImpl::IDBThreadHelper::IDBThreadHelper( |
+ scoped_refptr<IndexedDBCursor> cursor) |
+ : cursor_(std::move(cursor)) {} |
+ |
+CursorImpl::IDBThreadHelper::~IDBThreadHelper() {} |
+ |
+void CursorImpl::IDBThreadHelper::Advance( |
+ uint32_t count, |
+ scoped_refptr<IndexedDBCallbacks> callbacks) { |
+ cursor_->Advance(count, std::move(callbacks)); |
+} |
+ |
+void CursorImpl::IDBThreadHelper::Continue( |
+ const IndexedDBKey& key, |
+ const IndexedDBKey& primary_key, |
+ scoped_refptr<IndexedDBCallbacks> callbacks) { |
+ cursor_->Continue( |
+ key.IsValid() ? base::MakeUnique<IndexedDBKey>(key) : nullptr, |
+ primary_key.IsValid() ? base::MakeUnique<IndexedDBKey>(primary_key) |
+ : nullptr, |
+ std::move(callbacks)); |
+} |
+ |
+void CursorImpl::IDBThreadHelper::Prefetch( |
+ int32_t count, |
+ scoped_refptr<IndexedDBCallbacks> callbacks) { |
+ cursor_->PrefetchContinue(count, std::move(callbacks)); |
+} |
+ |
+void CursorImpl::IDBThreadHelper::PrefetchReset(int32_t used_prefetches, |
+ int32_t unused_prefetches) { |
+ leveldb::Status s = |
+ cursor_->PrefetchReset(used_prefetches, unused_prefetches); |
+ // TODO(cmumford): Handle this error (crbug.com/363397) |
+ if (!s.ok()) |
+ DLOG(ERROR) << "Unable to reset prefetch"; |
+} |
+ |
+} // namespace content |