Index: content/renderer/indexed_db_dispatcher.cc |
diff --git a/content/renderer/indexed_db_dispatcher.cc b/content/renderer/indexed_db_dispatcher.cc |
index 7fd09548c8df58bc5ba6dc7346cb46e653b47cac..fea473761da04644ed83404d241109dd729eb959 100644 |
--- a/content/renderer/indexed_db_dispatcher.cc |
+++ b/content/renderer/indexed_db_dispatcher.cc |
@@ -44,6 +44,8 @@ bool IndexedDBDispatcher::OnMessageReceived(const IPC::Message& msg) { |
OnSuccessOpenCursor) |
IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorContinue, |
OnSuccessCursorContinue) |
+ IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorPrefetch, |
+ OnSuccessCursorPrefetch) |
IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIDBDatabase, |
OnSuccessIDBDatabase) |
IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIndexedDBKey, |
@@ -70,6 +72,7 @@ void IndexedDBDispatcher::RequestIDBCursorUpdate( |
WebIDBCallbacks* callbacks_ptr, |
int32 idb_cursor_id, |
WebExceptionCode* ec) { |
+ ResetCursorPrefetchCaches(); |
scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); |
int32 response_id = pending_callbacks_.Add(callbacks.release()); |
@@ -84,6 +87,9 @@ void IndexedDBDispatcher::RequestIDBCursorContinue( |
WebIDBCallbacks* callbacks_ptr, |
int32 idb_cursor_id, |
WebExceptionCode* ec) { |
+ // Reset all cursor prefetch caches except for this cursor. |
+ ResetCursorPrefetchCaches(idb_cursor_id); |
+ |
scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); |
int32 response_id = pending_callbacks_.Add(callbacks.release()); |
@@ -93,10 +99,32 @@ void IndexedDBDispatcher::RequestIDBCursorContinue( |
pending_callbacks_.Remove(response_id); |
} |
+void IndexedDBDispatcher::RequestIDBCursorPrefetch( |
+ int n, |
+ WebIDBCallbacks* callbacks_ptr, |
+ int32 idb_cursor_id, |
+ WebExceptionCode* ec) { |
+ scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); |
+ |
+ int32 response_id = pending_callbacks_.Add(callbacks.release()); |
+ RenderThreadImpl::current()->Send( |
+ new IndexedDBHostMsg_CursorPrefetch(idb_cursor_id, response_id, n, ec)); |
+ if (*ec) |
+ pending_callbacks_.Remove(response_id); |
+} |
+ |
+void IndexedDBDispatcher::RequestIDBCursorPrefetchReset( |
+ int used_prefetches, int unused_prefetches, int32 idb_cursor_id) { |
+ RenderThreadImpl::current()->Send( |
+ new IndexedDBHostMsg_CursorPrefetchReset(idb_cursor_id, used_prefetches, |
+ unused_prefetches)); |
+} |
+ |
void IndexedDBDispatcher::RequestIDBCursorDelete( |
WebIDBCallbacks* callbacks_ptr, |
int32 idb_cursor_id, |
WebExceptionCode* ec) { |
+ ResetCursorPrefetchCaches(); |
scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); |
int32 response_id = pending_callbacks_.Add(callbacks.release()); |
@@ -111,6 +139,7 @@ void IndexedDBDispatcher::RequestIDBFactoryOpen( |
WebIDBCallbacks* callbacks_ptr, |
const string16& origin, |
WebFrame* web_frame) { |
+ ResetCursorPrefetchCaches(); |
scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); |
if (!web_frame) |
@@ -130,6 +159,7 @@ void IndexedDBDispatcher::RequestIDBFactoryGetDatabaseNames( |
WebIDBCallbacks* callbacks_ptr, |
const string16& origin, |
WebFrame* web_frame) { |
+ ResetCursorPrefetchCaches(); |
scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); |
if (!web_frame) |
@@ -150,6 +180,7 @@ void IndexedDBDispatcher::RequestIDBFactoryDeleteDatabase( |
WebIDBCallbacks* callbacks_ptr, |
const string16& origin, |
WebFrame* web_frame) { |
+ ResetCursorPrefetchCaches(); |
scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); |
if (!web_frame) |
@@ -167,6 +198,7 @@ void IndexedDBDispatcher::RequestIDBFactoryDeleteDatabase( |
} |
void IndexedDBDispatcher::RequestIDBDatabaseClose(int32 idb_database_id) { |
+ ResetCursorPrefetchCaches(); |
RenderThreadImpl::current()->Send( |
new IndexedDBHostMsg_DatabaseClose(idb_database_id)); |
pending_database_callbacks_.Remove(idb_database_id); |
@@ -175,6 +207,7 @@ void IndexedDBDispatcher::RequestIDBDatabaseClose(int32 idb_database_id) { |
void IndexedDBDispatcher::RequestIDBDatabaseOpen( |
WebIDBDatabaseCallbacks* callbacks_ptr, |
int32 idb_database_id) { |
+ ResetCursorPrefetchCaches(); |
scoped_ptr<WebIDBDatabaseCallbacks> callbacks(callbacks_ptr); |
int32 response_id = pending_database_callbacks_.Add(callbacks.release()); |
@@ -187,6 +220,7 @@ void IndexedDBDispatcher::RequestIDBDatabaseSetVersion( |
WebIDBCallbacks* callbacks_ptr, |
int32 idb_database_id, |
WebExceptionCode* ec) { |
+ ResetCursorPrefetchCaches(); |
scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); |
int32 response_id = pending_callbacks_.Add(callbacks.release()); |
@@ -204,6 +238,7 @@ void IndexedDBDispatcher::RequestIDBIndexOpenObjectCursor( |
int32 idb_index_id, |
const WebIDBTransaction& transaction, |
WebExceptionCode* ec) { |
+ ResetCursorPrefetchCaches(); |
scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); |
IndexedDBHostMsg_IndexOpenCursor_Params params; |
params.response_id = pending_callbacks_.Add(callbacks.release()); |
@@ -227,6 +262,7 @@ void IndexedDBDispatcher::RequestIDBIndexOpenKeyCursor( |
int32 idb_index_id, |
const WebIDBTransaction& transaction, |
WebExceptionCode* ec) { |
+ ResetCursorPrefetchCaches(); |
scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); |
IndexedDBHostMsg_IndexOpenCursor_Params params; |
params.response_id = pending_callbacks_.Add(callbacks.release()); |
@@ -251,6 +287,7 @@ void IndexedDBDispatcher::RequestIDBIndexGetObject( |
int32 idb_index_id, |
const WebIDBTransaction& transaction, |
WebExceptionCode* ec) { |
+ ResetCursorPrefetchCaches(); |
scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); |
int32 response_id = pending_callbacks_.Add(callbacks.release()); |
RenderThreadImpl::current()->Send( |
@@ -267,6 +304,7 @@ void IndexedDBDispatcher::RequestIDBIndexGetKey( |
int32 idb_index_id, |
const WebIDBTransaction& transaction, |
WebExceptionCode* ec) { |
+ ResetCursorPrefetchCaches(); |
scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); |
int32 response_id = pending_callbacks_.Add(callbacks.release()); |
RenderThreadImpl::current()->Send( |
@@ -283,6 +321,7 @@ void IndexedDBDispatcher::RequestIDBObjectStoreGet( |
int32 idb_object_store_id, |
const WebIDBTransaction& transaction, |
WebExceptionCode* ec) { |
+ ResetCursorPrefetchCaches(); |
scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); |
int32 response_id = pending_callbacks_.Add(callbacks.release()); |
@@ -302,6 +341,7 @@ void IndexedDBDispatcher::RequestIDBObjectStorePut( |
int32 idb_object_store_id, |
const WebIDBTransaction& transaction, |
WebExceptionCode* ec) { |
+ ResetCursorPrefetchCaches(); |
scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); |
IndexedDBHostMsg_ObjectStorePut_Params params; |
params.idb_object_store_id = idb_object_store_id; |
@@ -322,6 +362,7 @@ void IndexedDBDispatcher::RequestIDBObjectStoreDelete( |
int32 idb_object_store_id, |
const WebIDBTransaction& transaction, |
WebExceptionCode* ec) { |
+ ResetCursorPrefetchCaches(); |
scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); |
int32 response_id = pending_callbacks_.Add(callbacks.release()); |
@@ -338,6 +379,7 @@ void IndexedDBDispatcher::RequestIDBObjectStoreClear( |
int32 idb_object_store_id, |
const WebIDBTransaction& transaction, |
WebExceptionCode* ec) { |
+ ResetCursorPrefetchCaches(); |
scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); |
int32 response_id = pending_callbacks_.Add(callbacks.release()); |
@@ -356,6 +398,7 @@ void IndexedDBDispatcher::RequestIDBObjectStoreOpenCursor( |
int32 idb_object_store_id, |
const WebIDBTransaction& transaction, |
WebExceptionCode* ec) { |
+ ResetCursorPrefetchCaches(); |
scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); |
IndexedDBHostMsg_ObjectStoreOpenCursor_Params params; |
params.response_id = pending_callbacks_.Add(callbacks.release()); |
@@ -458,6 +501,21 @@ void IndexedDBDispatcher::OnSuccessCursorContinue( |
pending_callbacks_.Remove(response_id); |
} |
+void IndexedDBDispatcher::OnSuccessCursorPrefetch( |
+ int32 response_id, |
+ int32 cursor_id, |
+ const std::vector<IndexedDBKey>& keys, |
+ const std::vector<IndexedDBKey>& primary_keys, |
+ const std::vector<content::SerializedScriptValue>& values) { |
+ RendererWebIDBCursorImpl* cursor = cursors_[cursor_id]; |
+ DCHECK(cursor); |
+ cursor->SetPrefetchData(keys, primary_keys, values); |
+ |
+ WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(response_id); |
+ cursor->CachedContinue(callbacks); |
+ pending_callbacks_.Remove(response_id); |
+} |
+ |
void IndexedDBDispatcher::OnBlocked(int32 response_id) { |
WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(response_id); |
callbacks->onBlocked(); |
@@ -493,3 +551,12 @@ void IndexedDBDispatcher::OnVersionChange(int32 database_id, |
if (callbacks) |
callbacks->onVersionChange(newVersion); |
} |
+ |
+void IndexedDBDispatcher::ResetCursorPrefetchCaches(int32 exception_cursor_id) { |
jsbell
2011/11/28 20:29:16
Should this at least be scoped to database_id? Is
hans
2011/11/29 14:44:34
That would make sense, but it doesn't make any dif
|
+ typedef std::map<int32, RendererWebIDBCursorImpl*>::iterator Iterator; |
+ for (Iterator i = cursors_.begin(); i != cursors_.end(); ++i) { |
+ if (i->first == exception_cursor_id) |
+ continue; |
+ i->second->ResetPrefetchCache(); |
+ } |
+} |