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

Side by Side Diff: content/renderer/indexed_db_dispatcher.cc

Issue 8400061: IndexedDB: Recycle cursor objects when calling continue(). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/indexed_db_dispatcher.h" 5 #include "content/renderer/indexed_db_dispatcher.h"
6 6
7 #include "content/common/indexed_db_messages.h" 7 #include "content/common/indexed_db_messages.h"
8 #include "content/renderer/render_thread_impl.h" 8 #include "content/renderer/render_thread_impl.h"
9 #include "content/renderer/render_view_impl.h" 9 #include "content/renderer/render_view_impl.h"
10 #include "content/renderer/renderer_webidbcursor_impl.h" 10 #include "content/renderer/renderer_webidbcursor_impl.h"
(...skipping 24 matching lines...) Expand all
35 } 35 }
36 36
37 IndexedDBDispatcher::~IndexedDBDispatcher() { 37 IndexedDBDispatcher::~IndexedDBDispatcher() {
38 } 38 }
39 39
40 bool IndexedDBDispatcher::OnMessageReceived(const IPC::Message& msg) { 40 bool IndexedDBDispatcher::OnMessageReceived(const IPC::Message& msg) {
41 bool handled = true; 41 bool handled = true;
42 IPC_BEGIN_MESSAGE_MAP(IndexedDBDispatcher, msg) 42 IPC_BEGIN_MESSAGE_MAP(IndexedDBDispatcher, msg)
43 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIDBCursor, 43 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIDBCursor,
44 OnSuccessOpenCursor) 44 OnSuccessOpenCursor)
45 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorContinue,
46 OnSuccessCursorContinue)
45 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIDBDatabase, 47 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIDBDatabase,
46 OnSuccessIDBDatabase) 48 OnSuccessIDBDatabase)
47 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIndexedDBKey, 49 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIndexedDBKey,
48 OnSuccessIndexedDBKey) 50 OnSuccessIndexedDBKey)
49 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIDBTransaction, 51 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIDBTransaction,
50 OnSuccessIDBTransaction) 52 OnSuccessIDBTransaction)
51 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessStringList, 53 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessStringList,
52 OnSuccessStringList) 54 OnSuccessStringList)
53 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessSerializedScriptValue, 55 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessSerializedScriptValue,
54 OnSuccessSerializedScriptValue) 56 OnSuccessSerializedScriptValue)
(...skipping 23 matching lines...) Expand all
78 } 80 }
79 81
80 void IndexedDBDispatcher::RequestIDBCursorContinue( 82 void IndexedDBDispatcher::RequestIDBCursorContinue(
81 const IndexedDBKey& key, 83 const IndexedDBKey& key,
82 WebIDBCallbacks* callbacks_ptr, 84 WebIDBCallbacks* callbacks_ptr,
83 int32 idb_cursor_id, 85 int32 idb_cursor_id,
84 WebExceptionCode* ec) { 86 WebExceptionCode* ec) {
85 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); 87 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr);
86 88
87 int32 response_id = pending_callbacks_.Add(callbacks.release()); 89 int32 response_id = pending_callbacks_.Add(callbacks.release());
90 pending_cursor_continues_[response_id] = idb_cursor_id;
88 RenderThreadImpl::current()->Send( 91 RenderThreadImpl::current()->Send(
89 new IndexedDBHostMsg_CursorContinue(idb_cursor_id, response_id, key, ec)); 92 new IndexedDBHostMsg_CursorContinue(idb_cursor_id, response_id, key, ec));
90 if (*ec) 93 if (*ec) {
91 pending_callbacks_.Remove(response_id); 94 pending_callbacks_.Remove(response_id);
95 pending_cursor_continues_.erase(idb_cursor_id);
96 }
92 } 97 }
93 98
94 void IndexedDBDispatcher::RequestIDBCursorDelete( 99 void IndexedDBDispatcher::RequestIDBCursorDelete(
95 WebIDBCallbacks* callbacks_ptr, 100 WebIDBCallbacks* callbacks_ptr,
96 int32 idb_cursor_id, 101 int32 idb_cursor_id,
97 WebExceptionCode* ec) { 102 WebExceptionCode* ec) {
98 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); 103 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr);
99 104
100 int32 response_id = pending_callbacks_.Add(callbacks.release()); 105 int32 response_id = pending_callbacks_.Add(callbacks.release());
101 RenderThreadImpl::current()->Send( 106 RenderThreadImpl::current()->Send(
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 callbacks->onSuccess(value); 429 callbacks->onSuccess(value);
425 pending_callbacks_.Remove(response_id); 430 pending_callbacks_.Remove(response_id);
426 } 431 }
427 432
428 void IndexedDBDispatcher::OnSuccessOpenCursor(int32 repsonse_id, 433 void IndexedDBDispatcher::OnSuccessOpenCursor(int32 repsonse_id,
429 int32 object_id, const IndexedDBKey& key, const IndexedDBKey& primaryKey, 434 int32 object_id, const IndexedDBKey& key, const IndexedDBKey& primaryKey,
430 const content::SerializedScriptValue& value) { 435 const content::SerializedScriptValue& value) {
431 WebIDBCallbacks* callbacks = 436 WebIDBCallbacks* callbacks =
432 pending_callbacks_.Lookup(repsonse_id); 437 pending_callbacks_.Lookup(repsonse_id);
433 callbacks->onSuccess(new RendererWebIDBCursorImpl(object_id, key, 438 callbacks->onSuccess(new RendererWebIDBCursorImpl(object_id, key,
434 primaryKey, value)); 439 primaryKey, value));
dgrogan 2011/10/29 00:54:28 You can remove the non-object_id parameters.
hans 2011/10/31 16:11:52 Done.
440
441 cursor_key_[object_id] = key;
dgrogan 2011/10/29 00:54:28 If the onSuccess call is synchronous, shouldn't th
hans 2011/10/31 16:11:52 It's not synchronous, but it certainly looks weird
442 cursor_primary_key_[object_id] = primaryKey;
443 cursor_value_[object_id] = value;
444
435 pending_callbacks_.Remove(repsonse_id); 445 pending_callbacks_.Remove(repsonse_id);
436 } 446 }
437 447
448 void IndexedDBDispatcher::OnSuccessCursorContinue(
449 int32 response_id,
michaeln 2011/10/30 21:54:06 cursor_id could be a useful here, i think you woul
hans 2011/10/31 16:11:52 Done.
450 const IndexedDBKey& key,
451 const IndexedDBKey& primary_key,
452 const content::SerializedScriptValue& value) {
453 int32 cursor_id = pending_cursor_continues_[response_id];
454
michaeln 2011/10/30 21:54:06 Is there any chance the cursor was deleted prior t
hans 2011/10/31 16:11:52 No, according to the comment in ~RendererWebIDBCur
455 cursor_key_[cursor_id] = key;
456 cursor_primary_key_[cursor_id] = primary_key;
457 cursor_value_[cursor_id] = value;
michaeln 2011/10/30 21:54:06 The RendererWebIDBCursorImpl has data members for
hans 2011/10/31 16:11:52 Yes, doing that.
458
459 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(response_id);
460 callbacks->onSuccessCursorContinue();
461
462 pending_callbacks_.Remove(response_id);
463 pending_cursor_continues_.erase(response_id);
464 }
465
438 void IndexedDBDispatcher::OnBlocked(int32 response_id) { 466 void IndexedDBDispatcher::OnBlocked(int32 response_id) {
439 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(response_id); 467 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(response_id);
440 callbacks->onBlocked(); 468 callbacks->onBlocked();
441 } 469 }
442 470
443 void IndexedDBDispatcher::OnError(int32 response_id, int code, 471 void IndexedDBDispatcher::OnError(int32 response_id, int code,
444 const string16& message) { 472 const string16& message) {
445 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(response_id); 473 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(response_id);
446 callbacks->onError(WebIDBDatabaseError(code, message)); 474 callbacks->onError(WebIDBDatabaseError(code, message));
447 pending_callbacks_.Remove(response_id); 475 pending_callbacks_.Remove(response_id);
(...skipping 15 matching lines...) Expand all
463 491
464 void IndexedDBDispatcher::OnVersionChange(int32 database_id, 492 void IndexedDBDispatcher::OnVersionChange(int32 database_id,
465 const string16& newVersion) { 493 const string16& newVersion) {
466 WebIDBDatabaseCallbacks* callbacks = 494 WebIDBDatabaseCallbacks* callbacks =
467 pending_database_callbacks_.Lookup(database_id); 495 pending_database_callbacks_.Lookup(database_id);
468 // callbacks would be NULL if a versionchange event is received after close 496 // callbacks would be NULL if a versionchange event is received after close
469 // has been called. 497 // has been called.
470 if (callbacks) 498 if (callbacks)
471 callbacks->onVersionChange(newVersion); 499 callbacks->onVersionChange(newVersion);
472 } 500 }
501
502 IndexedDBKey IndexedDBDispatcher::getCursorKey(int32 cursor_id) {
503 return cursor_key_[cursor_id];
504 }
505
506 IndexedDBKey IndexedDBDispatcher::getCursorPrimaryKey(int32 cursor_id) {
507 return cursor_primary_key_[cursor_id];
508 }
509
510 content::SerializedScriptValue IndexedDBDispatcher::getCursorValue(
511 int32 cursor_id) {
512 return cursor_value_[cursor_id];
513 }
514
515 void IndexedDBDispatcher::CursorDestroyed(int32 cursor_id) {
516 cursor_key_.erase(cursor_id);
517 cursor_primary_key_.erase(cursor_id);
518 cursor_value_.erase(cursor_id);
519 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698