1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/indexed_db/indexed_db_dispatcher.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <utility> 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/format_macros.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_local.h" 13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/indexed_db/indexed_db_key_builders.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/child/indexed_db/webidbcursor_impl.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/child/indexed_db/webidbdatabase_impl.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/child/thread_safe_sender.h" 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/common/indexed_db/indexed_db_constants.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/indexed_db/indexed_db_messages.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_channel.h" 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebIDBDatabaseCallbacks.h" 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebIDBDatabaseError.h" 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebIDBDatabaseException.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing blink::WebBlobInfo; 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebData; 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBCallbacks; 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using blink::WebIDBCursor; 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBDatabase; 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBDatabaseCallbacks; 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBDatabaseError; 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKey; 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBMetadata; 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString; 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebVector; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::ThreadLocalPointer; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static base::LazyInstance<ThreadLocalPointer<IndexedDBDispatcher> >::Leaky 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_idb_dispatcher_tls = LAZY_INSTANCE_INITIALIZER; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IndexedDBDispatcher* const kHasBeenDeleted = 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<IndexedDBDispatcher*>(0x1); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // unnamed namespace 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const size_t kMaxIDBMessageOverhead = 1024 * 1024; // 1MB; arbitrarily chosen. 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const size_t kMaxIDBValueSizeInBytes = 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC::Channel::kMaximumMessageSize - kMaxIDBMessageOverhead; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIndexedDBDispatcher::IndexedDBDispatcher(ThreadSafeSender* thread_safe_sender) 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : thread_safe_sender_(thread_safe_sender) { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_idb_dispatcher_tls.Pointer()->Set(this); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IndexedDBDispatcher::~IndexedDBDispatcher() { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear any pending callbacks - which may result in dispatch requests - 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before marking the dispatcher as deleted. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_callbacks_.Clear(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_database_callbacks_.Clear(); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(pending_callbacks_.IsEmpty()); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(pending_database_callbacks_.IsEmpty()); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_idb_dispatcher_tls.Pointer()->Set(kHasBeenDeleted); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIndexedDBDispatcher* IndexedDBDispatcher::ThreadSpecificInstance( 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ThreadSafeSender* thread_safe_sender) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (g_idb_dispatcher_tls.Pointer()->Get() == kHasBeenDeleted) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Re-instantiating TLS IndexedDBDispatcher."; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_idb_dispatcher_tls.Pointer()->Set(NULL); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (g_idb_dispatcher_tls.Pointer()->Get()) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_idb_dispatcher_tls.Pointer()->Get(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IndexedDBDispatcher* dispatcher = new IndexedDBDispatcher(thread_safe_sender); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (WorkerTaskRunner::Instance()->CurrentWorkerId()) 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WorkerTaskRunner::Instance()->AddStopObserver(dispatcher); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dispatcher; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDispatcher::OnWorkerRunLoopStopped() { delete this; } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebIDBMetadata IndexedDBDispatcher::ConvertMetadata( 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IndexedDBDatabaseMetadata& idb_metadata) { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebIDBMetadata web_metadata; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_metadata.id = idb_metadata.id; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_metadata.name = idb_metadata.name; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_metadata.version = idb_metadata.version; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_metadata.intVersion = idb_metadata.int_version; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_metadata.maxObjectStoreId = idb_metadata.max_object_store_id; 94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) web_metadata.objectStores = 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebVector<WebIDBMetadata::ObjectStore>(idb_metadata.object_stores.size()); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < idb_metadata.object_stores.size(); ++i) { 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IndexedDBObjectStoreMetadata& idb_store_metadata = 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idb_metadata.object_stores[i]; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebIDBMetadata::ObjectStore& web_store_metadata = 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_metadata.objectStores[i]; 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_store_metadata.id = idb_store_metadata.id; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_store_metadata.name = idb_store_metadata.name; 105ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch web_store_metadata.keyPath = 106ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WebIDBKeyPathBuilder::Build(idb_store_metadata.keyPath); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_store_metadata.autoIncrement = idb_store_metadata.autoIncrement; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_store_metadata.maxIndexId = idb_store_metadata.max_index_id; 109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) web_store_metadata.indexes = 110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebVector<WebIDBMetadata::Index>(idb_store_metadata.indexes.size()); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t j = 0; j < idb_store_metadata.indexes.size(); ++j) { 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IndexedDBIndexMetadata& idb_index_metadata = 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) idb_store_metadata.indexes[j]; 115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebIDBMetadata::Index& web_index_metadata = web_store_metadata.indexes[j]; 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_index_metadata.id = idb_index_metadata.id; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_index_metadata.name = idb_index_metadata.name; 119ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch web_index_metadata.keyPath = 120ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WebIDBKeyPathBuilder::Build(idb_index_metadata.keyPath); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_index_metadata.unique = idb_index_metadata.unique; 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_index_metadata.multiEntry = idb_index_metadata.multiEntry; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return web_metadata; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void IndexedDBDispatcher::OnMessageReceived(const IPC::Message& msg) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(IndexedDBDispatcher, msg) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIDBCursor, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSuccessOpenCursor) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorAdvance, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSuccessCursorContinue) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorContinue, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSuccessCursorContinue) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessCursorPrefetch, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSuccessCursorPrefetch) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIDBDatabase, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSuccessIDBDatabase) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessIndexedDBKey, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSuccessIndexedDBKey) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessStringList, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSuccessStringList) 146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessValue, OnSuccessValue) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessValueWithKey, 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnSuccessValueWithKey) 149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessInteger, OnSuccessInteger) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksSuccessUndefined, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSuccessUndefined) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksError, OnError) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksIntBlocked, OnIntBlocked) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(IndexedDBMsg_CallbacksUpgradeNeeded, OnUpgradeNeeded) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksForcedClose, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnForcedClose) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksIntVersionChange, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnIntVersionChange) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksAbort, OnAbort) 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(IndexedDBMsg_DatabaseCallbacksComplete, OnComplete) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a message gets here, IndexedDBMessageFilter already determined that it 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is an IndexedDB message. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(handled) << "Didn't handle a message defined at line " 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << IPC_MESSAGE_ID_LINE(msg.type()); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IndexedDBDispatcher::Send(IPC::Message* msg) { 170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return thread_safe_sender_->Send(msg); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void IndexedDBDispatcher::RequestIDBCursorAdvance( 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long count, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebIDBCallbacks* callbacks_ptr, 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int32 ipc_cursor_id, 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 transaction_id) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset all cursor prefetch caches except for this cursor. 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResetCursorPrefetchCaches(transaction_id, ipc_cursor_id); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_callbacks_id = pending_callbacks_.Add(callbacks.release()); 184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Send(new IndexedDBHostMsg_CursorAdvance( 185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ipc_cursor_id, CurrentWorkerId(), ipc_callbacks_id, count)); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void IndexedDBDispatcher::RequestIDBCursorContinue( 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IndexedDBKey& key, 190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const IndexedDBKey& primary_key, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebIDBCallbacks* callbacks_ptr, 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int32 ipc_cursor_id, 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 transaction_id) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset all cursor prefetch caches except for this cursor. 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResetCursorPrefetchCaches(transaction_id, ipc_cursor_id); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_callbacks_id = pending_callbacks_.Add(callbacks.release()); 200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Send(new IndexedDBHostMsg_CursorContinue( 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ipc_cursor_id, CurrentWorkerId(), ipc_callbacks_id, key, primary_key)); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void IndexedDBDispatcher::RequestIDBCursorPrefetch( 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n, 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebIDBCallbacks* callbacks_ptr, 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int32 ipc_cursor_id) { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_callbacks_id = pending_callbacks_.Add(callbacks.release()); 211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Send(new IndexedDBHostMsg_CursorPrefetch( 212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ipc_cursor_id, CurrentWorkerId(), ipc_callbacks_id, n)); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDispatcher::RequestIDBCursorPrefetchReset(int used_prefetches, 216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int unused_prefetches, 217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int32 ipc_cursor_id) { 218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Send(new IndexedDBHostMsg_CursorPrefetchReset( 219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ipc_cursor_id, used_prefetches, unused_prefetches)); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::RequestIDBFactoryOpen( 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& name, 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 version, 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 transaction_id, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebIDBCallbacks* callbacks_ptr, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebIDBDatabaseCallbacks* database_callbacks_ptr, 2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::string& database_identifier) { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); 230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<WebIDBDatabaseCallbacks> database_callbacks( 231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) database_callbacks_ptr); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IndexedDBHostMsg_FactoryOpen_Params params; 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.ipc_thread_id = CurrentWorkerId(); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.ipc_callbacks_id = pending_callbacks_.Add(callbacks.release()); 236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.ipc_database_callbacks_id = 237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pending_database_callbacks_.Add(database_callbacks.release()); 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.database_identifier = database_identifier; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.name = name; 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.transaction_id = transaction_id; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.version = version; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new IndexedDBHostMsg_FactoryOpen(params)); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void IndexedDBDispatcher::RequestIDBFactoryGetDatabaseNames( 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebIDBCallbacks* callbacks_ptr, 2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::string& database_identifier) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IndexedDBHostMsg_FactoryGetDatabaseNames_Params params; 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.ipc_thread_id = CurrentWorkerId(); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.ipc_callbacks_id = pending_callbacks_.Add(callbacks.release()); 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.database_identifier = database_identifier; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new IndexedDBHostMsg_FactoryGetDatabaseNames(params)); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void IndexedDBDispatcher::RequestIDBFactoryDeleteDatabase( 258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& name, 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebIDBCallbacks* callbacks_ptr, 2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::string& database_identifier) { 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IndexedDBHostMsg_FactoryDeleteDatabase_Params params; 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.ipc_thread_id = CurrentWorkerId(); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.ipc_callbacks_id = pending_callbacks_.Add(callbacks.release()); 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.database_identifier = database_identifier; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.name = name; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new IndexedDBHostMsg_FactoryDeleteDatabase(params)); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::RequestIDBDatabaseClose( 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_database_id, 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_database_callbacks_id) { 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new IndexedDBHostMsg_DatabaseClose(ipc_database_id)); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There won't be pending database callbacks if the transaction was aborted in 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the initial upgradeneeded event handler. 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_database_callbacks_.Lookup(ipc_database_callbacks_id)) 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_database_callbacks_.Remove(ipc_database_callbacks_id); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 281116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid IndexedDBDispatcher::NotifyIDBDatabaseVersionChangeIgnored( 282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int32 ipc_database_id) { 283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Send(new IndexedDBHostMsg_DatabaseVersionChangeIgnored(ipc_database_id)); 284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::RequestIDBDatabaseCreateTransaction( 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_database_id, 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 transaction_id, 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebIDBDatabaseCallbacks* database_callbacks_ptr, 2907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WebVector<long long> object_store_ids, 291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebIDBTransactionMode mode) { 292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<WebIDBDatabaseCallbacks> database_callbacks( 293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) database_callbacks_ptr); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IndexedDBHostMsg_DatabaseCreateTransaction_Params params; 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.ipc_thread_id = CurrentWorkerId(); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.ipc_database_id = ipc_database_id; 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.transaction_id = transaction_id; 298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.ipc_database_callbacks_id = 299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pending_database_callbacks_.Add(database_callbacks.release()); 300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.object_store_ids 301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) .assign(object_store_ids.data(), 302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) object_store_ids.data() + object_store_ids.size()); 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.mode = mode; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new IndexedDBHostMsg_DatabaseCreateTransaction(params)); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::RequestIDBDatabaseGet( 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_database_id, 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 transaction_id, 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 object_store_id, 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 index_id, 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IndexedDBKeyRange& key_range, 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool key_only, 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebIDBCallbacks* callbacks) { 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResetCursorPrefetchCaches(transaction_id, kAllCursors); 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IndexedDBHostMsg_DatabaseGet_Params params; 318f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) init_params(¶ms, callbacks); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.ipc_database_id = ipc_database_id; 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.transaction_id = transaction_id; 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.object_store_id = object_store_id; 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.index_id = index_id; 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.key_range = key_range; 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.key_only = key_only; 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new IndexedDBHostMsg_DatabaseGet(params)); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::RequestIDBDatabasePut( 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_database_id, 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 transaction_id, 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 object_store_id, 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebData& value, 333c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const blink::WebVector<WebBlobInfo>& web_blob_info, 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IndexedDBKey& key, 335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebIDBPutMode put_mode, 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebIDBCallbacks* callbacks, 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebVector<long long>& index_ids, 3387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const WebVector<WebVector<WebIDBKey> >& index_keys) { 339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (value.size() + key.size_estimate() > kMaxIDBValueSizeInBytes) { 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callbacks->onError(WebIDBDatabaseError( 341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebIDBDatabaseExceptionUnknownError, 342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebString::fromUTF8(base::StringPrintf( 343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "The serialized value is too large" 344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) " (size=%" PRIuS " bytes, max=%" PRIuS " bytes).", 345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) value.size(), 346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) kMaxIDBValueSizeInBytes).c_str()))); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResetCursorPrefetchCaches(transaction_id, kAllCursors); 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IndexedDBHostMsg_DatabasePut_Params params; 352f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) init_params(¶ms, callbacks); 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.ipc_database_id = ipc_database_id; 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.transaction_id = transaction_id; 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.object_store_id = object_store_id; 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.value.assign(value.data(), value.data() + value.size()); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.key = key; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.put_mode = put_mode; 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_EQ(index_ids.size(), index_keys.size()); 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.index_keys.resize(index_ids.size()); 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0, len = index_ids.size(); i < len; ++i) { 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.index_keys[i].first = index_ids[i]; 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.index_keys[i].second.resize(index_keys[i].size()); 366868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (size_t j = 0; j < index_keys[i].size(); ++j) { 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.index_keys[i].second[j] = 368ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch IndexedDBKey(IndexedDBKeyBuilder::Build(index_keys[i][j])); 369868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 372c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch params.blob_or_file_info.resize(web_blob_info.size()); 373c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for (size_t i = 0; i < web_blob_info.size(); ++i) { 374c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const WebBlobInfo& info = web_blob_info[i]; 375c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IndexedDBMsg_BlobOrFileInfo& blob_or_file_info = 376c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch params.blob_or_file_info[i]; 377c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blob_or_file_info.is_file = info.isFile(); 378c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (info.isFile()) { 379c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blob_or_file_info.file_path = info.filePath(); 380c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blob_or_file_info.file_name = info.fileName(); 3816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) blob_or_file_info.last_modified = info.lastModified(); 382c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 3836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) blob_or_file_info.size = info.size(); 384c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blob_or_file_info.uuid = info.uuid().latin1(); 385c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(blob_or_file_info.uuid.size()); 386c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blob_or_file_info.mime_type = info.type(); 387c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 388c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new IndexedDBHostMsg_DatabasePut(params)); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::RequestIDBDatabaseOpenCursor( 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_database_id, 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 transaction_id, 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 object_store_id, 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 index_id, 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IndexedDBKeyRange& key_range, 398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebIDBCursorDirection direction, 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool key_only, 400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebIDBTaskType task_type, 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebIDBCallbacks* callbacks) { 4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResetCursorPrefetchCaches(transaction_id, kAllCursors); 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IndexedDBHostMsg_DatabaseOpenCursor_Params params; 404f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) init_params(¶ms, callbacks); 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.ipc_database_id = ipc_database_id; 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.transaction_id = transaction_id; 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.object_store_id = object_store_id; 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.index_id = index_id; 4097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch params.key_range = key_range; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.direction = direction; 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.key_only = key_only; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.task_type = task_type; 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new IndexedDBHostMsg_DatabaseOpenCursor(params)); 4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(cursor_transaction_ids_.find(params.ipc_callbacks_id) == 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cursor_transaction_ids_.end()); 4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cursor_transaction_ids_[params.ipc_callbacks_id] = transaction_id; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::RequestIDBDatabaseCount( 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_database_id, 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 transaction_id, 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 object_store_id, 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 index_id, 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IndexedDBKeyRange& key_range, 4267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WebIDBCallbacks* callbacks) { 4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResetCursorPrefetchCaches(transaction_id, kAllCursors); 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IndexedDBHostMsg_DatabaseCount_Params params; 429f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) init_params(¶ms, callbacks); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.ipc_database_id = ipc_database_id; 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.transaction_id = transaction_id; 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.object_store_id = object_store_id; 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.index_id = index_id; 4347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch params.key_range = key_range; 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new IndexedDBHostMsg_DatabaseCount(params)); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::RequestIDBDatabaseDeleteRange( 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_database_id, 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 transaction_id, 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 object_store_id, 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IndexedDBKeyRange& key_range, 4437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WebIDBCallbacks* callbacks) { 4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResetCursorPrefetchCaches(transaction_id, kAllCursors); 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IndexedDBHostMsg_DatabaseDeleteRange_Params params; 446f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) init_params(¶ms, callbacks); 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.ipc_database_id = ipc_database_id; 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.transaction_id = transaction_id; 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.object_store_id = object_store_id; 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.key_range = key_range; 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new IndexedDBHostMsg_DatabaseDeleteRange(params)); 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::RequestIDBDatabaseClear( 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_database_id, 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 transaction_id, 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 object_store_id, 4587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WebIDBCallbacks* callbacks_ptr) { 4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResetCursorPrefetchCaches(transaction_id, kAllCursors); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebIDBCallbacks> callbacks(callbacks_ptr); 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_callbacks_id = pending_callbacks_.Add(callbacks.release()); 462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Send(new IndexedDBHostMsg_DatabaseClear(CurrentWorkerId(), 463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ipc_callbacks_id, 464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ipc_database_id, 465868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) transaction_id, 466868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) object_store_id)); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::CursorDestroyed(int32 ipc_cursor_id) { 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursors_.erase(ipc_cursor_id); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::DatabaseDestroyed(int32 ipc_database_id) { 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(databases_.count(ipc_database_id), 1u); 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) databases_.erase(ipc_database_id); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::OnSuccessIDBDatabase( 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_thread_id, 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_callbacks_id, 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_database_callbacks_id, 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_object_id, 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IndexedDBDatabaseMetadata& idb_metadata) { 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!callbacks) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebIDBMetadata metadata(ConvertMetadata(idb_metadata)); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If an upgrade was performed, count will be non-zero. 490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WebIDBDatabase* database = NULL; 491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Back-end will send kNoDatabase if it was already sent in OnUpgradeNeeded. 493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // May already be deleted and removed from the table, but do not recreate.. 494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ipc_object_id != kNoDatabase) { 495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(!databases_.count(ipc_object_id)); 4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) database = databases_[ipc_object_id] = new WebIDBDatabaseImpl( 497eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ipc_object_id, ipc_database_callbacks_id, thread_safe_sender_.get()); 498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) callbacks->onSuccess(database, metadata); 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_callbacks_.Remove(ipc_callbacks_id); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDispatcher::OnSuccessIndexedDBKey(int32 ipc_thread_id, 505868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int32 ipc_callbacks_id, 506868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const IndexedDBKey& key) { 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!callbacks) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 511ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch callbacks->onSuccess(WebIDBKeyBuilder::Build(key)); 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_callbacks_.Remove(ipc_callbacks_id); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void IndexedDBDispatcher::OnSuccessStringList( 516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int32 ipc_thread_id, 517868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int32 ipc_callbacks_id, 518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<base::string16>& value) { 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!callbacks) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callbacks->onSuccess(WebVector<WebString>(value)); 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_callbacks_.Remove(ipc_callbacks_id); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic void PrepareWebValueAndBlobInfo( 5285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::string& value, 5295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::vector<IndexedDBMsg_BlobOrFileInfo>& blob_info, 5305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebData* web_value, 5315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu blink::WebVector<WebBlobInfo>* web_blob_info) { 5325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (value.empty()) 5345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 5355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu web_value->assign(&*value.begin(), value.size()); 5375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu blink::WebVector<WebBlobInfo> local_blob_info(blob_info.size()); 5385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (size_t i = 0; i < blob_info.size(); ++i) { 5395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const IndexedDBMsg_BlobOrFileInfo& info = blob_info[i]; 5405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (info.is_file) { 5415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu local_blob_info[i] = WebBlobInfo(WebString::fromUTF8(info.uuid.c_str()), 5425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu info.file_path, 5435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu info.file_name, 5445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu info.mime_type, 5455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu info.last_modified, 5465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu info.size); 5475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } else { 5485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu local_blob_info[i] = WebBlobInfo( 5495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebString::fromUTF8(info.uuid.c_str()), info.mime_type, info.size); 5505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 5515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 5525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu web_blob_info->swap(local_blob_info); 5535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 5545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 555c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid IndexedDBDispatcher::OnSuccessValue( 5565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const IndexedDBMsg_CallbacksSuccessValue_Params& params) { 5575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK_EQ(params.ipc_thread_id, CurrentWorkerId()); 5585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebIDBCallbacks* callbacks = 5595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu pending_callbacks_.Lookup(params.ipc_callbacks_id); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!callbacks) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebData web_value; 5635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebVector<WebBlobInfo> web_blob_info; 5645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu PrepareWebValueAndBlobInfo( 5655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu params.value, params.blob_or_file_info, &web_value, &web_blob_info); 5665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu callbacks->onSuccess(web_value, web_blob_info); 5675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu pending_callbacks_.Remove(params.ipc_callbacks_id); 5685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu cursor_transaction_ids_.erase(params.ipc_callbacks_id); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::OnSuccessValueWithKey( 5725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const IndexedDBMsg_CallbacksSuccessValueWithKey_Params& params) { 5735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK_EQ(params.ipc_thread_id, CurrentWorkerId()); 5745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebIDBCallbacks* callbacks = 5755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu pending_callbacks_.Lookup(params.ipc_callbacks_id); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!callbacks) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebData web_value; 5795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebVector<WebBlobInfo> web_blob_info; 5805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu PrepareWebValueAndBlobInfo( 5815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu params.value, params.blob_or_file_info, &web_value, &web_blob_info); 582ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch callbacks->onSuccess(web_value, 5835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu web_blob_info, 5845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebIDBKeyBuilder::Build(params.primary_key), 5855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebIDBKeyPathBuilder::Build(params.key_path)); 5865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu pending_callbacks_.Remove(params.ipc_callbacks_id); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDispatcher::OnSuccessInteger(int32 ipc_thread_id, 590868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int32 ipc_callbacks_id, 591868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 value) { 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!callbacks) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callbacks->onSuccess(value); 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_callbacks_.Remove(ipc_callbacks_id); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 600868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void IndexedDBDispatcher::OnSuccessUndefined(int32 ipc_thread_id, 601868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int32 ipc_callbacks_id) { 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!callbacks) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callbacks->onSuccess(); 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_callbacks_.Remove(ipc_callbacks_id); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void IndexedDBDispatcher::OnSuccessOpenCursor( 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IndexedDBMsg_CallbacksSuccessIDBCursor_Params& p) { 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_callbacks_id = p.ipc_callbacks_id; 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_object_id = p.ipc_cursor_id; 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IndexedDBKey& key = p.key; 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IndexedDBKey& primary_key = p.primary_key; 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebData web_value; 6185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebVector<WebBlobInfo> web_blob_info; 6195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu PrepareWebValueAndBlobInfo( 6205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu p.value, p.blob_or_file_info, &web_value, &web_blob_info); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(cursor_transaction_ids_.find(ipc_callbacks_id) != 6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cursor_transaction_ids_.end()); 6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 transaction_id = cursor_transaction_ids_[ipc_callbacks_id]; 6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cursor_transaction_ids_.erase(ipc_callbacks_id); 6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 627868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!callbacks) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebIDBCursorImpl* cursor = new WebIDBCursorImpl( 6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ipc_object_id, transaction_id, thread_safe_sender_.get()); 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursors_[ipc_object_id] = cursor; 6345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu callbacks->onSuccess(cursor, 6355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebIDBKeyBuilder::Build(key), 6365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebIDBKeyBuilder::Build(primary_key), 6375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu web_value, 6385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu web_blob_info); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_callbacks_.Remove(ipc_callbacks_id); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void IndexedDBDispatcher::OnSuccessCursorContinue( 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IndexedDBMsg_CallbacksSuccessCursorContinue_Params& p) { 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_callbacks_id = p.ipc_callbacks_id; 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_cursor_id = p.ipc_cursor_id; 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IndexedDBKey& key = p.key; 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IndexedDBKey& primary_key = p.primary_key; 6507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& value = p.value; 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 652010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (cursors_.find(ipc_cursor_id) == cursors_.end()) 653010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!callbacks) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebData web_value; 6605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebVector<WebBlobInfo> web_blob_info; 6615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu PrepareWebValueAndBlobInfo( 6625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu value, p.blob_or_file_info, &web_value, &web_blob_info); 663ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch callbacks->onSuccess(WebIDBKeyBuilder::Build(key), 6645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebIDBKeyBuilder::Build(primary_key), 6655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu web_value, 6665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu web_blob_info); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_callbacks_.Remove(ipc_callbacks_id); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void IndexedDBDispatcher::OnSuccessCursorPrefetch( 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params& p) { 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_callbacks_id = p.ipc_callbacks_id; 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_cursor_id = p.ipc_cursor_id; 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<IndexedDBKey>& keys = p.keys; 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<IndexedDBKey>& primary_keys = p.primary_keys; 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<WebData> values(p.values.size()); 6795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK_EQ(p.values.size(), p.blob_or_file_infos.size()); 6805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::vector<WebVector<WebBlobInfo> > blob_infos(p.blob_or_file_infos.size()); 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < p.values.size(); ++i) { 6825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu PrepareWebValueAndBlobInfo( 6835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu p.values[i], p.blob_or_file_infos[i], &values[i], &blob_infos[i]); 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 685010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::map<int32, WebIDBCursorImpl*>::const_iterator cur_iter = 686010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cursors_.find(ipc_cursor_id); 687010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (cur_iter == cursors_.end()) 688010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 689010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 690010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cur_iter->second->SetPrefetchData(keys, primary_keys, values, blob_infos); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(callbacks); 694010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cur_iter->second->CachedContinue(callbacks); 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_callbacks_.Remove(ipc_callbacks_id); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::OnIntBlocked(int32 ipc_thread_id, 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_callbacks_id, 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 existing_version) { 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(callbacks); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callbacks->onBlocked(existing_version); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::OnUpgradeNeeded( 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IndexedDBMsg_CallbacksUpgradeNeeded_Params& p) { 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(p.ipc_callbacks_id); 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(callbacks); 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebIDBMetadata metadata(ConvertMetadata(p.idb_metadata)); 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!databases_.count(p.ipc_database_id)); 714eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch databases_[p.ipc_database_id] = 7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new WebIDBDatabaseImpl(p.ipc_database_id, 7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) p.ipc_database_callbacks_id, 7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) thread_safe_sender_.get()); 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callbacks->onUpgradeNeeded( 719eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch p.old_version, 720eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch databases_[p.ipc_database_id], 721eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch metadata, 722f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static_cast<blink::WebIDBDataLoss>(p.data_loss), 7230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) WebString::fromUTF8(p.data_loss_message)); 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::OnError(int32 ipc_thread_id, 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_callbacks_id, 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int code, 729a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& message) { 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!callbacks) 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 734eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (message.empty()) 735eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callbacks->onError(WebIDBDatabaseError(code)); 736eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 737eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callbacks->onError(WebIDBDatabaseError(code, message)); 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_callbacks_.Remove(ipc_callbacks_id); 7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cursor_transaction_ids_.erase(ipc_callbacks_id); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::OnAbort(int32 ipc_thread_id, 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_database_callbacks_id, 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 transaction_id, 745868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int code, 746a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& message) { 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebIDBDatabaseCallbacks* callbacks = 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_database_callbacks_.Lookup(ipc_database_callbacks_id); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!callbacks) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 752eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (message.empty()) 753eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callbacks->onAbort(transaction_id, WebIDBDatabaseError(code)); 754eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 755eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callbacks->onAbort(transaction_id, WebIDBDatabaseError(code, message)); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::OnComplete(int32 ipc_thread_id, 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_database_callbacks_id, 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 transaction_id) { 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebIDBDatabaseCallbacks* callbacks = 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_database_callbacks_.Lookup(ipc_database_callbacks_id); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!callbacks) 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callbacks->onComplete(transaction_id); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::OnForcedClose(int32 ipc_thread_id, 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_database_callbacks_id) { 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebIDBDatabaseCallbacks* callbacks = 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_database_callbacks_.Lookup(ipc_database_callbacks_id); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!callbacks) 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callbacks->onForcedClose(); 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::OnIntVersionChange(int32 ipc_thread_id, 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_database_callbacks_id, 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 old_version, 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 new_version) { 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebIDBDatabaseCallbacks* callbacks = 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_database_callbacks_.Lookup(ipc_database_callbacks_id); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // callbacks would be NULL if a versionchange event is received after close 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // has been called. 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!callbacks) 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callbacks->onVersionChange(old_version, new_version); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void IndexedDBDispatcher::ResetCursorPrefetchCaches( 7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 transaction_id, 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 ipc_exception_cursor_id) { 7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef std::map<int32, WebIDBCursorImpl*>::iterator Iterator; 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (Iterator i = cursors_.begin(); i != cursors_.end(); ++i) { 7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (i->first == ipc_exception_cursor_id || 7995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) i->second->transaction_id() != transaction_id) 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i->second->ResetPrefetchCache(); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 806