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(&params, 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(&params, 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(&params, 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(&params, 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(&params, 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