| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | function onCursor() | 
 | { | 
 |   var cursor = event.target.result; | 
 |   if (cursor === null) { | 
 |     debug('Reached end of object cursor.'); | 
 |     if (!gotObjectThroughCursor) { | 
 |       fail('Did not get object through cursor.'); | 
 |       return; | 
 |     } | 
 |     done(); | 
 |     return; | 
 |   } | 
 |  | 
 |   debug('Got object through cursor.'); | 
 |   shouldBe('event.target.result.key', '55'); | 
 |   shouldBe('event.target.result.value.aValue', '"foo"'); | 
 |   gotObjectThroughCursor = true; | 
 |  | 
 |   cursor.continue(); | 
 | } | 
 |  | 
 | function onKeyCursor() | 
 | { | 
 |   var cursor = event.target.result; | 
 |   if (cursor === null) { | 
 |     debug('Reached end of key cursor.'); | 
 |     if (!gotKeyThroughCursor) { | 
 |       fail('Did not get key through cursor.'); | 
 |       return; | 
 |     } | 
 |  | 
 |     var request = index.openCursor(IDBKeyRange.only(55)); | 
 |     request.onsuccess = onCursor; | 
 |     request.onerror = unexpectedErrorCallback; | 
 |     gotObjectThroughCursor = false; | 
 |     return; | 
 |   } | 
 |  | 
 |   debug('Got key through cursor.'); | 
 |   shouldBe('event.target.result.key', '55'); | 
 |   shouldBe('event.target.result.primaryKey', '1'); | 
 |   gotKeyThroughCursor = true; | 
 |  | 
 |   cursor.continue(); | 
 | } | 
 |  | 
 | function getSuccess() | 
 | { | 
 |   debug('Successfully got object through key in index.'); | 
 |  | 
 |   shouldBe('event.target.result.aKey', '55'); | 
 |   shouldBe('event.target.result.aValue', '"foo"'); | 
 |  | 
 |   var request = index.openKeyCursor(IDBKeyRange.only(55)); | 
 |   request.onsuccess = onKeyCursor; | 
 |   request.onerror = unexpectedErrorCallback; | 
 |   gotKeyThroughCursor = false; | 
 | } | 
 |  | 
 | function getKeySuccess() | 
 | { | 
 |   debug('Successfully got key.'); | 
 |   shouldBe('event.target.result', '1'); | 
 |  | 
 |   var request = index.get(55); | 
 |   request.onsuccess = getSuccess; | 
 |   request.onerror = unexpectedErrorCallback; | 
 | } | 
 |  | 
 | function moreDataAdded() | 
 | { | 
 |   debug('Successfully added more data.'); | 
 |  | 
 |   var request = index.getKey(55); | 
 |   request.onsuccess = getKeySuccess; | 
 |   request.onerror = unexpectedErrorCallback; | 
 | } | 
 |  | 
 | function indexErrorExpected() | 
 | { | 
 |   debug('Existing index triggered on error as expected.'); | 
 |  | 
 |   var request = objectStore.put({'aKey': 55, 'aValue': 'foo'}, 1); | 
 |   request.onsuccess = moreDataAdded; | 
 |   request.onerror = unexpectedErrorCallback; | 
 | } | 
 |  | 
 | function indexSuccess() | 
 | { | 
 |   debug('Index created successfully.'); | 
 |  | 
 |   shouldBe("index.name", "'myIndex'"); | 
 |   shouldBe("index.objectStore.name", "'test'"); | 
 |   shouldBe("index.keyPath", "'aKey'"); | 
 |   shouldBe("index.unique", "true"); | 
 |  | 
 |   try { | 
 |     request = objectStore.createIndex('myIndex', 'aKey', {unique: true}); | 
 |     fail('Re-creating an index must throw an exception'); | 
 |   } catch (e) { | 
 |     indexErrorExpected(); | 
 |   } | 
 | } | 
 |  | 
 | function createIndex(expect_error) | 
 | { | 
 |   debug('Creating an index.'); | 
 |   try { | 
 |     window.index = objectStore.createIndex('myIndex', 'aKey', {unique: true}); | 
 |     indexSuccess(); | 
 |   } catch (e) { | 
 |     unexpectedErrorCallback(); | 
 |   } | 
 | } | 
 |  | 
 | function dataAddedSuccess() | 
 | { | 
 |   debug('Data added'); | 
 |   createIndex(false); | 
 | } | 
 |  | 
 | function populateObjectStore() | 
 | { | 
 |   debug('Populating object store'); | 
 |   db = event.target.result; | 
 |   window.objectStore = db.createObjectStore('test'); | 
 |   var myValue = {'aKey': 21, 'aValue': '!42'}; | 
 |   var request = objectStore.add(myValue, 0); | 
 |   request.onsuccess = dataAddedSuccess; | 
 |   request.onerror = unexpectedErrorCallback; | 
 | } | 
 |  | 
 | function test() { | 
 |   indexedDBTest(populateObjectStore); | 
 | } | 
 |  |