1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5function onCursor()
6{
7  var cursor = event.target.result;
8  if (cursor === null) {
9    debug('Reached end of object cursor.');
10    if (!gotObjectThroughCursor) {
11      fail('Did not get object through cursor.');
12      return;
13    }
14    done();
15    return;
16  }
17
18  debug('Got object through cursor.');
19  shouldBe('event.target.result.key', '55');
20  shouldBe('event.target.result.value.aValue', '"foo"');
21  gotObjectThroughCursor = true;
22
23  cursor.continue();
24}
25
26function onKeyCursor()
27{
28  var cursor = event.target.result;
29  if (cursor === null) {
30    debug('Reached end of key cursor.');
31    if (!gotKeyThroughCursor) {
32      fail('Did not get key through cursor.');
33      return;
34    }
35
36    var request = index.openCursor(IDBKeyRange.only(55));
37    request.onsuccess = onCursor;
38    request.onerror = unexpectedErrorCallback;
39    gotObjectThroughCursor = false;
40    return;
41  }
42
43  debug('Got key through cursor.');
44  shouldBe('event.target.result.key', '55');
45  shouldBe('event.target.result.primaryKey', '1');
46  gotKeyThroughCursor = true;
47
48  cursor.continue();
49}
50
51function getSuccess()
52{
53  debug('Successfully got object through key in index.');
54
55  shouldBe('event.target.result.aKey', '55');
56  shouldBe('event.target.result.aValue', '"foo"');
57
58  var request = index.openKeyCursor(IDBKeyRange.only(55));
59  request.onsuccess = onKeyCursor;
60  request.onerror = unexpectedErrorCallback;
61  gotKeyThroughCursor = false;
62}
63
64function getKeySuccess()
65{
66  debug('Successfully got key.');
67  shouldBe('event.target.result', '1');
68
69  var request = index.get(55);
70  request.onsuccess = getSuccess;
71  request.onerror = unexpectedErrorCallback;
72}
73
74function moreDataAdded()
75{
76  debug('Successfully added more data.');
77
78  var request = index.getKey(55);
79  request.onsuccess = getKeySuccess;
80  request.onerror = unexpectedErrorCallback;
81}
82
83function indexErrorExpected()
84{
85  debug('Existing index triggered on error as expected.');
86
87  var request = objectStore.put({'aKey': 55, 'aValue': 'foo'}, 1);
88  request.onsuccess = moreDataAdded;
89  request.onerror = unexpectedErrorCallback;
90}
91
92function indexSuccess()
93{
94  debug('Index created successfully.');
95
96  shouldBe("index.name", "'myIndex'");
97  shouldBe("index.objectStore.name", "'test'");
98  shouldBe("index.keyPath", "'aKey'");
99  shouldBe("index.unique", "true");
100
101  try {
102    request = objectStore.createIndex('myIndex', 'aKey', {unique: true});
103    fail('Re-creating an index must throw an exception');
104  } catch (e) {
105    indexErrorExpected();
106  }
107}
108
109function createIndex(expect_error)
110{
111  debug('Creating an index.');
112  try {
113    window.index = objectStore.createIndex('myIndex', 'aKey', {unique: true});
114    indexSuccess();
115  } catch (e) {
116    unexpectedErrorCallback();
117  }
118}
119
120function dataAddedSuccess()
121{
122  debug('Data added');
123  createIndex(false);
124}
125
126function populateObjectStore()
127{
128  debug('Populating object store');
129  db = event.target.result;
130  window.objectStore = db.createObjectStore('test');
131  var myValue = {'aKey': 21, 'aValue': '!42'};
132  var request = objectStore.add(myValue, 0);
133  request.onsuccess = dataAddedSuccess;
134  request.onerror = unexpectedErrorCallback;
135}
136
137function test() {
138  indexedDBTest(populateObjectStore);
139}
140
141