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

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

Issue 2500263003: Port messages sent by WebIDBCursorImpl to Mojo. (Closed)
Patch Set: Address dcheng@'s comments. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/child/indexed_db/indexed_db_dispatcher.cc
diff --git a/content/child/indexed_db/indexed_db_dispatcher.cc b/content/child/indexed_db/indexed_db_dispatcher.cc
index aafd24419d65f749c47d08f81e01134920406d48..4189fdfed76e851e98dd279bc78241449d02b03e 100644
--- a/content/child/indexed_db/indexed_db_dispatcher.cc
+++ b/content/child/indexed_db/indexed_db_dispatcher.cc
@@ -6,36 +6,18 @@
#include <utility>
-#include "base/format_macros.h"
#include "base/lazy_instance.h"
-#include "base/strings/stringprintf.h"
#include "base/threading/thread_local.h"
#include "content/child/indexed_db/indexed_db_key_builders.h"
#include "content/child/indexed_db/webidbcursor_impl.h"
-#include "content/child/indexed_db/webidbdatabase_impl.h"
-#include "content/child/thread_safe_sender.h"
#include "content/common/indexed_db/indexed_db_messages.h"
#include "ipc/ipc_channel.h"
#include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBDatabaseCallbacks.h"
-#include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBDatabaseError.h"
-#include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBDatabaseException.h"
#include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBObservation.h"
-#include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBValue.h"
-using blink::WebBlobInfo;
-using blink::WebData;
-using blink::WebIDBCallbacks;
-using blink::WebIDBCursor;
-using blink::WebIDBDatabase;
-using blink::WebIDBDatabaseCallbacks;
-using blink::WebIDBDatabaseError;
using blink::WebIDBKey;
-using blink::WebIDBMetadata;
using blink::WebIDBObservation;
using blink::WebIDBObserver;
-using blink::WebIDBValue;
-using blink::WebString;
-using blink::WebVector;
using base::ThreadLocalPointer;
namespace content {
@@ -49,23 +31,15 @@ IndexedDBDispatcher* const kHasBeenDeleted =
} // unnamed namespace
-IndexedDBDispatcher::IndexedDBDispatcher(ThreadSafeSender* thread_safe_sender)
- : thread_safe_sender_(thread_safe_sender) {
+IndexedDBDispatcher::IndexedDBDispatcher() {
g_idb_dispatcher_tls.Pointer()->Set(this);
}
IndexedDBDispatcher::~IndexedDBDispatcher() {
- // Clear any pending callbacks - which may result in dispatch requests -
- // before marking the dispatcher as deleted.
- pending_callbacks_.Clear();
-
- DCHECK(pending_callbacks_.IsEmpty());
-
g_idb_dispatcher_tls.Pointer()->Set(kHasBeenDeleted);
}
-IndexedDBDispatcher* IndexedDBDispatcher::ThreadSpecificInstance(
- ThreadSafeSender* thread_safe_sender) {
+IndexedDBDispatcher* IndexedDBDispatcher::ThreadSpecificInstance() {
if (g_idb_dispatcher_tls.Pointer()->Get() == kHasBeenDeleted) {
NOTREACHED() << "Re-instantiating TLS IndexedDBDispatcher.";
g_idb_dispatcher_tls.Pointer()->Set(NULL);
@@ -73,7 +47,7 @@ IndexedDBDispatcher* IndexedDBDispatcher::ThreadSpecificInstance(
if (g_idb_dispatcher_tls.Pointer()->Get())
return g_idb_dispatcher_tls.Pointer()->Get();
- IndexedDBDispatcher* dispatcher = new IndexedDBDispatcher(thread_safe_sender);
+ IndexedDBDispatcher* dispatcher = new IndexedDBDispatcher();
if (WorkerThread::GetCurrentId())
WorkerThread::AddObserver(dispatcher);
return dispatcher;
@@ -101,15 +75,6 @@ std::vector<WebIDBObservation> IndexedDBDispatcher::ConvertObservations(
void IndexedDBDispatcher::OnMessageReceived(const IPC::Message& msg) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(IndexedDBDispatcher, msg)
- IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorAdvance,
- OnSuccessCursorContinue)
- IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorContinue,
- OnSuccessCursorContinue)
- IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorPrefetch,
- OnSuccessCursorPrefetch)
- IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessValue, OnSuccessValue)
- IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessInteger, OnSuccessInteger)
- IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksError, OnError)
IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksChanges,
OnDatabaseChanges)
IPC_MESSAGE_UNHANDLED(handled = false)
@@ -120,10 +85,6 @@ void IndexedDBDispatcher::OnMessageReceived(const IPC::Message& msg) {
<< IPC_MESSAGE_ID_LINE(msg.type());
}
-bool IndexedDBDispatcher::Send(IPC::Message* msg) {
- return thread_safe_sender_->Send(msg);
-}
-
int32_t IndexedDBDispatcher::RegisterObserver(
std::unique_ptr<WebIDBObserver> observer) {
return observers_.Add(observer.release());
@@ -135,65 +96,6 @@ void IndexedDBDispatcher::RemoveObservers(
observers_.Remove(id);
}
-void IndexedDBDispatcher::RequestIDBCursorAdvance(
- unsigned long count,
- WebIDBCallbacks* callbacks_ptr,
- int32_t ipc_cursor_id,
- int64_t transaction_id) {
- // Reset all cursor prefetch caches except for this cursor.
- ResetCursorPrefetchCaches(transaction_id, ipc_cursor_id);
-
- std::unique_ptr<WebIDBCallbacks> callbacks(callbacks_ptr);
-
- int32_t ipc_callbacks_id = pending_callbacks_.Add(callbacks.release());
- Send(new IndexedDBHostMsg_CursorAdvance(
- ipc_cursor_id, CurrentWorkerId(), ipc_callbacks_id, count));
-}
-
-void IndexedDBDispatcher::RequestIDBCursorContinue(
- const IndexedDBKey& key,
- const IndexedDBKey& primary_key,
- WebIDBCallbacks* callbacks_ptr,
- int32_t ipc_cursor_id,
- int64_t transaction_id) {
- // Reset all cursor prefetch caches except for this cursor.
- ResetCursorPrefetchCaches(transaction_id, ipc_cursor_id);
-
- std::unique_ptr<WebIDBCallbacks> callbacks(callbacks_ptr);
-
- int32_t ipc_callbacks_id = pending_callbacks_.Add(callbacks.release());
- Send(new IndexedDBHostMsg_CursorContinue(
- ipc_cursor_id, CurrentWorkerId(), ipc_callbacks_id, key, primary_key));
-}
-
-void IndexedDBDispatcher::RequestIDBCursorPrefetch(
- int n,
- WebIDBCallbacks* callbacks_ptr,
- int32_t ipc_cursor_id) {
- std::unique_ptr<WebIDBCallbacks> callbacks(callbacks_ptr);
-
- int32_t ipc_callbacks_id = pending_callbacks_.Add(callbacks.release());
- Send(new IndexedDBHostMsg_CursorPrefetch(
- ipc_cursor_id, CurrentWorkerId(), ipc_callbacks_id, n));
-}
-
-void IndexedDBDispatcher::RequestIDBCursorPrefetchReset(int used_prefetches,
- int unused_prefetches,
- int32_t ipc_cursor_id) {
- Send(new IndexedDBHostMsg_CursorPrefetchReset(
- ipc_cursor_id, used_prefetches, unused_prefetches));
-}
-
-void IndexedDBDispatcher::RegisterCursor(int32_t ipc_cursor_id,
- WebIDBCursorImpl* cursor) {
- DCHECK(!base::ContainsKey(cursors_, ipc_cursor_id));
- cursors_[ipc_cursor_id] = cursor;
-}
-
-void IndexedDBDispatcher::CursorDestroyed(int32_t ipc_cursor_id) {
- cursors_.erase(ipc_cursor_id);
-}
-
void IndexedDBDispatcher::RegisterMojoOwnedCallbacks(
IndexedDBCallbacksImpl::InternalState* callbacks) {
mojo_owned_callback_state_.insert(callbacks);
@@ -216,125 +118,6 @@ void IndexedDBDispatcher::UnregisterMojoOwnedDatabaseCallbacks(
mojo_owned_database_callback_state_.erase(callbacks);
}
-// Populate some WebIDBValue members (data & blob info) from the supplied
-// value message (IndexedDBMsg_Value or one that includes it).
-template <class IndexedDBMsgValueType>
-static void PrepareWebValue(const IndexedDBMsgValueType& value,
- WebIDBValue* web_value) {
- if (value.bits.empty())
- return;
-
- web_value->data.assign(&*value.bits.begin(), value.bits.size());
- blink::WebVector<WebBlobInfo> local_blob_info(value.blob_or_file_info.size());
- for (size_t i = 0; i < value.blob_or_file_info.size(); ++i) {
- const IndexedDBMsg_BlobOrFileInfo& info = value.blob_or_file_info[i];
- if (info.is_file) {
- local_blob_info[i] = WebBlobInfo(
- WebString::fromUTF8(info.uuid.c_str()), info.file_path,
- info.file_name, info.mime_type, info.last_modified, info.size);
- } else {
- local_blob_info[i] = WebBlobInfo(WebString::fromUTF8(info.uuid.c_str()),
- info.mime_type, info.size);
- }
- }
-
- web_value->webBlobInfo.swap(local_blob_info);
-}
-
-static void PrepareReturnWebValue(const IndexedDBMsg_ReturnValue& value,
- WebIDBValue* web_value) {
- PrepareWebValue(value, web_value);
- web_value->primaryKey = WebIDBKeyBuilder::Build(value.primary_key);
- web_value->keyPath = WebIDBKeyPathBuilder::Build(value.key_path);
-}
-
-void IndexedDBDispatcher::OnSuccessValue(
- const IndexedDBMsg_CallbacksSuccessValue_Params& params) {
- DCHECK_EQ(params.ipc_thread_id, CurrentWorkerId());
- WebIDBCallbacks* callbacks =
- pending_callbacks_.Lookup(params.ipc_callbacks_id);
- if (!callbacks)
- return;
- WebIDBValue web_value;
- PrepareReturnWebValue(params.value, &web_value);
- if (params.value.primary_key.IsValid()) {
- web_value.primaryKey = WebIDBKeyBuilder::Build(params.value.primary_key);
- web_value.keyPath = WebIDBKeyPathBuilder::Build(params.value.key_path);
- }
- callbacks->onSuccess(web_value);
- pending_callbacks_.Remove(params.ipc_callbacks_id);
-}
-
-void IndexedDBDispatcher::OnSuccessInteger(int32_t ipc_thread_id,
- int32_t ipc_callbacks_id,
- int64_t value) {
- DCHECK_EQ(ipc_thread_id, CurrentWorkerId());
- WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id);
- if (!callbacks)
- return;
- callbacks->onSuccess(value);
- pending_callbacks_.Remove(ipc_callbacks_id);
-}
-
-void IndexedDBDispatcher::OnSuccessCursorContinue(
- const IndexedDBMsg_CallbacksSuccessCursorContinue_Params& p) {
- DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId());
- int32_t ipc_callbacks_id = p.ipc_callbacks_id;
- int32_t ipc_cursor_id = p.ipc_cursor_id;
- const IndexedDBKey& key = p.key;
- const IndexedDBKey& primary_key = p.primary_key;
-
- if (cursors_.find(ipc_cursor_id) == cursors_.end())
- return;
-
- WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id);
- if (!callbacks)
- return;
-
- WebIDBValue web_value;
- PrepareWebValue(p.value, &web_value);
- callbacks->onSuccess(WebIDBKeyBuilder::Build(key),
- WebIDBKeyBuilder::Build(primary_key), web_value);
-
- pending_callbacks_.Remove(ipc_callbacks_id);
-}
-
-void IndexedDBDispatcher::OnSuccessCursorPrefetch(
- const IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params& p) {
- DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId());
- int32_t ipc_callbacks_id = p.ipc_callbacks_id;
- int32_t ipc_cursor_id = p.ipc_cursor_id;
- std::vector<WebIDBValue> values(p.values.size());
- for (size_t i = 0; i < p.values.size(); ++i)
- PrepareWebValue(p.values[i], &values[i]);
- std::map<int32_t, WebIDBCursorImpl*>::const_iterator cur_iter =
- cursors_.find(ipc_cursor_id);
- if (cur_iter == cursors_.end())
- return;
-
- cur_iter->second->SetPrefetchData(p.keys, p.primary_keys, values);
-
- WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id);
- DCHECK(callbacks);
- cur_iter->second->CachedContinue(callbacks);
- pending_callbacks_.Remove(ipc_callbacks_id);
-}
-
-void IndexedDBDispatcher::OnError(int32_t ipc_thread_id,
- int32_t ipc_callbacks_id,
- int code,
- const base::string16& message) {
- DCHECK_EQ(ipc_thread_id, CurrentWorkerId());
- WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id);
- if (!callbacks)
- return;
- if (message.empty())
- callbacks->onError(WebIDBDatabaseError(code));
- else
- callbacks->onError(WebIDBDatabaseError(code, message));
- pending_callbacks_.Remove(ipc_callbacks_id);
-}
-
void IndexedDBDispatcher::OnDatabaseChanges(
int32_t ipc_thread_id,
const IndexedDBMsg_ObserverChanges& changes) {
@@ -352,15 +135,23 @@ void IndexedDBDispatcher::OnDatabaseChanges(
}
}
+void IndexedDBDispatcher::RegisterCursor(WebIDBCursorImpl* cursor) {
+ DCHECK(!base::ContainsValue(cursors_, cursor));
+ cursors_.insert(cursor);
+}
+
+void IndexedDBDispatcher::UnregisterCursor(WebIDBCursorImpl* cursor) {
+ DCHECK(base::ContainsValue(cursors_, cursor));
+ cursors_.erase(cursor);
+}
+
void IndexedDBDispatcher::ResetCursorPrefetchCaches(
int64_t transaction_id,
- int32_t ipc_exception_cursor_id) {
- typedef std::map<int32_t, WebIDBCursorImpl*>::iterator Iterator;
- for (Iterator i = cursors_.begin(); i != cursors_.end(); ++i) {
- if (i->first == ipc_exception_cursor_id ||
- i->second->transaction_id() != transaction_id)
- continue;
- i->second->ResetPrefetchCache();
+ WebIDBCursorImpl* exception_cursor) {
+ for (WebIDBCursorImpl* cursor : cursors_) {
+ if (cursor != exception_cursor &&
+ cursor->transaction_id() == transaction_id)
+ cursor->ResetPrefetchCache();
}
}
« no previous file with comments | « content/child/indexed_db/indexed_db_dispatcher.h ('k') | content/child/indexed_db/indexed_db_message_filter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698