Index: content/renderer/indexed_db_dispatcher.h |
diff --git a/content/renderer/indexed_db_dispatcher.h b/content/renderer/indexed_db_dispatcher.h |
index d2b3f1aa95953f5545e1b2755aceaeb6e66a840c..8e3392bf5fa468c4390706994b12691b29a34d72 100644 |
--- a/content/renderer/indexed_db_dispatcher.h |
+++ b/content/renderer/indexed_db_dispatcher.h |
@@ -11,6 +11,8 @@ |
#include "base/id_map.h" |
#include "base/nullable_string16.h" |
+#include "content/common/child_thread.h" |
+#include "content/renderer/indexed_db_message_filter.h" |
#include "ipc/ipc_channel.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebExceptionCode.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebIDBCallbacks.h" |
@@ -32,13 +34,12 @@ class SerializedScriptValue; |
} |
// Handle the indexed db related communication for this entire renderer. |
-class IndexedDBDispatcher : public IPC::Channel::Listener { |
+class IndexedDBDispatcher { |
public: |
- IndexedDBDispatcher(); |
+ IndexedDBDispatcher(IndexedDBMessageFilter*); |
virtual ~IndexedDBDispatcher(); |
- // IPC::Channel::Listener implementation. |
- virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; |
+ void OnMessageReceived(const IPC::Message& msg); |
void Send(IPC::Message* msg); |
void RequestIDBFactoryGetDatabaseNames( |
@@ -185,13 +186,47 @@ class IndexedDBDispatcher : public IPC::Channel::Listener { |
void OnComplete(int32 transaction_id); |
void OnVersionChange(int32 database_id, const string16& newVersion); |
+ // This class facilitates mapping callback ids specified in incoming IPC |
+ // messages to threads. It: |
+ // * Retrieves process-unique ids for each stored WebIDBCallbacks object. The |
+ // browser process includes these ids in messages sent back to us. |
+ // * Registers incoming transaction and database callback ids that are created |
+ // in the browser process. We'll need to revisit this scheme if the browser |
+ // stops generating unique ids. |
+ // * Ensures, through IDMap, that it is only called on a single thread. |
+ template<class CallbackType> |
+ class CallbackIDMap { |
+ public: |
+ CallbackIDMap(IndexedDBMessageFilter* filter) : filter_(filter) { |
+ } |
+ void AddWithID(CallbackType* callbacks, int32 id) { |
+ filter_->NotifyAddWithIDForType(id, callbacks); |
+ map_.AddWithID(callbacks, id); |
+ } |
+ int32 Add(CallbackType* callbacks) { |
+ int id = filter_->GetUniqueID(); |
+ map_.AddWithID(callbacks, id); |
+ return id; |
+ } |
+ void Remove(int32 id) { |
+ filter_->RemoveForType(id, (CallbackType*)NULL); |
+ map_.Remove(id); |
+ } |
+ CallbackType* Lookup(int32 id) { |
+ return map_.Lookup(id); |
+ } |
+ private: |
+ // The filter is alive for the life of the process, nothing deletes it. |
+ IndexedDBMessageFilter* filter_; |
+ IDMap<CallbackType, IDMapOwnPointer> map_; |
+ }; |
+ |
// 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::WebIDBTransactionCallbacks, IDMapOwnPointer> |
+ CallbackIDMap<WebKit::WebIDBCallbacks> pending_callbacks_; |
+ CallbackIDMap<WebKit::WebIDBTransactionCallbacks> |
pending_transaction_callbacks_; |
- IDMap<WebKit::WebIDBDatabaseCallbacks, IDMapOwnPointer> |
- pending_database_callbacks_; |
+ CallbackIDMap<WebKit::WebIDBDatabaseCallbacks> pending_database_callbacks_; |
// Map from cursor id to RendererWebIDBCursorImpl. |
std::map<int32, RendererWebIDBCursorImpl*> cursors_; |