1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file. 4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_database.h" 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <set> 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/auto_reset.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/logging.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/run_loop.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_backing_store.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/indexed_db/indexed_db_callbacks.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/indexed_db/indexed_db_connection.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_cursor.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_fake_backing_store.h" 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_transaction.h" 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_value.h" 221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/indexed_db/mock_indexed_db_callbacks.h" 231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/indexed_db/mock_indexed_db_database_callbacks.h" 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/browser/indexed_db/mock_indexed_db_factory.h" 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "testing/gtest/include/gtest/gtest.h" 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16; 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace { 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kFakeChildProcessId = 0; 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace content { 34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST(IndexedDBDatabaseTest, BackingStoreRetention) { 36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<IndexedDBFakeBackingStore> backing_store = 37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new IndexedDBFakeBackingStore(); 38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(backing_store->HasOneRef()); 39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<MockIndexedDBFactory> factory = new MockIndexedDBFactory(); 410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch leveldb::Status s; 420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_refptr<IndexedDBDatabase> db = 430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch IndexedDBDatabase::Create(ASCIIToUTF16("db"), 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci backing_store.get(), 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci factory.get(), 460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch IndexedDBDatabase::Identifier(), 470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &s); 480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(s.ok()); 49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(backing_store->HasOneRef()); // local and db 50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) db = NULL; 51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(backing_store->HasOneRef()); // local 52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST(IndexedDBDatabaseTest, ConnectionLifecycle) { 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<IndexedDBFakeBackingStore> backing_store = 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new IndexedDBFakeBackingStore(); 57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(backing_store->HasOneRef()); // local 58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<MockIndexedDBFactory> factory = new MockIndexedDBFactory(); 600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch leveldb::Status s; 61ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_refptr<IndexedDBDatabase> db = 62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch IndexedDBDatabase::Create(ASCIIToUTF16("db"), 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci backing_store.get(), 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci factory.get(), 650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch IndexedDBDatabase::Identifier(), 660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &s); 670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(s.ok()); 68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(backing_store->HasOneRef()); // local and db 69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_refptr<MockIndexedDBCallbacks> request1(new MockIndexedDBCallbacks()); 711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_refptr<MockIndexedDBDatabaseCallbacks> callbacks1( 721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) new MockIndexedDBDatabaseCallbacks()); 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const int64 transaction_id1 = 1; 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IndexedDBPendingConnection connection1( 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request1, 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) callbacks1, 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kFakeChildProcessId, 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) transaction_id1, 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION); 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) db->OpenConnection(connection1); 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(backing_store->HasOneRef()); // db, connection count > 0 83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_refptr<MockIndexedDBCallbacks> request2(new MockIndexedDBCallbacks()); 851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_refptr<MockIndexedDBDatabaseCallbacks> callbacks2( 861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) new MockIndexedDBDatabaseCallbacks()); 87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const int64 transaction_id2 = 2; 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IndexedDBPendingConnection connection2( 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request2, 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) callbacks2, 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kFakeChildProcessId, 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) transaction_id2, 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION); 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) db->OpenConnection(connection2); 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(backing_store->HasOneRef()); // local and connection 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) request1->connection()->ForceClose(); 998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FALSE(request1->connection()->IsConnected()); 100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(backing_store->HasOneRef()); // local and connection 102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) request2->connection()->ForceClose(); 1048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FALSE(request2->connection()->IsConnected()); 1058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(backing_store->HasOneRef()); 1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_FALSE(db->backing_store()); 108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) db = NULL; 110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST(IndexedDBDatabaseTest, ForcedClose) { 113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<IndexedDBFakeBackingStore> backing_store = 114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new IndexedDBFakeBackingStore(); 115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(backing_store->HasOneRef()); 116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<MockIndexedDBFactory> factory = new MockIndexedDBFactory(); 1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch leveldb::Status s; 119ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_refptr<IndexedDBDatabase> database = 120ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch IndexedDBDatabase::Create(ASCIIToUTF16("db"), 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci backing_store.get(), 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci factory.get(), 1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch IndexedDBDatabase::Identifier(), 1240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &s); 1250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(s.ok()); 126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(backing_store->HasOneRef()); // local and db 127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_refptr<MockIndexedDBDatabaseCallbacks> callbacks( 1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) new MockIndexedDBDatabaseCallbacks()); 1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_refptr<MockIndexedDBCallbacks> request(new MockIndexedDBCallbacks()); 131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const int64 upgrade_transaction_id = 3; 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IndexedDBPendingConnection connection( 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request, 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) callbacks, 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kFakeChildProcessId, 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) upgrade_transaction_id, 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION); 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) database->OpenConnection(connection); 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(database.get(), request->connection()->database()); 140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const int64 transaction_id = 123; 142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::vector<int64> scope; 1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch database->CreateTransaction(transaction_id, 1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch request->connection(), 1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scope, 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebIDBTransactionModeReadOnly); 147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch request->connection()->ForceClose(); 149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(backing_store->HasOneRef()); // local 1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_TRUE(callbacks->abort_called()); 152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass MockDeleteCallbacks : public IndexedDBCallbacks { 1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MockDeleteCallbacks() 1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : IndexedDBCallbacks(NULL, 0, 0), 1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch blocked_called_(false), 159a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch success_called_(false) {} 1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void OnBlocked(int64 existing_version) OVERRIDE { 1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch blocked_called_ = true; 1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void OnSuccess(int64 result) OVERRIDE { success_called_ = true; } 1657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool blocked_called() const { return blocked_called_; } 1675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool success_called() const { return success_called_; } 1687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 1705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual ~MockDeleteCallbacks() {} 1717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool blocked_called_; 173a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool success_called_; 174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockDeleteCallbacks); 1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 1777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1787dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(IndexedDBDatabaseTest, PendingDelete) { 1797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<IndexedDBFakeBackingStore> backing_store = 1807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch new IndexedDBFakeBackingStore(); 1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(backing_store->HasOneRef()); // local 1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<MockIndexedDBFactory> factory = new MockIndexedDBFactory(); 1840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch leveldb::Status s; 185ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_refptr<IndexedDBDatabase> db = 186ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch IndexedDBDatabase::Create(ASCIIToUTF16("db"), 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci backing_store.get(), 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci factory.get(), 1890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch IndexedDBDatabase::Identifier(), 1900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &s); 1910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(s.ok()); 1927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(backing_store->HasOneRef()); // local and db 1937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_refptr<MockIndexedDBCallbacks> request1(new MockIndexedDBCallbacks()); 1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_refptr<MockIndexedDBDatabaseCallbacks> callbacks1( 1961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) new MockIndexedDBDatabaseCallbacks()); 1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const int64 transaction_id1 = 1; 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IndexedDBPendingConnection connection( 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request1, 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) callbacks1, 201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kFakeChildProcessId, 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) transaction_id1, 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION); 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) db->OpenConnection(connection); 2057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(backing_store->HasOneRef()); // local and db 2077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<MockDeleteCallbacks> request2(new MockDeleteCallbacks()); 2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch db->DeleteDatabase(request2); 2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(request2->blocked_called()); 212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch db->VersionChangeIgnored(); 2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(request2->blocked_called()); 214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(backing_store->HasOneRef()); // local and db 2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) db->Close(request1->connection(), true /* forced */); 2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_FALSE(db->backing_store()); 2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(backing_store->HasOneRef()); // local 2215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(request2->success_called()); 2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void DummyOperation(IndexedDBTransaction* transaction) { 225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class IndexedDBDatabaseOperationTest : public testing::Test { 228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) IndexedDBDatabaseOperationTest() 2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : commit_success_(leveldb::Status::OK()), 2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) factory_(new MockIndexedDBFactory()) {} 232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void SetUp() { 234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) backing_store_ = new IndexedDBFakeBackingStore(); 235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) leveldb::Status s; 236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) db_ = IndexedDBDatabase::Create(ASCIIToUTF16("db"), 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci backing_store_.get(), 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci factory_.get(), 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IndexedDBDatabase::Identifier(), 240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &s); 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(s.ok()); 242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) request_ = new MockIndexedDBCallbacks(); 244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callbacks_ = new MockIndexedDBDatabaseCallbacks(); 245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const int64 transaction_id = 1; 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) db_->OpenConnection(IndexedDBPendingConnection( 247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) request_, 248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callbacks_, 249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kFakeChildProcessId, 250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) transaction_id, 251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION)); 252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(IndexedDBDatabaseMetadata::NO_INT_VERSION, 253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) db_->metadata().int_version); 254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) transaction_ = new IndexedDBTransaction( 256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) transaction_id, 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callbacks_, 258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::set<int64>() /*scope*/, 259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebIDBTransactionModeVersionChange, 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci db_.get(), 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new IndexedDBFakeBackingStore::FakeTransaction(commit_success_)); 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci db_->TransactionCreated(transaction_.get()); 263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Add a dummy task which takes the place of the VersionChangeOperation 265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // which kicks off the upgrade. This ensures that the transaction has 266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // processed at least one task before the CreateObjectStore call. 267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) transaction_->ScheduleTask(base::Bind(&DummyOperation)); 268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void RunPostedTasks() { base::RunLoop().RunUntilIdle(); } 271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected: 273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<IndexedDBFakeBackingStore> backing_store_; 274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<IndexedDBDatabase> db_; 275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<MockIndexedDBCallbacks> request_; 276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<MockIndexedDBDatabaseCallbacks> callbacks_; 277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<IndexedDBTransaction> transaction_; 278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 27946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) leveldb::Status commit_success_; 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::MessageLoop message_loop_; 2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<MockIndexedDBFactory> factory_; 284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(IndexedDBDatabaseOperationTest); 286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(IndexedDBDatabaseOperationTest, CreateObjectStore) { 289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const int64 store_id = 1001; 291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) db_->CreateObjectStore(transaction_->id(), 292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) store_id, 293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASCIIToUTF16("store"), 294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IndexedDBKeyPath(), 295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false /*auto_increment*/); 296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); 297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunPostedTasks(); 298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) transaction_->Commit(); 299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); 300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(IndexedDBDatabaseOperationTest, CreateIndex) { 303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); 304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const int64 store_id = 1001; 305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) db_->CreateObjectStore(transaction_->id(), 306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) store_id, 307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASCIIToUTF16("store"), 308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IndexedDBKeyPath(), 309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false /*auto_increment*/); 310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); 311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const int64 index_id = 2002; 312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) db_->CreateIndex(transaction_->id(), 313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) store_id, 314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) index_id, 315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASCIIToUTF16("index"), 316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IndexedDBKeyPath(), 317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false /*unique*/, 318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false /*multi_entry*/); 319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ( 320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1ULL, 321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) db_->metadata().object_stores.find(store_id)->second.indexes.size()); 322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunPostedTasks(); 323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) transaction_->Commit(); 324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); 325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ( 326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1ULL, 327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) db_->metadata().object_stores.find(store_id)->second.indexes.size()); 328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class IndexedDBDatabaseOperationAbortTest 331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : public IndexedDBDatabaseOperationTest { 332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 33346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) IndexedDBDatabaseOperationAbortTest() { 33446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) commit_success_ = leveldb::Status::NotFound("Bummer."); 33546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 336f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 337f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 338f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(IndexedDBDatabaseOperationAbortTest); 339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(IndexedDBDatabaseOperationAbortTest, CreateObjectStore) { 342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); 343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const int64 store_id = 1001; 344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) db_->CreateObjectStore(transaction_->id(), 345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) store_id, 346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASCIIToUTF16("store"), 347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IndexedDBKeyPath(), 348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false /*auto_increment*/); 349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); 350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunPostedTasks(); 351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) transaction_->Commit(); 352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); 353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(IndexedDBDatabaseOperationAbortTest, CreateIndex) { 356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); 357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const int64 store_id = 1001; 358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) db_->CreateObjectStore(transaction_->id(), 359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) store_id, 360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASCIIToUTF16("store"), 361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IndexedDBKeyPath(), 362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false /*auto_increment*/); 363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); 364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const int64 index_id = 2002; 365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) db_->CreateIndex(transaction_->id(), 366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) store_id, 367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) index_id, 368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASCIIToUTF16("index"), 369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IndexedDBKeyPath(), 370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false /*unique*/, 371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false /*multi_entry*/); 372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ( 373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1ULL, 374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) db_->metadata().object_stores.find(store_id)->second.indexes.size()); 375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunPostedTasks(); 376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) transaction_->Commit(); 377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); 378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(IndexedDBDatabaseOperationTest, CreatePutDelete) { 381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); 382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const int64 store_id = 1001; 383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Creation is synchronous. 385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) db_->CreateObjectStore(transaction_->id(), 386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) store_id, 387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASCIIToUTF16("store"), 388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IndexedDBKeyPath(), 389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false /*auto_increment*/); 390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); 391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Put is asynchronous 394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IndexedDBValue value("value1", std::vector<IndexedDBBlobInfo>()); 39503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ScopedVector<storage::BlobDataHandle> handles; 396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<IndexedDBKey> key(new IndexedDBKey("key")); 397cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<IndexedDBDatabase::IndexKeys> index_keys; 398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<MockIndexedDBCallbacks> request( 399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new MockIndexedDBCallbacks(false)); 400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) db_->Put(transaction_->id(), 401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) store_id, 402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &value, 403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &handles, 404cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) key.Pass(), 405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebIDBPutModeAddOnly, 406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) request, 407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) index_keys); 408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Deletion is asynchronous. 410cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) db_->DeleteObjectStore(transaction_->id(), 411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) store_id); 412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); 413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This will execute the Put then Delete. 415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunPostedTasks(); 416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); 41746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 418f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) transaction_->Commit(); // Cleans up the object hierarchy. 419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace content 422