summaryrefslogtreecommitdiffstats
path: root/content/child/indexed_db/indexed_db_dispatcher.h
diff options
context:
space:
mode:
Diffstat (limited to 'content/child/indexed_db/indexed_db_dispatcher.h')
-rw-r--r--content/child/indexed_db/indexed_db_dispatcher.h241
1 files changed, 241 insertions, 0 deletions
diff --git a/content/child/indexed_db/indexed_db_dispatcher.h b/content/child/indexed_db/indexed_db_dispatcher.h
new file mode 100644
index 0000000..f8b2102
--- /dev/null
+++ b/content/child/indexed_db/indexed_db_dispatcher.h
@@ -0,0 +1,241 @@
+// 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_CHILD_INDEXED_DB_INDEXED_DB_DISPATCHER_H_
+#define CONTENT_CHILD_INDEXED_DB_INDEXED_DB_DISPATCHER_H_
+
+#include <map>
+#include <vector>
+
+#include "base/gtest_prod_util.h"
+#include "base/id_map.h"
+#include "base/nullable_string16.h"
+#include "content/common/content_export.h"
+#include "ipc/ipc_sync_message_filter.h"
+#include "third_party/WebKit/public/platform/WebIDBCallbacks.h"
+#include "third_party/WebKit/public/platform/WebIDBCursor.h"
+#include "third_party/WebKit/public/platform/WebIDBDatabase.h"
+#include "third_party/WebKit/public/platform/WebIDBDatabaseCallbacks.h"
+#include "webkit/glue/worker_task_runner.h"
+
+struct IndexedDBDatabaseMetadata;
+struct IndexedDBMsg_CallbacksSuccessCursorContinue_Params;
+struct IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params;
+struct IndexedDBMsg_CallbacksSuccessIDBCursor_Params;
+struct IndexedDBMsg_CallbacksUpgradeNeeded_Params;
+
+namespace WebKit {
+class WebData;
+}
+
+namespace content {
+class IndexedDBKey;
+class IndexedDBKeyPath;
+class IndexedDBKeyRange;
+class RendererWebIDBCursorImpl;
+class RendererWebIDBDatabaseImpl;
+
+CONTENT_EXPORT extern const size_t kMaxIDBValueSizeInBytes;
+
+// 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 webkit_glue::WorkerTaskRunner::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();
+ virtual ~IndexedDBDispatcher();
+ static IndexedDBDispatcher* ThreadSpecificInstance();
+
+ // webkit_glue::WorkerTaskRunner::Observer implementation.
+ virtual void OnWorkerRunLoopStopped() OVERRIDE;
+
+ static WebKit::WebIDBMetadata ConvertMetadata(
+ const IndexedDBDatabaseMetadata& idb_metadata);
+
+ void OnMessageReceived(const IPC::Message& msg);
+ static bool Send(IPC::Message* msg);
+
+ void RequestIDBFactoryGetDatabaseNames(WebKit::WebIDBCallbacks* callbacks,
+ const string16& database_identifier);
+
+ void RequestIDBFactoryOpen(
+ const string16& name,
+ int64 version,
+ int64 transaction_id,
+ WebKit::WebIDBCallbacks* callbacks,
+ WebKit::WebIDBDatabaseCallbacks* database_callbacks,
+ const string16& database_identifier);
+
+ void RequestIDBFactoryDeleteDatabase(const string16& name,
+ WebKit::WebIDBCallbacks* callbacks,
+ const string16& database_identifier);
+
+ void RequestIDBCursorAdvance(unsigned long count,
+ WebKit::WebIDBCallbacks* callbacks_ptr,
+ int32 ipc_cursor_id);
+
+ virtual void RequestIDBCursorContinue(const IndexedDBKey& key,
+ WebKit::WebIDBCallbacks* callbacks_ptr,
+ int32 ipc_cursor_id);
+
+ virtual void RequestIDBCursorPrefetch(int n,
+ WebKit::WebIDBCallbacks* callbacks_ptr,
+ int32 ipc_cursor_id);
+
+ void RequestIDBCursorPrefetchReset(int used_prefetches,
+ int unused_prefetches,
+ int32 ipc_cursor_id);
+
+ void RequestIDBDatabaseClose(int32 ipc_database_id,
+ int32 ipc_database_callbacks_id);
+
+ void RequestIDBDatabaseCreateTransaction(
+ int32 ipc_database_id,
+ int64 transaction_id,
+ WebKit::WebIDBDatabaseCallbacks* database_callbacks_ptr,
+ WebKit::WebVector<long long> object_store_ids,
+ unsigned short mode);
+
+ void RequestIDBDatabaseGet(int32 ipc_database_id,
+ int64 transaction_id,
+ int64 object_store_id,
+ int64 index_id,
+ const IndexedDBKeyRange& key_range,
+ bool key_only,
+ WebKit::WebIDBCallbacks* callbacks);
+
+ void RequestIDBDatabasePut(
+ int32 ipc_database_id,
+ int64 transaction_id,
+ int64 object_store_id,
+ const WebKit::WebData& value,
+ const IndexedDBKey& key,
+ WebKit::WebIDBDatabase::PutMode put_mode,
+ WebKit::WebIDBCallbacks* callbacks,
+ const WebKit::WebVector<long long>& index_ids,
+ const WebKit::WebVector<WebKit::WebVector<WebKit::WebIDBKey> >&
+ index_keys);
+
+ void RequestIDBDatabaseOpenCursor(int32 ipc_database_id,
+ int64 transaction_id,
+ int64 object_store_id,
+ int64 index_id,
+ const IndexedDBKeyRange& key_range,
+ unsigned short direction,
+ bool key_only,
+ WebKit::WebIDBDatabase::TaskType task_type,
+ WebKit::WebIDBCallbacks* callbacks);
+
+ void RequestIDBDatabaseCount(int32 ipc_database_id,
+ int64 transaction_id,
+ int64 object_store_id,
+ int64 index_id,
+ const IndexedDBKeyRange& key_range,
+ WebKit::WebIDBCallbacks* callbacks);
+
+ void RequestIDBDatabaseDeleteRange(int32 ipc_database_id,
+ int64 transaction_id,
+ int64 object_store_id,
+ const IndexedDBKeyRange& key_range,
+ WebKit::WebIDBCallbacks* callbacks);
+
+ void RequestIDBDatabaseClear(int32 ipc_database_id,
+ int64 transaction_id,
+ int64 object_store_id,
+ WebKit::WebIDBCallbacks* callbacks);
+
+ virtual void CursorDestroyed(int32 ipc_cursor_id);
+ void DatabaseDestroyed(int32 ipc_database_id);
+
+ private:
+ FRIEND_TEST_ALL_PREFIXES(IndexedDBDispatcherTest, ValueSizeTest);
+
+ static int32 CurrentWorkerId() {
+ return webkit_glue::WorkerTaskRunner::Instance()->CurrentWorkerId();
+ }
+
+ template <typename T>
+ void init_params(T& params, WebKit::WebIDBCallbacks* callbacks_ptr) {
+ scoped_ptr<WebKit::WebIDBCallbacks> callbacks(callbacks_ptr);
+ params.ipc_thread_id = CurrentWorkerId();
+ params.ipc_callbacks_id = pending_callbacks_.Add(callbacks.release());
+ }
+
+ // IDBCallback message handlers.
+ void OnSuccessIDBDatabase(int32 ipc_thread_id,
+ int32 ipc_callbacks_id,
+ int32 ipc_database_callbacks_id,
+ int32 ipc_object_id,
+ const IndexedDBDatabaseMetadata& idb_metadata);
+ void OnSuccessIndexedDBKey(int32 ipc_thread_id,
+ int32 ipc_callbacks_id,
+ const IndexedDBKey& key);
+
+ void OnSuccessOpenCursor(
+ const IndexedDBMsg_CallbacksSuccessIDBCursor_Params& p);
+ void OnSuccessCursorContinue(
+ const IndexedDBMsg_CallbacksSuccessCursorContinue_Params& p);
+ void OnSuccessCursorPrefetch(
+ const IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params& p);
+ void OnSuccessStringList(int32 ipc_thread_id,
+ int32 ipc_callbacks_id,
+ const std::vector<string16>& value);
+ void OnSuccessValue(int32 ipc_thread_id,
+ int32 ipc_callbacks_id,
+ const std::vector<char>& value);
+ void OnSuccessValueWithKey(int32 ipc_thread_id,
+ int32 ipc_callbacks_id,
+ const std::vector<char>& value,
+ const IndexedDBKey& primary_key,
+ const IndexedDBKeyPath& key_path);
+ void OnSuccessInteger(int32 ipc_thread_id,
+ int32 ipc_callbacks_id,
+ int64 value);
+ void OnSuccessUndefined(int32 ipc_thread_id, int32 ipc_callbacks_id);
+ void OnError(int32 ipc_thread_id,
+ int32 ipc_callbacks_id,
+ int code,
+ const string16& message);
+ void OnIntBlocked(int32 ipc_thread_id,
+ int32 ipc_callbacks_id,
+ int64 existing_version);
+ void OnUpgradeNeeded(const IndexedDBMsg_CallbacksUpgradeNeeded_Params& p);
+ void OnAbort(int32 ipc_thread_id,
+ int32 ipc_database_id,
+ int64 transaction_id,
+ int code,
+ const string16& message);
+ void OnComplete(int32 ipc_thread_id,
+ int32 ipc_database_id,
+ int64 transaction_id);
+ void OnForcedClose(int32 ipc_thread_id, int32 ipc_database_id);
+ void OnIntVersionChange(int32 ipc_thread_id,
+ int32 ipc_database_id,
+ int64 old_version,
+ int64 new_version);
+
+ // Reset cursor prefetch caches for all cursors except exception_cursor_id.
+ void ResetCursorPrefetchCaches(int32 ipc_exception_cursor_id = -1);
+
+ // Careful! WebIDBCallbacks wraps non-threadsafe data types. It must be
+ // destroyed and used on the same thread it was created on.
+ IDMap<WebKit::WebIDBCallbacks, IDMapOwnPointer> pending_callbacks_;
+ IDMap<WebKit::WebIDBDatabaseCallbacks, IDMapOwnPointer>
+ pending_database_callbacks_;
+
+ // Map from cursor id to RendererWebIDBCursorImpl.
+ std::map<int32, RendererWebIDBCursorImpl*> cursors_;
+
+ std::map<int32, RendererWebIDBDatabaseImpl*> databases_;
+
+ DISALLOW_COPY_AND_ASSIGN(IndexedDBDispatcher);
+};
+
+} // namespace content
+
+#endif // CONTENT_CHILD_INDEXED_DB_INDEXED_DB_DISPATCHER_H_