IndexedDB: Move content/renderer/indexed_db/ to Blink, take 2

The original CL was reverted due to an IndexedDB
stability issue reported in https://crbug.com/899446.

The stability issue was fixed as part of
commit 48bcb8e3f5b21bba8806dfa083aa0e1fa395f061.  A test
to verify the issue doesn't regress was landed as part of
commit 884a9b662680278cc4c75e792fd038f155e3cce2.

This change was originally a revert of the following commits:
- commit 236db7092f734f4323be60a94f553a9b0102da1b
- commit 63debc6587a8e13227953c8a25f3ae7c547711c1
- commit e14fc0eec15c68760ac5211e6fc15a08d5ce4635

Bug: 717812
Change-Id: I2e1d7a12fa30ccb8cdd5d792f8e7c72b40dc30c8
Reviewed-on: https://chromium-review.googlesource.com/c/1316830
Commit-Queue: Chase Phillips <cmp@chromium.org>
Reviewed-by: Dmitry Gozman <dgozman@chromium.org>
Reviewed-by: Robert Sesek <rsesek@chromium.org>
Reviewed-by: Daniel Murphy <dmurph@chromium.org>
Cr-Commit-Position: refs/heads/master@{#607753}
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn
index 134e72b..6cb3021 100644
--- a/content/renderer/BUILD.gn
+++ b/content/renderer/BUILD.gn
@@ -141,20 +141,6 @@
     "ime_event_guard.h",
     "in_process_renderer_thread.cc",
     "in_process_renderer_thread.h",
-    "indexed_db/indexed_db_callbacks_impl.cc",
-    "indexed_db/indexed_db_callbacks_impl.h",
-    "indexed_db/indexed_db_database_callbacks_impl.cc",
-    "indexed_db/indexed_db_database_callbacks_impl.h",
-    "indexed_db/indexed_db_dispatcher.cc",
-    "indexed_db/indexed_db_dispatcher.h",
-    "indexed_db/indexed_db_key_builders.cc",
-    "indexed_db/indexed_db_key_builders.h",
-    "indexed_db/webidbcursor_impl.cc",
-    "indexed_db/webidbcursor_impl.h",
-    "indexed_db/webidbdatabase_impl.cc",
-    "indexed_db/webidbdatabase_impl.h",
-    "indexed_db/webidbfactory_impl.cc",
-    "indexed_db/webidbfactory_impl.h",
     "input/frame_input_handler_impl.cc",
     "input/frame_input_handler_impl.h",
     "input/input_event_prediction.cc",
diff --git a/content/renderer/indexed_db/OWNERS b/content/renderer/indexed_db/OWNERS
deleted file mode 100644
index a740487..0000000
--- a/content/renderer/indexed_db/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-file://content/browser/indexed_db/OWNERS
-
-# TEAM: storage-dev@chromium.org
-# COMPONENT: Blink>Storage>IndexedDB
diff --git a/content/renderer/indexed_db/indexed_db_callbacks_impl.cc b/content/renderer/indexed_db/indexed_db_callbacks_impl.cc
deleted file mode 100644
index 9bc5671..0000000
--- a/content/renderer/indexed_db/indexed_db_callbacks_impl.cc
+++ /dev/null
@@ -1,261 +0,0 @@
-// 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/renderer/indexed_db/indexed_db_callbacks_impl.h"
-
-#include "content/renderer/indexed_db/indexed_db_dispatcher.h"
-#include "content/renderer/indexed_db/indexed_db_key_builders.h"
-#include "content/renderer/indexed_db/webidbcursor_impl.h"
-#include "content/renderer/indexed_db/webidbdatabase_impl.h"
-#include "third_party/blink/public/platform/file_path_conversion.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_callbacks.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_database_error.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_metadata.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_name_and_version.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_value.h"
-
-using blink::IndexedDBDatabaseMetadata;
-using blink::WebBlobInfo;
-using blink::WebData;
-using blink::WebIDBCallbacks;
-using blink::WebIDBDatabase;
-using blink::WebIDBMetadata;
-using blink::WebIDBNameAndVersion;
-using blink::WebIDBValue;
-using blink::WebString;
-using blink::WebVector;
-using blink::mojom::IDBDatabaseAssociatedPtrInfo;
-
-namespace content {
-
-namespace {
-
-void ConvertIndexMetadata(const blink::IndexedDBIndexMetadata& metadata,
-                          WebIDBMetadata::Index* output) {
-  output->id = metadata.id;
-  output->name = WebString::FromUTF16(metadata.name);
-  output->key_path = WebIDBKeyPathBuilder::Build(metadata.key_path);
-  output->unique = metadata.unique;
-  output->multi_entry = metadata.multi_entry;
-}
-
-void ConvertObjectStoreMetadata(
-    const blink::IndexedDBObjectStoreMetadata& metadata,
-    WebIDBMetadata::ObjectStore* output) {
-  output->id = metadata.id;
-  output->name = WebString::FromUTF16(metadata.name);
-  output->key_path = WebIDBKeyPathBuilder::Build(metadata.key_path);
-  output->auto_increment = metadata.auto_increment;
-  output->max_index_id = metadata.max_index_id;
-  output->indexes = WebVector<WebIDBMetadata::Index>(metadata.indexes.size());
-  size_t i = 0;
-  for (const auto& iter : metadata.indexes)
-    ConvertIndexMetadata(iter.second, &output->indexes[i++]);
-}
-
-void ConvertDatabaseMetadata(const IndexedDBDatabaseMetadata& metadata,
-                             WebIDBMetadata* output) {
-  output->id = metadata.id;
-  output->name = WebString::FromUTF16(metadata.name);
-  output->version = metadata.version;
-  output->max_object_store_id = metadata.max_object_store_id;
-  output->object_stores =
-      WebVector<WebIDBMetadata::ObjectStore>(metadata.object_stores.size());
-  size_t i = 0;
-  for (const auto& iter : metadata.object_stores)
-    ConvertObjectStoreMetadata(iter.second, &output->object_stores[i++]);
-}
-
-WebIDBValue ConvertReturnValue(const blink::mojom::IDBReturnValuePtr& value) {
-  if (!value)
-    return WebIDBValue(WebData(), WebVector<WebBlobInfo>());
-
-  WebIDBValue web_value = IndexedDBCallbacksImpl::ConvertValue(value->value);
-  web_value.SetInjectedPrimaryKey(WebIDBKeyBuilder::Build(value->primary_key),
-                                  WebIDBKeyPathBuilder::Build(value->key_path));
-  return web_value;
-}
-
-WebIDBNameAndVersion ConvertNameVersion(
-    const blink::mojom::IDBNameAndVersionPtr& name_and_version) {
-  return WebIDBNameAndVersion(WebString::FromUTF16(name_and_version->name),
-                              name_and_version->version);
-}
-
-}  // namespace
-
-// static
-WebIDBValue IndexedDBCallbacksImpl::ConvertValue(
-    const blink::mojom::IDBValuePtr& value) {
-  if (!value || value->bits.empty())
-    return WebIDBValue(WebData(), WebVector<WebBlobInfo>());
-
-  WebVector<WebBlobInfo> local_blob_info;
-  local_blob_info.reserve(value->blob_or_file_info.size());
-  for (size_t i = 0; i < value->blob_or_file_info.size(); ++i) {
-    const auto& info = value->blob_or_file_info[i];
-    if (info->file) {
-      local_blob_info.emplace_back(WebString::FromUTF8(info->uuid),
-                                   blink::FilePathToWebString(info->file->path),
-                                   WebString::FromUTF16(info->file->name),
-                                   WebString::FromUTF16(info->mime_type),
-                                   info->file->last_modified.ToDoubleT(),
-                                   info->size, info->blob.PassHandle());
-    } else {
-      local_blob_info.emplace_back(WebString::FromUTF8(info->uuid),
-                                   WebString::FromUTF16(info->mime_type),
-                                   info->size, info->blob.PassHandle());
-    }
-  }
-
-  // TODO(crbug.com/902498): Use mojom traits to map directly to WebData.
-  WebData web_data(reinterpret_cast<const char*>(value->bits.data()),
-                   value->bits.size());
-  // Release value->bits std::vector.
-  value->bits.clear();
-  return WebIDBValue(std::move(web_data), std::move(local_blob_info));
-}
-
-IndexedDBCallbacksImpl::IndexedDBCallbacksImpl(
-    std::unique_ptr<WebIDBCallbacks> callbacks,
-    int64_t transaction_id,
-    const base::WeakPtr<WebIDBCursorImpl>& cursor)
-    : callbacks_(std::move(callbacks)),
-      cursor_(cursor),
-      transaction_id_(transaction_id) {}
-
-IndexedDBCallbacksImpl::~IndexedDBCallbacksImpl() = default;
-
-void IndexedDBCallbacksImpl::Error(int32_t code,
-                                   const base::string16& message) {
-  callbacks_->OnError(
-      blink::WebIDBDatabaseError(code, WebString::FromUTF16(message)));
-  callbacks_.reset();
-}
-
-void IndexedDBCallbacksImpl::SuccessNamesAndVersionsList(
-    std::vector<blink::mojom::IDBNameAndVersionPtr> names_and_versions) {
-  WebVector<WebIDBNameAndVersion> web_names_and_versions;
-  web_names_and_versions.reserve(names_and_versions.size());
-  for (const blink::mojom::IDBNameAndVersionPtr& name_version :
-       names_and_versions)
-    web_names_and_versions.emplace_back(ConvertNameVersion(name_version));
-  callbacks_->OnSuccess(web_names_and_versions);
-  callbacks_.reset();
-}
-
-void IndexedDBCallbacksImpl::SuccessStringList(
-    const std::vector<base::string16>& value) {
-  WebVector<WebString> web_value(value.size());
-  std::transform(
-      value.begin(), value.end(), web_value.begin(),
-      [](const base::string16& s) { return WebString::FromUTF16(s); });
-  callbacks_->OnSuccess(web_value);
-  callbacks_.reset();
-}
-
-void IndexedDBCallbacksImpl::Blocked(int64_t existing_version) {
-  callbacks_->OnBlocked(existing_version);
-  // Not resetting |callbacks_|.
-}
-
-void IndexedDBCallbacksImpl::UpgradeNeeded(
-    IDBDatabaseAssociatedPtrInfo database_info,
-    int64_t old_version,
-    blink::WebIDBDataLoss data_loss,
-    const std::string& data_loss_message,
-    const IndexedDBDatabaseMetadata& metadata) {
-  WebIDBDatabase* database = new WebIDBDatabaseImpl(std::move(database_info));
-  WebIDBMetadata web_metadata;
-  ConvertDatabaseMetadata(metadata, &web_metadata);
-  callbacks_->OnUpgradeNeeded(old_version, database, web_metadata, data_loss,
-                              WebString::FromUTF8(data_loss_message));
-  // Not resetting |callbacks_|.
-}
-
-void IndexedDBCallbacksImpl::SuccessDatabase(
-    IDBDatabaseAssociatedPtrInfo database_info,
-    const IndexedDBDatabaseMetadata& metadata) {
-  WebIDBDatabase* database = nullptr;
-  if (database_info.is_valid()) {
-    database = new WebIDBDatabaseImpl(std::move(database_info));
-  }
-
-  WebIDBMetadata web_metadata;
-  ConvertDatabaseMetadata(metadata, &web_metadata);
-  callbacks_->OnSuccess(database, web_metadata);
-  callbacks_.reset();
-}
-
-void IndexedDBCallbacksImpl::SuccessCursor(
-    blink::mojom::IDBCursorAssociatedPtrInfo cursor_info,
-    const IndexedDBKey& key,
-    const IndexedDBKey& primary_key,
-    blink::mojom::IDBValuePtr value) {
-  WebIDBCursorImpl* cursor =
-      new WebIDBCursorImpl(std::move(cursor_info), transaction_id_);
-  callbacks_->OnSuccess(cursor, WebIDBKeyBuilder::Build(key),
-                        WebIDBKeyBuilder::Build(primary_key),
-                        ConvertValue(value));
-  callbacks_.reset();
-}
-
-void IndexedDBCallbacksImpl::SuccessValue(
-    blink::mojom::IDBReturnValuePtr value) {
-  callbacks_->OnSuccess(ConvertReturnValue(value));
-  callbacks_.reset();
-}
-
-void IndexedDBCallbacksImpl::SuccessCursorContinue(
-    const IndexedDBKey& key,
-    const IndexedDBKey& primary_key,
-    blink::mojom::IDBValuePtr value) {
-  callbacks_->OnSuccess(WebIDBKeyBuilder::Build(key),
-                        WebIDBKeyBuilder::Build(primary_key),
-                        ConvertValue(value));
-  callbacks_.reset();
-}
-
-void IndexedDBCallbacksImpl::SuccessCursorPrefetch(
-    const std::vector<IndexedDBKey>& keys,
-    const std::vector<IndexedDBKey>& primary_keys,
-    std::vector<blink::mojom::IDBValuePtr> values) {
-  std::vector<WebIDBValue> web_values;
-  web_values.reserve(values.size());
-  for (const blink::mojom::IDBValuePtr& value : values)
-    web_values.emplace_back(ConvertValue(value));
-
-  if (cursor_) {
-    cursor_->SetPrefetchData(keys, primary_keys, std::move(web_values));
-    cursor_->CachedContinue(callbacks_.get());
-  }
-  callbacks_.reset();
-}
-
-void IndexedDBCallbacksImpl::SuccessArray(
-    std::vector<blink::mojom::IDBReturnValuePtr> values) {
-  WebVector<WebIDBValue> web_values;
-  web_values.reserve(values.size());
-  for (const blink::mojom::IDBReturnValuePtr& value : values)
-    web_values.emplace_back(ConvertReturnValue(value));
-  callbacks_->OnSuccess(std::move(web_values));
-  callbacks_.reset();
-}
-
-void IndexedDBCallbacksImpl::SuccessKey(const IndexedDBKey& key) {
-  callbacks_->OnSuccess(WebIDBKeyBuilder::Build(key));
-  callbacks_.reset();
-}
-
-void IndexedDBCallbacksImpl::SuccessInteger(int64_t value) {
-  callbacks_->OnSuccess(value);
-  callbacks_.reset();
-}
-
-void IndexedDBCallbacksImpl::Success() {
-  callbacks_->OnSuccess();
-  callbacks_.reset();
-}
-
-}  // namespace content
diff --git a/content/renderer/indexed_db/indexed_db_callbacks_impl.h b/content/renderer/indexed_db/indexed_db_callbacks_impl.h
deleted file mode 100644
index 27052f4..0000000
--- a/content/renderer/indexed_db/indexed_db_callbacks_impl.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// 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.
-
-#ifndef CONTENT_RENDERER_INDEXED_DB_INDEXED_DB_CALLBACKS_IMPL_H_
-#define CONTENT_RENDERER_INDEXED_DB_INDEXED_DB_CALLBACKS_IMPL_H_
-
-#include "mojo/public/cpp/bindings/associated_binding.h"
-#include "third_party/blink/public/common/indexeddb/indexeddb_key.h"
-#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom.h"
-
-using blink::IndexedDBKey;
-
-namespace blink {
-class WebIDBCallbacks;
-class WebIDBValue;
-}  // namespace blink
-
-namespace content {
-
-class WebIDBCursorImpl;
-
-// Implements the child-process end of the pipe used to deliver callbacks. It
-// is owned by the IO thread. |callback_runner_| is used to post tasks back to
-// the thread which owns the blink::WebIDBCallbacks.
-class IndexedDBCallbacksImpl : public blink::mojom::IDBCallbacks {
- public:
-  enum : int64_t { kNoTransaction = -1 };
-
-  static blink::WebIDBValue ConvertValue(
-      const blink::mojom::IDBValuePtr& value);
-
-  IndexedDBCallbacksImpl(std::unique_ptr<blink::WebIDBCallbacks> callbacks,
-                         int64_t transaction_id,
-                         const base::WeakPtr<WebIDBCursorImpl>& cursor);
-  ~IndexedDBCallbacksImpl() override;
-
-  // blink::mojom::IDBCallbacks implementation:
-  void Error(int32_t code, const base::string16& message) override;
-  void SuccessNamesAndVersionsList(
-      std::vector<blink::mojom::IDBNameAndVersionPtr> names_and_versions)
-      override;
-  void SuccessStringList(const std::vector<base::string16>& value) override;
-  void Blocked(int64_t existing_version) override;
-  void UpgradeNeeded(blink::mojom::IDBDatabaseAssociatedPtrInfo database_info,
-                     int64_t old_version,
-                     blink::WebIDBDataLoss data_loss,
-                     const std::string& data_loss_message,
-                     const blink::IndexedDBDatabaseMetadata& metadata) override;
-  void SuccessDatabase(
-      blink::mojom::IDBDatabaseAssociatedPtrInfo database_info,
-      const blink::IndexedDBDatabaseMetadata& metadata) override;
-  void SuccessCursor(blink::mojom::IDBCursorAssociatedPtrInfo cursor,
-                     const IndexedDBKey& key,
-                     const IndexedDBKey& primary_key,
-                     blink::mojom::IDBValuePtr value) override;
-  void SuccessValue(blink::mojom::IDBReturnValuePtr value) override;
-  void SuccessCursorContinue(const IndexedDBKey& key,
-                             const IndexedDBKey& primary_key,
-                             blink::mojom::IDBValuePtr value) override;
-  void SuccessCursorPrefetch(
-      const std::vector<IndexedDBKey>& keys,
-      const std::vector<IndexedDBKey>& primary_keys,
-      std::vector<blink::mojom::IDBValuePtr> values) override;
-  void SuccessArray(
-      std::vector<blink::mojom::IDBReturnValuePtr> values) override;
-  void SuccessKey(const IndexedDBKey& key) override;
-  void SuccessInteger(int64_t value) override;
-  void Success() override;
-
- private:
-  scoped_refptr<base::SingleThreadTaskRunner> callback_runner_;
-  std::unique_ptr<blink::WebIDBCallbacks> callbacks_;
-  base::WeakPtr<WebIDBCursorImpl> cursor_;
-  int64_t transaction_id_;
-
-  DISALLOW_COPY_AND_ASSIGN(IndexedDBCallbacksImpl);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_INDEXED_DB_INDEXED_DB_CALLBACKS_IMPL_H_
diff --git a/content/renderer/indexed_db/indexed_db_database_callbacks_impl.h b/content/renderer/indexed_db/indexed_db_database_callbacks_impl.h
deleted file mode 100644
index 304f978..0000000
--- a/content/renderer/indexed_db/indexed_db_database_callbacks_impl.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// 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.
-
-#ifndef CONTENT_RENDERER_INDEXED_DB_INDEXED_DB_DATABASE_CALLBACKS_IMPL_H_
-#define CONTENT_RENDERER_INDEXED_DB_INDEXED_DB_DATABASE_CALLBACKS_IMPL_H_
-
-#include "base/single_thread_task_runner.h"
-#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom.h"
-
-namespace blink {
-class WebIDBDatabaseCallbacks;
-}
-
-namespace content {
-
-class IndexedDBDatabaseCallbacksImpl
-    : public blink::mojom::IDBDatabaseCallbacks {
- public:
-  explicit IndexedDBDatabaseCallbacksImpl(
-      std::unique_ptr<blink::WebIDBDatabaseCallbacks> callbacks);
-  ~IndexedDBDatabaseCallbacksImpl() override;
-
-  // blink::mojom::IDBDatabaseCallbacks implementation
-  void ForcedClose() override;
-  void VersionChange(int64_t old_version, int64_t new_version) override;
-  void Abort(int64_t transaction_id,
-             int32_t code,
-             const base::string16& message) override;
-  void Complete(int64_t transaction_id) override;
-  void Changes(blink::mojom::IDBObserverChangesPtr changes) override;
-
- private:
-  std::unique_ptr<blink::WebIDBDatabaseCallbacks> callbacks_;
-
-  DISALLOW_COPY_AND_ASSIGN(IndexedDBDatabaseCallbacksImpl);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_INDEXED_DB_INDEXED_DB_DATABASE_CALLBACKS_IMPL_H_
diff --git a/content/renderer/indexed_db/indexed_db_dispatcher.cc b/content/renderer/indexed_db/indexed_db_dispatcher.cc
deleted file mode 100644
index 6237adb..0000000
--- a/content/renderer/indexed_db/indexed_db_dispatcher.cc
+++ /dev/null
@@ -1,80 +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/renderer/indexed_db/indexed_db_dispatcher.h"
-
-#include <utility>
-
-#include "base/lazy_instance.h"
-#include "base/memory/ptr_util.h"
-#include "base/threading/thread_local.h"
-#include "content/renderer/indexed_db/indexed_db_key_builders.h"
-#include "content/renderer/indexed_db/webidbcursor_impl.h"
-#include "ipc/ipc_channel.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_database_callbacks.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_observation.h"
-
-using blink::WebIDBKey;
-using blink::WebIDBObservation;
-using base::ThreadLocalPointer;
-
-namespace content {
-static base::LazyInstance<ThreadLocalPointer<IndexedDBDispatcher>>::Leaky
-    g_idb_dispatcher_tls = LAZY_INSTANCE_INITIALIZER;
-
-namespace {
-
-IndexedDBDispatcher* const kDeletedIndexedDBDispatcherMarker =
-    reinterpret_cast<IndexedDBDispatcher*>(0x1);
-
-}  // unnamed namespace
-
-IndexedDBDispatcher::IndexedDBDispatcher() {
-  g_idb_dispatcher_tls.Pointer()->Set(this);
-}
-
-IndexedDBDispatcher::~IndexedDBDispatcher() {
-  g_idb_dispatcher_tls.Pointer()->Set(kDeletedIndexedDBDispatcherMarker);
-}
-
-IndexedDBDispatcher* IndexedDBDispatcher::ThreadSpecificInstance() {
-  if (g_idb_dispatcher_tls.Pointer()->Get() ==
-      kDeletedIndexedDBDispatcherMarker) {
-    NOTREACHED() << "Re-instantiating TLS IndexedDBDispatcher.";
-    g_idb_dispatcher_tls.Pointer()->Set(nullptr);
-  }
-  if (g_idb_dispatcher_tls.Pointer()->Get())
-    return g_idb_dispatcher_tls.Pointer()->Get();
-
-  IndexedDBDispatcher* dispatcher = new IndexedDBDispatcher();
-  if (WorkerThread::GetCurrentId())
-    WorkerThread::AddObserver(dispatcher);
-  return dispatcher;
-}
-
-void IndexedDBDispatcher::WillStopCurrentWorkerThread() {
-  delete this;
-}
-
-void IndexedDBDispatcher::RegisterCursor(WebIDBCursorImpl* cursor) {
-  DCHECK(!base::ContainsKey(cursors_, cursor));
-  cursors_.insert(cursor);
-}
-
-void IndexedDBDispatcher::UnregisterCursor(WebIDBCursorImpl* cursor) {
-  DCHECK(base::ContainsKey(cursors_, cursor));
-  cursors_.erase(cursor);
-}
-
-void IndexedDBDispatcher::ResetCursorPrefetchCaches(
-    int64_t transaction_id,
-    WebIDBCursorImpl* exception_cursor) {
-  for (WebIDBCursorImpl* cursor : cursors_) {
-    if (cursor != exception_cursor &&
-        cursor->transaction_id() == transaction_id)
-      cursor->ResetPrefetchCache();
-  }
-}
-
-}  // namespace content
diff --git a/content/renderer/indexed_db/indexed_db_dispatcher.h b/content/renderer/indexed_db/indexed_db_dispatcher.h
deleted file mode 100644
index 1863778..0000000
--- a/content/renderer/indexed_db/indexed_db_dispatcher.h
+++ /dev/null
@@ -1,59 +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.
-
-#ifndef CONTENT_RENDERER_INDEXED_DB_INDEXED_DB_DISPATCHER_H_
-#define CONTENT_RENDERER_INDEXED_DB_INDEXED_DB_DISPATCHER_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/gtest_prod_util.h"
-#include "base/macros.h"
-#include "base/strings/nullable_string16.h"
-#include "content/common/content_export.h"
-#include "content/public/renderer/worker_thread.h"
-#include "content/renderer/indexed_db/indexed_db_callbacks_impl.h"
-#include "content/renderer/indexed_db/indexed_db_database_callbacks_impl.h"
-#include "ipc/ipc_sync_message_filter.h"
-#include "third_party/blink/public/common/indexeddb/web_idb_types.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_callbacks.h"
-#include "url/origin.h"
-
-namespace content {
-class WebIDBCursorImpl;
-
-// Handle the indexed db related communication for this context thread - the
-// main thread and each worker thread have their own copies.
-class CONTENT_EXPORT IndexedDBDispatcher : public WorkerThread::Observer {
- public:
-  // Constructor made public to allow RenderThreadImpl to own a copy without
-  // failing a NOTREACHED in ThreadSpecificInstance in tests that instantiate
-  // two copies of RenderThreadImpl on the same thread.  Everyone else probably
-  // wants to use ThreadSpecificInstance().
-  IndexedDBDispatcher();
-  ~IndexedDBDispatcher() override;
-
-  static IndexedDBDispatcher* ThreadSpecificInstance();
-
-  // WorkerThread::Observer implementation.
-  void WillStopCurrentWorkerThread() override;
-
-  void RegisterCursor(WebIDBCursorImpl* cursor);
-  void UnregisterCursor(WebIDBCursorImpl* cursor);
-  // Reset cursor prefetch caches for all cursors except exception_cursor.
-  void ResetCursorPrefetchCaches(int64_t transaction_id,
-                                 WebIDBCursorImpl* exception_cursor);
-
- private:
-  FRIEND_TEST_ALL_PREFIXES(IndexedDBDispatcherTest, CursorReset);
-  FRIEND_TEST_ALL_PREFIXES(IndexedDBDispatcherTest, CursorTransactionId);
-
-  std::unordered_set<WebIDBCursorImpl*> cursors_;
-
-  DISALLOW_COPY_AND_ASSIGN(IndexedDBDispatcher);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_INDEXED_DB_INDEXED_DB_DISPATCHER_H_
diff --git a/content/renderer/indexed_db/indexed_db_key_builders.h b/content/renderer/indexed_db/indexed_db_key_builders.h
deleted file mode 100644
index 841dbb41..0000000
--- a/content/renderer/indexed_db/indexed_db_key_builders.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (c) 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.
-
-#ifndef CONTENT_RENDERER_INDEXED_DB_INDEXED_DB_KEY_BUILDERS_H_
-#define CONTENT_RENDERER_INDEXED_DB_INDEXED_DB_KEY_BUILDERS_H_
-
-#include "base/macros.h"
-#include "content/common/content_export.h"
-#include "third_party/blink/public/common/indexeddb/indexeddb_key.h"
-#include "third_party/blink/public/common/indexeddb/indexeddb_key_path.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_key.h"
-
-namespace blink {
-
-class IndexedDBKeyRange;
-class WebIDBKeyPath;
-class WebIDBKeyRange;
-
-}  // namespace blink
-
-namespace content {
-
-class CONTENT_EXPORT IndexedDBKeyBuilder {
- public:
-  static blink::IndexedDBKey Build(blink::WebIDBKeyView key);
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(IndexedDBKeyBuilder);
-};
-
-class CONTENT_EXPORT WebIDBKeyBuilder {
- public:
-  static blink::WebIDBKey Build(const blink::IndexedDBKey& key);
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(WebIDBKeyBuilder);
-};
-
-class CONTENT_EXPORT IndexedDBKeyRangeBuilder {
- public:
-  static blink::IndexedDBKeyRange Build(const blink::WebIDBKeyRange& key_range);
-
-  // Builds a point range (containing a single key).
-  static blink::IndexedDBKeyRange Build(blink::WebIDBKeyView key);
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(IndexedDBKeyRangeBuilder);
-};
-
-class CONTENT_EXPORT WebIDBKeyRangeBuilder {
- public:
-  static blink::WebIDBKeyRange Build(const blink::IndexedDBKeyRange& key);
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(WebIDBKeyRangeBuilder);
-};
-
-class CONTENT_EXPORT IndexedDBKeyPathBuilder {
- public:
-  static blink::IndexedDBKeyPath Build(const blink::WebIDBKeyPath& key_path);
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(IndexedDBKeyPathBuilder);
-};
-
-class CONTENT_EXPORT WebIDBKeyPathBuilder {
- public:
-  static blink::WebIDBKeyPath Build(const blink::IndexedDBKeyPath& key_path);
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(WebIDBKeyPathBuilder);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_INDEXED_DB_INDEXED_DB_KEY_BUILDERS_H_
diff --git a/content/renderer/indexed_db/webidbcursor_impl.h b/content/renderer/indexed_db/webidbcursor_impl.h
deleted file mode 100644
index 39baa2c..0000000
--- a/content/renderer/indexed_db/webidbcursor_impl.h
+++ /dev/null
@@ -1,95 +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.
-
-#ifndef CONTENT_RENDERER_INDEXED_DB_WEBIDBCURSOR_IMPL_H_
-#define CONTENT_RENDERER_INDEXED_DB_WEBIDBCURSOR_IMPL_H_
-
-#include <stdint.h>
-
-#include <vector>
-
-#include "base/compiler_specific.h"
-#include "base/containers/circular_deque.h"
-#include "base/gtest_prod_util.h"
-#include "base/memory/ref_counted.h"
-#include "content/common/content_export.h"
-#include "third_party/blink/public/common/indexeddb/indexeddb_key.h"
-#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_callbacks.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_cursor.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_key.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_value.h"
-
-namespace content {
-
-class IndexedDBCallbacksImpl;
-
-class CONTENT_EXPORT WebIDBCursorImpl : public blink::WebIDBCursor {
- public:
-  WebIDBCursorImpl(blink::mojom::IDBCursorAssociatedPtrInfo cursor,
-                   int64_t transaction_id);
-  ~WebIDBCursorImpl() override;
-
-  void Advance(unsigned long count, blink::WebIDBCallbacks* callback) override;
-  void CursorContinue(blink::WebIDBKeyView key,
-                      blink::WebIDBKeyView primary_key,
-                      blink::WebIDBCallbacks* callback) override;
-  void PostSuccessHandlerCallback() override;
-
-  void SetPrefetchData(const std::vector<blink::IndexedDBKey>& keys,
-                       const std::vector<blink::IndexedDBKey>& primary_keys,
-                       std::vector<blink::WebIDBValue> values);
-
-  void CachedAdvance(unsigned long count, blink::WebIDBCallbacks* callbacks);
-  void CachedContinue(blink::WebIDBCallbacks* callbacks);
-
-  // This method is virtual so it can be overridden in unit tests.
-  virtual void ResetPrefetchCache();
-
-  int64_t transaction_id() const { return transaction_id_; }
-
- private:
-  blink::mojom::IDBCallbacksAssociatedPtrInfo GetCallbacksProxy(
-      std::unique_ptr<IndexedDBCallbacksImpl> callbacks);
-
-  FRIEND_TEST_ALL_PREFIXES(IndexedDBDispatcherTest, CursorReset);
-  FRIEND_TEST_ALL_PREFIXES(IndexedDBDispatcherTest, CursorTransactionId);
-  FRIEND_TEST_ALL_PREFIXES(WebIDBCursorImplTest, AdvancePrefetchTest);
-  FRIEND_TEST_ALL_PREFIXES(WebIDBCursorImplTest, PrefetchReset);
-  FRIEND_TEST_ALL_PREFIXES(WebIDBCursorImplTest, PrefetchTest);
-
-  enum { kInvalidCursorId = -1 };
-  enum { kPrefetchContinueThreshold = 2 };
-  enum { kMinPrefetchAmount = 5 };
-  enum { kMaxPrefetchAmount = 100 };
-
-  int64_t transaction_id_;
-
-  blink::mojom::IDBCursorAssociatedPtr cursor_;
-
-  // Prefetch cache.
-  base::circular_deque<blink::IndexedDBKey> prefetch_keys_;
-  base::circular_deque<blink::IndexedDBKey> prefetch_primary_keys_;
-  base::circular_deque<blink::WebIDBValue> prefetch_values_;
-
-  // Number of continue calls that would qualify for a pre-fetch.
-  int continue_count_;
-
-  // Number of items used from the last prefetch.
-  int used_prefetches_;
-
-  // Number of onsuccess handlers we are waiting for.
-  int pending_onsuccess_callbacks_;
-
-  // Number of items to request in next prefetch.
-  int prefetch_amount_;
-
-  base::WeakPtrFactory<WebIDBCursorImpl> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(WebIDBCursorImpl);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_INDEXED_DB_WEBIDBCURSOR_IMPL_H_
diff --git a/content/renderer/indexed_db/webidbdatabase_impl.cc b/content/renderer/indexed_db/webidbdatabase_impl.cc
deleted file mode 100644
index 1fcec2d..0000000
--- a/content/renderer/indexed_db/webidbdatabase_impl.cc
+++ /dev/null
@@ -1,376 +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/renderer/indexed_db/webidbdatabase_impl.h"
-
-#include <stddef.h>
-
-#include <string>
-#include <vector>
-
-#include "base/format_macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/strings/string16.h"
-#include "base/strings/stringprintf.h"
-#include "content/renderer/indexed_db/indexed_db_callbacks_impl.h"
-#include "content/renderer/indexed_db/indexed_db_dispatcher.h"
-#include "content/renderer/indexed_db/indexed_db_key_builders.h"
-#include "mojo/public/cpp/bindings/strong_associated_binding.h"
-#include "third_party/blink/public/common/indexeddb/indexeddb_key.h"
-#include "third_party/blink/public/platform/file_path_conversion.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_database_error.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_database_exception.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_key_path.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_metadata.h"
-#include "third_party/blink/public/platform/web_blob_info.h"
-#include "third_party/blink/public/platform/web_string.h"
-#include "third_party/blink/public/platform/web_vector.h"
-
-using blink::IndexedDBKey;
-using blink::IndexedDBIndexKeys;
-using blink::WebBlobInfo;
-using blink::WebIDBCallbacks;
-using blink::WebIDBDatabase;
-using blink::WebIDBDatabaseCallbacks;
-using blink::WebIDBMetadata;
-using blink::WebIDBKey;
-using blink::WebIDBKeyPath;
-using blink::WebIDBKeyRange;
-using blink::WebIDBKeyView;
-using blink::WebString;
-using blink::WebVector;
-using blink::mojom::IDBCallbacksAssociatedPtrInfo;
-using blink::mojom::IDBDatabaseAssociatedPtrInfo;
-
-namespace content {
-
-namespace {
-
-std::vector<IndexedDBIndexKeys> ConvertWebIndexKeys(
-    const WebVector<blink::WebIDBIndexKeys>& index_keys) {
-  std::vector<IndexedDBIndexKeys> result;
-  result.reserve(index_keys.size());
-  for (size_t i = 0, len = index_keys.size(); i < len; ++i) {
-    result.emplace_back(index_keys[i].first, std::vector<IndexedDBKey>());
-    std::vector<IndexedDBKey>& result_keys = result.back().second;
-    result_keys.reserve(index_keys[i].second.size());
-    for (const WebIDBKey& index_key : index_keys[i].second)
-      result_keys.emplace_back(IndexedDBKeyBuilder::Build(index_key.View()));
-  }
-  return result;
-}
-
-}  // namespace
-
-WebIDBDatabaseImpl::WebIDBDatabaseImpl(
-    IDBDatabaseAssociatedPtrInfo database_info)
-    : database_(std::move(database_info)) {}
-
-WebIDBDatabaseImpl::~WebIDBDatabaseImpl() = default;
-
-void WebIDBDatabaseImpl::CreateObjectStore(long long transaction_id,
-                                           long long object_store_id,
-                                           const WebString& name,
-                                           const WebIDBKeyPath& key_path,
-                                           bool auto_increment) {
-  database_->CreateObjectStore(transaction_id, object_store_id, name.Utf16(),
-                               IndexedDBKeyPathBuilder::Build(key_path),
-                               auto_increment);
-}
-
-void WebIDBDatabaseImpl::DeleteObjectStore(long long transaction_id,
-                                           long long object_store_id) {
-  database_->DeleteObjectStore(transaction_id, object_store_id);
-}
-
-void WebIDBDatabaseImpl::RenameObjectStore(long long transaction_id,
-                                           long long object_store_id,
-                                           const blink::WebString& new_name) {
-  database_->RenameObjectStore(transaction_id, object_store_id,
-                               new_name.Utf16());
-}
-
-void WebIDBDatabaseImpl::CreateTransaction(
-    long long transaction_id,
-    const WebVector<long long>& object_store_ids,
-    blink::WebIDBTransactionMode mode) {
-  database_->CreateTransaction(
-      transaction_id,
-      std::vector<int64_t>(object_store_ids.begin(), object_store_ids.end()),
-      mode);
-}
-
-void WebIDBDatabaseImpl::Close() {
-  database_->Close();
-}
-
-void WebIDBDatabaseImpl::VersionChangeIgnored() {
-  database_->VersionChangeIgnored();
-}
-
-void WebIDBDatabaseImpl::AddObserver(
-    long long transaction_id,
-    int32_t observer_id,
-    bool include_transaction,
-    bool no_records,
-    bool values,
-    const std::bitset<blink::kWebIDBOperationTypeCount>& operation_types) {
-  static_assert(blink::kWebIDBOperationTypeCount < sizeof(uint16_t) * CHAR_BIT,
-                "WebIDBOperationType Count exceeds size of uint16_t");
-  database_->AddObserver(transaction_id, observer_id, include_transaction,
-                         no_records, values, operation_types.to_ulong());
-}
-
-void WebIDBDatabaseImpl::RemoveObservers(
-    const WebVector<int32_t>& observer_ids_to_remove) {
-  std::vector<int32_t> remove_observer_ids(
-      observer_ids_to_remove.Data(),
-      observer_ids_to_remove.Data() + observer_ids_to_remove.size());
-  database_->RemoveObservers(remove_observer_ids);
-}
-
-void WebIDBDatabaseImpl::Get(long long transaction_id,
-                             long long object_store_id,
-                             long long index_id,
-                             const WebIDBKeyRange& key_range,
-                             bool key_only,
-                             WebIDBCallbacks* callbacks) {
-  IndexedDBDispatcher::ThreadSpecificInstance()->ResetCursorPrefetchCaches(
-      transaction_id, nullptr);
-
-  auto callbacks_impl = std::make_unique<IndexedDBCallbacksImpl>(
-      base::WrapUnique(callbacks), transaction_id, nullptr);
-  database_->Get(transaction_id, object_store_id, index_id,
-                 IndexedDBKeyRangeBuilder::Build(key_range), key_only,
-                 GetCallbacksProxy(std::move(callbacks_impl)));
-}
-
-void WebIDBDatabaseImpl::GetAll(long long transaction_id,
-                                long long object_store_id,
-                                long long index_id,
-                                const WebIDBKeyRange& key_range,
-                                long long max_count,
-                                bool key_only,
-                                WebIDBCallbacks* callbacks) {
-  IndexedDBDispatcher::ThreadSpecificInstance()->ResetCursorPrefetchCaches(
-      transaction_id, nullptr);
-
-  auto callbacks_impl = std::make_unique<IndexedDBCallbacksImpl>(
-      base::WrapUnique(callbacks), transaction_id, nullptr);
-  database_->GetAll(transaction_id, object_store_id, index_id,
-                    IndexedDBKeyRangeBuilder::Build(key_range), key_only,
-                    max_count, GetCallbacksProxy(std::move(callbacks_impl)));
-}
-
-void WebIDBDatabaseImpl::Put(
-    long long transaction_id,
-    long long object_store_id,
-    const blink::WebData& value,
-    const WebVector<WebBlobInfo>& web_blob_info,
-    WebIDBKeyView web_primary_key,
-    blink::WebIDBPutMode put_mode,
-    WebIDBCallbacks* callbacks,
-    const WebVector<blink::WebIDBIndexKeys>& web_index_keys) {
-  IndexedDBKey primary_key = IndexedDBKeyBuilder::Build(web_primary_key);
-
-  IndexedDBDispatcher::ThreadSpecificInstance()->ResetCursorPrefetchCaches(
-      transaction_id, nullptr);
-
-  auto mojo_value = blink::mojom::IDBValue::New();
-
-  // mojo_value->bits initialization.
-  value.ForEachSegment([&mojo_value](const char* segment, size_t segment_size,
-                                     size_t segment_offset) {
-    const auto& segment_span = base::make_span(segment, segment + segment_size);
-    mojo_value->bits.insert(mojo_value->bits.end(), segment_span.begin(),
-                            segment_span.end());
-    return true;
-  });
-
-  // mojo_value->blob_or_file_info initialization.
-  mojo_value->blob_or_file_info.reserve(web_blob_info.size());
-  for (const WebBlobInfo& info : web_blob_info) {
-    auto blob_info = blink::mojom::IDBBlobInfo::New();
-    if (info.IsFile()) {
-      blob_info->file = blink::mojom::IDBFileInfo::New();
-      blob_info->file->path = blink::WebStringToFilePath(info.FilePath());
-      blob_info->file->name = info.FileName().Utf16();
-      blob_info->file->last_modified =
-          base::Time::FromDoubleT(info.LastModified());
-    }
-    blob_info->size = info.size();
-    blob_info->uuid = info.Uuid().Latin1();
-    DCHECK(blob_info->uuid.size());
-    blob_info->mime_type = info.GetType().Utf16();
-    blob_info->blob = blink::mojom::BlobPtrInfo(info.CloneBlobHandle(),
-                                                blink::mojom::Blob::Version_);
-    mojo_value->blob_or_file_info.push_back(std::move(blob_info));
-  }
-
-  std::vector<blink::IndexedDBIndexKeys> index_keys =
-      ConvertWebIndexKeys(web_index_keys);
-  size_t index_keys_size = 0;
-  for (const auto& index_key : index_keys) {
-    index_keys_size++;  // Account for index_key.first (int64_t).
-    for (const auto& key : index_key.second) {
-      index_keys_size += key.size_estimate();
-    }
-  }
-
-  size_t arg_size =
-      mojo_value->bits.size() + primary_key.size_estimate() + index_keys_size;
-  if (arg_size >= max_put_value_size_) {
-    callbacks->OnError(blink::WebIDBDatabaseError(
-        blink::kWebIDBDatabaseExceptionUnknownError,
-        WebString::FromUTF8(base::StringPrintf(
-            "The serialized keys and/or value are too large"
-            " (size=%" PRIuS " bytes, max=%" PRIuS " bytes).",
-            arg_size, max_put_value_size_))));
-    return;
-  }
-
-  auto callbacks_impl = std::make_unique<IndexedDBCallbacksImpl>(
-      base::WrapUnique(callbacks), transaction_id, nullptr);
-  database_->Put(transaction_id, object_store_id, std::move(mojo_value),
-                 primary_key, put_mode, std::move(index_keys),
-                 GetCallbacksProxy(std::move(callbacks_impl)));
-}
-
-void WebIDBDatabaseImpl::SetIndexKeys(
-    long long transaction_id,
-    long long object_store_id,
-    WebIDBKeyView primary_key,
-    const WebVector<blink::WebIDBIndexKeys>& index_keys) {
-  database_->SetIndexKeys(transaction_id, object_store_id,
-                          IndexedDBKeyBuilder::Build(primary_key),
-                          ConvertWebIndexKeys(index_keys));
-}
-
-void WebIDBDatabaseImpl::SetIndexesReady(
-    long long transaction_id,
-    long long object_store_id,
-    const WebVector<long long>& web_index_ids) {
-  std::vector<int64_t> index_ids(web_index_ids.Data(),
-                                 web_index_ids.Data() + web_index_ids.size());
-  database_->SetIndexesReady(transaction_id, object_store_id,
-                             std::move(index_ids));
-}
-
-void WebIDBDatabaseImpl::OpenCursor(long long transaction_id,
-                                    long long object_store_id,
-                                    long long index_id,
-                                    const WebIDBKeyRange& key_range,
-                                    blink::WebIDBCursorDirection direction,
-                                    bool key_only,
-                                    blink::WebIDBTaskType task_type,
-                                    WebIDBCallbacks* callbacks) {
-  IndexedDBDispatcher::ThreadSpecificInstance()->ResetCursorPrefetchCaches(
-      transaction_id, nullptr);
-
-  auto callbacks_impl = std::make_unique<IndexedDBCallbacksImpl>(
-      base::WrapUnique(callbacks), transaction_id, nullptr);
-  database_->OpenCursor(transaction_id, object_store_id, index_id,
-                        IndexedDBKeyRangeBuilder::Build(key_range), direction,
-                        key_only, task_type,
-                        GetCallbacksProxy(std::move(callbacks_impl)));
-}
-
-void WebIDBDatabaseImpl::Count(long long transaction_id,
-                               long long object_store_id,
-                               long long index_id,
-                               const WebIDBKeyRange& key_range,
-                               WebIDBCallbacks* callbacks) {
-  IndexedDBDispatcher::ThreadSpecificInstance()->ResetCursorPrefetchCaches(
-      transaction_id, nullptr);
-
-  auto callbacks_impl = std::make_unique<IndexedDBCallbacksImpl>(
-      base::WrapUnique(callbacks), transaction_id, nullptr);
-  database_->Count(transaction_id, object_store_id, index_id,
-                   IndexedDBKeyRangeBuilder::Build(key_range),
-                   GetCallbacksProxy(std::move(callbacks_impl)));
-}
-
-void WebIDBDatabaseImpl::Delete(long long transaction_id,
-                                long long object_store_id,
-                                WebIDBKeyView primary_key,
-                                WebIDBCallbacks* callbacks) {
-  IndexedDBDispatcher::ThreadSpecificInstance()->ResetCursorPrefetchCaches(
-      transaction_id, nullptr);
-
-  auto callbacks_impl = std::make_unique<IndexedDBCallbacksImpl>(
-      base::WrapUnique(callbacks), transaction_id, nullptr);
-  database_->DeleteRange(transaction_id, object_store_id,
-                         IndexedDBKeyRangeBuilder::Build(primary_key),
-                         GetCallbacksProxy(std::move(callbacks_impl)));
-}
-
-void WebIDBDatabaseImpl::DeleteRange(long long transaction_id,
-                                     long long object_store_id,
-                                     const WebIDBKeyRange& key_range,
-                                     WebIDBCallbacks* callbacks) {
-  IndexedDBDispatcher::ThreadSpecificInstance()->ResetCursorPrefetchCaches(
-      transaction_id, nullptr);
-
-  auto callbacks_impl = std::make_unique<IndexedDBCallbacksImpl>(
-      base::WrapUnique(callbacks), transaction_id, nullptr);
-  database_->DeleteRange(transaction_id, object_store_id,
-                         IndexedDBKeyRangeBuilder::Build(key_range),
-                         GetCallbacksProxy(std::move(callbacks_impl)));
-}
-
-void WebIDBDatabaseImpl::Clear(long long transaction_id,
-                               long long object_store_id,
-                               WebIDBCallbacks* callbacks) {
-  IndexedDBDispatcher::ThreadSpecificInstance()->ResetCursorPrefetchCaches(
-      transaction_id, nullptr);
-
-  auto callbacks_impl = std::make_unique<IndexedDBCallbacksImpl>(
-      base::WrapUnique(callbacks), transaction_id, nullptr);
-  database_->Clear(transaction_id, object_store_id,
-                   GetCallbacksProxy(std::move(callbacks_impl)));
-}
-
-void WebIDBDatabaseImpl::CreateIndex(long long transaction_id,
-                                     long long object_store_id,
-                                     long long index_id,
-                                     const WebString& name,
-                                     const WebIDBKeyPath& key_path,
-                                     bool unique,
-                                     bool multi_entry) {
-  database_->CreateIndex(transaction_id, object_store_id, index_id,
-                         name.Utf16(), IndexedDBKeyPathBuilder::Build(key_path),
-                         unique, multi_entry);
-}
-
-void WebIDBDatabaseImpl::DeleteIndex(long long transaction_id,
-                                     long long object_store_id,
-                                     long long index_id) {
-  database_->DeleteIndex(transaction_id, object_store_id, index_id);
-}
-
-void WebIDBDatabaseImpl::RenameIndex(long long transaction_id,
-                                     long long object_store_id,
-                                     long long index_id,
-                                     const WebString& new_name) {
-  database_->RenameIndex(transaction_id, object_store_id, index_id,
-                         new_name.Utf16());
-}
-
-void WebIDBDatabaseImpl::Abort(long long transaction_id) {
-  database_->Abort(transaction_id);
-}
-
-void WebIDBDatabaseImpl::Commit(long long transaction_id) {
-  database_->Commit(transaction_id);
-}
-
-IDBCallbacksAssociatedPtrInfo WebIDBDatabaseImpl::GetCallbacksProxy(
-    std::unique_ptr<IndexedDBCallbacksImpl> callbacks) {
-  IDBCallbacksAssociatedPtrInfo ptr_info;
-  auto request = mojo::MakeRequest(&ptr_info);
-  mojo::MakeStrongAssociatedBinding(std::move(callbacks), std::move(request));
-  return ptr_info;
-}
-
-}  // namespace content
diff --git a/content/renderer/indexed_db/webidbdatabase_impl_unittest.cc b/content/renderer/indexed_db/webidbdatabase_impl_unittest.cc
deleted file mode 100644
index 39bc0f2..0000000
--- a/content/renderer/indexed_db/webidbdatabase_impl_unittest.cc
+++ /dev/null
@@ -1,96 +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 <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "content/child/thread_safe_sender.h"
-#include "content/public/test/test_browser_thread_bundle.h"
-#include "content/renderer/indexed_db/mock_webidbcallbacks.h"
-#include "content/renderer/indexed_db/webidbdatabase_impl.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/common/indexeddb/indexeddb_key.h"
-#include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h"
-#include "third_party/blink/public/platform/web_blob_info.h"
-#include "third_party/blink/public/platform/web_data.h"
-#include "third_party/blink/public/web/web_heap.h"
-
-using blink::IndexedDBKey;
-using blink::WebBlobInfo;
-using blink::WebData;
-using blink::WebIDBCursor;
-using blink::WebIDBKey;
-using blink::WebVector;
-using testing::_;
-using testing::Invoke;
-using testing::StrictMock;
-using testing::WithArgs;
-
-namespace content {
-
-class WebIDBDatabaseImplTest : public testing::Test {
- public:
-  WebIDBDatabaseImplTest() {}
-
-  void TearDown() override { blink::WebHeap::CollectAllGarbageForTesting(); }
-
- private:
-  TestBrowserThreadBundle thread_bundle_;
-
-  DISALLOW_COPY_AND_ASSIGN(WebIDBDatabaseImplTest);
-};
-
-TEST_F(WebIDBDatabaseImplTest, ValueSizeTest) {
-  // For testing use a much smaller maximum size to prevent allocating >100 MB
-  // of memory, which crashes on memory-constrained systems.
-  const size_t kMaxValueSizeForTesting = 10 * 1024 * 1024;  // 10 MB
-
-  const std::vector<char> data(kMaxValueSizeForTesting + 1);
-  const WebData value(&data.front(), data.size());
-  const WebVector<WebBlobInfo> web_blob_info;
-
-  const int64_t transaction_id = 1;
-  const int64_t object_store_id = 2;
-
-  StrictMock<MockWebIDBCallbacks> callbacks;
-  EXPECT_CALL(callbacks, OnError(_)).Times(1);
-
-  WebIDBDatabaseImpl database_impl(nullptr);
-  database_impl.max_put_value_size_ = kMaxValueSizeForTesting;
-  const WebIDBKey idb_key = WebIDBKey::CreateNumber(0);
-  database_impl.Put(transaction_id, object_store_id, value, web_blob_info,
-                    idb_key.View(), blink::kWebIDBPutModeAddOrUpdate,
-                    &callbacks, WebVector<blink::WebIDBIndexKeys>());
-}
-
-TEST_F(WebIDBDatabaseImplTest, KeyAndValueSizeTest) {
-  // For testing use a much smaller maximum size to prevent allocating >100 MB
-  // of memory, which crashes on memory-constrained systems.
-  const size_t kMaxValueSizeForTesting = 10 * 1024 * 1024;  // 10 MB
-  const size_t kKeySize = 1024 * 1024;
-
-  const std::vector<char> data(kMaxValueSizeForTesting - kKeySize);
-  const WebData value(&data.front(), data.size());
-  const WebVector<WebBlobInfo> web_blob_info;
-  const WebIDBKey key = WebIDBKey::CreateString(blink::WebString::FromUTF16(
-      base::string16(kKeySize / sizeof(base::string16::value_type), 'x')));
-
-  const int64_t transaction_id = 1;
-  const int64_t object_store_id = 2;
-
-  StrictMock<MockWebIDBCallbacks> callbacks;
-  EXPECT_CALL(callbacks, OnError(_)).Times(1);
-
-  WebIDBDatabaseImpl database_impl(nullptr);
-  database_impl.max_put_value_size_ = kMaxValueSizeForTesting;
-  database_impl.Put(transaction_id, object_store_id, value, web_blob_info,
-                    key.View(), blink::kWebIDBPutModeAddOrUpdate, &callbacks,
-                    WebVector<blink::WebIDBIndexKeys>());
-}
-
-}  // namespace content
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index ca3e62d..22beddb89 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -88,7 +88,6 @@
 #include "content/renderer/dom_storage/webstoragenamespace_impl.h"
 #include "content/renderer/effective_connection_type_helper.h"
 #include "content/renderer/gpu/frame_swap_message_queue.h"
-#include "content/renderer/indexed_db/indexed_db_dispatcher.h"
 #include "content/renderer/input/widget_input_handler_manager.h"
 #include "content/renderer/loader/resource_dispatcher.h"
 #include "content/renderer/low_memory_mode_controller.h"
@@ -764,7 +763,6 @@
                           base::Unretained(appcache_dispatcher())),
       GetWebMainThreadScheduler()->IPCTaskRunner());
   dom_storage_dispatcher_.reset(new DomStorageDispatcher());
-  main_thread_indexed_db_dispatcher_.reset(new IndexedDBDispatcher());
 
   vc_manager_.reset(new VideoCaptureImplManager());
 
diff --git a/content/renderer/render_thread_impl.h b/content/renderer/render_thread_impl.h
index 886a283..37ed299 100644
--- a/content/renderer/render_thread_impl.h
+++ b/content/renderer/render_thread_impl.h
@@ -125,7 +125,6 @@
 class DomStorageDispatcher;
 class FrameSwapMessageQueue;
 class GpuVideoAcceleratorFactoriesImpl;
-class IndexedDBDispatcher;
 class LowMemoryModeController;
 class MidiMessageFilter;
 class P2PSocketDispatcher;
@@ -597,7 +596,6 @@
   // These objects live solely on the render thread.
   std::unique_ptr<AppCacheDispatcher> appcache_dispatcher_;
   std::unique_ptr<DomStorageDispatcher> dom_storage_dispatcher_;
-  std::unique_ptr<IndexedDBDispatcher> main_thread_indexed_db_dispatcher_;
   std::unique_ptr<blink::scheduler::WebThreadScheduler> main_thread_scheduler_;
   std::unique_ptr<RendererBlinkPlatformImpl> blink_platform_impl_;
   std::unique_ptr<ResourceDispatcher> resource_dispatcher_;
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc
index 8324f0c..0a22404 100644
--- a/content/renderer/renderer_blink_platform_impl.cc
+++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -46,7 +46,6 @@
 #include "content/renderer/dom_storage/session_web_storage_namespace_impl.h"
 #include "content/renderer/dom_storage/webstoragenamespace_impl.h"
 #include "content/renderer/image_capture/image_capture_frame_grabber.h"
-#include "content/renderer/indexed_db/webidbfactory_impl.h"
 #include "content/renderer/loader/child_url_loader_factory_bundle.h"
 #include "content/renderer/loader/code_cache_loader_impl.h"
 #include "content/renderer/loader/resource_dispatcher.h"
@@ -140,7 +139,6 @@
 using blink::WebBlobRegistry;
 using blink::WebCanvasCaptureHandler;
 using blink::WebDatabaseObserver;
-using blink::WebIDBFactory;
 using blink::WebImageCaptureFrameGrabber;
 using blink::WebMediaPlayer;
 using blink::WebMediaRecorderHandler;
@@ -563,17 +561,6 @@
 
 //------------------------------------------------------------------------------
 
-std::unique_ptr<blink::WebIDBFactory>
-RendererBlinkPlatformImpl::CreateIdbFactory() {
-  blink::mojom::IDBFactoryPtrInfo web_idb_factory_host_info;
-  GetInterfaceProvider()->GetInterface(
-      mojo::MakeRequest(&web_idb_factory_host_info));
-  return std::make_unique<WebIDBFactoryImpl>(
-      std::move(web_idb_factory_host_info));
-}
-
-//------------------------------------------------------------------------------
-
 WebString RendererBlinkPlatformImpl::FileSystemCreateOriginIdentifier(
     const blink::WebSecurityOrigin& origin) {
   return WebString::FromUTF8(
diff --git a/content/renderer/renderer_blink_platform_impl.h b/content/renderer/renderer_blink_platform_impl.h
index 4ec814f..d12e1fc 100644
--- a/content/renderer/renderer_blink_platform_impl.h
+++ b/content/renderer/renderer_blink_platform_impl.h
@@ -27,7 +27,6 @@
 #include "third_party/blink/public/common/screen_orientation/web_screen_orientation_type.h"
 #include "third_party/blink/public/mojom/loader/code_cache.mojom.h"
 #include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_factory.h"
 #include "third_party/blink/public/platform/modules/webdatabase/web_database.mojom.h"
 
 #if defined(OS_LINUX)
@@ -125,7 +124,6 @@
   viz::FrameSinkId GenerateFrameSinkId() override;
   bool IsLockedToSite() const override;
 
-  std::unique_ptr<blink::WebIDBFactory> CreateIdbFactory() override;
   blink::WebString FileSystemCreateOriginIdentifier(
       const blink::WebSecurityOrigin& origin) override;
 
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index acbc468..2539260 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1704,10 +1704,6 @@
     "../renderer/gpu/layer_tree_view_unittest.cc",
     "../renderer/gpu/queue_message_swap_promise_unittest.cc",
     "../renderer/ico_image_decoder_unittest.cc",
-    "../renderer/indexed_db/mock_webidbcallbacks.cc",
-    "../renderer/indexed_db/mock_webidbcallbacks.h",
-    "../renderer/indexed_db/webidbcursor_impl_unittest.cc",
-    "../renderer/indexed_db/webidbdatabase_impl_unittest.cc",
     "../renderer/input/input_event_prediction_unittest.cc",
     "../renderer/input/main_thread_event_queue_unittest.cc",
     "../renderer/loader/resource_dispatcher_unittest.cc",
diff --git a/content/test/data/indexeddb/cursor_prefetch.js b/content/test/data/indexeddb/cursor_prefetch.js
index 076e6a9..772f5c0 100644
--- a/content/test/data/indexeddb/cursor_prefetch.js
+++ b/content/test/data/indexeddb/cursor_prefetch.js
@@ -3,8 +3,8 @@
 // found in the LICENSE file.
 
 // These constants should match the ones in
-// content/child/indexed_db/webidbcursor_impl.h to make sure the test hits the
-// right code paths.
+// third_party/blink/renderer/modules/indexeddb/web_idb_cursor_impl.h to
+// make sure the test hits the right code paths.
 var kPrefetchThreshold = 2;
 var kMinPrefetchAmount = 5;
 
diff --git a/content/test/test_blink_web_unit_test_support.cc b/content/test/test_blink_web_unit_test_support.cc
index 98a8fc1..4d75061 100644
--- a/content/test/test_blink_web_unit_test_support.cc
+++ b/content/test/test_blink_web_unit_test_support.cc
@@ -214,12 +214,6 @@
   return &blob_registry_;
 }
 
-std::unique_ptr<blink::WebIDBFactory>
-TestBlinkWebUnitTestSupport::CreateIdbFactory() {
-  NOTREACHED() << "IndexedDB cannot be tested with in-process harnesses.";
-  return nullptr;
-}
-
 std::unique_ptr<blink::WebURLLoaderFactory>
 TestBlinkWebUnitTestSupport::CreateDefaultURLLoaderFactory() {
   return std::make_unique<WebURLLoaderFactoryWithMock>(
diff --git a/content/test/test_blink_web_unit_test_support.h b/content/test/test_blink_web_unit_test_support.h
index 75010ad..44e7e95 100644
--- a/content/test/test_blink_web_unit_test_support.h
+++ b/content/test/test_blink_web_unit_test_support.h
@@ -34,7 +34,6 @@
   ~TestBlinkWebUnitTestSupport() override;
 
   blink::WebBlobRegistry* GetBlobRegistry() override;
-  std::unique_ptr<blink::WebIDBFactory> CreateIdbFactory() override;
 
   std::unique_ptr<blink::WebURLLoaderFactory> CreateDefaultURLLoaderFactory()
       override;
diff --git a/third_party/blink/common/BUILD.gn b/third_party/blink/common/BUILD.gn
index 6da01ea..a810c19 100644
--- a/third_party/blink/common/BUILD.gn
+++ b/third_party/blink/common/BUILD.gn
@@ -33,11 +33,11 @@
     "frame/frame_policy.cc",
     "frame/from_ad_state.cc",
     "frame/user_activation_state.cc",
+    "indexeddb/indexed_db_default_mojom_traits.cc",
     "indexeddb/indexeddb_key.cc",
     "indexeddb/indexeddb_key_path.cc",
     "indexeddb/indexeddb_key_range.cc",
     "indexeddb/indexeddb_metadata.cc",
-    "indexeddb/indexeddb_mojom_traits.cc",
     "manifest/manifest.cc",
     "manifest/manifest_icon_selector.cc",
     "messaging/cloneable_message.cc",
diff --git a/third_party/blink/common/indexeddb/indexeddb_mojom_traits.cc b/third_party/blink/common/indexeddb/indexed_db_default_mojom_traits.cc
similarity index 99%
rename from third_party/blink/common/indexeddb/indexeddb_mojom_traits.cc
rename to third_party/blink/common/indexeddb/indexed_db_default_mojom_traits.cc
index b1b6d00..f8386d8 100644
--- a/third_party/blink/common/indexeddb/indexeddb_mojom_traits.cc
+++ b/third_party/blink/common/indexeddb/indexed_db_default_mojom_traits.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "third_party/blink/public/common/indexeddb/indexeddb_mojom_traits.h"
+#include "third_party/blink/public/common/indexeddb/indexed_db_default_mojom_traits.h"
 
 #include <utility>
 
diff --git a/third_party/blink/common/indexeddb/indexeddb_key.cc b/third_party/blink/common/indexeddb/indexeddb_key.cc
index 99f2fce..b5c331d 100644
--- a/third_party/blink/common/indexeddb/indexeddb_key.cc
+++ b/third_party/blink/common/indexeddb/indexeddb_key.cc
@@ -24,10 +24,10 @@
 // Very rough estimate of minimum key size overhead.
 const size_t kOverheadSize = 16;
 
-static size_t CalculateArraySize(const IndexedDBKey::KeyArray& keys) {
+size_t CalculateArraySize(const IndexedDBKey::KeyArray& keys) {
   size_t size(0);
-  for (size_t i = 0; i < keys.size(); ++i)
-    size += keys[i].size_estimate();
+  for (const auto& key : keys)
+    size += key.size_estimate();
   return size;
 }
 
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn
index 6c2aeb2..0fe6607 100644
--- a/third_party/blink/public/BUILD.gn
+++ b/third_party/blink/public/BUILD.gn
@@ -128,13 +128,11 @@
     "platform/mac/web_sandbox_support.h",
     "platform/mac/web_scrollbar_theme.h",
     "platform/modules/background_fetch/web_background_fetch_registration.h",
+    "platform/modules/indexeddb/indexed_db_key_builder.h",
     "platform/modules/indexeddb/web_idb_callbacks.h",
-    "platform/modules/indexeddb/web_idb_cursor.h",
-    "platform/modules/indexeddb/web_idb_database.h",
     "platform/modules/indexeddb/web_idb_database_callbacks.h",
     "platform/modules/indexeddb/web_idb_database_error.h",
     "platform/modules/indexeddb/web_idb_database_exception.h",
-    "platform/modules/indexeddb/web_idb_factory.h",
     "platform/modules/indexeddb/web_idb_key.h",
     "platform/modules/indexeddb/web_idb_key_path.h",
     "platform/modules/indexeddb/web_idb_key_range.h",
diff --git a/third_party/blink/public/common/BUILD.gn b/third_party/blink/public/common/BUILD.gn
index 9917892..89dc9ca 100644
--- a/third_party/blink/public/common/BUILD.gn
+++ b/third_party/blink/public/common/BUILD.gn
@@ -52,11 +52,11 @@
     "frame/user_activation_state.h",
     "frame/user_activation_update_source.h",
     "frame/user_activation_update_type.h",
+    "indexeddb/indexed_db_default_mojom_traits.h",
     "indexeddb/indexeddb_key.h",
     "indexeddb/indexeddb_key_path.h",
     "indexeddb/indexeddb_key_range.h",
     "indexeddb/indexeddb_metadata.h",
-    "indexeddb/indexeddb_mojom_traits.h",
     "indexeddb/web_idb_types.h",
     "manifest/manifest.h",
     "manifest/manifest_icon_selector.h",
diff --git a/third_party/blink/public/common/indexeddb/indexed_db_default.typemap b/third_party/blink/public/common/indexeddb/indexed_db_default.typemap
new file mode 100644
index 0000000..76bb446c
--- /dev/null
+++ b/third_party/blink/public/common/indexeddb/indexed_db_default.typemap
@@ -0,0 +1,31 @@
+# Copyright 2018 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.
+
+mojom = "//third_party/blink/public/mojom/indexeddb/indexeddb.mojom"
+public_headers = [
+  "//third_party/blink/public/common/indexeddb/indexeddb_key.h",
+  "//third_party/blink/public/common/indexeddb/indexeddb_key_path.h",
+  "//third_party/blink/public/common/indexeddb/indexeddb_key_range.h",
+  "//third_party/blink/public/common/indexeddb/indexeddb_metadata.h",
+  "//third_party/blink/public/common/indexeddb/web_idb_types.h",
+]
+traits_headers = [
+  "//mojo/public/cpp/bindings/array_traits_span.h",
+  "//third_party/blink/public/common/indexeddb/indexed_db_default_mojom_traits.h",
+]
+type_mappings = [
+  "blink.mojom.IDBCursorDirection=::blink::WebIDBCursorDirection",
+  "blink.mojom.IDBDataLoss=::blink::WebIDBDataLoss",
+  "blink.mojom.IDBDatabaseMetadata=::blink::IndexedDBDatabaseMetadata",
+  "blink.mojom.IDBIndexKeys=::blink::IndexedDBIndexKeys",
+  "blink.mojom.IDBIndexMetadata=::blink::IndexedDBIndexMetadata",
+  "blink.mojom.IDBKey=::blink::IndexedDBKey",
+  "blink.mojom.IDBKeyPath=::blink::IndexedDBKeyPath",
+  "blink.mojom.IDBKeyRange=::blink::IndexedDBKeyRange",
+  "blink.mojom.IDBObjectStoreMetadata=::blink::IndexedDBObjectStoreMetadata",
+  "blink.mojom.IDBOperationType=::blink::WebIDBOperationType",
+  "blink.mojom.IDBPutMode=::blink::WebIDBPutMode",
+  "blink.mojom.IDBTaskType=::blink::WebIDBTaskType",
+  "blink.mojom.IDBTransactionMode=::blink::WebIDBTransactionMode",
+]
diff --git a/third_party/blink/public/common/indexeddb/indexeddb_mojom_traits.h b/third_party/blink/public/common/indexeddb/indexed_db_default_mojom_traits.h
similarity index 96%
rename from third_party/blink/public/common/indexeddb/indexeddb_mojom_traits.h
rename to third_party/blink/public/common/indexeddb/indexed_db_default_mojom_traits.h
index 583b2ba..b1620f4 100644
--- a/third_party/blink/public/common/indexeddb/indexeddb_mojom_traits.h
+++ b/third_party/blink/public/common/indexeddb/indexed_db_default_mojom_traits.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_INDEXEDDB_INDEXEDDB_MOJOM_TRAITS_H_
-#define THIRD_PARTY_BLINK_PUBLIC_COMMON_INDEXEDDB_INDEXEDDB_MOJOM_TRAITS_H_
+#ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_INDEXEDDB_INDEXED_DB_DEFAULT_MOJOM_TRAITS_H_
+#define THIRD_PARTY_BLINK_PUBLIC_COMMON_INDEXEDDB_INDEXED_DB_DEFAULT_MOJOM_TRAITS_H_
 
 #include "base/containers/span.h"
 #include "third_party/blink/public/common/common_export.h"
@@ -232,4 +232,4 @@
 
 }  // namespace mojo
 
-#endif  // THIRD_PARTY_BLINK_PUBLIC_COMMON_INDEXEDDB_INDEXEDDB_MOJOM_TRAITS_H_
+#endif  // THIRD_PARTY_BLINK_PUBLIC_COMMON_INDEXEDDB_INDEXED_DB_DEFAULT_MOJOM_TRAITS_H_
diff --git a/third_party/blink/public/common/indexeddb/indexeddb.typemap b/third_party/blink/public/common/indexeddb/indexeddb.typemap
deleted file mode 100644
index 5210388..0000000
--- a/third_party/blink/public/common/indexeddb/indexeddb.typemap
+++ /dev/null
@@ -1,31 +0,0 @@
-# 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.
-
-mojom = "//third_party/blink/public/mojom/indexeddb/indexeddb.mojom"
-public_headers = [
-  "//third_party/blink/public/common/indexeddb/indexeddb_key.h",
-  "//third_party/blink/public/common/indexeddb/indexeddb_key_path.h",
-  "//third_party/blink/public/common/indexeddb/indexeddb_key_range.h",
-  "//third_party/blink/public/common/indexeddb/indexeddb_metadata.h",
-  "//third_party/blink/public/common/indexeddb/web_idb_types.h",
-]
-traits_headers = [
-  "//mojo/public/cpp/bindings/array_traits_span.h",
-  "//third_party/blink/public/common/indexeddb/indexeddb_mojom_traits.h",
-]
-type_mappings = [
-  "blink.mojom.IDBCursorDirection=blink::WebIDBCursorDirection",
-  "blink.mojom.IDBDataLoss=blink::WebIDBDataLoss",
-  "blink.mojom.IDBDatabaseMetadata=blink::IndexedDBDatabaseMetadata",
-  "blink.mojom.IDBIndexKeys=blink::IndexedDBIndexKeys",
-  "blink.mojom.IDBIndexMetadata=blink::IndexedDBIndexMetadata",
-  "blink.mojom.IDBKey=blink::IndexedDBKey",
-  "blink.mojom.IDBKeyPath=blink::IndexedDBKeyPath",
-  "blink.mojom.IDBKeyRange=blink::IndexedDBKeyRange",
-  "blink.mojom.IDBObjectStoreMetadata=blink::IndexedDBObjectStoreMetadata",
-  "blink.mojom.IDBOperationType=blink::WebIDBOperationType",
-  "blink.mojom.IDBPutMode=blink::WebIDBPutMode",
-  "blink.mojom.IDBTaskType=blink::WebIDBTaskType",
-  "blink.mojom.IDBTransactionMode=blink::WebIDBTransactionMode",
-]
diff --git a/third_party/blink/public/platform/modules/indexeddb/indexed_db_key_builder.h b/third_party/blink/public/platform/modules/indexeddb/indexed_db_key_builder.h
new file mode 100644
index 0000000..28a5e8f
--- /dev/null
+++ b/third_party/blink/public/platform/modules/indexeddb/indexed_db_key_builder.h
@@ -0,0 +1,76 @@
+// Copyright (c) 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.
+
+#ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_INDEXEDDB_INDEXED_DB_KEY_BUILDER_H_
+#define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_INDEXEDDB_INDEXED_DB_KEY_BUILDER_H_
+
+#include "third_party/blink/public/common/indexeddb/indexeddb_key.h"
+#include "third_party/blink/public/common/indexeddb/indexeddb_key_path.h"
+#include "third_party/blink/public/platform/modules/indexeddb/web_idb_key.h"
+#include "third_party/blink/public/platform/web_common.h"
+
+namespace blink {
+
+class IndexedDBKeyRange;
+class WebIDBKeyPath;
+class WebIDBKeyRange;
+
+class BLINK_EXPORT IndexedDBKeyBuilder {
+ public:
+  static IndexedDBKey Build(WebIDBKeyView key);
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(IndexedDBKeyBuilder);
+};
+
+class BLINK_EXPORT WebIDBKeyBuilder {
+ public:
+  static WebIDBKey Build(const IndexedDBKey& key);
+  static WebIDBKey Build(const WebIDBKeyView& key);
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(WebIDBKeyBuilder);
+};
+
+class BLINK_EXPORT IndexedDBKeyRangeBuilder {
+ public:
+  static IndexedDBKeyRange Build(const WebIDBKeyRange& key_range);
+
+  // Builds a point range (containing a single key).
+  static IndexedDBKeyRange Build(WebIDBKeyView key);
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(IndexedDBKeyRangeBuilder);
+};
+
+class BLINK_EXPORT WebIDBKeyRangeBuilder {
+ public:
+  static WebIDBKeyRange Build(const IndexedDBKeyRange& key);
+
+  // Builds a point range (containing a single key).
+  static WebIDBKeyRange Build(WebIDBKeyView key);
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(WebIDBKeyRangeBuilder);
+};
+
+class BLINK_EXPORT IndexedDBKeyPathBuilder {
+ public:
+  static IndexedDBKeyPath Build(const WebIDBKeyPath& key_path);
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(IndexedDBKeyPathBuilder);
+};
+
+class BLINK_EXPORT WebIDBKeyPathBuilder {
+ public:
+  static WebIDBKeyPath Build(const IndexedDBKeyPath& key_path);
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(WebIDBKeyPathBuilder);
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_INDEXEDDB_INDEXED_DB_KEY_BUILDER_H_
diff --git a/third_party/blink/public/platform/modules/indexeddb/web_idb_database_callbacks.h b/third_party/blink/public/platform/modules/indexeddb/web_idb_database_callbacks.h
index 2343315..deac9f4 100644
--- a/third_party/blink/public/platform/modules/indexeddb/web_idb_database_callbacks.h
+++ b/third_party/blink/public/platform/modules/indexeddb/web_idb_database_callbacks.h
@@ -40,11 +40,11 @@
 
 class WebIDBDatabaseCallbacks {
  public:
-  using ObservationIndexMap = std::unordered_map<int32_t, std::vector<int32_t>>;
+  using ObservationIndexMap = std::unordered_map<int32_t, WebVector<int32_t>>;
 
   // Maps observer to transaction, which needs an id and a scope.
   using TransactionMap =
-      std::unordered_map<int32_t, std::pair<int64_t, std::vector<int64_t>>>;
+      std::unordered_map<int32_t, std::pair<int64_t, WebVector<int64_t>>>;
 
   virtual ~WebIDBDatabaseCallbacks() = default;
 
diff --git a/third_party/blink/public/platform/modules/indexeddb/web_idb_key.h b/third_party/blink/public/platform/modules/indexeddb/web_idb_key.h
index cdacdfe..7255f7d 100644
--- a/third_party/blink/public/platform/modules/indexeddb/web_idb_key.h
+++ b/third_party/blink/public/platform/modules/indexeddb/web_idb_key.h
@@ -62,7 +62,7 @@
 // The Blink object wrapped by WebIDBKey is immutable, so WebIDBKeyView
 // instances are implicitly const references.
 //
-// Having both WebIDBKeyView and WebIDBView is extra complexity, and we pay this
+// Having both WebIDBKeyView and WebIDBKey is extra complexity, and we pay this
 // price to avoid unnecessary memory copying. Specifically, WebIDBKeyView is
 // used to issue requests to the IndexedDB backing store.
 //
@@ -99,6 +99,19 @@
   // Only valid for NumberType.
   BLINK_EXPORT double Number() const;
 
+  BLINK_EXPORT size_t SizeEstimate() const;
+
+  // TODO(cmp): Ensure |private_| can never be null.
+  //
+  // SizeEstimate() can be called when |private_| is null.  That happens if and
+  // only if the |WebIDBKey| instance is created using WebIDBKey::CreateNull().
+  //
+  // Eventually, WebIDBKey::CreateNull() will change so that case will lead to
+  // a non-null |private_|.  At that time, this null check can change to a
+  // DCHECK that |private_| is not null and the special null case handling can
+  // be removed.
+  BLINK_EXPORT bool IsNull() const { return !private_; }
+
  private:
   const IDBKey* const private_;
 };
@@ -124,18 +137,25 @@
   BLINK_EXPORT static WebIDBKey CreateNull() noexcept { return WebIDBKey(); }
 
   // The default constructor must not be used explicitly.
-  // It is only provided for WebVector's use.
+  // It is only provided for WebVector and Mojo's use.
   BLINK_EXPORT WebIDBKey() noexcept;
 
   BLINK_EXPORT WebIDBKey(WebIDBKey&&) noexcept;
   BLINK_EXPORT WebIDBKey& operator=(WebIDBKey&&) noexcept;
 
+  // TODO(cmp): Remove copy and assignment constructors when Vector<->WebVector
+  //            conversions are no longer needed.
+  BLINK_EXPORT WebIDBKey(const WebIDBKey& rkey);
+  BLINK_EXPORT WebIDBKey& operator=(const WebIDBKey& rkey);
+
   BLINK_EXPORT ~WebIDBKey();
 
   BLINK_EXPORT WebIDBKeyView View() const {
     return WebIDBKeyView(private_.get());
   }
 
+  BLINK_EXPORT size_t SizeEstimate() const { return View().SizeEstimate(); }
+
 #if INSIDE_BLINK
   explicit WebIDBKey(std::unique_ptr<IDBKey>) noexcept;
   WebIDBKey& operator=(std::unique_ptr<IDBKey>) noexcept;
@@ -147,11 +167,6 @@
 #endif  // INSIDE_BLINK
 
  private:
-  // WebIDBKey has to be move-only, because std::unique_ptr is move-only. Making
-  // the restriction explicit results in slightly better compilation error
-  // messages in code that attempts copying.
-  WebIDBKey(const WebIDBKey&) = delete;
-  WebIDBKey& operator=(const WebIDBKey&) = delete;
 
   std::unique_ptr<IDBKey> private_;
 };
diff --git a/third_party/blink/public/platform/platform.h b/third_party/blink/public/platform/platform.h
index b9acf77..6225f1f 100644
--- a/third_party/blink/public/platform/platform.h
+++ b/third_party/blink/public/platform/platform.h
@@ -50,7 +50,6 @@
 #include "third_party/blink/public/mojom/loader/code_cache.mojom-shared.h"
 #include "third_party/blink/public/platform/blame_context.h"
 #include "third_party/blink/public/platform/code_cache_loader.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_factory.h"
 #include "third_party/blink/public/platform/user_metrics_action.h"
 #include "third_party/blink/public/platform/web_audio_device.h"
 #include "third_party/blink/public/platform/web_common.h"
@@ -298,11 +297,6 @@
 
   virtual WebString ConvertIDNToUnicode(const WebString& host) { return host; }
 
-  // IndexedDB ----------------------------------------------------------
-
-  // Must return non-null.
-  virtual std::unique_ptr<WebIDBFactory> CreateIdbFactory() { return nullptr; }
-
   // History -------------------------------------------------------------
 
   // Returns the hash for the given canonicalized URL for use in visited
diff --git a/third_party/blink/public/public_typemaps.gni b/third_party/blink/public/public_typemaps.gni
index 92a1825..d59930b 100644
--- a/third_party/blink/public/public_typemaps.gni
+++ b/third_party/blink/public/public_typemaps.gni
@@ -5,7 +5,7 @@
 # These are typemaps which are exposed by Blink to its embedder.
 typemaps = [
   "//third_party/blink/public/platform/content_security_policy.typemap",
-  "//third_party/blink/public/common/indexeddb/indexeddb.typemap",
+  "//third_party/blink/public/common/indexeddb/indexed_db_default.typemap",
   "//third_party/blink/public/common/manifest/display_mode.typemap",
   "//third_party/blink/public/common/manifest/manifest.typemap",
   "//third_party/blink/public/common/notifications/notification_types.typemap",
diff --git a/third_party/blink/renderer/modules/BUILD.gn b/third_party/blink/renderer/modules/BUILD.gn
index b03f4eb..43e9b66 100644
--- a/third_party/blink/renderer/modules/BUILD.gn
+++ b/third_party/blink/renderer/modules/BUILD.gn
@@ -276,10 +276,14 @@
     "indexeddb/idb_test_helper.cc",
     "indexeddb/idb_transaction_test.cc",
     "indexeddb/idb_value_wrapping_test.cc",
+    "indexeddb/mock_web_idb_callbacks.cc",
+    "indexeddb/mock_web_idb_callbacks.h",
     "indexeddb/mock_web_idb_database.cc",
     "indexeddb/mock_web_idb_database.h",
     "indexeddb/mock_web_idb_factory.cc",
     "indexeddb/mock_web_idb_factory.h",
+    "indexeddb/web_idb_cursor_impl_unittest.cc",
+    "indexeddb/web_idb_database_impl_unittest.cc",
     "manifest/image_resource_type_converters_test.cc",
     "media_controls/elements/media_control_animated_arrow_container_element_test.cc",
     "media_controls/elements/media_control_display_cutout_fullscreen_button_element_test.cc",
diff --git a/third_party/blink/renderer/modules/exported/BUILD.gn b/third_party/blink/renderer/modules/exported/BUILD.gn
index f79e1d1..bfc6251 100644
--- a/third_party/blink/renderer/modules/exported/BUILD.gn
+++ b/third_party/blink/renderer/modules/exported/BUILD.gn
@@ -5,6 +5,7 @@
 
 blink_modules_sources("exported") {
   sources = [
+    "indexed_db_key_builder.cc",
     "web_apply_constraints_request.cc",
     "web_ax_context.cc",
     "web_ax_object.cc",
diff --git a/content/renderer/indexed_db/indexed_db_key_builders.cc b/third_party/blink/renderer/modules/exported/indexed_db_key_builder.cc
similarity index 62%
rename from content/renderer/indexed_db/indexed_db_key_builders.cc
rename to third_party/blink/renderer/modules/exported/indexed_db_key_builder.cc
index 11414a0..8c2b8985 100644
--- a/content/renderer/indexed_db/indexed_db_key_builders.cc
+++ b/third_party/blink/renderer/modules/exported/indexed_db_key_builder.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/renderer/indexed_db/indexed_db_key_builders.h"
+#include "third_party/blink/public/platform/modules/indexeddb/indexed_db_key_builder.h"
 
 #include <stddef.h>
 
@@ -11,7 +11,6 @@
 #include <utility>
 #include <vector>
 
-#include "base/logging.h"
 #include "third_party/blink/public/common/indexeddb/indexeddb_key_range.h"
 #include "third_party/blink/public/common/indexeddb/web_idb_types.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_key.h"
@@ -19,32 +18,18 @@
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_key_range.h"
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/public/platform/web_vector.h"
+#include "third_party/blink/renderer/modules/indexeddb/idb_key_range.h"
 
-using blink::IndexedDBKey;
-using blink::IndexedDBKeyPath;
-using blink::IndexedDBKeyRange;
-using blink::WebIDBKey;
-using blink::WebIDBKeyRange;
-using blink::WebIDBKeyView;
-using blink::kWebIDBKeyTypeArray;
-using blink::kWebIDBKeyTypeBinary;
-using blink::kWebIDBKeyTypeDate;
-using blink::kWebIDBKeyTypeInvalid;
-using blink::kWebIDBKeyTypeMin;
-using blink::kWebIDBKeyTypeNull;
-using blink::kWebIDBKeyTypeNumber;
-using blink::kWebIDBKeyTypeString;
-using blink::WebVector;
-using blink::WebString;
+namespace blink {
 
 namespace {
 
-IndexedDBKey::KeyArray CopyKeyArray(blink::WebIDBKeyArrayView array) {
+IndexedDBKey::KeyArray CopyKeyArray(WebIDBKeyArrayView array) {
   IndexedDBKey::KeyArray result;
   const size_t array_size = array.size();
   result.reserve(array_size);
   for (size_t i = 0; i < array_size; ++i)
-    result.emplace_back(content::IndexedDBKeyBuilder::Build(array[i]));
+    result.emplace_back(IndexedDBKeyBuilder::Build(array[i]));
   return result;
 }
 
@@ -58,15 +43,13 @@
 
 }  // anonymous namespace
 
-namespace content {
-
 // static
-IndexedDBKey IndexedDBKeyBuilder::Build(blink::WebIDBKeyView key) {
+IndexedDBKey IndexedDBKeyBuilder::Build(WebIDBKeyView key) {
   switch (key.KeyType()) {
     case kWebIDBKeyTypeArray:
       return IndexedDBKey(CopyKeyArray(key.ArrayView()));
     case kWebIDBKeyTypeBinary: {
-      const blink::WebData data = key.Binary();
+      const WebData data = key.Binary();
       std::string key_string;
       key_string.reserve(data.size());
 
@@ -88,13 +71,44 @@
     case kWebIDBKeyTypeInvalid:
       return IndexedDBKey(key.KeyType());
     case kWebIDBKeyTypeMin:
-    default:
       NOTREACHED();
       return IndexedDBKey();
   }
 }
 
 // static
+WebIDBKey WebIDBKeyBuilder::Build(const WebIDBKeyView& key) {
+  switch (key.KeyType()) {
+    case kWebIDBKeyTypeArray: {
+      const WebIDBKeyArrayView& array = key.ArrayView();
+      WebVector<WebIDBKey> web_idb_keys;
+      const size_t array_size = array.size();
+      web_idb_keys.reserve(array_size);
+      for (size_t i = 0; i < array_size; ++i)
+        web_idb_keys.emplace_back(Build(array[i]));
+      return WebIDBKey::CreateArray(std::move(web_idb_keys));
+    }
+    case kWebIDBKeyTypeBinary: {
+      const WebData data = key.Binary();
+      return WebIDBKey::CreateBinary(data);
+    }
+    case kWebIDBKeyTypeString:
+      return WebIDBKey::CreateString(key.String());
+    case kWebIDBKeyTypeDate:
+      return WebIDBKey::CreateDate(key.Date());
+    case kWebIDBKeyTypeNumber:
+      return WebIDBKey::CreateNumber(key.Number());
+    case kWebIDBKeyTypeInvalid:
+      return WebIDBKey::CreateInvalid();
+    case kWebIDBKeyTypeNull:
+      return WebIDBKey::CreateNull();
+    case kWebIDBKeyTypeMin:
+      NOTREACHED();
+      return WebIDBKey::CreateInvalid();
+  }
+}
+
+// static
 WebIDBKey WebIDBKeyBuilder::Build(const IndexedDBKey& key) {
   switch (key.type()) {
     case kWebIDBKeyTypeArray: {
@@ -105,8 +119,11 @@
         web_idb_keys.emplace_back(Build(array_element));
       return WebIDBKey::CreateArray(std::move(web_idb_keys));
     }
-    case kWebIDBKeyTypeBinary:
-      return WebIDBKey::CreateBinary(key.binary());
+    case kWebIDBKeyTypeBinary: {
+      const std::string& str = key.binary();
+      const WebData& data = WebData(str.c_str(), str.length());
+      return WebIDBKey::CreateBinary(data);
+    }
     case kWebIDBKeyTypeString:
       return WebIDBKey::CreateString(WebString::FromUTF16(key.string()));
     case kWebIDBKeyTypeDate:
@@ -118,7 +135,6 @@
     case kWebIDBKeyTypeNull:
       return WebIDBKey::CreateNull();
     case kWebIDBKeyTypeMin:
-    default:
       NOTREACHED();
       return WebIDBKey::CreateInvalid();
   }
@@ -140,6 +156,13 @@
 }
 
 // static
+WebIDBKeyRange WebIDBKeyRangeBuilder::Build(WebIDBKeyView key) {
+  return WebIDBKeyRange(WebIDBKeyBuilder::Build(key),
+                        WebIDBKeyBuilder::Build(key), false /* lower_open */,
+                        false /* upper_open */);
+}
+
+// static
 WebIDBKeyRange WebIDBKeyRangeBuilder::Build(
     const IndexedDBKeyRange& key_range) {
   return WebIDBKeyRange(WebIDBKeyBuilder::Build(key_range.lower()),
@@ -148,43 +171,31 @@
 }
 
 // static
-IndexedDBKeyPath IndexedDBKeyPathBuilder::Build(
-    const blink::WebIDBKeyPath& key_path) {
+IndexedDBKeyPath IndexedDBKeyPathBuilder::Build(const WebIDBKeyPath& key_path) {
   switch (key_path.KeyPathType()) {
-    case blink::kWebIDBKeyPathTypeString:
+    case kWebIDBKeyPathTypeString:
       return IndexedDBKeyPath(key_path.String().Utf16());
-    case blink::kWebIDBKeyPathTypeArray:
+    case kWebIDBKeyPathTypeArray:
       return IndexedDBKeyPath(CopyArray(key_path.Array()));
-    case blink::kWebIDBKeyPathTypeNull:
-      return IndexedDBKeyPath();
-    default:
-      NOTREACHED();
+    case kWebIDBKeyPathTypeNull:
       return IndexedDBKeyPath();
   }
 }
 
 // static
-blink::WebIDBKeyPath WebIDBKeyPathBuilder::Build(
-    const IndexedDBKeyPath& key_path) {
+WebIDBKeyPath WebIDBKeyPathBuilder::Build(const IndexedDBKeyPath& key_path) {
   switch (key_path.type()) {
-    case blink::kWebIDBKeyPathTypeString:
-      return blink::WebIDBKeyPath::Create(
-          WebString::FromUTF16(key_path.string()));
-    case blink::kWebIDBKeyPathTypeArray: {
+    case kWebIDBKeyPathTypeString:
+      return WebIDBKeyPath::Create(WebString::FromUTF16(key_path.string()));
+    case kWebIDBKeyPathTypeArray: {
       WebVector<WebString> key_path_vector(key_path.array().size());
-      std::transform(key_path.array().begin(), key_path.array().end(),
-                     key_path_vector.begin(),
-                     [](const typename base::string16& s) {
-                       return WebString::FromUTF16(s);
-                     });
-      return blink::WebIDBKeyPath::Create(key_path_vector);
+      for (const auto& item : key_path.array())
+        key_path_vector.emplace_back(WebString::FromUTF16(item));
+      return WebIDBKeyPath::Create(key_path_vector);
     }
-    case blink::kWebIDBKeyPathTypeNull:
-      return blink::WebIDBKeyPath::CreateNull();
-    default:
-      NOTREACHED();
-      return blink::WebIDBKeyPath::CreateNull();
+    case kWebIDBKeyPathTypeNull:
+      return WebIDBKeyPath::CreateNull();
   }
 }
 
-}  // namespace content
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/exported/web_idb_key.cc b/third_party/blink/renderer/modules/exported/web_idb_key.cc
index 600bfce..4b26410 100644
--- a/third_party/blink/renderer/modules/exported/web_idb_key.cc
+++ b/third_party/blink/renderer/modules/exported/web_idb_key.cc
@@ -68,6 +68,23 @@
   return private_->Number();
 }
 
+size_t WebIDBKeyView::SizeEstimate() const {
+  // TODO(cmp): Ensure |private_| can never be null.
+  //
+  // SizeEstimate() can be called when |private_| is null.  That happens if and
+  // only if the |WebIDBKey| instance is created using WebIDBKey::CreateNull().
+  //
+  // Eventually, WebIDBKey::CreateNull() will change so that case will lead to
+  // a non-null |private_|.  At that time, this null check can change to a
+  // DCHECK that |private_| is not null and the special null case handling can
+  // be removed.
+  if (this->IsNull()) {
+    return IDBKey::kIDBKeyOverheadSize;
+  }
+
+  return private_->SizeEstimate();
+}
+
 WebIDBKey WebIDBKey::CreateArray(WebVector<WebIDBKey> array) {
   IDBKey::KeyArray keys;
   keys.ReserveCapacity(SafeCast<wtf_size_t>(array.size()));
@@ -112,4 +129,11 @@
   return *this;
 }
 
+WebIDBKey::WebIDBKey(const WebIDBKey& rkey)
+    : private_(IDBKey::Clone(rkey.private_)) {}
+WebIDBKey& WebIDBKey::operator=(const WebIDBKey& rkey) {
+  private_ = IDBKey::Clone(rkey.private_);
+  return *this;
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/indexeddb/BUILD.gn b/third_party/blink/renderer/modules/indexeddb/BUILD.gn
index b16dcc0..624dbe2 100644
--- a/third_party/blink/renderer/modules/indexeddb/BUILD.gn
+++ b/third_party/blink/renderer/modules/indexeddb/BUILD.gn
@@ -58,13 +58,34 @@
     "idb_version_change_event.cc",
     "idb_version_change_event.h",
     "indexed_db.h",
+    "indexed_db_blink_mojom_traits.cc",
+    "indexed_db_blink_mojom_traits.h",
+    "indexed_db_callbacks_impl.cc",
+    "indexed_db_callbacks_impl.h",
     "indexed_db_client.cc",
     "indexed_db_client.h",
+    "indexed_db_database_callbacks_impl.cc",
+    "indexed_db_database_callbacks_impl.h",
+    "indexed_db_dispatcher.cc",
+    "indexed_db_dispatcher.h",
     "inspector_indexed_db_agent.cc",
     "inspector_indexed_db_agent.h",
     "web_idb_callbacks_impl.cc",
     "web_idb_callbacks_impl.h",
+    "web_idb_cursor.h",
+    "web_idb_cursor_impl.cc",
+    "web_idb_cursor_impl.h",
+    "web_idb_database.h",
     "web_idb_database_callbacks_impl.cc",
     "web_idb_database_callbacks_impl.h",
+    "web_idb_database_impl.cc",
+    "web_idb_database_impl.h",
+    "web_idb_factory.h",
+    "web_idb_factory_impl.cc",
+    "web_idb_factory_impl.h",
+  ]
+
+  public_deps = [
+    "//third_party/blink/public/mojom:mojom_modules_blink",
   ]
 }
diff --git a/third_party/blink/renderer/modules/indexeddb/OWNERS b/third_party/blink/renderer/modules/indexeddb/OWNERS
index a740487..4d50d63 100644
--- a/third_party/blink/renderer/modules/indexeddb/OWNERS
+++ b/third_party/blink/renderer/modules/indexeddb/OWNERS
@@ -1,4 +1,9 @@
 file://content/browser/indexed_db/OWNERS
 
+per-file *_mojom_traits*.*=set noparent
+per-file *_mojom_traits*.*=file://ipc/SECURITY_OWNERS
+per-file *.typemap=set noparent
+per-file *.typemap=file://ipc/SECURITY_OWNERS
+
 # TEAM: storage-dev@chromium.org
 # COMPONENT: Blink>Storage>IndexedDB
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_cursor.cc b/third_party/blink/renderer/modules/indexeddb/idb_cursor.cc
index 8d1a9d21..4ee0d30 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_cursor.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_cursor.cc
@@ -27,7 +27,6 @@
 
 #include <limits>
 #include <memory>
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_database.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_key_range.h"
 #include "third_party/blink/renderer/bindings/modules/v8/to_v8_for_modules.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_binding_for_modules.h"
@@ -38,6 +37,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/idb_object_store.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_tracing.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_transaction.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_database.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/v8_private_property.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_cursor.h b/third_party/blink/renderer/modules/indexeddb/idb_cursor.h
index 64cec7cd..821aaf2 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_cursor.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_cursor.h
@@ -29,12 +29,12 @@
 #include <memory>
 #include "base/memory/scoped_refptr.h"
 #include "third_party/blink/public/common/indexeddb/web_idb_types.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_cursor.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
 #include "third_party/blink/renderer/bindings/modules/v8/idb_object_store_or_idb_index.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_key.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_request.h"
 #include "third_party/blink/renderer/modules/indexeddb/indexed_db.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_cursor.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/wtf/compiler.h"
 
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_cursor_with_value.h b/third_party/blink/renderer/modules/indexeddb/idb_cursor_with_value.h
index 91223d4..5914eff 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_cursor_with_value.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_cursor_with_value.h
@@ -28,9 +28,9 @@
 
 #include <memory>
 #include "third_party/blink/public/common/indexeddb/web_idb_types.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_cursor.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_cursor.h"
 #include "third_party/blink/renderer/modules/indexeddb/indexed_db.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_cursor.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_database.cc b/third_party/blink/renderer/modules/indexeddb/idb_database.cc
index f16cf99..3bad717 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_database.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_database.cc
@@ -208,7 +208,7 @@
       IDBTransaction* transaction = nullptr;
       auto it = transactions.find(map_entry.first);
       if (it != transactions.end()) {
-        const std::pair<int64_t, std::vector<int64_t>>& obs_txn = it->second;
+        const std::pair<int64_t, WebVector<int64_t>>& obs_txn = it->second;
         HashSet<String> stores;
         for (int64_t store_id : obs_txn.second) {
           stores.insert(metadata_.object_stores.at(store_id)->name);
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_database.h b/third_party/blink/renderer/modules/indexeddb/idb_database.h
index 556f2054..bf99761 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_database.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_database.h
@@ -29,7 +29,6 @@
 #include <memory>
 
 #include "base/memory/scoped_refptr.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_database.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_database_callbacks.h"
 #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
 #include "third_party/blink/renderer/bindings/core/v8/string_or_string_sequence.h"
@@ -43,6 +42,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/idb_object_store_parameters.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_transaction.h"
 #include "third_party/blink/renderer/modules/indexeddb/indexed_db.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_database.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/trace_wrapper_member.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_factory.cc b/third_party/blink/renderer/modules/indexeddb/idb_factory.cc
index 38167d5..f1c3beb1 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_factory.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_factory.cc
@@ -31,9 +31,10 @@
 #include <memory>
 #include <utility>
 
+#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h"
+#include "third_party/blink/public/platform/interface_provider.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_callbacks.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_database_callbacks.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_factory.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_name_and_version.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_value.h"
 #include "third_party/blink/public/platform/platform.h"
@@ -53,6 +54,8 @@
 #include "third_party/blink/renderer/modules/indexeddb/idb_key.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_tracing.h"
 #include "third_party/blink/renderer/modules/indexeddb/indexed_db_client.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_factory.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_factory_impl.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/histogram.h"
@@ -186,8 +189,13 @@
 }
 
 WebIDBFactory* IDBFactory::GetFactory() {
-  if (!web_idb_factory_)
-    web_idb_factory_ = Platform::Current()->CreateIdbFactory();
+  if (!web_idb_factory_) {
+    mojom::blink::IDBFactoryPtrInfo web_idb_factory_host_info;
+    Platform::Current()->GetInterfaceProvider()->GetInterface(
+        mojo::MakeRequest(&web_idb_factory_host_info));
+    web_idb_factory_ = std::make_unique<WebIDBFactoryImpl>(
+        std::move(web_idb_factory_host_info));
+  }
   return web_idb_factory_.get();
 }
 
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_factory.h b/third_party/blink/renderer/modules/indexeddb/idb_factory.h
index 3d7e36d..3ff9b1c 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_factory.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_factory.h
@@ -29,9 +29,9 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_IDB_FACTORY_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_IDB_FACTORY_H_
 
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_factory.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_open_db_request.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_factory.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_index.h b/third_party/blink/renderer/modules/indexeddb/idb_index.h
index 99a4824..e78ec6ff 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_index.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_index.h
@@ -27,13 +27,13 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_IDB_INDEX_H_
 
 #include "third_party/blink/public/common/indexeddb/web_idb_types.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_cursor.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_database.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_cursor.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_key_path.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_key_range.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_metadata.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_request.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_cursor.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_database.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/wtf/forward.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_key.cc b/third_party/blink/renderer/modules/indexeddb/idb_key.cc
index 8ed421c..d061b3e3 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_key.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_key.cc
@@ -34,6 +34,40 @@
 
 namespace blink {
 
+namespace {
+
+size_t CalculateIDBKeyArraySize(const IDBKey::KeyArray& keys) {
+  size_t size(0);
+  for (const auto& key : keys)
+    size += key.get()->SizeEstimate();
+  return size;
+}
+
+}  // namespace
+
+IDBKey::IDBKey() : type_(kInvalidType), size_estimate_(kIDBKeyOverheadSize) {}
+
+IDBKey::IDBKey(Type type, double number)
+    : type_(type),
+      number_(number),
+      size_estimate_(kIDBKeyOverheadSize + sizeof(number_)) {}
+
+IDBKey::IDBKey(const String& value)
+    : type_(kStringType),
+      string_(value),
+      size_estimate_(kIDBKeyOverheadSize + (string_.length() * sizeof(UChar))) {
+}
+
+IDBKey::IDBKey(scoped_refptr<SharedBuffer> value)
+    : type_(kBinaryType),
+      binary_(std::move(value)),
+      size_estimate_(kIDBKeyOverheadSize + binary_.get()->size()) {}
+
+IDBKey::IDBKey(KeyArray key_array)
+    : type_(kArrayType),
+      array_(std::move(key_array)),
+      size_estimate_(kIDBKeyOverheadSize + CalculateIDBKeyArraySize(array_)) {}
+
 IDBKey::~IDBKey() = default;
 
 bool IDBKey::IsValid() const {
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_key.h b/third_party/blink/renderer/modules/indexeddb/idb_key.h
index 3082acad..9c8e9add 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_key.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_key.h
@@ -78,8 +78,50 @@
     return base::WrapUnique(new IDBKey(std::move(array)));
   }
 
+  // TODO(cmp): This |Clone| function is necessary for WebIDBKey's ctor
+  //            functions.  It needs to be available in this header file so
+  //            web_idb_key.cc can use it.  When the IDB Blink variant typemap
+  //            moves to the renderer/modules/indexeddb/ types and off of the
+  //            WebIDB* types, this |Clone| function should be removed.
+  static std::unique_ptr<IDBKey> Clone(const std::unique_ptr<IDBKey>& rkey_in) {
+    IDBKey* rkey = rkey_in.get();
+    if (!rkey_in.get())
+      return nullptr;
+
+    switch (rkey->GetType()) {
+      case kInvalidType:
+        return IDBKey::CreateInvalid();
+      case kArrayType: {
+        IDBKey::KeyArray lkey_array;
+        const auto& rkey_array = rkey->Array();
+        for (const auto& rkey_item : rkey_array)
+          lkey_array.push_back(IDBKey::Clone(rkey_item));
+        return IDBKey::CreateArray(std::move(lkey_array));
+      }
+      case kBinaryType:
+        return IDBKey::CreateBinary(rkey->Binary());
+      case kStringType:
+        return IDBKey::CreateString(rkey->GetString());
+      case kDateType:
+        return IDBKey::CreateDate(rkey->Date());
+      case kNumberType:
+        return IDBKey::CreateNumber(rkey->Number());
+
+      case kTypeEnumMax:
+        break;  // Not used, NOTREACHED.
+    }
+    NOTREACHED();
+    return nullptr;
+  }
+
   ~IDBKey();
 
+  // Very rough estimate of minimum key size overhead.
+  //
+  // TODO(cmp): When the reference to this in web_idb_key.cc goes away, move
+  //            this variable back to idb_key.cc's anonymous namespace.
+  static const size_t kIDBKeyOverheadSize = 16;
+
   // In order of the least to the highest precedent in terms of sort order.
   // These values are written to logs. New enum values can be added, but
   // existing enums must never be renumbered or deleted and reused.
@@ -124,6 +166,7 @@
   int Compare(const IDBKey* other) const;
   bool IsLessThan(const IDBKey* other) const;
   bool IsEqual(const IDBKey* other) const;
+  size_t SizeEstimate() const { return size_estimate_; }
 
   // Returns a new key array with invalid keys and duplicates removed.
   //
@@ -140,20 +183,22 @@
  private:
   DISALLOW_COPY_AND_ASSIGN(IDBKey);
 
-  IDBKey() : type_(kInvalidType) {}
-  IDBKey(Type type, double number) : type_(type), number_(number) {}
-  explicit IDBKey(const class String& value)
-      : type_(kStringType), string_(value) {}
-  explicit IDBKey(scoped_refptr<SharedBuffer> value)
-      : type_(kBinaryType), binary_(std::move(value)) {}
-  explicit IDBKey(KeyArray key_array)
-      : type_(kArrayType), array_(std::move(key_array)) {}
+  IDBKey();
+  IDBKey(Type type, double number);
+  explicit IDBKey(const String& value);
+  explicit IDBKey(scoped_refptr<SharedBuffer> value);
+  explicit IDBKey(KeyArray key_array);
 
   Type type_;
   KeyArray array_;
   scoped_refptr<SharedBuffer> binary_;
-  const class String string_;
+  const String string_;
   const double number_ = 0;
+
+  // Initialized in IDBKey constructors based on key type and value size (see
+  // idb_key.cc).  Returned via SizeEstimate() and used in IndexedDB code to
+  // verify that a given key is small enough to pass over IPC.
+  size_t size_estimate_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc b/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc
index 5757d79..f7d0fce9 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc
@@ -30,7 +30,6 @@
 #include "base/feature_list.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/numerics/safe_conversions.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_database.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_key.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_key_range.h"
 #include "third_party/blink/public/platform/web_blob_info.h"
@@ -49,6 +48,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/idb_key_path.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_tracing.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_value_wrapping.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_database.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/histogram.h"
@@ -558,8 +558,8 @@
     key_type_histogram.Count(static_cast<int>(key->GetType()));
   }
 
-  WebVector<WebIDBIndexKeys> index_keys;
-  index_keys.reserve(Metadata().indexes.size());
+  Vector<WebIDBIndexKeys> index_keys;
+  index_keys.ReserveInitialCapacity(Metadata().indexes.size());
   for (const auto& it : Metadata().indexes) {
     if (clone.IsEmpty())
       value_wrapper.Clone(script_state, &clone);
@@ -754,8 +754,8 @@
       const IDBKey* primary_key = cursor->IdbPrimaryKey();
       ScriptValue value = cursor->value(script_state_);
 
-      WebVector<WebIDBIndexKeys> index_keys;
-      index_keys.reserve(1);
+      Vector<WebIDBIndexKeys> index_keys;
+      index_keys.ReserveInitialCapacity(1);
       index_keys.emplace_back(
           IndexMetadata().id,
           GenerateIndexKeysForValue(script_state_->GetIsolate(),
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_object_store.h b/third_party/blink/renderer/modules/indexeddb/idb_object_store.h
index 041f0b8..08241501 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_object_store.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_object_store.h
@@ -28,8 +28,6 @@
 
 #include "base/memory/scoped_refptr.h"
 #include "third_party/blink/public/common/indexeddb/web_idb_types.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_cursor.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_database.h"
 #include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_cursor.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_index.h"
@@ -39,6 +37,8 @@
 #include "third_party/blink/renderer/modules/indexeddb/idb_metadata.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_request.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_transaction.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_cursor.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_database.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.h b/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.h
index 26d3a07d6..10ca6524 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.h
@@ -27,8 +27,8 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_IDB_OPEN_DB_REQUEST_H_
 
 #include <memory>
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_database.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_request.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_database.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_request.h b/third_party/blink/renderer/modules/indexeddb/idb_request.h
index e5d5d4f..f70e380 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_request.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_request.h
@@ -34,7 +34,6 @@
 #include "base/macros.h"
 #include "base/memory/scoped_refptr.h"
 #include "third_party/blink/public/common/indexeddb/web_idb_types.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_cursor.h"
 #include "third_party/blink/public/platform/web_blob_info.h"
 #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
@@ -49,6 +48,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/idb_any.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_transaction.h"
 #include "third_party/blink/renderer/modules/indexeddb/indexed_db.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_cursor.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/blob/blob_data.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_request_queue_item.cc b/third_party/blink/renderer/modules/indexeddb/idb_request_queue_item.cc
index cfbe57f..bb8753c 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_request_queue_item.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_request_queue_item.cc
@@ -9,12 +9,12 @@
 
 #include "base/callback.h"
 #include "base/memory/scoped_refptr.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_cursor.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_key.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_request.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_request_loader.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_value.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_cursor.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_transaction.h b/third_party/blink/renderer/modules/indexeddb/idb_transaction.h
index 0cd78d4..d0c50289 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_transaction.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_transaction.h
@@ -29,7 +29,6 @@
 #include <memory>
 
 #include "third_party/blink/public/common/indexeddb/web_idb_types.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_database.h"
 #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
 #include "third_party/blink/renderer/core/dom/context_lifecycle_observer.h"
 #include "third_party/blink/renderer/core/dom/dom_string_list.h"
@@ -38,6 +37,7 @@
 #include "third_party/blink/renderer/modules/event_target_modules.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_metadata.h"
 #include "third_party/blink/renderer/modules/indexeddb/indexed_db.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_database.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 #include "third_party/blink/renderer/platform/wtf/deque.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/indexed_db_blink.typemap b/third_party/blink/renderer/modules/indexeddb/indexed_db_blink.typemap
new file mode 100644
index 0000000..3a3bd88
--- /dev/null
+++ b/third_party/blink/renderer/modules/indexeddb/indexed_db_blink.typemap
@@ -0,0 +1,41 @@
+# Copyright 2018 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.
+
+mojom = "//third_party/blink/public/mojom/indexeddb/indexeddb.mojom"
+public_headers = [
+  "//third_party/blink/public/common/indexeddb/web_idb_types.h",
+  "//third_party/blink/public/platform/modules/indexeddb/web_idb_key.h",
+  "//third_party/blink/public/platform/modules/indexeddb/web_idb_key_path.h",
+  "//third_party/blink/public/platform/modules/indexeddb/web_idb_key_range.h",
+  "//third_party/blink/public/platform/modules/indexeddb/web_idb_metadata.h",
+  "//third_party/blink/public/platform/modules/indexeddb/web_idb_name_and_version.h",
+  "//third_party/blink/renderer/modules/indexeddb/idb_key_range.h",
+]
+traits_headers = [
+  "//mojo/public/cpp/base/string16_mojom_traits.h",
+  "//mojo/public/cpp/bindings/array_traits_web_vector.h",
+  "//mojo/public/cpp/bindings/array_traits_wtf_vector.h",
+  "//third_party/blink/public/common/indexeddb/indexed_db_default_mojom_traits.h",
+  "//third_party/blink/renderer/modules/indexeddb/indexed_db_blink_mojom_traits.h",
+  "//third_party/blink/renderer/platform/mojo/string16_mojom_traits.h",
+]
+deps = [
+  "//mojo/public/cpp/bindings",
+  "//third_party/blink/renderer/platform/wtf",
+]
+type_mappings = [
+  "blink.mojom.IDBCursorDirection=::blink::WebIDBCursorDirection",
+  "blink.mojom.IDBDataLoss=::blink::WebIDBDataLoss",
+  "blink.mojom.IDBDatabaseMetadata=::blink::WebIDBMetadata",
+  "blink.mojom.IDBIndexKeys=::blink::WebIDBIndexKeys",
+  "blink.mojom.IDBIndexMetadata=::blink::WebIDBMetadata::Index",
+  "blink.mojom.IDBKey=::blink::WebIDBKey[move_only]",
+  "blink.mojom.IDBKeyPath=::blink::WebIDBKeyPath",
+  "blink.mojom.IDBKeyRange=::blink::WebIDBKeyRange",
+  "blink.mojom.IDBObjectStoreMetadata=::blink::WebIDBMetadata::ObjectStore",
+  "blink.mojom.IDBOperationType=::blink::WebIDBOperationType",
+  "blink.mojom.IDBPutMode=::blink::WebIDBPutMode",
+  "blink.mojom.IDBTaskType=::blink::WebIDBTaskType",
+  "blink.mojom.IDBTransactionMode=::blink::WebIDBTransactionMode",
+]
diff --git a/third_party/blink/renderer/modules/indexeddb/indexed_db_blink_mojom_traits.cc b/third_party/blink/renderer/modules/indexeddb/indexed_db_blink_mojom_traits.cc
new file mode 100644
index 0000000..a8806ef
--- /dev/null
+++ b/third_party/blink/renderer/modules/indexeddb/indexed_db_blink_mojom_traits.cc
@@ -0,0 +1,290 @@
+// Copyright 2018 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 "third_party/blink/renderer/modules/indexeddb/indexed_db_blink_mojom_traits.h"
+
+#include "base/stl_util.h"
+#include "mojo/public/cpp/bindings/array_traits_web_vector.h"
+#include "mojo/public/cpp/bindings/array_traits_wtf_vector.h"
+#include "third_party/blink/public/common/indexeddb/indexed_db_default_mojom_traits.h"
+#include "third_party/blink/public/common/indexeddb/indexeddb_key.h"
+#include "third_party/blink/public/common/indexeddb/indexeddb_key_range.h"
+#include "third_party/blink/public/common/indexeddb/indexeddb_metadata.h"
+#include "third_party/blink/renderer/modules/indexeddb/idb_key_range.h"
+#include "third_party/blink/renderer/platform/mojo/string16_mojom_traits.h"
+#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+
+using blink::mojom::IDBCursorDirection;
+using blink::mojom::IDBDataLoss;
+using blink::mojom::IDBOperationType;
+
+namespace mojo {
+
+// static
+bool StructTraits<
+    blink::mojom::IDBDatabaseMetadataDataView,
+    blink::WebIDBMetadata>::Read(blink::mojom::IDBDatabaseMetadataDataView data,
+                                 blink::WebIDBMetadata* out) {
+  out->id = data.id();
+  String name;
+  if (!data.ReadName(&name))
+    return false;
+  out->name = name;
+  out->version = data.version();
+  out->max_object_store_id = data.max_object_store_id();
+  if (!data.ReadObjectStores(&out->object_stores))
+    return false;
+  return true;
+}
+
+// static
+bool StructTraits<blink::mojom::IDBIndexKeysDataView, blink::WebIDBIndexKeys>::
+    Read(blink::mojom::IDBIndexKeysDataView data, blink::WebIDBIndexKeys* out) {
+  out->first = data.index_id();
+  if (!data.ReadIndexKeys(&out->second))
+    return false;
+  return true;
+}
+
+// static
+bool StructTraits<blink::mojom::IDBIndexMetadataDataView,
+                  blink::WebIDBMetadata::Index>::
+    Read(blink::mojom::IDBIndexMetadataDataView data,
+         blink::WebIDBMetadata::Index* out) {
+  out->id = data.id();
+  String name;
+  if (!data.ReadName(&name))
+    return false;
+  out->name = name;
+  if (!data.ReadKeyPath(&out->key_path))
+    return false;
+  out->unique = data.unique();
+  out->multi_entry = data.multi_entry();
+  return true;
+}
+
+// static
+blink::mojom::IDBKeyDataDataView::Tag
+UnionTraits<blink::mojom::IDBKeyDataDataView, blink::WebIDBKey>::GetTag(
+    const blink::WebIDBKey& key) {
+  switch (key.View().KeyType()) {
+    case blink::kWebIDBKeyTypeInvalid:
+      return blink::mojom::IDBKeyDataDataView::Tag::OTHER;
+    case blink::kWebIDBKeyTypeArray:
+      return blink::mojom::IDBKeyDataDataView::Tag::KEY_ARRAY;
+    case blink::kWebIDBKeyTypeBinary:
+      return blink::mojom::IDBKeyDataDataView::Tag::BINARY;
+    case blink::kWebIDBKeyTypeString:
+      return blink::mojom::IDBKeyDataDataView::Tag::STRING;
+    case blink::kWebIDBKeyTypeDate:
+      return blink::mojom::IDBKeyDataDataView::Tag::DATE;
+    case blink::kWebIDBKeyTypeNumber:
+      return blink::mojom::IDBKeyDataDataView::Tag::NUMBER;
+    case blink::kWebIDBKeyTypeNull:
+      return blink::mojom::IDBKeyDataDataView::Tag::OTHER;
+
+    // Not used, fall through to NOTREACHED.
+    case blink::kWebIDBKeyTypeMin:;
+  }
+  NOTREACHED();
+  return blink::mojom::IDBKeyDataDataView::Tag::OTHER;
+}
+
+// static
+bool UnionTraits<blink::mojom::IDBKeyDataDataView, blink::WebIDBKey>::Read(
+    blink::mojom::IDBKeyDataDataView data,
+    blink::WebIDBKey* out) {
+  switch (data.tag()) {
+    case blink::mojom::IDBKeyDataDataView::Tag::KEY_ARRAY: {
+      Vector<blink::WebIDBKey> array;
+      if (!data.ReadKeyArray(&array))
+        return false;
+      blink::WebVector<blink::WebIDBKey> webvector_array;
+      for (const auto& item : array) {
+        webvector_array.emplace_back(
+            blink::WebIDBKeyBuilder::Build(item.View()));
+      }
+      *out = blink::WebIDBKey::CreateArray(std::move(webvector_array));
+      return true;
+    }
+    case blink::mojom::IDBKeyDataDataView::Tag::BINARY: {
+      ArrayDataView<uint8_t> bytes;
+      data.GetBinaryDataView(&bytes);
+      *out = blink::WebIDBKey::CreateBinary(blink::WebData(
+          reinterpret_cast<const char*>(bytes.data()), bytes.size()));
+      return true;
+    }
+    case blink::mojom::IDBKeyDataDataView::Tag::STRING: {
+      String string;
+      if (!data.ReadString(&string))
+        return false;
+      *out = blink::WebIDBKey::CreateString(blink::WebString(string));
+      return true;
+    }
+    case blink::mojom::IDBKeyDataDataView::Tag::DATE:
+      *out = blink::WebIDBKey::CreateDate(data.date());
+      return true;
+    case blink::mojom::IDBKeyDataDataView::Tag::NUMBER:
+      *out = blink::WebIDBKey::CreateNumber(data.number());
+      return true;
+    case blink::mojom::IDBKeyDataDataView::Tag::OTHER:
+      switch (data.other()) {
+        case blink::mojom::IDBDatalessKeyType::Invalid:
+          *out = blink::WebIDBKey::CreateInvalid();
+          return true;
+        case blink::mojom::IDBDatalessKeyType::Null:
+          *out = blink::WebIDBKey::CreateNull();
+          return true;
+      }
+  }
+
+  return false;
+}
+
+// static
+const blink::WebVector<blink::WebIDBKey>
+UnionTraits<blink::mojom::IDBKeyDataDataView, blink::WebIDBKey>::key_array(
+    const blink::WebIDBKey& key) {
+  const auto& array_view = key.View().ArrayView();
+  const size_t array_size = array_view.size();
+  Vector<blink::WebIDBKey> result;
+  result.ReserveInitialCapacity(array_view.size());
+  // |array_view| is of type WebIDBKeyArrayView which only implements size()
+  // and operator[].  Since it doesn't have other typical array functions, we
+  // must use an iterator-style for loop.
+  for (size_t i = 0; i < array_size; ++i)
+    result.emplace_back(blink::WebIDBKeyBuilder::Build(array_view[i]));
+  return result;
+}
+
+// static
+const Vector<uint8_t>
+UnionTraits<blink::mojom::IDBKeyDataDataView, blink::WebIDBKey>::binary(
+    const blink::WebIDBKey& key) {
+  const auto& data = key.View().Binary();
+  Vector<uint8_t> result;
+  result.ReserveInitialCapacity(data.size());
+  data.ForEachSegment([&result](const char* segment, size_t segment_size,
+                                size_t segment_offset) {
+    const auto& segment_span = base::make_span(segment, segment + segment_size);
+    result.AppendRange(segment_span.begin(), segment_span.end());
+    return true;
+  });
+  return result;
+}
+
+// static
+const blink::WebIDBKey&
+StructTraits<blink::mojom::IDBKeyDataView, blink::WebIDBKey>::data(
+    const blink::WebIDBKey& key) {
+  return key;
+}
+
+// static
+bool StructTraits<blink::mojom::IDBKeyDataView, blink::WebIDBKey>::Read(
+    blink::mojom::IDBKeyDataView data,
+    blink::WebIDBKey* out) {
+  return data.ReadData(out);
+}
+
+// static
+blink::mojom::blink::IDBKeyPathDataPtr
+StructTraits<blink::mojom::IDBKeyPathDataView, blink::WebIDBKeyPath>::data(
+    const blink::WebIDBKeyPath& key_path) {
+  if (key_path.KeyPathType() == blink::kWebIDBKeyPathTypeNull)
+    return nullptr;
+
+  auto data = blink::mojom::blink::IDBKeyPathData::New();
+  switch (key_path.KeyPathType()) {
+    case blink::kWebIDBKeyPathTypeString: {
+      String key_path_string = key_path.String();
+      if (key_path_string.IsNull())
+        key_path_string = g_empty_string;
+      data->set_string(key_path_string);
+      return data;
+    }
+    case blink::kWebIDBKeyPathTypeArray: {
+      const auto& array = key_path.Array();
+      Vector<String> result;
+      result.ReserveInitialCapacity(array.size());
+      for (const auto& item : array)
+        result.push_back(item);
+      data->set_string_array(result);
+      return data;
+    }
+
+    case blink::kWebIDBKeyPathTypeNull:
+      break;  // Not used, NOTREACHED.
+  }
+  NOTREACHED();
+  return data;
+}
+
+// static
+bool StructTraits<blink::mojom::IDBKeyPathDataView, blink::WebIDBKeyPath>::Read(
+    blink::mojom::IDBKeyPathDataView data,
+    blink::WebIDBKeyPath* out) {
+  blink::mojom::IDBKeyPathDataDataView data_view;
+  data.GetDataDataView(&data_view);
+
+  if (data_view.is_null()) {
+    *out = blink::WebIDBKeyPath();
+    return true;
+  }
+
+  switch (data_view.tag()) {
+    case blink::mojom::IDBKeyPathDataDataView::Tag::STRING: {
+      String string;
+      if (!data_view.ReadString(&string))
+        return false;
+      *out = blink::WebIDBKeyPath(blink::WebString(string));
+      return true;
+    }
+    case blink::mojom::IDBKeyPathDataDataView::Tag::STRING_ARRAY: {
+      Vector<String> array;
+      if (!data_view.ReadStringArray(&array))
+        return false;
+      *out = blink::WebIDBKeyPath(array);
+      return true;
+    }
+  }
+
+  return false;
+}
+
+// static
+bool StructTraits<blink::mojom::IDBKeyRangeDataView, blink::WebIDBKeyRange>::
+    Read(blink::mojom::IDBKeyRangeDataView data, blink::WebIDBKeyRange* out) {
+  // TODO(cmp): Use WebIDBKey and WebIDBKeyRange directly.
+  blink::IndexedDBKey lower;
+  blink::IndexedDBKey upper;
+  if (!data.ReadLower(&lower) || !data.ReadUpper(&upper))
+    return false;
+
+  blink::IndexedDBKeyRange temp(lower, upper, data.lower_open(),
+                                data.upper_open());
+  *out = blink::WebIDBKeyRangeBuilder::Build(temp);
+  return true;
+}
+
+// static
+bool StructTraits<blink::mojom::IDBObjectStoreMetadataDataView,
+                  blink::WebIDBMetadata::ObjectStore>::
+    Read(blink::mojom::IDBObjectStoreMetadataDataView data,
+         blink::WebIDBMetadata::ObjectStore* out) {
+  out->id = data.id();
+  String name;
+  if (!data.ReadName(&name))
+    return false;
+  out->name = name;
+  if (!data.ReadKeyPath(&out->key_path))
+    return false;
+  out->auto_increment = data.auto_increment();
+  out->max_index_id = data.max_index_id();
+  if (!data.ReadIndexes(&out->indexes))
+    return false;
+  return true;
+}
+
+}  // namespace mojo
diff --git a/third_party/blink/renderer/modules/indexeddb/indexed_db_blink_mojom_traits.h b/third_party/blink/renderer/modules/indexeddb/indexed_db_blink_mojom_traits.h
new file mode 100644
index 0000000..408631a
--- /dev/null
+++ b/third_party/blink/renderer/modules/indexeddb/indexed_db_blink_mojom_traits.h
@@ -0,0 +1,187 @@
+// Copyright 2018 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.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_INDEXED_DB_BLINK_MOJOM_TRAITS_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_INDEXED_DB_BLINK_MOJOM_TRAITS_H_
+
+#include <stdint.h>
+
+#include "third_party/blink/public/common/indexeddb/indexeddb_key.h"
+#include "third_party/blink/public/common/indexeddb/indexeddb_key_range.h"
+#include "third_party/blink/public/common/indexeddb/indexeddb_metadata.h"
+#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h"
+#include "third_party/blink/public/platform/modules/indexeddb/indexed_db_key_builder.h"
+#include "third_party/blink/public/platform/modules/indexeddb/web_idb_key.h"
+#include "third_party/blink/public/platform/modules/indexeddb/web_idb_key_range.h"
+#include "third_party/blink/public/platform/modules/indexeddb/web_idb_metadata.h"
+#include "third_party/blink/public/platform/web_vector.h"
+#include "third_party/blink/renderer/modules/modules_export.h"
+#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+
+namespace mojo {
+
+template <>
+struct MODULES_EXPORT StructTraits<blink::mojom::IDBDatabaseMetadataDataView,
+                                   blink::WebIDBMetadata> {
+  static int64_t id(const blink::WebIDBMetadata& metadata) {
+    return metadata.id;
+  }
+  static WTF::String name(const blink::WebIDBMetadata& metadata) {
+    if (metadata.name.IsNull())
+      return g_empty_string;
+    return metadata.name;
+  }
+  static int64_t version(const blink::WebIDBMetadata& metadata) {
+    return metadata.version;
+  }
+  static int64_t max_object_store_id(const blink::WebIDBMetadata& metadata) {
+    return metadata.max_object_store_id;
+  }
+  static const blink::WebVector<blink::WebIDBMetadata::ObjectStore>&
+  object_stores(const blink::WebIDBMetadata& metadata) {
+    return metadata.object_stores;
+  }
+  static bool Read(blink::mojom::IDBDatabaseMetadataDataView data,
+                   blink::WebIDBMetadata* out);
+};
+
+template <>
+struct MODULES_EXPORT
+    StructTraits<blink::mojom::IDBIndexKeysDataView, blink::WebIDBIndexKeys> {
+  static int64_t index_id(const blink::WebIDBIndexKeys& index_keys) {
+    return index_keys.first;
+  }
+  static const blink::WebVector<blink::WebIDBKey>& index_keys(
+      const blink::WebIDBIndexKeys& index_keys) {
+    return index_keys.second;
+  }
+  static bool Read(blink::mojom::IDBIndexKeysDataView data,
+                   blink::WebIDBIndexKeys* out);
+};
+
+template <>
+struct MODULES_EXPORT StructTraits<blink::mojom::IDBIndexMetadataDataView,
+                                   blink::WebIDBMetadata::Index> {
+  static int64_t id(const blink::WebIDBMetadata::Index& metadata) {
+    return metadata.id;
+  }
+  static WTF::String name(const blink::WebIDBMetadata::Index& metadata) {
+    if (metadata.name.IsNull())
+      return g_empty_string;
+    return metadata.name;
+  }
+  static const blink::WebIDBKeyPath& key_path(
+      const blink::WebIDBMetadata::Index& metadata) {
+    return metadata.key_path;
+  }
+  static bool unique(const blink::WebIDBMetadata::Index& metadata) {
+    return metadata.unique;
+  }
+  static bool multi_entry(const blink::WebIDBMetadata::Index& metadata) {
+    return metadata.multi_entry;
+  }
+  static bool Read(blink::mojom::IDBIndexMetadataDataView data,
+                   blink::WebIDBMetadata::Index* out);
+};
+
+template <>
+struct MODULES_EXPORT
+    UnionTraits<blink::mojom::IDBKeyDataDataView, blink::WebIDBKey> {
+  static blink::mojom::IDBKeyDataDataView::Tag GetTag(
+      const blink::WebIDBKey& key);
+  static bool Read(blink::mojom::IDBKeyDataDataView data,
+                   blink::WebIDBKey* out);
+  static const blink::WebVector<blink::WebIDBKey> key_array(
+      const blink::WebIDBKey& key);
+  static const Vector<uint8_t> binary(const blink::WebIDBKey& key);
+  static const WTF::String string(const blink::WebIDBKey& key) {
+    String key_string = key.View().String();
+    if (key_string.IsNull())
+      key_string = g_empty_string;
+    return key_string;
+  }
+  static double date(const blink::WebIDBKey& key) { return key.View().Date(); }
+  static double number(const blink::WebIDBKey& key) {
+    return key.View().Number();
+  }
+  static blink::mojom::IDBDatalessKeyType other(const blink::WebIDBKey& key) {
+    switch (key.View().KeyType()) {
+      case blink::kWebIDBKeyTypeInvalid:
+        return blink::mojom::IDBDatalessKeyType::Invalid;
+      case blink::kWebIDBKeyTypeNull:
+        return blink::mojom::IDBDatalessKeyType::Null;
+      default:
+        NOTREACHED();
+        return blink::mojom::IDBDatalessKeyType::Invalid;
+    }
+  }
+};
+
+template <>
+struct MODULES_EXPORT
+    StructTraits<blink::mojom::IDBKeyDataView, blink::WebIDBKey> {
+  static const blink::WebIDBKey& data(const blink::WebIDBKey& key);
+  static bool Read(blink::mojom::IDBKeyDataView data, blink::WebIDBKey* out);
+};
+
+template <>
+struct MODULES_EXPORT
+    StructTraits<blink::mojom::IDBKeyPathDataView, blink::WebIDBKeyPath> {
+  static blink::mojom::blink::IDBKeyPathDataPtr data(
+      const blink::WebIDBKeyPath& key_path);
+  static bool Read(blink::mojom::IDBKeyPathDataView data,
+                   blink::WebIDBKeyPath* out);
+};
+
+template <>
+struct MODULES_EXPORT
+    StructTraits<blink::mojom::IDBKeyRangeDataView, blink::WebIDBKeyRange> {
+  static blink::WebIDBKey lower(const blink::WebIDBKeyRange& key_range) {
+    return blink::WebIDBKeyBuilder::Build(key_range.Lower());
+  }
+  static blink::WebIDBKey upper(const blink::WebIDBKeyRange& key_range) {
+    return blink::WebIDBKeyBuilder::Build(key_range.Upper());
+  }
+  static bool lower_open(const blink::WebIDBKeyRange& key_range) {
+    return key_range.LowerOpen();
+  }
+  static bool upper_open(const blink::WebIDBKeyRange& key_range) {
+    return key_range.UpperOpen();
+  }
+  static bool Read(blink::mojom::IDBKeyRangeDataView data,
+                   blink::WebIDBKeyRange* out);
+};
+
+template <>
+struct MODULES_EXPORT StructTraits<blink::mojom::IDBObjectStoreMetadataDataView,
+                                   blink::WebIDBMetadata::ObjectStore> {
+  static int64_t id(const blink::WebIDBMetadata::ObjectStore& metadata) {
+    return metadata.id;
+  }
+  static WTF::String name(const blink::WebIDBMetadata::ObjectStore& metadata) {
+    return metadata.name;
+  }
+  static const blink::WebIDBKeyPath& key_path(
+      const blink::WebIDBMetadata::ObjectStore& metadata) {
+    return metadata.key_path;
+  }
+  static bool auto_increment(
+      const blink::WebIDBMetadata::ObjectStore& metadata) {
+    return metadata.auto_increment;
+  }
+  static int64_t max_index_id(
+      const blink::WebIDBMetadata::ObjectStore& metadata) {
+    return metadata.max_index_id;
+  }
+  static const blink::WebVector<blink::WebIDBMetadata::Index>& indexes(
+      const blink::WebIDBMetadata::ObjectStore& metadata) {
+    return metadata.indexes;
+  }
+  static bool Read(blink::mojom::IDBObjectStoreMetadataDataView data,
+                   blink::WebIDBMetadata::ObjectStore* out);
+};
+
+}  // namespace mojo
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_INDEXED_DB_BLINK_MOJOM_TRAITS_H_
diff --git a/third_party/blink/renderer/modules/indexeddb/indexed_db_callbacks_impl.cc b/third_party/blink/renderer/modules/indexeddb/indexed_db_callbacks_impl.cc
new file mode 100644
index 0000000..8b884c7
--- /dev/null
+++ b/third_party/blink/renderer/modules/indexeddb/indexed_db_callbacks_impl.cc
@@ -0,0 +1,216 @@
+// 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 "third_party/blink/renderer/modules/indexeddb/indexed_db_callbacks_impl.h"
+
+#include "third_party/blink/public/platform/file_path_conversion.h"
+#include "third_party/blink/public/platform/modules/indexeddb/indexed_db_key_builder.h"
+#include "third_party/blink/public/platform/modules/indexeddb/web_idb_callbacks.h"
+#include "third_party/blink/public/platform/modules/indexeddb/web_idb_database_error.h"
+#include "third_party/blink/public/platform/modules/indexeddb/web_idb_metadata.h"
+#include "third_party/blink/public/platform/modules/indexeddb/web_idb_name_and_version.h"
+#include "third_party/blink/public/platform/modules/indexeddb/web_idb_value.h"
+#include "third_party/blink/renderer/modules/indexeddb/idb_key_range.h"
+#include "third_party/blink/renderer/modules/indexeddb/indexed_db_dispatcher.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_cursor_impl.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_database_impl.h"
+
+using blink::IndexedDBDatabaseMetadata;
+using blink::WebBlobInfo;
+using blink::WebData;
+using blink::WebIDBCallbacks;
+using blink::WebIDBDatabase;
+using blink::WebIDBMetadata;
+using blink::WebIDBNameAndVersion;
+using blink::WebIDBValue;
+using blink::WebString;
+using blink::WebVector;
+using blink::mojom::blink::IDBDatabaseAssociatedPtrInfo;
+
+namespace blink {
+
+namespace {
+
+WebIDBValue ConvertReturnValue(const mojom::blink::IDBReturnValuePtr& value) {
+  if (!value)
+    return WebIDBValue(WebData(), WebVector<WebBlobInfo>());
+
+  WebIDBValue web_value = IndexedDBCallbacksImpl::ConvertValue(value->value);
+  web_value.SetInjectedPrimaryKey(value->primary_key, value->key_path);
+  return web_value;
+}
+
+WebIDBNameAndVersion ConvertNameVersion(
+    const mojom::blink::IDBNameAndVersionPtr& name_and_version) {
+  return WebIDBNameAndVersion(name_and_version->name,
+                              name_and_version->version);
+}
+
+}  // namespace
+
+// static
+WebIDBValue IndexedDBCallbacksImpl::ConvertValue(
+    const mojom::blink::IDBValuePtr& value) {
+  if (!value || value->bits.IsEmpty())
+    return WebIDBValue(WebData(), WebVector<WebBlobInfo>());
+
+  WebVector<WebBlobInfo> local_blob_info;
+  local_blob_info.reserve(value->blob_or_file_info.size());
+  for (const auto& info : value->blob_or_file_info) {
+    if (info->file) {
+      local_blob_info.emplace_back(
+          WebString(info->uuid), FilePathToWebString(info->file->path),
+          WebString(info->file->name), WebString(info->mime_type),
+          info->file->last_modified.ToDoubleT(), info->size,
+          info->blob.PassHandle());
+    } else {
+      local_blob_info.emplace_back(WebString(info->uuid),
+                                   WebString(info->mime_type), info->size,
+                                   info->blob.PassHandle());
+    }
+  }
+
+  // TODO(crbug.com/902498): Use mojom traits to map directly to WebData.
+  WebData web_data(reinterpret_cast<const char*>(value->bits.data()),
+                   value->bits.size());
+  // Release value->bits std::vector.
+  value->bits.clear();
+  return WebIDBValue(std::move(web_data), std::move(local_blob_info));
+}
+
+IndexedDBCallbacksImpl::IndexedDBCallbacksImpl(
+    std::unique_ptr<WebIDBCallbacks> callbacks,
+    int64_t transaction_id,
+    const base::WeakPtr<WebIDBCursorImpl>& cursor)
+    : callbacks_(std::move(callbacks)),
+      cursor_(cursor),
+      transaction_id_(transaction_id) {}
+
+IndexedDBCallbacksImpl::~IndexedDBCallbacksImpl() = default;
+
+void IndexedDBCallbacksImpl::Error(int32_t code, const WTF::String& message) {
+  callbacks_->OnError(WebIDBDatabaseError(code, WebString(message)));
+  callbacks_.reset();
+}
+
+void IndexedDBCallbacksImpl::SuccessNamesAndVersionsList(
+    Vector<mojom::blink::IDBNameAndVersionPtr> names_and_versions) {
+  WebVector<WebIDBNameAndVersion> web_names_and_versions;
+  web_names_and_versions.reserve(names_and_versions.size());
+  for (const mojom::blink::IDBNameAndVersionPtr& name_version :
+       names_and_versions)
+    web_names_and_versions.emplace_back(ConvertNameVersion(name_version));
+  callbacks_->OnSuccess(web_names_and_versions);
+  callbacks_.reset();
+}
+
+void IndexedDBCallbacksImpl::SuccessStringList(const Vector<String>& value) {
+  WebVector<WebString> web_value(value.size());
+  std::transform(value.begin(), value.end(), web_value.begin(),
+                 [](const WTF::String& s) { return WebString(s); });
+  callbacks_->OnSuccess(web_value);
+  callbacks_.reset();
+}
+
+void IndexedDBCallbacksImpl::Blocked(int64_t existing_version) {
+  callbacks_->OnBlocked(existing_version);
+  // Not resetting |callbacks_|.  In this instance we will have to forward at
+  // least one other call in the set OnUpgradeNeeded() / OnSuccess() /
+  // OnError().
+}
+
+void IndexedDBCallbacksImpl::UpgradeNeeded(
+    IDBDatabaseAssociatedPtrInfo database_info,
+    int64_t old_version,
+    WebIDBDataLoss data_loss,
+    const String& data_loss_message,
+    const WebIDBMetadata& web_metadata) {
+  WebIDBDatabase* database = new WebIDBDatabaseImpl(std::move(database_info));
+  callbacks_->OnUpgradeNeeded(old_version, database, web_metadata, data_loss,
+                              WebString(data_loss_message));
+  // Not resetting |callbacks_|.  In this instance we will have to forward at
+  // least one other call in the set OnSuccess() / OnError().
+}
+
+void IndexedDBCallbacksImpl::SuccessDatabase(
+    IDBDatabaseAssociatedPtrInfo database_info,
+    const WebIDBMetadata& web_metadata) {
+  WebIDBDatabase* database = nullptr;
+  if (database_info.is_valid())
+    database = new WebIDBDatabaseImpl(std::move(database_info));
+
+  callbacks_->OnSuccess(database, web_metadata);
+  callbacks_.reset();
+}
+
+void IndexedDBCallbacksImpl::SuccessCursor(
+    mojom::blink::IDBCursorAssociatedPtrInfo cursor_info,
+    WebIDBKey key,
+    WebIDBKey primary_key,
+    mojom::blink::IDBValuePtr value) {
+  WebIDBCursorImpl* cursor =
+      new WebIDBCursorImpl(std::move(cursor_info), transaction_id_);
+  callbacks_->OnSuccess(cursor, std::move(key), std::move(primary_key),
+                        ConvertValue(value));
+  callbacks_.reset();
+}
+
+void IndexedDBCallbacksImpl::SuccessValue(
+    mojom::blink::IDBReturnValuePtr value) {
+  callbacks_->OnSuccess(ConvertReturnValue(value));
+  callbacks_.reset();
+}
+
+void IndexedDBCallbacksImpl::SuccessCursorContinue(
+    WebIDBKey key,
+    WebIDBKey primary_key,
+    mojom::blink::IDBValuePtr value) {
+  callbacks_->OnSuccess(std::move(key), std::move(primary_key),
+                        ConvertValue(value));
+  callbacks_.reset();
+}
+
+void IndexedDBCallbacksImpl::SuccessCursorPrefetch(
+    Vector<WebIDBKey> keys,
+    Vector<WebIDBKey> primary_keys,
+    Vector<mojom::blink::IDBValuePtr> values) {
+  Vector<WebIDBValue> web_values;
+  web_values.ReserveInitialCapacity(values.size());
+  for (const mojom::blink::IDBValuePtr& value : values)
+    web_values.emplace_back(ConvertValue(value));
+
+  if (cursor_) {
+    cursor_->SetPrefetchData(std::move(keys), std::move(primary_keys),
+                             std::move(web_values));
+    cursor_->CachedContinue(callbacks_.get());
+  }
+  callbacks_.reset();
+}
+
+void IndexedDBCallbacksImpl::SuccessArray(
+    Vector<mojom::blink::IDBReturnValuePtr> values) {
+  WebVector<WebIDBValue> web_values;
+  web_values.reserve(values.size());
+  for (const mojom::blink::IDBReturnValuePtr& value : values)
+    web_values.emplace_back(ConvertReturnValue(value));
+  callbacks_->OnSuccess(std::move(web_values));
+  callbacks_.reset();
+}
+
+void IndexedDBCallbacksImpl::SuccessKey(WebIDBKey key) {
+  callbacks_->OnSuccess(std::move(key));
+  callbacks_.reset();
+}
+
+void IndexedDBCallbacksImpl::SuccessInteger(int64_t value) {
+  callbacks_->OnSuccess(value);
+  callbacks_.reset();
+}
+
+void IndexedDBCallbacksImpl::Success() {
+  callbacks_->OnSuccess();
+  callbacks_.reset();
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/indexeddb/indexed_db_callbacks_impl.h b/third_party/blink/renderer/modules/indexeddb/indexed_db_callbacks_impl.h
new file mode 100644
index 0000000..6138ba7
--- /dev/null
+++ b/third_party/blink/renderer/modules/indexeddb/indexed_db_callbacks_impl.h
@@ -0,0 +1,82 @@
+// 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.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_INDEXED_DB_CALLBACKS_IMPL_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_INDEXED_DB_CALLBACKS_IMPL_H_
+
+#include <stdint.h>
+
+#include <memory>
+
+#include "base/memory/scoped_refptr.h"
+#include "base/memory/weak_ptr.h"
+#include "mojo/public/cpp/bindings/associated_binding.h"
+#include "third_party/blink/public/common/indexeddb/indexeddb_key.h"
+#include "third_party/blink/public/common/indexeddb/indexeddb_metadata.h"
+#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h"
+
+namespace blink {
+
+class WebIDBCallbacks;
+class WebIDBCursorImpl;
+class WebIDBValue;
+
+// Implements the child-process end of the pipe used to deliver callbacks.
+// |callback_runner_| is used to post tasks back to the thread which owns the
+// blink::WebIDBCallbacks.
+class IndexedDBCallbacksImpl : public mojom::blink::IDBCallbacks {
+ public:
+  // |kNoTransaction| is used as the default transaction ID when instantiating
+  // an IndexedDBCallbacksImpl instance.  See web_idb_factory_impl.cc for those
+  // cases.
+  enum : int64_t { kNoTransaction = -1 };
+
+  static WebIDBValue ConvertValue(const mojom::blink::IDBValuePtr& value);
+
+  IndexedDBCallbacksImpl(std::unique_ptr<WebIDBCallbacks> callbacks,
+                         int64_t transaction_id,
+                         const base::WeakPtr<WebIDBCursorImpl>& cursor);
+  ~IndexedDBCallbacksImpl() override;
+
+  // mojom::blink::IDBCallbacks implementation:
+  void Error(int32_t code, const String& message) override;
+  void SuccessNamesAndVersionsList(
+      Vector<mojom::blink::IDBNameAndVersionPtr> names_and_versions) override;
+  void SuccessStringList(const Vector<String>& value) override;
+  void Blocked(int64_t existing_version) override;
+  void UpgradeNeeded(mojom::blink::IDBDatabaseAssociatedPtrInfo database_info,
+                     int64_t old_version,
+                     WebIDBDataLoss data_loss,
+                     const String& data_loss_message,
+                     const WebIDBMetadata& metadata) override;
+  void SuccessDatabase(mojom::blink::IDBDatabaseAssociatedPtrInfo database_info,
+                       const WebIDBMetadata& metadata) override;
+  void SuccessCursor(mojom::blink::IDBCursorAssociatedPtrInfo cursor,
+                     WebIDBKey key,
+                     WebIDBKey primary_key,
+                     mojom::blink::IDBValuePtr value) override;
+  void SuccessValue(mojom::blink::IDBReturnValuePtr value) override;
+  void SuccessCursorContinue(WebIDBKey key,
+                             WebIDBKey primary_key,
+                             mojom::blink::IDBValuePtr value) override;
+  void SuccessCursorPrefetch(Vector<WebIDBKey> keys,
+                             Vector<WebIDBKey> primary_keys,
+                             Vector<mojom::blink::IDBValuePtr> values) override;
+  void SuccessArray(Vector<mojom::blink::IDBReturnValuePtr> values) override;
+  void SuccessKey(WebIDBKey key) override;
+  void SuccessInteger(int64_t value) override;
+  void Success() override;
+
+ private:
+  scoped_refptr<base::SingleThreadTaskRunner> callback_runner_;
+  std::unique_ptr<WebIDBCallbacks> callbacks_;
+  base::WeakPtr<WebIDBCursorImpl> cursor_;
+  int64_t transaction_id_;
+
+  DISALLOW_COPY_AND_ASSIGN(IndexedDBCallbacksImpl);
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_INDEXED_DB_CALLBACKS_IMPL_H_
diff --git a/content/renderer/indexed_db/indexed_db_database_callbacks_impl.cc b/third_party/blink/renderer/modules/indexeddb/indexed_db_database_callbacks_impl.cc
similarity index 62%
rename from content/renderer/indexed_db/indexed_db_database_callbacks_impl.cc
rename to third_party/blink/renderer/modules/indexeddb/indexed_db_database_callbacks_impl.cc
index a63c065..1149fab 100644
--- a/content/renderer/indexed_db/indexed_db_database_callbacks_impl.cc
+++ b/third_party/blink/renderer/modules/indexeddb/indexed_db_database_callbacks_impl.cc
@@ -2,24 +2,23 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/renderer/indexed_db/indexed_db_database_callbacks_impl.h"
+#include "third_party/blink/renderer/modules/indexeddb/indexed_db_database_callbacks_impl.h"
 
 #include <unordered_map>
 #include <utility>
 
-#include "base/threading/thread_task_runner_handle.h"
-#include "content/renderer/indexed_db/indexed_db_callbacks_impl.h"
-#include "content/renderer/indexed_db/indexed_db_dispatcher.h"
-#include "content/renderer/indexed_db/indexed_db_key_builders.h"
+#include "third_party/blink/public/platform/modules/indexeddb/indexed_db_key_builder.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_database_callbacks.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_database_error.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_observation.h"
+#include "third_party/blink/renderer/modules/indexeddb/idb_key_range.h"
+#include "third_party/blink/renderer/modules/indexeddb/indexed_db_callbacks_impl.h"
 
 using blink::WebVector;
 using blink::WebIDBDatabaseCallbacks;
 using blink::WebIDBObservation;
 
-namespace content {
+namespace blink {
 
 IndexedDBDatabaseCallbacksImpl::IndexedDBDatabaseCallbacksImpl(
     std::unique_ptr<WebIDBDatabaseCallbacks> callbacks)
@@ -38,10 +37,9 @@
 
 void IndexedDBDatabaseCallbacksImpl::Abort(int64_t transaction_id,
                                            int32_t code,
-                                           const base::string16& message) {
-  callbacks_->OnAbort(
-      transaction_id,
-      blink::WebIDBDatabaseError(code, blink::WebString::FromUTF16(message)));
+                                           const String& message) {
+  callbacks_->OnAbort(transaction_id,
+                      blink::WebIDBDatabaseError(code, message));
 }
 
 void IndexedDBDatabaseCallbacksImpl::Complete(int64_t transaction_id) {
@@ -49,33 +47,34 @@
 }
 
 void IndexedDBDatabaseCallbacksImpl::Changes(
-    blink::mojom::IDBObserverChangesPtr changes) {
+    mojom::blink::IDBObserverChangesPtr changes) {
   WebVector<WebIDBObservation> web_observations;
   web_observations.reserve(changes->observations.size());
   for (const auto& observation : changes->observations) {
     web_observations.emplace_back(
-        observation->object_store_id, observation->type,
-        WebIDBKeyRangeBuilder::Build(observation->key_range),
+        observation->object_store_id, observation->type, observation->key_range,
         IndexedDBCallbacksImpl::ConvertValue(observation->value));
   }
 
-  WebIDBDatabaseCallbacks::ObservationIndexMap observation_index_map(
-      changes->observation_index_map.begin(),
-      changes->observation_index_map.end());
+  std::unordered_map<int32_t, WebVector<int32_t>> observation_index_map;
+  for (const auto& observation_pair : changes->observation_index_map) {
+    observation_index_map[observation_pair.key] =
+        WebVector<int32_t>(observation_pair.value);
+  }
 
-  std::unordered_map<int32_t, std::pair<int64_t, std::vector<int64_t>>>
+  std::unordered_map<int32_t, std::pair<int64_t, WebVector<int64_t>>>
       observer_transactions;
   for (const auto& transaction_pair : changes->transaction_map) {
     // Moving an int64_t is rather silly. Sadly, std::make_pair's overloads
     // accept either two rvalue arguments, or none.
-    observer_transactions[transaction_pair.first] =
-        std::make_pair<int64_t, std::vector<int64_t>>(
-            std::move(transaction_pair.second->id),
-            std::move(transaction_pair.second->scope));
+    observer_transactions[transaction_pair.key] =
+        std::make_pair<int64_t, Vector<int64_t>>(
+            std::move(transaction_pair.value->id),
+            std::move(transaction_pair.value->scope));
   }
 
   callbacks_->OnChanges(observation_index_map, std::move(web_observations),
                         observer_transactions);
 }
 
-}  // namespace content
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/indexeddb/indexed_db_database_callbacks_impl.h b/third_party/blink/renderer/modules/indexeddb/indexed_db_database_callbacks_impl.h
new file mode 100644
index 0000000..702ea69
--- /dev/null
+++ b/third_party/blink/renderer/modules/indexeddb/indexed_db_database_callbacks_impl.h
@@ -0,0 +1,42 @@
+// 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.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_INDEXED_DB_DATABASE_CALLBACKS_IMPL_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_INDEXED_DB_DATABASE_CALLBACKS_IMPL_H_
+
+#include <stdint.h>
+
+#include <memory>
+
+#include "base/single_thread_task_runner.h"
+#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h"
+
+namespace blink {
+class WebIDBDatabaseCallbacks;
+
+class IndexedDBDatabaseCallbacksImpl
+    : public mojom::blink::IDBDatabaseCallbacks {
+ public:
+  explicit IndexedDBDatabaseCallbacksImpl(
+      std::unique_ptr<WebIDBDatabaseCallbacks> callbacks);
+  ~IndexedDBDatabaseCallbacksImpl() override;
+
+  // mojom::blink::IDBDatabaseCallbacks implementation
+  void ForcedClose() override;
+  void VersionChange(int64_t old_version, int64_t new_version) override;
+  void Abort(int64_t transaction_id,
+             int32_t code,
+             const WTF::String& message) override;
+  void Complete(int64_t transaction_id) override;
+  void Changes(mojom::blink::IDBObserverChangesPtr changes) override;
+
+ private:
+  std::unique_ptr<WebIDBDatabaseCallbacks> callbacks_;
+
+  DISALLOW_COPY_AND_ASSIGN(IndexedDBDatabaseCallbacksImpl);
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_INDEXED_DB_DATABASE_CALLBACKS_IMPL_H_
diff --git a/third_party/blink/renderer/modules/indexeddb/indexed_db_dispatcher.cc b/third_party/blink/renderer/modules/indexeddb/indexed_db_dispatcher.cc
new file mode 100644
index 0000000..84198c4
--- /dev/null
+++ b/third_party/blink/renderer/modules/indexeddb/indexed_db_dispatcher.cc
@@ -0,0 +1,49 @@
+// 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 "third_party/blink/renderer/modules/indexeddb/indexed_db_dispatcher.h"
+
+#include <utility>
+
+#include "third_party/blink/public/platform/modules/indexeddb/web_idb_database_callbacks.h"
+#include "third_party/blink/public/platform/modules/indexeddb/web_idb_observation.h"
+#include "third_party/blink/renderer/modules/indexeddb/idb_key_range.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_cursor_impl.h"
+
+namespace blink {
+// static
+IndexedDBDispatcher* IndexedDBDispatcher::GetInstanceForCurrentThread() {
+  DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadSpecific<IndexedDBDispatcher>,
+                                  thread_specific_instance, ());
+  return thread_specific_instance;
+}
+
+IndexedDBDispatcher::IndexedDBDispatcher() = default;
+
+// static
+void IndexedDBDispatcher::RegisterCursor(WebIDBCursorImpl* cursor) {
+  IndexedDBDispatcher* this_ptr = GetInstanceForCurrentThread();
+  DCHECK(!this_ptr->cursors_.Contains(cursor));
+  this_ptr->cursors_.insert(cursor);
+}
+
+// static
+void IndexedDBDispatcher::UnregisterCursor(WebIDBCursorImpl* cursor) {
+  IndexedDBDispatcher* this_ptr = GetInstanceForCurrentThread();
+  DCHECK(this_ptr->cursors_.Contains(cursor));
+  this_ptr->cursors_.erase(cursor);
+}
+
+// static
+void IndexedDBDispatcher::ResetCursorPrefetchCaches(
+    int64_t transaction_id,
+    WebIDBCursorImpl* except_cursor) {
+  IndexedDBDispatcher* this_ptr = GetInstanceForCurrentThread();
+  for (WebIDBCursorImpl* cursor : this_ptr->cursors_) {
+    if (cursor != except_cursor && cursor->transaction_id() == transaction_id)
+      cursor->ResetPrefetchCache();
+  }
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/indexeddb/indexed_db_dispatcher.h b/third_party/blink/renderer/modules/indexeddb/indexed_db_dispatcher.h
new file mode 100644
index 0000000..906d706
--- /dev/null
+++ b/third_party/blink/renderer/modules/indexeddb/indexed_db_dispatcher.h
@@ -0,0 +1,55 @@
+// 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.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_INDEXED_DB_DISPATCHER_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_INDEXED_DB_DISPATCHER_H_
+
+#include <stdint.h>
+
+#include "base/gtest_prod_util.h"
+#include "base/macros.h"
+#include "third_party/blink/public/common/indexeddb/web_idb_types.h"
+#include "third_party/blink/public/platform/modules/indexeddb/web_idb_callbacks.h"
+#include "third_party/blink/renderer/modules/indexeddb/indexed_db_callbacks_impl.h"
+#include "third_party/blink/renderer/modules/indexeddb/indexed_db_database_callbacks_impl.h"
+#include "third_party/blink/renderer/modules/modules_export.h"
+#include "third_party/blink/renderer/platform/wtf/hash_set.h"
+#include "third_party/blink/renderer/platform/wtf/thread_specific.h"
+
+namespace blink {
+class WebIDBCursorImpl;
+
+// Handle the indexed db related communication for this context thread - the
+// main thread and each worker thread have their own copies.
+class MODULES_EXPORT IndexedDBDispatcher {
+ public:
+  static void RegisterCursor(WebIDBCursorImpl* cursor);
+  static void UnregisterCursor(WebIDBCursorImpl* cursor);
+
+  // Reset cursor prefetch caches for all cursors except |except_cursor|.
+  // In most callers, |except_cursor| is passed as nullptr, causing all cursors
+  // to have their prefetch cache to be reset.  In 2 WebIDBCursorImpl callers,
+  // specifically from |Advance| and |CursorContinue|, these want to reset all
+  // cursor prefetch caches except the cursor the calls are running from.  They
+  // get that behavior by passing |this| to |ResetCursorPrefetchCaches| which
+  // skips calling |ResetPrefetchCache| on them.
+  static void ResetCursorPrefetchCaches(int64_t transaction_id,
+                                        WebIDBCursorImpl* except_cursor);
+
+ private:
+  friend class WTF::ThreadSpecific<IndexedDBDispatcher>;
+
+  static IndexedDBDispatcher* GetInstanceForCurrentThread();
+
+  IndexedDBDispatcher();
+
+  FRIEND_TEST_ALL_PREFIXES(IndexedDBDispatcherTest, CursorReset);
+  FRIEND_TEST_ALL_PREFIXES(IndexedDBDispatcherTest, CursorTransactionId);
+
+  WTF::HashSet<WebIDBCursorImpl*> cursors_;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_INDEXED_DB_DISPATCHER_H_
diff --git a/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc b/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc
index f0a9d295..5815469 100644
--- a/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc
+++ b/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc
@@ -34,7 +34,6 @@
 #include <utility>
 
 #include "third_party/blink/public/common/indexeddb/web_idb_types.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_cursor.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_controller.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
 #include "third_party/blink/renderer/core/dom/document.h"
@@ -59,6 +58,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/idb_open_db_request.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_request.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_transaction.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_cursor.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h"
diff --git a/content/renderer/indexed_db/mock_webidbcallbacks.cc b/third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.cc
similarity index 89%
rename from content/renderer/indexed_db/mock_webidbcallbacks.cc
rename to third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.cc
index ec05f485..1f78395 100644
--- a/content/renderer/indexed_db/mock_webidbcallbacks.cc
+++ b/third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/renderer/indexed_db/mock_webidbcallbacks.h"
+#include "third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.h"
 
-namespace content {
+namespace blink {
 
 MockWebIDBCallbacks::MockWebIDBCallbacks() {}
 
@@ -36,4 +36,4 @@
   DoOnSuccess(values);
 }
 
-}  // namespace content
+}  // namespace blink
diff --git a/content/renderer/indexed_db/mock_webidbcallbacks.h b/third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.h
similarity index 90%
rename from content/renderer/indexed_db/mock_webidbcallbacks.h
rename to third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.h
index ec337180..5c9b71d 100644
--- a/content/renderer/indexed_db/mock_webidbcallbacks.h
+++ b/third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_RENDERER_INDEXED_DB_MOCK_WEBIDBCALLBACKS_H_
-#define CONTENT_RENDERER_INDEXED_DB_MOCK_WEBIDBCALLBACKS_H_
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_MOCK_WEB_IDB_CALLBACKS_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_MOCK_WEB_IDB_CALLBACKS_H_
 
 #include "base/macros.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -15,7 +15,7 @@
 #include "third_party/blink/public/platform/web_blob_info.h"
 #include "third_party/blink/public/web/web_heap.h"
 
-namespace content {
+namespace blink {
 
 class MockWebIDBCallbacks : public blink::WebIDBCallbacks {
  public:
@@ -71,6 +71,6 @@
   DISALLOW_COPY_AND_ASSIGN(MockWebIDBCallbacks);
 };
 
-}  // namespace content
+}  // namespace blink
 
-#endif  // CONTENT_RENDERER_INDEXED_DB_MOCK_WEBIDBCALLBACKS_H_
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_MOCK_WEB_IDB_CALLBACKS_H_
diff --git a/third_party/blink/renderer/modules/indexeddb/mock_web_idb_database.h b/third_party/blink/renderer/modules/indexeddb/mock_web_idb_database.h
index a7325498..c38507f 100644
--- a/third_party/blink/renderer/modules/indexeddb/mock_web_idb_database.h
+++ b/third_party/blink/renderer/modules/indexeddb/mock_web_idb_database.h
@@ -7,10 +7,10 @@
 
 #include <gmock/gmock.h>
 #include <memory>
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_database.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_key_range.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_key.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_key_range.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_database.h"
 
 namespace blink {
 
@@ -23,7 +23,7 @@
   MOCK_METHOD5(CreateObjectStore,
                void(long long transaction_id,
                     long long object_store_id,
-                    const WebString& name,
+                    const String& name,
                     const WebIDBKeyPath&,
                     bool auto_increment));
   MOCK_METHOD2(DeleteObjectStore,
@@ -31,10 +31,10 @@
   MOCK_METHOD3(RenameObjectStore,
                void(long long transaction_id,
                     long long object_store_id,
-                    const WebString& new_name));
+                    const String& new_name));
   MOCK_METHOD3(CreateTransaction,
                void(long long id,
-                    const WebVector<long long>& scope,
+                    const Vector<int64_t>& scope,
                     WebIDBTransactionMode));
   MOCK_METHOD0(Close, void());
   MOCK_METHOD0(VersionChangeIgnored, void());
@@ -44,7 +44,7 @@
                void(long long transaction_id,
                     long long object_store_id,
                     long long index_id,
-                    const WebString& name,
+                    const String& name,
                     const WebIDBKeyPath&,
                     bool unique,
                     bool multi_entry));
@@ -56,7 +56,7 @@
                void(long long transaction_id,
                     long long object_store_id,
                     long long index_id,
-                    const WebString& new_name));
+                    const String& new_name));
   MOCK_METHOD6(
       AddObserver,
       void(long long transaction_id,
@@ -67,7 +67,7 @@
            const std::bitset<kWebIDBOperationTypeCount>& operation_types));
   MOCK_CONST_METHOD1(ContainsObserverId, bool(int32_t id));
   MOCK_METHOD1(RemoveObservers,
-               void(const WebVector<int32_t>& observer_ids_to_remove));
+               void(const Vector<int32_t>& observer_ids_to_remove));
   MOCK_METHOD6(Get,
                void(long long transaction_id,
                     long long object_store_id,
@@ -88,21 +88,21 @@
                void(long long transaction_id,
                     long long object_store_id,
                     const WebData& value,
-                    const WebVector<WebBlobInfo>&,
+                    const Vector<WebBlobInfo>&,
                     WebIDBKeyView primary_key,
                     WebIDBPutMode,
                     WebIDBCallbacks*,
-                    const WebVector<WebIDBIndexKeys>&));
+                    const Vector<WebIDBIndexKeys>&));
 
   MOCK_METHOD4(SetIndexKeys,
                void(long long transaction_id,
                     long long object_store_id,
                     WebIDBKeyView primary_key,
-                    const WebVector<WebIDBIndexKeys>&));
+                    const Vector<WebIDBIndexKeys>&));
   MOCK_METHOD3(SetIndexesReady,
                void(long long transaction_id,
                     long long object_store_id,
-                    const WebVector<long long>& index_ids));
+                    const Vector<int64_t>& index_ids));
   MOCK_METHOD8(OpenCursor,
                void(long long transaction_id,
                     long long object_store_id,
diff --git a/third_party/blink/renderer/modules/indexeddb/mock_web_idb_factory.h b/third_party/blink/renderer/modules/indexeddb/mock_web_idb_factory.h
index 83c890d..47ffe2f 100644
--- a/third_party/blink/renderer/modules/indexeddb/mock_web_idb_factory.h
+++ b/third_party/blink/renderer/modules/indexeddb/mock_web_idb_factory.h
@@ -9,9 +9,9 @@
 #include <memory>
 
 #include "base/single_thread_task_runner.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_factory.h"
 #include "third_party/blink/public/platform/web_common.h"
 #include "third_party/blink/public/platform/web_security_origin.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_factory.h"
 
 namespace base {
 class SingleThreadTaskRunner;
diff --git a/third_party/blink/renderer/modules/indexeddb/web_idb_callbacks_impl.cc b/third_party/blink/renderer/modules/indexeddb/web_idb_callbacks_impl.cc
index 12b0e2052..aac8402 100644
--- a/third_party/blink/renderer/modules/indexeddb/web_idb_callbacks_impl.cc
+++ b/third_party/blink/renderer/modules/indexeddb/web_idb_callbacks_impl.cc
@@ -31,8 +31,6 @@
 #include <memory>
 
 #include "base/memory/ptr_util.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_cursor.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_database.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_database_error.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_key.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_name_and_version.h"
@@ -43,6 +41,8 @@
 #include "third_party/blink/renderer/modules/indexeddb/idb_metadata.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_request.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_value.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_cursor.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_database.h"
 #include "third_party/blink/renderer/platform/shared_buffer.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
 
diff --git a/third_party/blink/public/platform/modules/indexeddb/web_idb_cursor.h b/third_party/blink/renderer/modules/indexeddb/web_idb_cursor.h
similarity index 88%
rename from third_party/blink/public/platform/modules/indexeddb/web_idb_cursor.h
rename to third_party/blink/renderer/modules/indexeddb/web_idb_cursor.h
index 248df14..7e03aa02 100644
--- a/third_party/blink/public/platform/modules/indexeddb/web_idb_cursor.h
+++ b/third_party/blink/renderer/modules/indexeddb/web_idb_cursor.h
@@ -23,18 +23,18 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_INDEXEDDB_WEB_IDB_CURSOR_H_
-#define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_INDEXEDDB_WEB_IDB_CURSOR_H_
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_WEB_IDB_CURSOR_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_WEB_IDB_CURSOR_H_
 
 #include "third_party/blink/public/common/indexeddb/web_idb_types.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_callbacks.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_key.h"
-#include "third_party/blink/public/platform/web_common.h"
 #include "third_party/blink/public/platform/web_string.h"
+#include "third_party/blink/renderer/modules/modules_export.h"
 
 namespace blink {
 
-class WebIDBCursor {
+class MODULES_EXPORT WebIDBCursor {
  public:
   virtual ~WebIDBCursor() = default;
 
@@ -65,4 +65,4 @@
 
 }  // namespace blink
 
-#endif  // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_INDEXEDDB_WEB_IDB_CURSOR_H_
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_WEB_IDB_CURSOR_H_
diff --git a/content/renderer/indexed_db/webidbcursor_impl.cc b/third_party/blink/renderer/modules/indexeddb/web_idb_cursor_impl.cc
similarity index 68%
rename from content/renderer/indexed_db/webidbcursor_impl.cc
rename to third_party/blink/renderer/modules/indexeddb/web_idb_cursor_impl.cc
index bdf5ce9..bdf6aeb4 100644
--- a/content/renderer/indexed_db/webidbcursor_impl.cc
+++ b/third_party/blink/renderer/modules/indexeddb/web_idb_cursor_impl.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/renderer/indexed_db/webidbcursor_impl.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_cursor_impl.h"
 
 #include <stddef.h>
 
@@ -10,10 +10,11 @@
 #include <vector>
 
 #include "base/single_thread_task_runner.h"
-#include "content/renderer/indexed_db/indexed_db_dispatcher.h"
-#include "content/renderer/indexed_db/indexed_db_key_builders.h"
 #include "mojo/public/cpp/bindings/strong_associated_binding.h"
+#include "third_party/blink/public/platform/modules/indexeddb/indexed_db_key_builder.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_value.h"
+#include "third_party/blink/renderer/modules/indexeddb/idb_key_range.h"
+#include "third_party/blink/renderer/modules/indexeddb/indexed_db_dispatcher.h"
 
 using blink::WebBlobInfo;
 using blink::WebData;
@@ -21,13 +22,13 @@
 using blink::WebIDBKey;
 using blink::WebIDBKeyView;
 using blink::WebIDBValue;
-using blink::mojom::IDBCallbacksAssociatedPtrInfo;
-using blink::mojom::IDBCursorAssociatedPtrInfo;
+using blink::mojom::blink::IDBCallbacksAssociatedPtrInfo;
+using blink::mojom::blink::IDBCursorAssociatedPtrInfo;
 
-namespace content {
+namespace blink {
 
 WebIDBCursorImpl::WebIDBCursorImpl(
-    blink::mojom::IDBCursorAssociatedPtrInfo cursor_info,
+    mojom::blink::IDBCursorAssociatedPtrInfo cursor_info,
     int64_t transaction_id)
     : transaction_id_(transaction_id),
       cursor_(std::move(cursor_info)),
@@ -36,7 +37,7 @@
       pending_onsuccess_callbacks_(0),
       prefetch_amount_(kMinPrefetchAmount),
       weak_factory_(this) {
-  IndexedDBDispatcher::ThreadSpecificInstance()->RegisterCursor(this);
+  IndexedDBDispatcher::RegisterCursor(this);
 }
 
 WebIDBCursorImpl::~WebIDBCursorImpl() {
@@ -44,7 +45,7 @@
   // 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.
-  IndexedDBDispatcher::ThreadSpecificInstance()->UnregisterCursor(this);
+  IndexedDBDispatcher::UnregisterCursor(this);
 }
 
 void WebIDBCursorImpl::Advance(unsigned long count,
@@ -57,8 +58,7 @@
   ResetPrefetchCache();
 
   // Reset all cursor prefetch caches except for this cursor.
-  IndexedDBDispatcher::ThreadSpecificInstance()->ResetCursorPrefetchCaches(
-      transaction_id_, this);
+  IndexedDBDispatcher::ResetCursorPrefetchCaches(transaction_id_, this);
 
   auto callbacks_impl = std::make_unique<IndexedDBCallbacksImpl>(
       std::move(callbacks), transaction_id_, weak_factory_.GetWeakPtr());
@@ -70,12 +70,12 @@
                                       WebIDBCallbacks* callbacks_ptr) {
   std::unique_ptr<WebIDBCallbacks> callbacks(callbacks_ptr);
 
-  if (key.KeyType() == blink::kWebIDBKeyTypeNull &&
-      primary_key.KeyType() == blink::kWebIDBKeyTypeNull) {
+  if (key.KeyType() == kWebIDBKeyTypeNull &&
+      primary_key.KeyType() == kWebIDBKeyTypeNull) {
     // No key(s), so this would qualify for a prefetch.
     ++continue_count_;
 
-    if (!prefetch_keys_.empty()) {
+    if (!prefetch_keys_.IsEmpty()) {
       // We have a prefetch cache, so serve the result from that.
       CachedContinue(callbacks.get());
       return;
@@ -103,13 +103,12 @@
   }
 
   // Reset all cursor prefetch caches except for this cursor.
-  IndexedDBDispatcher::ThreadSpecificInstance()->ResetCursorPrefetchCaches(
-      transaction_id_, this);
+  IndexedDBDispatcher::ResetCursorPrefetchCaches(transaction_id_, this);
 
   auto callbacks_impl = std::make_unique<IndexedDBCallbacksImpl>(
       std::move(callbacks), transaction_id_, weak_factory_.GetWeakPtr());
-  cursor_->CursorContinue(IndexedDBKeyBuilder::Build(key),
-                          IndexedDBKeyBuilder::Build(primary_key),
+  cursor_->CursorContinue(WebIDBKeyBuilder::Build(key),
+                          WebIDBKeyBuilder::Build(primary_key),
                           GetCallbacksProxy(std::move(callbacks_impl)));
 }
 
@@ -126,14 +125,18 @@
     ResetPrefetchCache();
 }
 
-void WebIDBCursorImpl::SetPrefetchData(
-    const std::vector<IndexedDBKey>& keys,
-    const std::vector<IndexedDBKey>& primary_keys,
-    std::vector<WebIDBValue> values) {
-  prefetch_keys_.assign(keys.begin(), keys.end());
-  prefetch_primary_keys_.assign(primary_keys.begin(), primary_keys.end());
-  prefetch_values_.assign(std::make_move_iterator(values.begin()),
-                          std::make_move_iterator(values.end()));
+void WebIDBCursorImpl::SetPrefetchData(Vector<WebIDBKey> keys,
+                                       Vector<WebIDBKey> primary_keys,
+                                       Vector<WebIDBValue> values) {
+  // Keys and values are stored in reverse order so that a cache'd continue can
+  // pop a value off of the back and prevent new memory allocations.
+  prefetch_keys_.AppendRange(std::make_move_iterator(keys.rbegin()),
+                             std::make_move_iterator(keys.rend()));
+  prefetch_primary_keys_.AppendRange(
+      std::make_move_iterator(primary_keys.rbegin()),
+      std::make_move_iterator(primary_keys.rend()));
+  prefetch_values_.AppendRange(std::make_move_iterator(values.rbegin()),
+                               std::make_move_iterator(values.rend()));
 
   used_prefetches_ = 0;
   pending_onsuccess_callbacks_ = 0;
@@ -146,9 +149,9 @@
   DCHECK_EQ(prefetch_values_.size(), prefetch_keys_.size());
 
   while (count > 1) {
-    prefetch_keys_.pop_front();
-    prefetch_primary_keys_.pop_front();
-    prefetch_values_.pop_front();
+    prefetch_keys_.pop_back();
+    prefetch_primary_keys_.pop_back();
+    prefetch_values_.pop_back();
     ++used_prefetches_;
     --count;
   }
@@ -161,13 +164,15 @@
   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 = std::move(prefetch_values_.front());
+  // Keys and values are stored in reverse order so that a cache'd continue can
+  // pop a value off of the back and prevent new memory allocations.
+  WebIDBKey key = std::move(prefetch_keys_.back());
+  WebIDBKey primary_key = std::move(prefetch_primary_keys_.back());
+  WebIDBValue value = std::move(prefetch_values_.back());
 
-  prefetch_keys_.pop_front();
-  prefetch_primary_keys_.pop_front();
-  prefetch_values_.pop_front();
+  prefetch_keys_.pop_back();
+  prefetch_primary_keys_.pop_back();
+  prefetch_values_.pop_back();
   ++used_prefetches_;
 
   ++pending_onsuccess_callbacks_;
@@ -180,15 +185,15 @@
     ResetPrefetchCache();
   }
 
-  callbacks->OnSuccess(WebIDBKeyBuilder::Build(key),
-                       WebIDBKeyBuilder::Build(primary_key), std::move(value));
+  callbacks->OnSuccess(std::move(key), std::move(primary_key),
+                       std::move(value));
 }
 
 void WebIDBCursorImpl::ResetPrefetchCache() {
   continue_count_ = 0;
   prefetch_amount_ = kMinPrefetchAmount;
 
-  if (prefetch_keys_.empty()) {
+  if (prefetch_keys_.IsEmpty()) {
     // No prefetch cache, so no need to reset the cursor in the back-end.
     return;
   }
@@ -212,4 +217,4 @@
   return ptr_info;
 }
 
-}  // namespace content
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/indexeddb/web_idb_cursor_impl.h b/third_party/blink/renderer/modules/indexeddb/web_idb_cursor_impl.h
new file mode 100644
index 0000000..f9b04bee
--- /dev/null
+++ b/third_party/blink/renderer/modules/indexeddb/web_idb_cursor_impl.h
@@ -0,0 +1,93 @@
+// 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.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_WEB_IDB_CURSOR_IMPL_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_WEB_IDB_CURSOR_IMPL_H_
+
+#include <stdint.h>
+
+#include <vector>
+
+#include "base/gtest_prod_util.h"
+#include "third_party/blink/public/common/indexeddb/indexeddb_key.h"
+#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h"
+#include "third_party/blink/public/platform/modules/indexeddb/web_idb_callbacks.h"
+#include "third_party/blink/public/platform/modules/indexeddb/web_idb_key.h"
+#include "third_party/blink/public/platform/modules/indexeddb/web_idb_value.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_cursor.h"
+#include "third_party/blink/renderer/modules/modules_export.h"
+
+namespace blink {
+
+class IndexedDBCallbacksImpl;
+
+class MODULES_EXPORT WebIDBCursorImpl : public WebIDBCursor {
+ public:
+  WebIDBCursorImpl(mojom::blink::IDBCursorAssociatedPtrInfo cursor,
+                   int64_t transaction_id);
+  ~WebIDBCursorImpl() override;
+
+  void Advance(unsigned long count, WebIDBCallbacks* callback) override;
+  void CursorContinue(WebIDBKeyView key,
+                      WebIDBKeyView primary_key,
+                      WebIDBCallbacks* callback) override;
+  void PostSuccessHandlerCallback() override;
+
+  void SetPrefetchData(Vector<WebIDBKey> keys,
+                       Vector<WebIDBKey> primary_keys,
+                       Vector<WebIDBValue> values);
+
+  void CachedAdvance(unsigned long count, WebIDBCallbacks* callbacks);
+  void CachedContinue(WebIDBCallbacks* callbacks);
+
+  // This method is virtual so it can be overridden in unit tests.
+  virtual void ResetPrefetchCache();
+
+  int64_t transaction_id() const { return transaction_id_; }
+
+ private:
+  mojom::blink::IDBCallbacksAssociatedPtrInfo GetCallbacksProxy(
+      std::unique_ptr<IndexedDBCallbacksImpl> callbacks);
+
+  FRIEND_TEST_ALL_PREFIXES(IndexedDBDispatcherTest, CursorReset);
+  FRIEND_TEST_ALL_PREFIXES(IndexedDBDispatcherTest, CursorTransactionId);
+  FRIEND_TEST_ALL_PREFIXES(WebIDBCursorImplTest, AdvancePrefetchTest);
+  FRIEND_TEST_ALL_PREFIXES(WebIDBCursorImplTest, PrefetchReset);
+  FRIEND_TEST_ALL_PREFIXES(WebIDBCursorImplTest, PrefetchTest);
+
+  static constexpr int kPrefetchContinueThreshold = 2;
+  static constexpr int kMinPrefetchAmount = 5;
+  static constexpr int kMaxPrefetchAmount = 100;
+
+  int64_t transaction_id_;
+
+  mojom::blink::IDBCursorAssociatedPtr cursor_;
+
+  // Prefetch cache. Keys and values are stored in reverse order so that a
+  // cache'd continue can pop a value off of the back and prevent new memory
+  // allocations.
+  Vector<WebIDBKey> prefetch_keys_;
+  Vector<WebIDBKey> prefetch_primary_keys_;
+  Vector<WebIDBValue> prefetch_values_;
+
+  // Number of continue calls that would qualify for a pre-fetch.
+  int continue_count_;
+
+  // Number of items used from the last prefetch.
+  int used_prefetches_;
+
+  // Number of onsuccess handlers we are waiting for.
+  int pending_onsuccess_callbacks_;
+
+  // Number of items to request in next prefetch.
+  int prefetch_amount_;
+
+  base::WeakPtrFactory<WebIDBCursorImpl> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(WebIDBCursorImpl);
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_WEB_IDB_CURSOR_IMPL_H_
diff --git a/content/renderer/indexed_db/webidbcursor_impl_unittest.cc b/third_party/blink/renderer/modules/indexeddb/web_idb_cursor_impl_unittest.cc
similarity index 78%
rename from content/renderer/indexed_db/webidbcursor_impl_unittest.cc
rename to third_party/blink/renderer/modules/indexeddb/web_idb_cursor_impl_unittest.cc
index 212b216..76fa9b2 100644
--- a/content/renderer/indexed_db/webidbcursor_impl_unittest.cc
+++ b/third_party/blink/renderer/modules/indexeddb/web_idb_cursor_impl_unittest.cc
@@ -2,46 +2,31 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/renderer/indexed_db/webidbcursor_impl.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_cursor_impl.h"
 
 #include <stddef.h>
 #include <stdint.h>
 
 #include <memory>
 
-#include "base/guid.h"
 #include "base/macros.h"
-#include "base/run_loop.h"
-#include "base/test/scoped_task_environment.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/values.h"
-#include "content/child/thread_safe_sender.h"
-#include "content/renderer/indexed_db/indexed_db_key_builders.h"
-#include "content/renderer/indexed_db/mock_webidbcallbacks.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/platform/modules/indexeddb/indexed_db_key_builder.h"
 #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h"
 #include "third_party/blink/public/platform/web_data.h"
+#include "third_party/blink/renderer/modules/indexeddb/idb_key_range.h"
+#include "third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.h"
+#include "third_party/blink/renderer/platform/testing/testing_platform_support.h"
+#include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
 
-using blink::IndexedDBKey;
-using blink::WebBlobInfo;
-using blink::WebData;
-using blink::WebIDBCallbacks;
-using blink::WebIDBKey;
-using blink::kWebIDBKeyTypeNumber;
-using blink::WebIDBValue;
-using blink::WebString;
-using blink::WebVector;
-using blink::mojom::IDBCursor;
-using testing::StrictMock;
-
-namespace content {
+namespace blink {
 
 namespace {
 
-class MockCursorImpl : public IDBCursor {
+class MockCursorImpl : public mojom::blink::IDBCursor {
  public:
-  explicit MockCursorImpl(blink::mojom::IDBCursorAssociatedRequest request)
+  explicit MockCursorImpl(mojom::blink::IDBCursorAssociatedRequest request)
       : binding_(this, std::move(request)) {
     binding_.set_connection_error_handler(base::BindOnce(
         &MockCursorImpl::CursorDestroyed, base::Unretained(this)));
@@ -49,7 +34,7 @@
 
   void Prefetch(
       int32_t count,
-      blink::mojom::IDBCallbacksAssociatedPtrInfo callbacks) override {
+      mojom::blink::IDBCallbacksAssociatedPtrInfo callbacks) override {
     ++prefetch_calls_;
     last_prefetch_count_ = count;
   }
@@ -61,14 +46,14 @@
   }
 
   void Advance(uint32_t count,
-               blink::mojom::IDBCallbacksAssociatedPtrInfo callbacks) override {
+               mojom::blink::IDBCallbacksAssociatedPtrInfo callbacks) override {
     ++advance_calls_;
   }
 
   void CursorContinue(
-      const IndexedDBKey& key,
-      const IndexedDBKey& primary_key,
-      blink::mojom::IDBCallbacksAssociatedPtrInfo callbacks) override {
+      WebIDBKey key,
+      WebIDBKey primary_key,
+      mojom::blink::IDBCallbacksAssociatedPtrInfo callbacks) override {
     ++continue_calls_;
   }
 
@@ -94,7 +79,7 @@
   mojo::AssociatedBinding<IDBCursor> binding_;
 };
 
-class MockContinueCallbacks : public StrictMock<MockWebIDBCallbacks> {
+class MockContinueCallbacks : public testing::StrictMock<MockWebIDBCallbacks> {
  public:
   MockContinueCallbacks(IndexedDBKey* key = nullptr,
                         WebVector<WebBlobInfo>* blobs = nullptr)
@@ -119,14 +104,14 @@
 class WebIDBCursorImplTest : public testing::Test {
  public:
   WebIDBCursorImplTest() : null_key_(WebIDBKey::CreateNull()) {
-    blink::mojom::IDBCursorAssociatedPtr ptr;
+    mojom::blink::IDBCursorAssociatedPtr ptr;
     mock_cursor_ = std::make_unique<MockCursorImpl>(
         mojo::MakeRequestAssociatedWithDedicatedPipe(&ptr));
     cursor_ = std::make_unique<WebIDBCursorImpl>(ptr.PassInterface(), 1);
   }
 
  protected:
-  base::test::ScopedTaskEnvironment scoped_task_environment_;
+  ScopedTestingPlatformSupport<TestingPlatformSupport> platform_;
   WebIDBKey null_key_;
   std::unique_ptr<WebIDBCursorImpl> cursor_;
   std::unique_ptr<MockCursorImpl> mock_cursor_;
@@ -142,7 +127,7 @@
   for (int i = 0; i < WebIDBCursorImpl::kPrefetchContinueThreshold; ++i) {
     cursor_->CursorContinue(null_key_.View(), null_key_.View(),
                             new MockContinueCallbacks());
-    base::RunLoop().RunUntilIdle();
+    platform_->RunUntilIdle();
     EXPECT_EQ(++continue_calls, mock_cursor_->continue_calls());
     EXPECT_EQ(0, mock_cursor_->prefetch_calls());
   }
@@ -157,7 +142,7 @@
     // Initiate the prefetch
     cursor_->CursorContinue(null_key_.View(), null_key_.View(),
                             new MockContinueCallbacks());
-    base::RunLoop().RunUntilIdle();
+    platform_->RunUntilIdle();
     EXPECT_EQ(continue_calls, mock_cursor_->continue_calls());
     EXPECT_EQ(repetitions + 1, mock_cursor_->prefetch_calls());
 
@@ -167,17 +152,22 @@
     last_prefetch_count = prefetch_count;
 
     // Fill the prefetch cache as requested.
-    std::vector<IndexedDBKey> keys;
-    std::vector<IndexedDBKey> primary_keys;
-    std::vector<WebIDBValue> values;
+    Vector<WebIDBKey> keys;
+    Vector<WebIDBKey> primary_keys;
+    Vector<WebIDBValue> values;
+    size_t expected_size = 0;
     for (int i = 0; i < prefetch_count; ++i) {
-      keys.emplace_back(expected_key + i, kWebIDBKeyTypeNumber);
+      WebIDBKey key = WebIDBKey::CreateNumber(expected_key + i);
+      keys.emplace_back(std::move(key));
       primary_keys.emplace_back();
+      expected_size++;
+      EXPECT_EQ(expected_size, keys.size());
+      EXPECT_EQ(expected_size, primary_keys.size());
       WebVector<WebBlobInfo> blob_info;
       blob_info.reserve(expected_key + i);
       for (int j = 0; j < expected_key + i; ++j) {
         blob_info.emplace_back(WebBlobInfo::BlobForTesting(
-            WebString::FromLatin1(base::GenerateGUID()), "text/plain", 123));
+            WebString("blobuuid"), "text/plain", 123));
       }
       values.emplace_back(WebData(), std::move(blob_info));
     }
@@ -194,7 +184,7 @@
       WebVector<WebBlobInfo> blobs;
       cursor_->CursorContinue(null_key_.View(), null_key_.View(),
                               new MockContinueCallbacks(&key, &blobs));
-      base::RunLoop().RunUntilIdle();
+      platform_->RunUntilIdle();
       EXPECT_EQ(continue_calls, mock_cursor_->continue_calls());
       EXPECT_EQ(repetitions + 1, mock_cursor_->prefetch_calls());
 
@@ -205,7 +195,7 @@
   }
 
   cursor_.reset();
-  base::RunLoop().RunUntilIdle();
+  platform_->RunUntilIdle();
   EXPECT_TRUE(mock_cursor_->destroyed());
 }
 
@@ -216,14 +206,14 @@
     cursor_->CursorContinue(null_key_.View(), null_key_.View(),
                             new MockContinueCallbacks());
   }
-  base::RunLoop().RunUntilIdle();
+  platform_->RunUntilIdle();
   EXPECT_EQ(0, mock_cursor_->prefetch_calls());
 
   // Initiate the prefetch
   cursor_->CursorContinue(null_key_.View(), null_key_.View(),
                           new MockContinueCallbacks());
 
-  base::RunLoop().RunUntilIdle();
+  platform_->RunUntilIdle();
   EXPECT_EQ(1, mock_cursor_->prefetch_calls());
   EXPECT_EQ(static_cast<int>(WebIDBCursorImpl::kPrefetchContinueThreshold),
             mock_cursor_->continue_calls());
@@ -233,17 +223,22 @@
 
   // Fill the prefetch cache as requested.
   int expected_key = 0;
-  std::vector<IndexedDBKey> keys;
-  std::vector<IndexedDBKey> primary_keys;
-  std::vector<WebIDBValue> values;
+  Vector<WebIDBKey> keys;
+  Vector<WebIDBKey> primary_keys;
+  Vector<WebIDBValue> values;
+  size_t expected_size = 0;
   for (int i = 0; i < prefetch_count; ++i) {
-    keys.emplace_back(expected_key + i, kWebIDBKeyTypeNumber);
+    WebIDBKey key = WebIDBKey::CreateNumber(expected_key + i);
+    keys.emplace_back(std::move(key));
     primary_keys.emplace_back();
+    expected_size++;
+    EXPECT_EQ(expected_size, keys.size());
+    EXPECT_EQ(expected_size, primary_keys.size());
     WebVector<WebBlobInfo> blob_info;
     blob_info.reserve(expected_key + i);
     for (int j = 0; j < expected_key + i; ++j) {
-      blob_info.emplace_back(WebBlobInfo::BlobForTesting(
-          WebString::FromLatin1(base::GenerateGUID()), "text/plain", 123));
+      blob_info.emplace_back(WebBlobInfo::BlobForTesting(WebString("blobuuid"),
+                                                         "text/plain", 123));
     }
     values.emplace_back(WebData(), std::move(blob_info));
   }
@@ -261,23 +256,23 @@
   IndexedDBKey key;
   cursor_->CursorContinue(null_key_.View(), null_key_.View(),
                           new MockContinueCallbacks(&key));
-  base::RunLoop().RunUntilIdle();
+  platform_->RunUntilIdle();
   EXPECT_EQ(0, key.number());
 
   // IDBCursor.advance(1)
   cursor_->Advance(1, new MockContinueCallbacks(&key));
-  base::RunLoop().RunUntilIdle();
+  platform_->RunUntilIdle();
   EXPECT_EQ(1, key.number());
 
   // IDBCursor.continue()
   cursor_->CursorContinue(null_key_.View(), null_key_.View(),
                           new MockContinueCallbacks(&key));
-  base::RunLoop().RunUntilIdle();
+  platform_->RunUntilIdle();
   EXPECT_EQ(2, key.number());
 
   // IDBCursor.advance(2)
   cursor_->Advance(2, new MockContinueCallbacks(&key));
-  base::RunLoop().RunUntilIdle();
+  platform_->RunUntilIdle();
   EXPECT_EQ(4, key.number());
 
   EXPECT_EQ(0, mock_cursor_->advance_calls());
@@ -285,14 +280,14 @@
   // IDBCursor.advance(lots) - beyond the fetched amount
   cursor_->Advance(WebIDBCursorImpl::kMaxPrefetchAmount,
                    new MockContinueCallbacks(&key));
-  base::RunLoop().RunUntilIdle();
+  platform_->RunUntilIdle();
   EXPECT_EQ(1, mock_cursor_->advance_calls());
   EXPECT_EQ(1, mock_cursor_->prefetch_calls());
   EXPECT_EQ(static_cast<int>(WebIDBCursorImpl::kPrefetchContinueThreshold),
             mock_cursor_->continue_calls());
 
   cursor_.reset();
-  base::RunLoop().RunUntilIdle();
+  platform_->RunUntilIdle();
   EXPECT_TRUE(mock_cursor_->destroyed());
 }
 
@@ -303,7 +298,7 @@
   for (int i = 0; i < WebIDBCursorImpl::kPrefetchContinueThreshold; ++i) {
     cursor_->CursorContinue(null_key_.View(), null_key_.View(),
                             new MockContinueCallbacks());
-    base::RunLoop().RunUntilIdle();
+    platform_->RunUntilIdle();
     EXPECT_EQ(++continue_calls, mock_cursor_->continue_calls());
     EXPECT_EQ(0, mock_cursor_->prefetch_calls());
   }
@@ -311,7 +306,7 @@
   // Initiate the prefetch
   cursor_->CursorContinue(null_key_.View(), null_key_.View(),
                           new MockContinueCallbacks());
-  base::RunLoop().RunUntilIdle();
+  platform_->RunUntilIdle();
   EXPECT_EQ(continue_calls, mock_cursor_->continue_calls());
   EXPECT_EQ(1, mock_cursor_->prefetch_calls());
   EXPECT_EQ(0, mock_cursor_->reset_calls());
@@ -320,21 +315,21 @@
   cursor_->ResetPrefetchCache();
 
   // No reset should have been sent since nothing has been received yet.
-  base::RunLoop().RunUntilIdle();
+  platform_->RunUntilIdle();
   EXPECT_EQ(0, mock_cursor_->reset_calls());
 
   // Fill the prefetch cache as requested.
   int prefetch_count = mock_cursor_->last_prefetch_count();
-  std::vector<IndexedDBKey> keys(prefetch_count);
-  std::vector<IndexedDBKey> primary_keys(prefetch_count);
-  std::vector<WebIDBValue> values;
+  Vector<WebIDBKey> keys(prefetch_count);
+  Vector<WebIDBKey> primary_keys(prefetch_count);
+  Vector<WebIDBValue> values;
   for (int i = 0; i < prefetch_count; ++i)
     values.emplace_back(WebData(), WebVector<WebBlobInfo>());
   cursor_->SetPrefetchData(std::move(keys), std::move(primary_keys),
                            std::move(values));
 
   // No reset should have been sent since prefetch data hasn't been used.
-  base::RunLoop().RunUntilIdle();
+  platform_->RunUntilIdle();
   EXPECT_EQ(0, mock_cursor_->reset_calls());
 
   // The real dispatcher would call cursor->CachedContinue(), so do that:
@@ -342,13 +337,13 @@
   cursor_->CachedContinue(&callbacks);
 
   // Now the cursor should have reset the rest of the cache.
-  base::RunLoop().RunUntilIdle();
+  platform_->RunUntilIdle();
   EXPECT_EQ(1, mock_cursor_->reset_calls());
   EXPECT_EQ(1, mock_cursor_->last_used_count());
 
   cursor_.reset();
-  base::RunLoop().RunUntilIdle();
+  platform_->RunUntilIdle();
   EXPECT_TRUE(mock_cursor_->destroyed());
 }
 
-}  // namespace content
+}  // namespace blink
diff --git a/third_party/blink/public/platform/modules/indexeddb/web_idb_database.h b/third_party/blink/renderer/modules/indexeddb/web_idb_database.h
similarity index 84%
rename from third_party/blink/public/platform/modules/indexeddb/web_idb_database.h
rename to third_party/blink/renderer/modules/indexeddb/web_idb_database.h
index 782d60fa..f5e28eb 100644
--- a/third_party/blink/public/platform/modules/indexeddb/web_idb_database.h
+++ b/third_party/blink/renderer/modules/indexeddb/web_idb_database.h
@@ -23,17 +23,18 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_INDEXEDDB_WEB_IDB_DATABASE_H_
-#define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_INDEXEDDB_WEB_IDB_DATABASE_H_
-
-#include "third_party/blink/public/common/indexeddb/web_idb_types.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_cursor.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_metadata.h"
-#include "third_party/blink/public/platform/web_blob_info.h"
-#include "third_party/blink/public/platform/web_common.h"
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_WEB_IDB_DATABASE_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_WEB_IDB_DATABASE_H_
 
 #include <bitset>
 
+#include "third_party/blink/public/common/indexeddb/web_idb_types.h"
+#include "third_party/blink/public/platform/modules/indexeddb/web_idb_metadata.h"
+#include "third_party/blink/public/platform/web_blob_info.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_cursor.h"
+#include "third_party/blink/renderer/modules/modules_export.h"
+#include "third_party/blink/renderer/platform/wtf/vector.h"
+
 namespace blink {
 
 class WebData;
@@ -41,22 +42,22 @@
 class WebIDBKeyPath;
 class WebIDBKeyRange;
 
-class WebIDBDatabase {
+class MODULES_EXPORT WebIDBDatabase {
  public:
   virtual ~WebIDBDatabase() = default;
 
   virtual void CreateObjectStore(long long transaction_id,
                                  long long object_store_id,
-                                 const WebString& name,
+                                 const String& name,
                                  const WebIDBKeyPath&,
                                  bool auto_increment) = 0;
   virtual void DeleteObjectStore(long long transaction_id,
                                  long long object_store_id) = 0;
   virtual void RenameObjectStore(long long transaction_id,
                                  long long object_store_id,
-                                 const WebString& name) = 0;
+                                 const String& name) = 0;
   virtual void CreateTransaction(long long id,
-                                 const WebVector<long long>& scope,
+                                 const Vector<int64_t>& scope,
                                  WebIDBTransactionMode) = 0;
   virtual void Close() = 0;
   virtual void VersionChangeIgnored() = 0;
@@ -67,7 +68,7 @@
   virtual void CreateIndex(long long transaction_id,
                            long long object_store_id,
                            long long index_id,
-                           const WebString& name,
+                           const String& name,
                            const WebIDBKeyPath&,
                            bool unique,
                            bool multi_entry) = 0;
@@ -77,7 +78,7 @@
   virtual void RenameIndex(long long transaction_id,
                            long long object_store_id,
                            long long index_id,
-                           const WebString& new_name) = 0;
+                           const String& new_name) = 0;
 
   static const long long kMinimumIndexId = 30;
 
@@ -89,7 +90,7 @@
       bool values,
       const std::bitset<kWebIDBOperationTypeCount>& operation_types) = 0;
   virtual void RemoveObservers(
-      const WebVector<int32_t>& observer_ids_to_remove) = 0;
+      const Vector<int32_t>& observer_ids_to_remove) = 0;
   virtual void Get(long long transaction_id,
                    long long object_store_id,
                    long long index_id,
@@ -106,18 +107,18 @@
   virtual void Put(long long transaction_id,
                    long long object_store_id,
                    const WebData& value,
-                   const WebVector<WebBlobInfo>&,
+                   const Vector<WebBlobInfo>&,
                    WebIDBKeyView primary_key,
                    WebIDBPutMode,
                    WebIDBCallbacks*,
-                   const WebVector<WebIDBIndexKeys>&) = 0;
+                   const Vector<WebIDBIndexKeys>&) = 0;
   virtual void SetIndexKeys(long long transaction_id,
                             long long object_store_id,
                             WebIDBKeyView primary_key,
-                            const WebVector<WebIDBIndexKeys>&) = 0;
+                            const Vector<WebIDBIndexKeys>&) = 0;
   virtual void SetIndexesReady(long long transaction_id,
                                long long object_store_id,
-                               const WebVector<long long>& index_ids) = 0;
+                               const Vector<int64_t>& index_ids) = 0;
   virtual void OpenCursor(long long transaction_id,
                           long long object_store_id,
                           long long index_id,
@@ -149,4 +150,4 @@
 
 }  // namespace blink
 
-#endif  // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_INDEXEDDB_WEB_IDB_DATABASE_H_
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_WEB_IDB_DATABASE_H_
diff --git a/third_party/blink/renderer/modules/indexeddb/web_idb_database_impl.cc b/third_party/blink/renderer/modules/indexeddb/web_idb_database_impl.cc
new file mode 100644
index 0000000..872bb3b9
--- /dev/null
+++ b/third_party/blink/renderer/modules/indexeddb/web_idb_database_impl.cc
@@ -0,0 +1,319 @@
+// 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 "third_party/blink/renderer/modules/indexeddb/web_idb_database_impl.h"
+
+#include <stddef.h>
+
+#include <string>
+#include <vector>
+
+#include "base/format_macros.h"
+#include "base/memory/ptr_util.h"
+#include "mojo/public/cpp/bindings/strong_associated_binding.h"
+#include "third_party/blink/public/common/indexeddb/indexeddb_key.h"
+#include "third_party/blink/public/platform/file_path_conversion.h"
+#include "third_party/blink/public/platform/modules/indexeddb/indexed_db_key_builder.h"
+#include "third_party/blink/public/platform/modules/indexeddb/web_idb_database_error.h"
+#include "third_party/blink/public/platform/modules/indexeddb/web_idb_database_exception.h"
+#include "third_party/blink/public/platform/modules/indexeddb/web_idb_key_path.h"
+#include "third_party/blink/public/platform/modules/indexeddb/web_idb_metadata.h"
+#include "third_party/blink/public/platform/web_blob_info.h"
+#include "third_party/blink/public/platform/web_string.h"
+#include "third_party/blink/public/platform/web_vector.h"
+#include "third_party/blink/renderer/modules/indexeddb/idb_key_range.h"
+#include "third_party/blink/renderer/modules/indexeddb/indexed_db_callbacks_impl.h"
+#include "third_party/blink/renderer/modules/indexeddb/indexed_db_dispatcher.h"
+
+namespace blink {
+
+WebIDBDatabaseImpl::WebIDBDatabaseImpl(
+    mojom::blink::IDBDatabaseAssociatedPtrInfo database_info)
+    : database_(std::move(database_info)) {}
+
+WebIDBDatabaseImpl::~WebIDBDatabaseImpl() = default;
+
+void WebIDBDatabaseImpl::CreateObjectStore(long long transaction_id,
+                                           long long object_store_id,
+                                           const String& name,
+                                           const WebIDBKeyPath& key_path,
+                                           bool auto_increment) {
+  database_->CreateObjectStore(transaction_id, object_store_id, name, key_path,
+                               auto_increment);
+}
+
+void WebIDBDatabaseImpl::DeleteObjectStore(long long transaction_id,
+                                           long long object_store_id) {
+  database_->DeleteObjectStore(transaction_id, object_store_id);
+}
+
+void WebIDBDatabaseImpl::RenameObjectStore(long long transaction_id,
+                                           long long object_store_id,
+                                           const String& new_name) {
+  database_->RenameObjectStore(transaction_id, object_store_id, new_name);
+}
+
+void WebIDBDatabaseImpl::CreateTransaction(
+    long long transaction_id,
+    const Vector<int64_t>& object_store_ids,
+    WebIDBTransactionMode mode) {
+  database_->CreateTransaction(transaction_id, object_store_ids, mode);
+}
+
+void WebIDBDatabaseImpl::Close() {
+  database_->Close();
+}
+
+void WebIDBDatabaseImpl::VersionChangeIgnored() {
+  database_->VersionChangeIgnored();
+}
+
+void WebIDBDatabaseImpl::AddObserver(
+    long long transaction_id,
+    int32_t observer_id,
+    bool include_transaction,
+    bool no_records,
+    bool values,
+    const std::bitset<kWebIDBOperationTypeCount>& operation_types) {
+  static_assert(kWebIDBOperationTypeCount < sizeof(uint16_t) * CHAR_BIT,
+                "WebIDBOperationType Count exceeds size of uint16_t");
+  database_->AddObserver(transaction_id, observer_id, include_transaction,
+                         no_records, values, operation_types.to_ulong());
+}
+
+void WebIDBDatabaseImpl::RemoveObservers(const Vector<int32_t>& observer_ids) {
+  database_->RemoveObservers(observer_ids);
+}
+
+void WebIDBDatabaseImpl::Get(long long transaction_id,
+                             long long object_store_id,
+                             long long index_id,
+                             const WebIDBKeyRange& key_range,
+                             bool key_only,
+                             WebIDBCallbacks* callbacks) {
+  IndexedDBDispatcher::ResetCursorPrefetchCaches(transaction_id, nullptr);
+
+  auto callbacks_impl = std::make_unique<IndexedDBCallbacksImpl>(
+      base::WrapUnique(callbacks), transaction_id, nullptr);
+  database_->Get(transaction_id, object_store_id, index_id, key_range, key_only,
+                 GetCallbacksProxy(std::move(callbacks_impl)));
+}
+
+void WebIDBDatabaseImpl::GetAll(long long transaction_id,
+                                long long object_store_id,
+                                long long index_id,
+                                const WebIDBKeyRange& key_range,
+                                long long max_count,
+                                bool key_only,
+                                WebIDBCallbacks* callbacks) {
+  IndexedDBDispatcher::ResetCursorPrefetchCaches(transaction_id, nullptr);
+
+  auto callbacks_impl = std::make_unique<IndexedDBCallbacksImpl>(
+      base::WrapUnique(callbacks), transaction_id, nullptr);
+  database_->GetAll(transaction_id, object_store_id, index_id, key_range,
+                    key_only, max_count,
+                    GetCallbacksProxy(std::move(callbacks_impl)));
+}
+
+void WebIDBDatabaseImpl::Put(long long transaction_id,
+                             long long object_store_id,
+                             const WebData& value,
+                             const Vector<WebBlobInfo>& web_blob_info,
+                             WebIDBKeyView web_primary_key,
+                             WebIDBPutMode put_mode,
+                             WebIDBCallbacks* callbacks,
+                             const Vector<WebIDBIndexKeys>& index_keys) {
+  WebIDBKey primary_key = WebIDBKeyBuilder::Build(web_primary_key);
+
+  IndexedDBDispatcher::ResetCursorPrefetchCaches(transaction_id, nullptr);
+
+  auto mojo_value = mojom::blink::IDBValue::New();
+
+  // mojo_value->bits initialization.
+  value.ForEachSegment([&mojo_value](const char* segment, size_t segment_size,
+                                     size_t segment_offset) {
+    const auto& segment_span = base::make_span(segment, segment + segment_size);
+    mojo_value->bits.AppendRange(segment_span.begin(), segment_span.end());
+    return true;
+  });
+
+  // mojo_value->blob_or_file_info initialization.
+  mojo_value->blob_or_file_info.ReserveInitialCapacity(web_blob_info.size());
+  for (const WebBlobInfo& info : web_blob_info) {
+    auto blob_info = mojom::blink::IDBBlobInfo::New();
+    if (info.IsFile()) {
+      blob_info->file = mojom::blink::IDBFileInfo::New();
+      blob_info->file->path = WebStringToFilePath(info.FilePath());
+      String name = info.FileName();
+      if (name.IsNull())
+        name = g_empty_string;
+      blob_info->file->name = name;
+      blob_info->file->last_modified =
+          base::Time::FromDoubleT(info.LastModified());
+    }
+    blob_info->size = info.size();
+    blob_info->uuid = info.Uuid();
+    DCHECK(!blob_info->uuid.IsEmpty());
+    String mime_type = info.GetType();
+    if (mime_type.IsNull())
+      mime_type = g_empty_string;
+    blob_info->mime_type = mime_type;
+    blob_info->blob = mojom::blink::BlobPtrInfo(info.CloneBlobHandle(),
+                                                mojom::blink::Blob::Version_);
+    mojo_value->blob_or_file_info.push_back(std::move(blob_info));
+  }
+
+  size_t index_keys_size = 0;
+  for (const auto& index_key : index_keys) {
+    index_keys_size++;  // Account for index_key.first (int64_t).
+    for (const auto& key : index_key.second) {
+      index_keys_size += key.SizeEstimate();
+    }
+  }
+
+  size_t arg_size =
+      mojo_value->bits.size() + primary_key.SizeEstimate() + index_keys_size;
+  if (arg_size >= max_put_value_size_) {
+    callbacks->OnError(blink::WebIDBDatabaseError(
+        blink::kWebIDBDatabaseExceptionUnknownError,
+        WebString(
+            String::Format("The serialized keys and/or value are too large"
+                           " (size=%" PRIuS " bytes, max=%" PRIuS " bytes).",
+                           arg_size, max_put_value_size_))));
+    return;
+  }
+
+  auto callbacks_impl = std::make_unique<IndexedDBCallbacksImpl>(
+      base::WrapUnique(callbacks), transaction_id, nullptr);
+  database_->Put(transaction_id, object_store_id, std::move(mojo_value),
+                 std::move(primary_key), put_mode, index_keys,
+                 GetCallbacksProxy(std::move(callbacks_impl)));
+}
+
+void WebIDBDatabaseImpl::SetIndexKeys(
+    long long transaction_id,
+    long long object_store_id,
+    WebIDBKeyView primary_key,
+    const Vector<WebIDBIndexKeys>& index_keys) {
+  IndexedDBKey temp(IndexedDBKeyBuilder::Build(primary_key));
+  database_->SetIndexKeys(transaction_id, object_store_id,
+                          WebIDBKeyBuilder::Build(temp), std::move(index_keys));
+}
+
+void WebIDBDatabaseImpl::SetIndexesReady(long long transaction_id,
+                                         long long object_store_id,
+                                         const Vector<int64_t>& index_ids) {
+  database_->SetIndexesReady(transaction_id, object_store_id,
+                             std::move(index_ids));
+}
+
+void WebIDBDatabaseImpl::OpenCursor(long long transaction_id,
+                                    long long object_store_id,
+                                    long long index_id,
+                                    const WebIDBKeyRange& key_range,
+                                    WebIDBCursorDirection direction,
+                                    bool key_only,
+                                    WebIDBTaskType task_type,
+                                    WebIDBCallbacks* callbacks) {
+  IndexedDBDispatcher::ResetCursorPrefetchCaches(transaction_id, nullptr);
+
+  auto callbacks_impl = std::make_unique<IndexedDBCallbacksImpl>(
+      base::WrapUnique(callbacks), transaction_id, nullptr);
+  database_->OpenCursor(transaction_id, object_store_id, index_id, key_range,
+                        direction, key_only, task_type,
+                        GetCallbacksProxy(std::move(callbacks_impl)));
+}
+
+void WebIDBDatabaseImpl::Count(long long transaction_id,
+                               long long object_store_id,
+                               long long index_id,
+                               const WebIDBKeyRange& key_range,
+                               WebIDBCallbacks* callbacks) {
+  IndexedDBDispatcher::ResetCursorPrefetchCaches(transaction_id, nullptr);
+
+  auto callbacks_impl = std::make_unique<IndexedDBCallbacksImpl>(
+      base::WrapUnique(callbacks), transaction_id, nullptr);
+  database_->Count(transaction_id, object_store_id, index_id, key_range,
+                   GetCallbacksProxy(std::move(callbacks_impl)));
+}
+
+void WebIDBDatabaseImpl::Delete(long long transaction_id,
+                                long long object_store_id,
+                                WebIDBKeyView primary_key,
+                                WebIDBCallbacks* callbacks) {
+  IndexedDBDispatcher::ResetCursorPrefetchCaches(transaction_id, nullptr);
+
+  auto callbacks_impl = std::make_unique<IndexedDBCallbacksImpl>(
+      base::WrapUnique(callbacks), transaction_id, nullptr);
+  database_->DeleteRange(transaction_id, object_store_id,
+                         WebIDBKeyRangeBuilder::Build(primary_key),
+                         GetCallbacksProxy(std::move(callbacks_impl)));
+}
+
+void WebIDBDatabaseImpl::DeleteRange(long long transaction_id,
+                                     long long object_store_id,
+                                     const WebIDBKeyRange& key_range,
+                                     WebIDBCallbacks* callbacks) {
+  IndexedDBDispatcher::ResetCursorPrefetchCaches(transaction_id, nullptr);
+
+  auto callbacks_impl = std::make_unique<IndexedDBCallbacksImpl>(
+      base::WrapUnique(callbacks), transaction_id, nullptr);
+  database_->DeleteRange(transaction_id, object_store_id, key_range,
+                         GetCallbacksProxy(std::move(callbacks_impl)));
+}
+
+void WebIDBDatabaseImpl::Clear(long long transaction_id,
+                               long long object_store_id,
+                               WebIDBCallbacks* callbacks) {
+  IndexedDBDispatcher::ResetCursorPrefetchCaches(transaction_id, nullptr);
+
+  auto callbacks_impl = std::make_unique<IndexedDBCallbacksImpl>(
+      base::WrapUnique(callbacks), transaction_id, nullptr);
+  database_->Clear(transaction_id, object_store_id,
+                   GetCallbacksProxy(std::move(callbacks_impl)));
+}
+
+void WebIDBDatabaseImpl::CreateIndex(long long transaction_id,
+                                     long long object_store_id,
+                                     long long index_id,
+                                     const String& name,
+                                     const WebIDBKeyPath& key_path,
+                                     bool unique,
+                                     bool multi_entry) {
+  database_->CreateIndex(transaction_id, object_store_id, index_id, name,
+                         key_path, unique, multi_entry);
+}
+
+void WebIDBDatabaseImpl::DeleteIndex(long long transaction_id,
+                                     long long object_store_id,
+                                     long long index_id) {
+  database_->DeleteIndex(transaction_id, object_store_id, index_id);
+}
+
+void WebIDBDatabaseImpl::RenameIndex(long long transaction_id,
+                                     long long object_store_id,
+                                     long long index_id,
+                                     const String& new_name) {
+  DCHECK(!new_name.IsNull());
+  database_->RenameIndex(transaction_id, object_store_id, index_id, new_name);
+}
+
+void WebIDBDatabaseImpl::Abort(long long transaction_id) {
+  database_->Abort(transaction_id);
+}
+
+void WebIDBDatabaseImpl::Commit(long long transaction_id) {
+  database_->Commit(transaction_id);
+}
+
+mojom::blink::IDBCallbacksAssociatedPtrInfo
+WebIDBDatabaseImpl::GetCallbacksProxy(
+    std::unique_ptr<IndexedDBCallbacksImpl> callbacks) {
+  mojom::blink::IDBCallbacksAssociatedPtrInfo ptr_info;
+  auto request = mojo::MakeRequest(&ptr_info);
+  mojo::MakeStrongAssociatedBinding(std::move(callbacks), std::move(request));
+  return ptr_info;
+}
+
+}  // namespace blink
diff --git a/content/renderer/indexed_db/webidbdatabase_impl.h b/third_party/blink/renderer/modules/indexeddb/web_idb_database_impl.h
similarity index 75%
rename from content/renderer/indexed_db/webidbdatabase_impl.h
rename to third_party/blink/renderer/modules/indexeddb/web_idb_database_impl.h
index d26e1de..8ef41986 100644
--- a/content/renderer/indexed_db/webidbdatabase_impl.h
+++ b/third_party/blink/renderer/modules/indexeddb/web_idb_database_impl.h
@@ -2,49 +2,43 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_RENDERER_INDEXED_DB_WEBIDBDATABASE_IMPL_H_
-#define CONTENT_RENDERER_INDEXED_DB_WEBIDBDATABASE_IMPL_H_
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_WEB_IDB_DATABASE_IMPL_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_WEB_IDB_DATABASE_IMPL_H_
 
 #include <stdint.h>
 
 #include <set>
 
-#include "base/memory/ref_counted.h"
 #include "base/single_thread_task_runner.h"
-#include "content/common/content_export.h"
 #include "third_party/blink/public/common/indexeddb/web_idb_types.h"
-#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_cursor.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_database.h"
+#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_cursor.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_database.h"
+#include "third_party/blink/renderer/modules/modules_export.h"
 
 namespace blink {
+class IndexedDBCallbacksImpl;
 class WebBlobInfo;
 class WebIDBCallbacks;
-class WebString;
-}  // namespace blink
 
-namespace content {
-
-class IndexedDBCallbacksImpl;
-
-class CONTENT_EXPORT WebIDBDatabaseImpl : public blink::WebIDBDatabase {
+class MODULES_EXPORT WebIDBDatabaseImpl : public blink::WebIDBDatabase {
  public:
-  WebIDBDatabaseImpl(blink::mojom::IDBDatabaseAssociatedPtrInfo database);
+  WebIDBDatabaseImpl(mojom::blink::IDBDatabaseAssociatedPtrInfo database);
   ~WebIDBDatabaseImpl() override;
 
   // blink::WebIDBDatabase
   void CreateObjectStore(long long transaction_id,
                          long long objectstore_id,
-                         const blink::WebString& name,
+                         const String& name,
                          const blink::WebIDBKeyPath&,
                          bool auto_increment) override;
   void DeleteObjectStore(long long transaction_id,
                          long long object_store_id) override;
   void RenameObjectStore(long long transaction_id,
                          long long object_store_id,
-                         const blink::WebString& new_name) override;
+                         const String& new_name) override;
   void CreateTransaction(long long transaction_id,
-                         const blink::WebVector<long long>& scope,
+                         const Vector<int64_t>& scope,
                          blink::WebIDBTransactionMode mode) override;
 
   void Close() override;
@@ -57,8 +51,7 @@
                    bool values,
                    const std::bitset<blink::kWebIDBOperationTypeCount>&
                        operation_types) override;
-  void RemoveObservers(
-      const blink::WebVector<int32_t>& observer_ids_to_remove) override;
+  void RemoveObservers(const Vector<int32_t>& observer_ids) override;
 
   void Get(long long transaction_id,
            long long object_store_id,
@@ -76,18 +69,18 @@
   void Put(long long transaction_id,
            long long object_store_id,
            const blink::WebData& value,
-           const blink::WebVector<blink::WebBlobInfo>&,
+           const Vector<blink::WebBlobInfo>&,
            blink::WebIDBKeyView primary_key,
            blink::WebIDBPutMode,
            blink::WebIDBCallbacks*,
-           const blink::WebVector<blink::WebIDBIndexKeys>&) override;
+           const Vector<blink::WebIDBIndexKeys>&) override;
   void SetIndexKeys(long long transaction_id,
                     long long object_store_id,
                     blink::WebIDBKeyView primary_key,
-                    const blink::WebVector<blink::WebIDBIndexKeys>&) override;
+                    const Vector<blink::WebIDBIndexKeys>&) override;
   void SetIndexesReady(long long transaction_id,
                        long long object_store_id,
-                       const blink::WebVector<long long>& index_ids) override;
+                       const Vector<int64_t>& index_ids) override;
   void OpenCursor(long long transaction_id,
                   long long object_store_id,
                   long long index_id,
@@ -115,7 +108,7 @@
   void CreateIndex(long long transaction_id,
                    long long object_store_id,
                    long long index_id,
-                   const blink::WebString& name,
+                   const String& name,
                    const blink::WebIDBKeyPath&,
                    bool unique,
                    bool multi_entry) override;
@@ -125,12 +118,12 @@
   void RenameIndex(long long transaction_id,
                    long long object_store_id,
                    long long index_id,
-                   const blink::WebString& new_name) override;
+                   const String& new_name) override;
   void Abort(long long transaction_id) override;
   void Commit(long long transaction_id) override;
 
  private:
-  blink::mojom::IDBCallbacksAssociatedPtrInfo GetCallbacksProxy(
+  mojom::blink::IDBCallbacksAssociatedPtrInfo GetCallbacksProxy(
       std::unique_ptr<IndexedDBCallbacksImpl> callbacks);
 
   FRIEND_TEST_ALL_PREFIXES(WebIDBDatabaseImplTest, ValueSizeTest);
@@ -141,12 +134,12 @@
   // Used by unit tests to exercise behavior without allocating huge chunks
   // of memory.
   size_t max_put_value_size_ =
-      blink::mojom::kIDBMaxMessageSize - blink::mojom::kIDBMaxMessageOverhead;
+      mojom::blink::kIDBMaxMessageSize - mojom::blink::kIDBMaxMessageOverhead;
 
   std::set<int32_t> observer_ids_;
-  blink::mojom::IDBDatabaseAssociatedPtr database_;
+  mojom::blink::IDBDatabaseAssociatedPtr database_;
 };
 
-}  // namespace content
+}  // namespace blink
 
-#endif  // CONTENT_RENDERER_INDEXED_DB_WEBIDBDATABASE_IMPL_H_
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_WEB_IDB_DATABASE_IMPL_H_
diff --git a/third_party/blink/renderer/modules/indexeddb/web_idb_database_impl_unittest.cc b/third_party/blink/renderer/modules/indexeddb/web_idb_database_impl_unittest.cc
new file mode 100644
index 0000000..a960ec6
--- /dev/null
+++ b/third_party/blink/renderer/modules/indexeddb/web_idb_database_impl_unittest.cc
@@ -0,0 +1,93 @@
+// 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 <stddef.h>
+#include <stdint.h>
+
+#include <memory>
+
+#include "base/macros.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/indexeddb/indexeddb_key.h"
+#include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h"
+#include "third_party/blink/public/platform/web_blob_info.h"
+#include "third_party/blink/public/platform/web_data.h"
+#include "third_party/blink/public/web/web_heap.h"
+#include "third_party/blink/renderer/modules/indexeddb/idb_key_range.h"
+#include "third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_database_impl.h"
+
+using testing::_;
+using testing::Invoke;
+using testing::StrictMock;
+using testing::WithArgs;
+
+namespace blink {
+
+class WebIDBDatabaseImplTest : public testing::Test {};
+
+TEST_F(WebIDBDatabaseImplTest, ValueSizeTest) {
+  // For testing use a much smaller maximum size to prevent allocating >100 MB
+  // of memory, which crashes on memory-constrained systems.
+  const size_t kMaxValueSizeForTesting = 10 * 1024 * 1024;  // 10 MB
+
+  const std::vector<char> data(kMaxValueSizeForTesting + 1);
+  const WebData value(&data.front(), data.size());
+  const Vector<WebBlobInfo> blob_info;
+  const WebIDBKey key = WebIDBKey::CreateNumber(0);
+  const int64_t transaction_id = 1;
+  const int64_t object_store_id = 2;
+  StrictMock<MockWebIDBCallbacks> callbacks;
+
+  ASSERT_GT(value.size() + key.SizeEstimate(), kMaxValueSizeForTesting);
+  ThreadState::Current()->CollectAllGarbage();
+  EXPECT_CALL(callbacks, OnError(_)).Times(1);
+
+  WebIDBDatabaseImpl database_impl(nullptr);
+  database_impl.max_put_value_size_ = kMaxValueSizeForTesting;
+  database_impl.Put(transaction_id, object_store_id, value, blob_info,
+                    key.View(), blink::kWebIDBPutModeAddOrUpdate, &callbacks,
+                    Vector<blink::WebIDBIndexKeys>());
+}
+
+TEST_F(WebIDBDatabaseImplTest, KeyAndValueSizeTest) {
+  // For testing use a much smaller maximum size to prevent allocating >100 MB
+  // of memory, which crashes on memory-constrained systems.
+  const size_t kMaxValueSizeForTesting = 10 * 1024 * 1024;  // 10 MB
+  const size_t kKeySize = 1024 * 1024;
+
+  const std::vector<char> data(kMaxValueSizeForTesting - kKeySize);
+  const WebData value(&data.front(), data.size());
+  const Vector<WebBlobInfo> blob_info;
+  const int64_t transaction_id = 1;
+  const int64_t object_store_id = 2;
+  StrictMock<MockWebIDBCallbacks> callbacks;
+
+  // For this test, we want IDBKey::SizeEstimate() minus kKeySize to be the
+  // smallest value > 0.  An IDBKey with a string has a size_estimate_ equal to
+  // kOverheadSize (~16) + (string.length * sizeof(UChar)).  Create
+  // |kKeySize / sizeof(UChar)| characters in String.
+  const unsigned int number_of_chars = kKeySize / sizeof(UChar);
+  Vector<UChar> key_string_vector;
+  key_string_vector.ReserveInitialCapacity(number_of_chars);
+  key_string_vector.Fill(u'0', number_of_chars);
+  String key_string(key_string_vector);
+  DCHECK_EQ(key_string.length(), number_of_chars);
+
+  WebIDBKey key = WebIDBKey::CreateString(key_string);
+  DCHECK_EQ(value.size(), kMaxValueSizeForTesting - kKeySize);
+  DCHECK_GT(key.SizeEstimate() - kKeySize, static_cast<unsigned long>(0));
+  DCHECK_GT(value.size() + key.SizeEstimate(), kMaxValueSizeForTesting);
+
+  ThreadState::Current()->CollectAllGarbage();
+  EXPECT_CALL(callbacks, OnError(_)).Times(1);
+
+  WebIDBDatabaseImpl database_impl(nullptr);
+  database_impl.max_put_value_size_ = kMaxValueSizeForTesting;
+  database_impl.Put(transaction_id, object_store_id, value, blob_info,
+                    key.View(), blink::kWebIDBPutModeAddOrUpdate, &callbacks,
+                    Vector<blink::WebIDBIndexKeys>());
+}
+
+}  // namespace blink
diff --git a/third_party/blink/public/platform/modules/indexeddb/web_idb_factory.h b/third_party/blink/renderer/modules/indexeddb/web_idb_factory.h
similarity index 89%
rename from third_party/blink/public/platform/modules/indexeddb/web_idb_factory.h
rename to third_party/blink/renderer/modules/indexeddb/web_idb_factory.h
index b99e5d8..71a2ce0 100644
--- a/third_party/blink/public/platform/modules/indexeddb/web_idb_factory.h
+++ b/third_party/blink/renderer/modules/indexeddb/web_idb_factory.h
@@ -26,11 +26,11 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_INDEXEDDB_WEB_IDB_FACTORY_H_
-#define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_INDEXEDDB_WEB_IDB_FACTORY_H_
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_WEB_IDB_FACTORY_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_WEB_IDB_FACTORY_H_
 
 #include "base/single_thread_task_runner.h"
-#include "third_party/blink/public/platform/web_common.h"
+#include "third_party/blink/renderer/modules/modules_export.h"
 
 namespace base {
 class SingleThreadTaskRunner;
@@ -43,7 +43,7 @@
 class WebSecurityOrigin;
 class WebString;
 
-class WebIDBFactory {
+class MODULES_EXPORT WebIDBFactory {
  public:
   virtual ~WebIDBFactory() = default;
 
@@ -70,4 +70,4 @@
 
 }  // namespace blink
 
-#endif  // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_INDEXEDDB_WEB_IDB_FACTORY_H_
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_WEB_IDB_FACTORY_H_
diff --git a/content/renderer/indexed_db/webidbfactory_impl.cc b/third_party/blink/renderer/modules/indexeddb/web_idb_factory_impl.cc
similarity index 71%
rename from content/renderer/indexed_db/webidbfactory_impl.cc
rename to third_party/blink/renderer/modules/indexeddb/web_idb_factory_impl.cc
index 62682a0..f158e08 100644
--- a/content/renderer/indexed_db/webidbfactory_impl.cc
+++ b/third_party/blink/renderer/modules/indexeddb/web_idb_factory_impl.cc
@@ -2,29 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/renderer/indexed_db/webidbfactory_impl.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_factory_impl.h"
 
 #include "base/memory/ptr_util.h"
-#include "content/renderer/indexed_db/indexed_db_callbacks_impl.h"
-#include "content/renderer/indexed_db/indexed_db_database_callbacks_impl.h"
-#include "content/renderer/storage_util.h"
-#include "ipc/ipc_sync_channel.h"
 #include "mojo/public/cpp/bindings/strong_associated_binding.h"
 #include "third_party/blink/public/platform/web_security_origin.h"
 #include "third_party/blink/public/platform/web_string.h"
+#include "third_party/blink/renderer/modules/indexeddb/indexed_db_callbacks_impl.h"
+#include "third_party/blink/renderer/modules/indexeddb/indexed_db_database_callbacks_impl.h"
 
-using blink::WebIDBCallbacks;
-using blink::WebIDBDatabase;
-using blink::WebIDBDatabaseCallbacks;
-using blink::WebSecurityOrigin;
-using blink::WebString;
-using blink::mojom::IDBCallbacksAssociatedPtrInfo;
-using blink::mojom::IDBDatabaseCallbacksAssociatedPtrInfo;
-using blink::mojom::IDBFactoryPtrInfo;
+namespace blink {
 
-namespace content {
-
-WebIDBFactoryImpl::WebIDBFactoryImpl(IDBFactoryPtrInfo factory_info)
+WebIDBFactoryImpl::WebIDBFactoryImpl(
+    mojom::blink::IDBFactoryPtrInfo factory_info)
     : factory_(std::move(factory_info)) {}
 
 WebIDBFactoryImpl::~WebIDBFactoryImpl() = default;
@@ -37,7 +27,7 @@
       base::WrapUnique(callbacks), IndexedDBCallbacksImpl::kNoTransaction,
       nullptr);
   factory_->GetDatabaseInfo(GetCallbacksProxy(std::move(callbacks_impl)),
-                            url::Origin(origin));
+                            origin);
 }
 
 void WebIDBFactoryImpl::GetDatabaseNames(
@@ -48,7 +38,7 @@
       base::WrapUnique(callbacks), IndexedDBCallbacksImpl::kNoTransaction,
       nullptr);
   factory_->GetDatabaseNames(GetCallbacksProxy(std::move(callbacks_impl)),
-                             url::Origin(origin));
+                             origin);
 }
 
 void WebIDBFactoryImpl::Open(
@@ -64,9 +54,10 @@
   auto database_callbacks_impl =
       std::make_unique<IndexedDBDatabaseCallbacksImpl>(
           base::WrapUnique(database_callbacks));
+  DCHECK(!name.IsNull());
   factory_->Open(GetCallbacksProxy(std::move(callbacks_impl)),
                  GetDatabaseCallbacksProxy(std::move(database_callbacks_impl)),
-                 url::Origin(origin), name.Utf16(), version, transaction_id);
+                 origin, name, version, transaction_id);
 }
 
 void WebIDBFactoryImpl::DeleteDatabase(
@@ -78,25 +69,27 @@
   auto callbacks_impl = std::make_unique<IndexedDBCallbacksImpl>(
       base::WrapUnique(callbacks), IndexedDBCallbacksImpl::kNoTransaction,
       nullptr);
-  factory_->DeleteDatabase(GetCallbacksProxy(std::move(callbacks_impl)),
-                           url::Origin(origin), name.Utf16(), force_close);
+  DCHECK(!name.IsNull());
+  factory_->DeleteDatabase(GetCallbacksProxy(std::move(callbacks_impl)), origin,
+                           name, force_close);
 }
 
-IDBCallbacksAssociatedPtrInfo WebIDBFactoryImpl::GetCallbacksProxy(
+mojom::blink::IDBCallbacksAssociatedPtrInfo
+WebIDBFactoryImpl::GetCallbacksProxy(
     std::unique_ptr<IndexedDBCallbacksImpl> callbacks) {
-  IDBCallbacksAssociatedPtrInfo ptr_info;
+  mojom::blink::IDBCallbacksAssociatedPtrInfo ptr_info;
   auto request = mojo::MakeRequest(&ptr_info);
   mojo::MakeStrongAssociatedBinding(std::move(callbacks), std::move(request));
   return ptr_info;
 }
 
-IDBDatabaseCallbacksAssociatedPtrInfo
+mojom::blink::IDBDatabaseCallbacksAssociatedPtrInfo
 WebIDBFactoryImpl::GetDatabaseCallbacksProxy(
     std::unique_ptr<IndexedDBDatabaseCallbacksImpl> callbacks) {
-  IDBDatabaseCallbacksAssociatedPtrInfo ptr_info;
+  mojom::blink::IDBDatabaseCallbacksAssociatedPtrInfo ptr_info;
   auto request = mojo::MakeRequest(&ptr_info);
   mojo::MakeStrongAssociatedBinding(std::move(callbacks), std::move(request));
   return ptr_info;
 }
 
-}  // namespace content
+}  // namespace blink
diff --git a/content/renderer/indexed_db/webidbfactory_impl.h b/third_party/blink/renderer/modules/indexeddb/web_idb_factory_impl.h
similarity index 63%
rename from content/renderer/indexed_db/webidbfactory_impl.h
rename to third_party/blink/renderer/modules/indexeddb/web_idb_factory_impl.h
index 619ea19..dbc69d8 100644
--- a/content/renderer/indexed_db/webidbfactory_impl.h
+++ b/third_party/blink/renderer/modules/indexeddb/web_idb_factory_impl.h
@@ -2,28 +2,24 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_RENDERER_INDEXED_DB_WEBIDBFACTORY_IMPL_H_
-#define CONTENT_RENDERER_INDEXED_DB_WEBIDBFACTORY_IMPL_H_
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_WEB_IDB_FACTORY_IMPL_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_WEB_IDB_FACTORY_IMPL_H_
 
-#include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
-#include "content/renderer/indexed_db/indexed_db_callbacks_impl.h"
-#include "content/renderer/indexed_db/indexed_db_database_callbacks_impl.h"
-#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom.h"
+#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_callbacks.h"
 #include "third_party/blink/public/platform/modules/indexeddb/web_idb_database_callbacks.h"
-#include "third_party/blink/public/platform/modules/indexeddb/web_idb_factory.h"
+#include "third_party/blink/renderer/modules/indexeddb/idb_key_range.h"
+#include "third_party/blink/renderer/modules/indexeddb/indexed_db_callbacks_impl.h"
+#include "third_party/blink/renderer/modules/indexeddb/indexed_db_database_callbacks_impl.h"
+#include "third_party/blink/renderer/modules/indexeddb/web_idb_factory.h"
 
 namespace blink {
 class WebSecurityOrigin;
 class WebString;
-}  // namespace blink
-
-namespace content {
 
 class WebIDBFactoryImpl : public blink::WebIDBFactory {
  public:
-  explicit WebIDBFactoryImpl(blink::mojom::IDBFactoryPtrInfo factory_info);
+  explicit WebIDBFactoryImpl(mojom::blink::IDBFactoryPtrInfo factory_info);
   ~WebIDBFactoryImpl() override;
 
   // See WebIDBFactory.h for documentation on these functions.
@@ -50,14 +46,14 @@
       scoped_refptr<base::SingleThreadTaskRunner> task_runner) override;
 
  private:
-  blink::mojom::IDBCallbacksAssociatedPtrInfo GetCallbacksProxy(
-      std::unique_ptr<IndexedDBCallbacksImpl> callbacks);
-  blink::mojom::IDBDatabaseCallbacksAssociatedPtrInfo GetDatabaseCallbacksProxy(
-      std::unique_ptr<IndexedDBDatabaseCallbacksImpl> callbacks);
+  mojom::blink::IDBCallbacksAssociatedPtrInfo GetCallbacksProxy(
+      std::unique_ptr<blink::IndexedDBCallbacksImpl> callbacks);
+  mojom::blink::IDBDatabaseCallbacksAssociatedPtrInfo GetDatabaseCallbacksProxy(
+      std::unique_ptr<blink::IndexedDBDatabaseCallbacksImpl> callbacks);
 
-  blink::mojom::IDBFactoryPtr factory_;
+  mojom::blink::IDBFactoryPtr factory_;
 };
 
-}  // namespace content
+}  // namespace blink
 
-#endif  // CONTENT_RENDERER_INDEXED_DB_WEBIDBFACTORY_IMPL_H_
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_WEB_IDB_FACTORY_IMPL_H_
diff --git a/third_party/blink/renderer/platform/mojo/blink_typemaps.gni b/third_party/blink/renderer/platform/mojo/blink_typemaps.gni
index 5461003..c7fab1a5 100644
--- a/third_party/blink/renderer/platform/mojo/blink_typemaps.gni
+++ b/third_party/blink/renderer/platform/mojo/blink_typemaps.gni
@@ -10,6 +10,7 @@
   "//mojo/public/cpp/base/unguessable_token.typemap",
   "//third_party/blink/renderer/core/messaging/blink_cloneable_message.typemap",
   "//third_party/blink/renderer/core/messaging/blink_transferable_message.typemap",
+  "//third_party/blink/renderer/modules/indexeddb/indexed_db_blink.typemap",
   "//third_party/blink/renderer/platform/blob/serialized_blob.typemap",
   "//third_party/blink/renderer/platform/mojo/big_buffer.typemap",
   "//third_party/blink/renderer/platform/mojo/big_string.typemap",
diff --git a/third_party/blink/renderer/platform/testing/testing_platform_support.cc b/third_party/blink/renderer/platform/testing/testing_platform_support.cc
index a9d9b23b..f44a0dc 100644
--- a/third_party/blink/renderer/platform/testing/testing_platform_support.cc
+++ b/third_party/blink/renderer/platform/testing/testing_platform_support.cc
@@ -110,10 +110,6 @@
   return old_platform_ ? old_platform_->GetBlobRegistry() : nullptr;
 }
 
-std::unique_ptr<WebIDBFactory> TestingPlatformSupport::CreateIdbFactory() {
-  return old_platform_ ? old_platform_->CreateIdbFactory() : nullptr;
-}
-
 WebURLLoaderMockFactory* TestingPlatformSupport::GetURLLoaderMockFactory() {
   return old_platform_ ? old_platform_->GetURLLoaderMockFactory() : nullptr;
 }
diff --git a/third_party/blink/renderer/platform/testing/testing_platform_support.h b/third_party/blink/renderer/platform/testing/testing_platform_support.h
index 87cfa93..38bf520 100644
--- a/third_party/blink/renderer/platform/testing/testing_platform_support.h
+++ b/third_party/blink/renderer/platform/testing/testing_platform_support.h
@@ -61,7 +61,6 @@
   // Platform:
   WebString DefaultLocale() override;
   WebBlobRegistry* GetBlobRegistry() override;
-  std::unique_ptr<WebIDBFactory> CreateIdbFactory() override;
   WebURLLoaderMockFactory* GetURLLoaderMockFactory() override;
   std::unique_ptr<blink::WebURLLoaderFactory> CreateDefaultURLLoaderFactory()
       override;