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

Unified Diff: content/browser/indexed_db/cursor_impl.cc

Issue 2500263003: Port messages sent by WebIDBCursorImpl to Mojo. (Closed)
Patch Set: Address yzshen@'s comments and fix leak. Created 4 years, 1 month 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/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..608f978f1d3f5aad7a2b827e3ef6d7ac1f9ef76c
--- /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_(dispatcher_host),
dcheng 2016/11/17 03:46:23 Nit: std::move()
Reilly Grant (use Gerrit) 2016/11/17 20:04:52 Done.
+ 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, callbacks);
dcheng 2016/11/17 03:46:23 Nit: std::move()
Reilly Grant (use Gerrit) 2016/11/17 20:04:51 Done.
+}
+
+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,
+ callbacks);
dcheng 2016/11/17 03:46:23 Nit: std::move()
Reilly Grant (use Gerrit) 2016/11/17 20:04:52 Done.
+}
+
+void CursorImpl::IDBThreadHelper::Prefetch(
+ int32_t count,
+ scoped_refptr<IndexedDBCallbacks> callbacks) {
+ cursor_->PrefetchContinue(count, callbacks);
Reilly Grant (use Gerrit) 2016/11/17 20:04:51 Done here too. :)
+}
+
+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

Powered by Google App Engine
This is Rietveld 408576698