| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "content/renderer/indexed_db/indexed_db_dispatcher.h" | |
| 6 | |
| 7 #include "base/lazy_instance.h" | |
| 8 #include "base/threading/thread_local.h" | |
| 9 #include "content/common/indexed_db/indexed_db_messages.h" | |
| 10 #include "content/renderer/indexed_db/renderer_webidbcursor_impl.h" | |
| 11 #include "content/renderer/indexed_db/renderer_webidbdatabase_impl.h" | |
| 12 #include "content/renderer/indexed_db/renderer_webidbindex_impl.h" | |
| 13 #include "content/renderer/indexed_db/renderer_webidbobjectstore_impl.h" | |
| 14 #include "content/renderer/indexed_db/renderer_webidbtransaction_impl.h" | |
| 15 #include "content/renderer/render_thread_impl.h" | |
| 16 #include "content/renderer/render_view_impl.h" | |
| 17 #include "ipc/ipc_channel.h" | |
| 18 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" | |
| 19 #include "third_party/WebKit/Source/WebKit/chromium/public/WebIDBDatabaseCallbac
ks.h" | |
| 20 #include "third_party/WebKit/Source/WebKit/chromium/public/WebIDBDatabaseError.h
" | |
| 21 #include "third_party/WebKit/Source/WebKit/chromium/public/WebIDBKeyRange.h" | |
| 22 | |
| 23 using base::ThreadLocalPointer; | |
| 24 using WebKit::WebDOMStringList; | |
| 25 using WebKit::WebExceptionCode; | |
| 26 using WebKit::WebFrame; | |
| 27 using WebKit::WebIDBCallbacks; | |
| 28 using WebKit::WebIDBKeyRange; | |
| 29 using WebKit::WebIDBDatabase; | |
| 30 using WebKit::WebIDBDatabaseCallbacks; | |
| 31 using WebKit::WebIDBDatabaseError; | |
| 32 using WebKit::WebIDBTransaction; | |
| 33 using WebKit::WebIDBTransactionCallbacks; | |
| 34 using webkit_glue::WorkerTaskRunner; | |
| 35 | |
| 36 static base::LazyInstance<ThreadLocalPointer<IndexedDBDispatcher> >::Leaky | |
| 37 g_idb_dispatcher_tls = LAZY_INSTANCE_INITIALIZER; | |
| 38 | |
| 39 namespace { | |
| 40 | |
| 41 int32 CurrentWorkerId() { | |
| 42 return WorkerTaskRunner::Instance()->CurrentWorkerId(); | |
| 43 } | |
| 44 | |
| 45 } // unnamed namespace | |
| 46 | |
| 47 IndexedDBDispatcher::IndexedDBDispatcher() { | |
| 48 g_idb_dispatcher_tls.Pointer()->Set(this); | |
| 49 } | |
| 50 | |
| 51 IndexedDBDispatcher::~IndexedDBDispatcher() { | |
| 52 g_idb_dispatcher_tls.Pointer()->Set(NULL); | |
| 53 } | |
| 54 | |
| 55 IndexedDBDispatcher* IndexedDBDispatcher::ThreadSpecificInstance() { | |
| 56 if (g_idb_dispatcher_tls.Pointer()->Get()) | |
| 57 return g_idb_dispatcher_tls.Pointer()->Get(); | |
| 58 | |
| 59 IndexedDBDispatcher* dispatcher = new IndexedDBDispatcher; | |
| 60 if (WorkerTaskRunner::Instance()->CurrentWorkerId()) | |
| 61 webkit_glue::WorkerTaskRunner::Instance()->AddStopObserver(dispatcher); | |
| 62 return dispatcher; | |
| 63 } | |
| 64 | |
| 65 void IndexedDBDispatcher::OnWorkerRunLoopStopped() { | |
| 66 delete this; | |
| 67 } | |
| 68 | |
| 69 void IndexedDBDispatcher::OnMessageReceived(const IPC::Message& msg) { | |
| 70 bool handled = true; | |
| 71 IPC_BEGIN_MESSAGE_MAP(IndexedDBDispatcher, msg) | |
| 72 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIDBCursor, | |
| 73 OnSuccessOpenCursor) | |
| 74 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorContinue, | |
| 75 OnSuccessCursorContinue) | |
| 76 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorPrefetch, | |
| 77 OnSuccessCursorPrefetch) | |
| 78 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIDBDatabase, | |
| 79 OnSuccessIDBDatabase) | |
| 80 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIndexedDBKey, | |
| 81 OnSuccessIndexedDBKey) | |
| 82 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIDBTransaction, | |
| 83 OnSuccessIDBTransaction) | |
| 84 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessStringList, | |
| 85 OnSuccessStringList) | |
| 86 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessSerializedScriptValue, | |
| 87 OnSuccessSerializedScriptValue) | |
| 88 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksError, OnError) | |
| 89 IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksBlocked, OnBlocked) | |
| 90 IPC_MESSAGE_HANDLER(IndexedDBMsg_TransactionCallbacksAbort, OnAbort) | |
| 91 IPC_MESSAGE_HANDLER(IndexedDBMsg_TransactionCallbacksComplete, OnComplete) | |
| 92 IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksVersionChange, | |
| 93 OnVersionChange) | |
| 94 IPC_MESSAGE_UNHANDLED(handled = false) | |
| 95 IPC_END_MESSAGE_MAP() | |
| 96 // If a message gets here, IndexedDBMessageFilter already determined that it | |
| 97 // is an IndexedDB message. | |
| 98 DCHECK(handled); | |
| 99 } | |
| 100 | |
| 101 void IndexedDBDispatcher::Send(IPC::Message* msg) { | |
| 102 ChildThread::current()->Send(msg); | |
| 103 } | |
| 104 | |
| 105 void IndexedDBDispatcher::RequestIDBCursorUpdate( | |
| 106 const content::SerializedScriptValue& value, | |
| 107 WebIDBCallbacks* callbacks_ptr, | |
| 108 int32 idb_cursor_id, | |
| 109 WebExceptionCode* ec) { | |
| 110 ResetCursorPrefetchCaches(); | |
| 111 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); | |
| 112 | |
| 113 int32 response_id = pending_callbacks_.Add(callbacks.release()); | |
| 114 Send( | |
| 115 new IndexedDBHostMsg_CursorUpdate(idb_cursor_id, CurrentWorkerId(), | |
| 116 response_id, value, ec)); | |
| 117 if (*ec) | |
| 118 pending_callbacks_.Remove(response_id); | |
| 119 } | |
| 120 | |
| 121 void IndexedDBDispatcher::RequestIDBCursorContinue( | |
| 122 const IndexedDBKey& key, | |
| 123 WebIDBCallbacks* callbacks_ptr, | |
| 124 int32 idb_cursor_id, | |
| 125 WebExceptionCode* ec) { | |
| 126 // Reset all cursor prefetch caches except for this cursor. | |
| 127 ResetCursorPrefetchCaches(idb_cursor_id); | |
| 128 | |
| 129 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); | |
| 130 | |
| 131 int32 response_id = pending_callbacks_.Add(callbacks.release()); | |
| 132 Send( | |
| 133 new IndexedDBHostMsg_CursorContinue(idb_cursor_id, CurrentWorkerId(), | |
| 134 response_id, key, ec)); | |
| 135 if (*ec) | |
| 136 pending_callbacks_.Remove(response_id); | |
| 137 } | |
| 138 | |
| 139 void IndexedDBDispatcher::RequestIDBCursorPrefetch( | |
| 140 int n, | |
| 141 WebIDBCallbacks* callbacks_ptr, | |
| 142 int32 idb_cursor_id, | |
| 143 WebExceptionCode* ec) { | |
| 144 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); | |
| 145 | |
| 146 int32 response_id = pending_callbacks_.Add(callbacks.release()); | |
| 147 Send(new IndexedDBHostMsg_CursorPrefetch(idb_cursor_id, CurrentWorkerId(), | |
| 148 response_id, n, ec)); | |
| 149 if (*ec) | |
| 150 pending_callbacks_.Remove(response_id); | |
| 151 } | |
| 152 | |
| 153 void IndexedDBDispatcher::RequestIDBCursorPrefetchReset( | |
| 154 int used_prefetches, int unused_prefetches, int32 idb_cursor_id) { | |
| 155 Send(new IndexedDBHostMsg_CursorPrefetchReset(idb_cursor_id, | |
| 156 used_prefetches, | |
| 157 unused_prefetches)); | |
| 158 } | |
| 159 | |
| 160 void IndexedDBDispatcher::RequestIDBCursorDelete( | |
| 161 WebIDBCallbacks* callbacks_ptr, | |
| 162 int32 idb_cursor_id, | |
| 163 WebExceptionCode* ec) { | |
| 164 ResetCursorPrefetchCaches(); | |
| 165 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); | |
| 166 | |
| 167 int32 response_id = pending_callbacks_.Add(callbacks.release()); | |
| 168 Send(new IndexedDBHostMsg_CursorDelete(idb_cursor_id, CurrentWorkerId(), | |
| 169 response_id, ec)); | |
| 170 if (*ec) | |
| 171 pending_callbacks_.Remove(response_id); | |
| 172 } | |
| 173 | |
| 174 void IndexedDBDispatcher::RequestIDBFactoryOpen( | |
| 175 const string16& name, | |
| 176 WebIDBCallbacks* callbacks_ptr, | |
| 177 const string16& origin, | |
| 178 WebFrame* web_frame) { | |
| 179 ResetCursorPrefetchCaches(); | |
| 180 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); | |
| 181 | |
| 182 if (!web_frame) | |
| 183 return; // We must be shutting down. | |
| 184 RenderViewImpl* render_view = RenderViewImpl::FromWebView(web_frame->view()); | |
| 185 if (!render_view) | |
| 186 return; // We must be shutting down. | |
| 187 | |
| 188 IndexedDBHostMsg_FactoryOpen_Params params; | |
| 189 params.thread_id = CurrentWorkerId(); | |
| 190 params.response_id = pending_callbacks_.Add(callbacks.release()); | |
| 191 params.origin = origin; | |
| 192 params.name = name; | |
| 193 Send(new IndexedDBHostMsg_FactoryOpen(params)); | |
| 194 } | |
| 195 | |
| 196 void IndexedDBDispatcher::RequestIDBFactoryGetDatabaseNames( | |
| 197 WebIDBCallbacks* callbacks_ptr, | |
| 198 const string16& origin, | |
| 199 WebFrame* web_frame) { | |
| 200 ResetCursorPrefetchCaches(); | |
| 201 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); | |
| 202 | |
| 203 if (!web_frame) | |
| 204 return; // We must be shutting down. | |
| 205 RenderViewImpl* render_view = RenderViewImpl::FromWebView(web_frame->view()); | |
| 206 if (!render_view) | |
| 207 return; // We must be shutting down. | |
| 208 | |
| 209 IndexedDBHostMsg_FactoryGetDatabaseNames_Params params; | |
| 210 params.thread_id = CurrentWorkerId(); | |
| 211 params.response_id = pending_callbacks_.Add(callbacks.release()); | |
| 212 params.origin = origin; | |
| 213 Send(new IndexedDBHostMsg_FactoryGetDatabaseNames(params)); | |
| 214 } | |
| 215 | |
| 216 void IndexedDBDispatcher::RequestIDBFactoryDeleteDatabase( | |
| 217 const string16& name, | |
| 218 WebIDBCallbacks* callbacks_ptr, | |
| 219 const string16& origin, | |
| 220 WebFrame* web_frame) { | |
| 221 ResetCursorPrefetchCaches(); | |
| 222 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); | |
| 223 | |
| 224 if (!web_frame) | |
| 225 return; // We must be shutting down. | |
| 226 RenderViewImpl* render_view = RenderViewImpl::FromWebView(web_frame->view()); | |
| 227 if (!render_view) | |
| 228 return; // We must be shutting down. | |
| 229 | |
| 230 IndexedDBHostMsg_FactoryDeleteDatabase_Params params; | |
| 231 params.thread_id = CurrentWorkerId(); | |
| 232 params.response_id = pending_callbacks_.Add(callbacks.release()); | |
| 233 params.origin = origin; | |
| 234 params.name = name; | |
| 235 Send(new IndexedDBHostMsg_FactoryDeleteDatabase(params)); | |
| 236 } | |
| 237 | |
| 238 void IndexedDBDispatcher::RequestIDBDatabaseClose(int32 idb_database_id) { | |
| 239 ResetCursorPrefetchCaches(); | |
| 240 Send(new IndexedDBHostMsg_DatabaseClose(idb_database_id)); | |
| 241 pending_database_callbacks_.Remove(idb_database_id); | |
| 242 } | |
| 243 | |
| 244 void IndexedDBDispatcher::RequestIDBDatabaseOpen( | |
| 245 WebIDBDatabaseCallbacks* callbacks_ptr, | |
| 246 int32 idb_database_id) { | |
| 247 ResetCursorPrefetchCaches(); | |
| 248 scoped_ptr<WebIDBDatabaseCallbacks> callbacks(callbacks_ptr); | |
| 249 | |
| 250 DCHECK(!pending_database_callbacks_.Lookup(idb_database_id)); | |
| 251 pending_database_callbacks_.AddWithID(callbacks.release(), idb_database_id); | |
| 252 Send(new IndexedDBHostMsg_DatabaseOpen(idb_database_id, CurrentWorkerId(), | |
| 253 idb_database_id)); | |
| 254 } | |
| 255 | |
| 256 void IndexedDBDispatcher::RequestIDBDatabaseSetVersion( | |
| 257 const string16& version, | |
| 258 WebIDBCallbacks* callbacks_ptr, | |
| 259 int32 idb_database_id, | |
| 260 WebExceptionCode* ec) { | |
| 261 ResetCursorPrefetchCaches(); | |
| 262 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); | |
| 263 | |
| 264 int32 response_id = pending_callbacks_.Add(callbacks.release()); | |
| 265 Send(new IndexedDBHostMsg_DatabaseSetVersion(idb_database_id, | |
| 266 CurrentWorkerId(), | |
| 267 response_id, version, ec)); | |
| 268 if (*ec) | |
| 269 pending_callbacks_.Remove(response_id); | |
| 270 } | |
| 271 | |
| 272 void IndexedDBDispatcher::RequestIDBIndexOpenObjectCursor( | |
| 273 const WebIDBKeyRange& idb_key_range, | |
| 274 unsigned short direction, | |
| 275 WebIDBCallbacks* callbacks_ptr, | |
| 276 int32 idb_index_id, | |
| 277 const WebIDBTransaction& transaction, | |
| 278 WebExceptionCode* ec) { | |
| 279 ResetCursorPrefetchCaches(); | |
| 280 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); | |
| 281 IndexedDBHostMsg_IndexOpenCursor_Params params; | |
| 282 params.thread_id = CurrentWorkerId(); | |
| 283 params.response_id = pending_callbacks_.Add(callbacks.release()); | |
| 284 params.lower_key.Set(idb_key_range.lower()); | |
| 285 params.upper_key.Set(idb_key_range.upper()); | |
| 286 params.lower_open = idb_key_range.lowerOpen(); | |
| 287 params.upper_open = idb_key_range.upperOpen(); | |
| 288 params.direction = direction; | |
| 289 params.idb_index_id = idb_index_id; | |
| 290 params.transaction_id = TransactionId(transaction); | |
| 291 Send(new IndexedDBHostMsg_IndexOpenObjectCursor(params, ec)); | |
| 292 if (*ec) | |
| 293 pending_callbacks_.Remove(params.response_id); | |
| 294 } | |
| 295 | |
| 296 void IndexedDBDispatcher::RequestIDBIndexOpenKeyCursor( | |
| 297 const WebIDBKeyRange& idb_key_range, | |
| 298 unsigned short direction, | |
| 299 WebIDBCallbacks* callbacks_ptr, | |
| 300 int32 idb_index_id, | |
| 301 const WebIDBTransaction& transaction, | |
| 302 WebExceptionCode* ec) { | |
| 303 ResetCursorPrefetchCaches(); | |
| 304 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); | |
| 305 IndexedDBHostMsg_IndexOpenCursor_Params params; | |
| 306 params.thread_id = CurrentWorkerId(); | |
| 307 params.response_id = pending_callbacks_.Add(callbacks.release()); | |
| 308 // TODO(jorlow): We really should just create a Chromium abstraction for | |
| 309 // KeyRange rather than doing it ad-hoc like this. | |
| 310 params.lower_key.Set(idb_key_range.lower()); | |
| 311 params.upper_key.Set(idb_key_range.upper()); | |
| 312 params.lower_open = idb_key_range.lowerOpen(); | |
| 313 params.upper_open = idb_key_range.upperOpen(); | |
| 314 params.direction = direction; | |
| 315 params.idb_index_id = idb_index_id; | |
| 316 params.transaction_id = TransactionId(transaction); | |
| 317 Send(new IndexedDBHostMsg_IndexOpenKeyCursor(params, ec)); | |
| 318 if (*ec) | |
| 319 pending_callbacks_.Remove(params.response_id); | |
| 320 } | |
| 321 | |
| 322 void IndexedDBDispatcher::RequestIDBIndexCount( | |
| 323 const WebIDBKeyRange& idb_key_range, | |
| 324 WebIDBCallbacks* callbacks_ptr, | |
| 325 int32 idb_index_id, | |
| 326 const WebIDBTransaction& transaction, | |
| 327 WebExceptionCode* ec) { | |
| 328 ResetCursorPrefetchCaches(); | |
| 329 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); | |
| 330 IndexedDBHostMsg_IndexCount_Params params; | |
| 331 params.thread_id = CurrentWorkerId(); | |
| 332 params.response_id = pending_callbacks_.Add(callbacks.release()); | |
| 333 params.lower_key.Set(idb_key_range.lower()); | |
| 334 params.upper_key.Set(idb_key_range.upper()); | |
| 335 params.lower_open = idb_key_range.lowerOpen(); | |
| 336 params.upper_open = idb_key_range.upperOpen(); | |
| 337 params.idb_index_id = idb_index_id; | |
| 338 params.transaction_id = TransactionId(transaction); | |
| 339 Send(new IndexedDBHostMsg_IndexCount(params, ec)); | |
| 340 if (*ec) | |
| 341 pending_callbacks_.Remove(params.response_id); | |
| 342 } | |
| 343 | |
| 344 void IndexedDBDispatcher::RequestIDBIndexGetObject( | |
| 345 const IndexedDBKey& key, | |
| 346 WebIDBCallbacks* callbacks_ptr, | |
| 347 int32 idb_index_id, | |
| 348 const WebIDBTransaction& transaction, | |
| 349 WebExceptionCode* ec) { | |
| 350 ResetCursorPrefetchCaches(); | |
| 351 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); | |
| 352 int32 response_id = pending_callbacks_.Add(callbacks.release()); | |
| 353 Send(new IndexedDBHostMsg_IndexGetObject(idb_index_id, CurrentWorkerId(), | |
| 354 response_id, key, | |
| 355 TransactionId(transaction), ec)); | |
| 356 if (*ec) | |
| 357 pending_callbacks_.Remove(response_id); | |
| 358 } | |
| 359 | |
| 360 void IndexedDBDispatcher::RequestIDBIndexGetKey( | |
| 361 const IndexedDBKey& key, | |
| 362 WebIDBCallbacks* callbacks_ptr, | |
| 363 int32 idb_index_id, | |
| 364 const WebIDBTransaction& transaction, | |
| 365 WebExceptionCode* ec) { | |
| 366 ResetCursorPrefetchCaches(); | |
| 367 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); | |
| 368 int32 response_id = pending_callbacks_.Add(callbacks.release()); | |
| 369 Send(new IndexedDBHostMsg_IndexGetKey( | |
| 370 idb_index_id, CurrentWorkerId(), response_id, key, | |
| 371 TransactionId(transaction), ec)); | |
| 372 if (*ec) | |
| 373 pending_callbacks_.Remove(response_id); | |
| 374 } | |
| 375 | |
| 376 void IndexedDBDispatcher::RequestIDBObjectStoreGet( | |
| 377 const IndexedDBKey& key, | |
| 378 WebIDBCallbacks* callbacks_ptr, | |
| 379 int32 idb_object_store_id, | |
| 380 const WebIDBTransaction& transaction, | |
| 381 WebExceptionCode* ec) { | |
| 382 ResetCursorPrefetchCaches(); | |
| 383 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); | |
| 384 | |
| 385 int32 response_id = pending_callbacks_.Add(callbacks.release()); | |
| 386 Send(new IndexedDBHostMsg_ObjectStoreGet( | |
| 387 idb_object_store_id, CurrentWorkerId(), response_id, | |
| 388 key, TransactionId(transaction), ec)); | |
| 389 if (*ec) | |
| 390 pending_callbacks_.Remove(response_id); | |
| 391 } | |
| 392 | |
| 393 void IndexedDBDispatcher::RequestIDBObjectStorePut( | |
| 394 const content::SerializedScriptValue& value, | |
| 395 const IndexedDBKey& key, | |
| 396 WebKit::WebIDBObjectStore::PutMode put_mode, | |
| 397 WebIDBCallbacks* callbacks_ptr, | |
| 398 int32 idb_object_store_id, | |
| 399 const WebIDBTransaction& transaction, | |
| 400 WebExceptionCode* ec) { | |
| 401 ResetCursorPrefetchCaches(); | |
| 402 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); | |
| 403 IndexedDBHostMsg_ObjectStorePut_Params params; | |
| 404 params.thread_id = CurrentWorkerId(); | |
| 405 params.idb_object_store_id = idb_object_store_id; | |
| 406 params.response_id = pending_callbacks_.Add(callbacks.release()); | |
| 407 params.serialized_value = value; | |
| 408 params.key = key; | |
| 409 params.put_mode = put_mode; | |
| 410 params.transaction_id = TransactionId(transaction); | |
| 411 Send(new IndexedDBHostMsg_ObjectStorePut(params, ec)); | |
| 412 if (*ec) | |
| 413 pending_callbacks_.Remove(params.response_id); | |
| 414 } | |
| 415 | |
| 416 void IndexedDBDispatcher::RequestIDBObjectStoreDelete( | |
| 417 const IndexedDBKey& key, | |
| 418 WebIDBCallbacks* callbacks_ptr, | |
| 419 int32 idb_object_store_id, | |
| 420 const WebIDBTransaction& transaction, | |
| 421 WebExceptionCode* ec) { | |
| 422 ResetCursorPrefetchCaches(); | |
| 423 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); | |
| 424 | |
| 425 int32 response_id = pending_callbacks_.Add(callbacks.release()); | |
| 426 Send(new IndexedDBHostMsg_ObjectStoreDelete( | |
| 427 idb_object_store_id, CurrentWorkerId(), response_id, key, | |
| 428 TransactionId(transaction), ec)); | |
| 429 if (*ec) | |
| 430 pending_callbacks_.Remove(response_id); | |
| 431 } | |
| 432 | |
| 433 void IndexedDBDispatcher::RequestIDBObjectStoreClear( | |
| 434 WebIDBCallbacks* callbacks_ptr, | |
| 435 int32 idb_object_store_id, | |
| 436 const WebIDBTransaction& transaction, | |
| 437 WebExceptionCode* ec) { | |
| 438 ResetCursorPrefetchCaches(); | |
| 439 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); | |
| 440 | |
| 441 int32 response_id = pending_callbacks_.Add(callbacks.release()); | |
| 442 Send(new IndexedDBHostMsg_ObjectStoreClear( | |
| 443 idb_object_store_id, CurrentWorkerId(), response_id, | |
| 444 TransactionId(transaction), ec)); | |
| 445 if (*ec) | |
| 446 pending_callbacks_.Remove(response_id); | |
| 447 } | |
| 448 | |
| 449 void IndexedDBDispatcher::RequestIDBObjectStoreOpenCursor( | |
| 450 const WebIDBKeyRange& idb_key_range, | |
| 451 unsigned short direction, | |
| 452 WebIDBCallbacks* callbacks_ptr, | |
| 453 int32 idb_object_store_id, | |
| 454 const WebIDBTransaction& transaction, | |
| 455 WebExceptionCode* ec) { | |
| 456 ResetCursorPrefetchCaches(); | |
| 457 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); | |
| 458 IndexedDBHostMsg_ObjectStoreOpenCursor_Params params; | |
| 459 params.thread_id = CurrentWorkerId(); | |
| 460 params.response_id = pending_callbacks_.Add(callbacks.release()); | |
| 461 params.lower_key.Set(idb_key_range.lower()); | |
| 462 params.upper_key.Set(idb_key_range.upper()); | |
| 463 params.lower_open = idb_key_range.lowerOpen(); | |
| 464 params.upper_open = idb_key_range.upperOpen(); | |
| 465 params.direction = direction; | |
| 466 params.idb_object_store_id = idb_object_store_id; | |
| 467 params.transaction_id = TransactionId(transaction); | |
| 468 Send(new IndexedDBHostMsg_ObjectStoreOpenCursor(params, ec)); | |
| 469 if (*ec) | |
| 470 pending_callbacks_.Remove(params.response_id); | |
| 471 } | |
| 472 | |
| 473 void IndexedDBDispatcher::RequestIDBObjectStoreCount( | |
| 474 const WebIDBKeyRange& idb_key_range, | |
| 475 WebIDBCallbacks* callbacks_ptr, | |
| 476 int32 idb_object_store_id, | |
| 477 const WebIDBTransaction& transaction, | |
| 478 WebExceptionCode* ec) { | |
| 479 ResetCursorPrefetchCaches(); | |
| 480 scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); | |
| 481 IndexedDBHostMsg_ObjectStoreCount_Params params; | |
| 482 params.thread_id = CurrentWorkerId(); | |
| 483 params.response_id = pending_callbacks_.Add(callbacks.release()); | |
| 484 params.lower_key.Set(idb_key_range.lower()); | |
| 485 params.upper_key.Set(idb_key_range.upper()); | |
| 486 params.lower_open = idb_key_range.lowerOpen(); | |
| 487 params.upper_open = idb_key_range.upperOpen(); | |
| 488 params.idb_object_store_id = idb_object_store_id; | |
| 489 params.transaction_id = TransactionId(transaction); | |
| 490 Send(new IndexedDBHostMsg_ObjectStoreCount(params, ec)); | |
| 491 if (*ec) | |
| 492 pending_callbacks_.Remove(params.response_id); | |
| 493 } | |
| 494 | |
| 495 void IndexedDBDispatcher::RegisterWebIDBTransactionCallbacks( | |
| 496 WebIDBTransactionCallbacks* callbacks, | |
| 497 int32 id) { | |
| 498 pending_transaction_callbacks_.AddWithID(callbacks, id); | |
| 499 } | |
| 500 | |
| 501 void IndexedDBDispatcher::CursorDestroyed(int32 cursor_id) { | |
| 502 cursors_.erase(cursor_id); | |
| 503 } | |
| 504 | |
| 505 int32 IndexedDBDispatcher::TransactionId( | |
| 506 const WebIDBTransaction& transaction) { | |
| 507 const RendererWebIDBTransactionImpl* impl = | |
| 508 static_cast<const RendererWebIDBTransactionImpl*>(&transaction); | |
| 509 return impl->id(); | |
| 510 } | |
| 511 | |
| 512 void IndexedDBDispatcher::OnSuccessIDBDatabase(int32 thread_id, | |
| 513 int32 response_id, | |
| 514 int32 object_id) { | |
| 515 DCHECK_EQ(thread_id, CurrentWorkerId()); | |
| 516 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(response_id); | |
| 517 if (!callbacks) | |
| 518 return; | |
| 519 callbacks->onSuccess(new RendererWebIDBDatabaseImpl(object_id)); | |
| 520 pending_callbacks_.Remove(response_id); | |
| 521 } | |
| 522 | |
| 523 void IndexedDBDispatcher::OnSuccessIndexedDBKey(int32 thread_id, | |
| 524 int32 response_id, | |
| 525 const IndexedDBKey& key) { | |
| 526 DCHECK_EQ(thread_id, CurrentWorkerId()); | |
| 527 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(response_id); | |
| 528 if (!callbacks) | |
| 529 return; | |
| 530 callbacks->onSuccess(key); | |
| 531 pending_callbacks_.Remove(response_id); | |
| 532 } | |
| 533 | |
| 534 void IndexedDBDispatcher::OnSuccessIDBTransaction(int32 thread_id, | |
| 535 int32 response_id, | |
| 536 int32 object_id) { | |
| 537 DCHECK_EQ(thread_id, CurrentWorkerId()); | |
| 538 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(response_id); | |
| 539 if (!callbacks) | |
| 540 return; | |
| 541 callbacks->onSuccess(new RendererWebIDBTransactionImpl(object_id)); | |
| 542 pending_callbacks_.Remove(response_id); | |
| 543 } | |
| 544 | |
| 545 void IndexedDBDispatcher::OnSuccessStringList( | |
| 546 int32 thread_id, int32 response_id, const std::vector<string16>& value) { | |
| 547 DCHECK_EQ(thread_id, CurrentWorkerId()); | |
| 548 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(response_id); | |
| 549 if (!callbacks) | |
| 550 return; | |
| 551 WebDOMStringList string_list; | |
| 552 for (std::vector<string16>::const_iterator it = value.begin(); | |
| 553 it != value.end(); ++it) | |
| 554 string_list.append(*it); | |
| 555 callbacks->onSuccess(string_list); | |
| 556 pending_callbacks_.Remove(response_id); | |
| 557 } | |
| 558 | |
| 559 void IndexedDBDispatcher::OnSuccessSerializedScriptValue( | |
| 560 int32 thread_id, int32 response_id, | |
| 561 const content::SerializedScriptValue& value) { | |
| 562 DCHECK_EQ(thread_id, CurrentWorkerId()); | |
| 563 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(response_id); | |
| 564 if (!callbacks) | |
| 565 return; | |
| 566 callbacks->onSuccess(value); | |
| 567 pending_callbacks_.Remove(response_id); | |
| 568 } | |
| 569 | |
| 570 void IndexedDBDispatcher::OnSuccessOpenCursor( | |
| 571 const IndexedDBMsg_CallbacksSuccessIDBCursor_Params& p) { | |
| 572 DCHECK_EQ(p.thread_id, CurrentWorkerId()); | |
| 573 int32 response_id = p.response_id; | |
| 574 int32 object_id = p.cursor_id; | |
| 575 const IndexedDBKey& key = p.key; | |
| 576 const IndexedDBKey& primary_key = p.primary_key; | |
| 577 const content::SerializedScriptValue& value = p.serialized_value; | |
| 578 | |
| 579 WebIDBCallbacks* callbacks = | |
| 580 pending_callbacks_.Lookup(response_id); | |
| 581 if (!callbacks) | |
| 582 return; | |
| 583 | |
| 584 RendererWebIDBCursorImpl* cursor = new RendererWebIDBCursorImpl(object_id); | |
| 585 cursors_[object_id] = cursor; | |
| 586 cursor->SetKeyAndValue(key, primary_key, value); | |
| 587 callbacks->onSuccess(cursor); | |
| 588 | |
| 589 pending_callbacks_.Remove(response_id); | |
| 590 } | |
| 591 | |
| 592 void IndexedDBDispatcher::OnSuccessCursorContinue( | |
| 593 const IndexedDBMsg_CallbacksSuccessCursorContinue_Params& p) { | |
| 594 DCHECK_EQ(p.thread_id, CurrentWorkerId()); | |
| 595 int32 response_id = p.response_id; | |
| 596 int32 cursor_id = p.cursor_id; | |
| 597 const IndexedDBKey& key = p.key; | |
| 598 const IndexedDBKey& primary_key = p.primary_key; | |
| 599 const content::SerializedScriptValue& value = p.serialized_value; | |
| 600 | |
| 601 RendererWebIDBCursorImpl* cursor = cursors_[cursor_id]; | |
| 602 DCHECK(cursor); | |
| 603 cursor->SetKeyAndValue(key, primary_key, value); | |
| 604 | |
| 605 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(response_id); | |
| 606 if (!callbacks) | |
| 607 return; | |
| 608 callbacks->onSuccessWithContinuation(); | |
| 609 | |
| 610 pending_callbacks_.Remove(response_id); | |
| 611 } | |
| 612 | |
| 613 void IndexedDBDispatcher::OnSuccessCursorPrefetch( | |
| 614 const IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params& p) { | |
| 615 DCHECK_EQ(p.thread_id, CurrentWorkerId()); | |
| 616 int32 response_id = p.response_id; | |
| 617 int32 cursor_id = p.cursor_id; | |
| 618 const std::vector<IndexedDBKey>& keys = p.keys; | |
| 619 const std::vector<IndexedDBKey>& primary_keys = p.primary_keys; | |
| 620 const std::vector<content::SerializedScriptValue>& values = p.values; | |
| 621 RendererWebIDBCursorImpl* cursor = cursors_[cursor_id]; | |
| 622 DCHECK(cursor); | |
| 623 cursor->SetPrefetchData(keys, primary_keys, values); | |
| 624 | |
| 625 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(response_id); | |
| 626 DCHECK(callbacks); | |
| 627 cursor->CachedContinue(callbacks); | |
| 628 pending_callbacks_.Remove(response_id); | |
| 629 } | |
| 630 | |
| 631 void IndexedDBDispatcher::OnBlocked(int32 thread_id, int32 response_id) { | |
| 632 DCHECK_EQ(thread_id, CurrentWorkerId()); | |
| 633 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(response_id); | |
| 634 DCHECK(callbacks); | |
| 635 callbacks->onBlocked(); | |
| 636 } | |
| 637 | |
| 638 void IndexedDBDispatcher::OnError(int32 thread_id, int32 response_id, int code, | |
| 639 const string16& message) { | |
| 640 DCHECK_EQ(thread_id, CurrentWorkerId()); | |
| 641 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(response_id); | |
| 642 if (!callbacks) | |
| 643 return; | |
| 644 callbacks->onError(WebIDBDatabaseError(code, message)); | |
| 645 pending_callbacks_.Remove(response_id); | |
| 646 } | |
| 647 | |
| 648 void IndexedDBDispatcher::OnAbort(int32 thread_id, int32 transaction_id) { | |
| 649 DCHECK_EQ(thread_id, CurrentWorkerId()); | |
| 650 WebIDBTransactionCallbacks* callbacks = | |
| 651 pending_transaction_callbacks_.Lookup(transaction_id); | |
| 652 if (!callbacks) | |
| 653 return; | |
| 654 callbacks->onAbort(); | |
| 655 pending_transaction_callbacks_.Remove(transaction_id); | |
| 656 } | |
| 657 | |
| 658 void IndexedDBDispatcher::OnComplete(int32 thread_id, int32 transaction_id) { | |
| 659 DCHECK_EQ(thread_id, CurrentWorkerId()); | |
| 660 WebIDBTransactionCallbacks* callbacks = | |
| 661 pending_transaction_callbacks_.Lookup(transaction_id); | |
| 662 if (!callbacks) | |
| 663 return; | |
| 664 callbacks->onComplete(); | |
| 665 pending_transaction_callbacks_.Remove(transaction_id); | |
| 666 } | |
| 667 | |
| 668 void IndexedDBDispatcher::OnVersionChange(int32 thread_id, | |
| 669 int32 database_id, | |
| 670 const string16& newVersion) { | |
| 671 DCHECK_EQ(thread_id, CurrentWorkerId()); | |
| 672 WebIDBDatabaseCallbacks* callbacks = | |
| 673 pending_database_callbacks_.Lookup(database_id); | |
| 674 // callbacks would be NULL if a versionchange event is received after close | |
| 675 // has been called. | |
| 676 if (!callbacks) | |
| 677 return; | |
| 678 callbacks->onVersionChange(newVersion); | |
| 679 } | |
| 680 | |
| 681 void IndexedDBDispatcher::ResetCursorPrefetchCaches(int32 exception_cursor_id) { | |
| 682 typedef std::map<int32, RendererWebIDBCursorImpl*>::iterator Iterator; | |
| 683 for (Iterator i = cursors_.begin(); i != cursors_.end(); ++i) { | |
| 684 if (i->first == exception_cursor_id) | |
| 685 continue; | |
| 686 i->second->ResetPrefetchCache(); | |
| 687 } | |
| 688 } | |
| OLD | NEW |