OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 window.indexedDB = window.indexedDB || window.webkitIndexedDB || | 5 window.indexedDB = window.indexedDB || window.webkitIndexedDB || |
6 window.mozIndexedDB || window.msIndexedDB; | 6 window.mozIndexedDB || window.msIndexedDB; |
7 window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange; | 7 window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange; |
8 | 8 |
9 var automation = { | 9 var automation = { |
10 results: {} | 10 results: {} |
11 }; | 11 }; |
12 | 12 |
13 automation.setDone = function() { | 13 automation.setDone = function() { |
14 this.setStatus("Test complete."); | 14 this.setStatus("Test complete."); |
15 document.cookie = '__done=1; path=/'; | 15 document.cookie = '__done=1; path=/'; |
16 }; | 16 }; |
17 | 17 |
18 automation.addResult = function(name, result) { | 18 automation.addResult = function(name, result) { |
19 result = "" + result; | 19 result = "" + result; |
20 this.results[name] = result; | 20 this.results[name] = result; |
21 var elt = document.getElementById('results'); | 21 var elt = document.getElementById('results'); |
22 var div = document.createElement('div'); | 22 var div = document.createElement('div'); |
23 div.innerText = name + ": " + result; | 23 div.textContent = name + ": " + result; |
24 elt.appendChild(div); | 24 elt.appendChild(div); |
25 }; | 25 }; |
26 | 26 |
27 automation.getResults = function() { | 27 automation.getResults = function() { |
28 return this.results; | 28 return this.results; |
29 }; | 29 }; |
30 | 30 |
31 automation.setStatus = function(s) { | 31 automation.setStatus = function(s) { |
32 document.getElementById('status').innerText = s; | 32 document.getElementById('status').textContent = s; |
33 }; | 33 }; |
34 | 34 |
35 function assert(t) { | 35 function assert(t) { |
36 if (!t) { | 36 if (!t) { |
37 var e = new Error("Assertion failed!"); | 37 var e = new Error("Assertion failed!"); |
38 console.log(e.stack); | 38 console.log(e.stack); |
39 throw e; | 39 throw e; |
40 } | 40 } |
41 } | 41 } |
42 | 42 |
43 function onError(e) { | 43 function onError(e) { |
44 var s = "Caught error."; | 44 var s = "Caught error."; |
45 if (e.target && e.target.webkitErrorMessage) | 45 if (e.target && e.target.webkitErrorMessage) |
46 s += "\n" + e.target.webkitErrorMessage; | 46 s += "\n" + e.target.webkitErrorMessage; |
| 47 else if (e.target && e.target.error) |
| 48 s += "\n" + e.target.error.name; |
47 console.log(s); | 49 console.log(s); |
48 automation.setStatus(s); | 50 automation.setStatus(s); |
49 e.stopPropagation(); | 51 e.stopPropagation(); |
50 throw new Error(e); | 52 throw new Error(e); |
51 } | 53 } |
52 | 54 |
53 var baseVersion = 2; // The version with our object stores. | 55 var baseVersion = 2; // The version with our object stores. |
54 var curVersion; | 56 var curVersion; |
55 | 57 |
56 // Valid options fields: | 58 // Valid options fields: |
57 // indexName: the name of an index to create on each object store | 59 // indexName: the name of an index to create on each object store |
58 // indexKeyPath: the key path for that index | 60 // indexKeyPath: the key path for that index |
59 // indexIsUnique: the "unique" option for IDBIndexParameters | 61 // indexIsUnique: the "unique" option for IDBIndexParameters |
60 // indexIsMultiEntry: the "multiEntry" option for IDBIndexParameters | 62 // indexIsMultiEntry: the "multiEntry" option for IDBIndexParameters |
61 // | 63 // |
62 function createDatabase( | 64 function createDatabase( |
63 name, objectStoreNames, handler, errorHandler, optionSets) { | 65 name, objectStoreNames, handler, errorHandler, optionSets) { |
64 var openRequest = indexedDB.open(name, baseVersion); | 66 var openRequest = indexedDB.open(name, baseVersion); |
65 openRequest.onblocked = errorHandler; | 67 openRequest.onblocked = errorHandler; |
| 68 openRequest.onerror = errorHandler; |
66 function createObjectStores(db) { | 69 function createObjectStores(db) { |
67 for (var store in objectStoreNames) { | 70 for (var store in objectStoreNames) { |
68 var name = objectStoreNames[store]; | 71 var name = objectStoreNames[store]; |
69 assert(!db.objectStoreNames.contains(name)); | 72 assert(!db.objectStoreNames.contains(name)); |
70 var os = db.createObjectStore(name); | 73 var os = db.createObjectStore(name); |
71 if (optionSets) { | 74 if (optionSets) { |
72 for (o in optionSets) { | 75 for (o in optionSets) { |
73 var options = optionSets[o]; | 76 var options = optionSets[o]; |
74 assert(options.indexName); | 77 assert(options.indexName); |
75 assert('indexKeyPath' in options); | 78 assert('indexKeyPath' in options); |
76 os.createIndex(options.indexName, options.indexKeyPath, | 79 os.createIndex(options.indexName, options.indexKeyPath, |
77 { unique: options.indexIsUnique, | 80 { unique: options.indexIsUnique, |
78 multiEntry: options.indexIsMultiEntry }); | 81 multiEntry: options.indexIsMultiEntry }); |
79 } | 82 } |
80 } | 83 } |
81 } | 84 } |
82 } | 85 } |
83 openRequest.onupgradeneeded = function(ev) { | 86 openRequest.onupgradeneeded = function(ev) { |
84 // TODO(ericu): This is the spec-compliant path, which doesn't yet work in | 87 // This is the spec-compliant path, which doesn't yet run in Chrome, but |
85 // Chrome, and isn't yet tested, as this function won't currently be called. | 88 // works in Firefox. |
86 assert(openRequest == ev.target); | 89 assert(openRequest == ev.target); |
87 createObjectStores(openRequest.result); | 90 var db = openRequest.result; |
| 91 db.onerror = errorHandler; |
| 92 createObjectStores(db); |
88 // onsuccess will get called after this exits. | 93 // onsuccess will get called after this exits. |
89 }; | 94 }; |
90 openRequest.onsuccess = function(ev) { | 95 openRequest.onsuccess = function(ev) { |
91 assert(openRequest == ev.target); | 96 assert(openRequest == ev.target); |
92 var db = openRequest.result; | 97 var db = openRequest.result; |
| 98 curVersion = db.version; |
93 db.onerror = function(ev) { | 99 db.onerror = function(ev) { |
94 console.log("db error", arguments, openRequest.webkitErrorMessage); | 100 console.log("db error", arguments, openRequest.webkitErrorMessage); |
95 errorHandler(); | 101 errorHandler(ev); |
96 } | 102 } |
97 if (db.version != baseVersion) { | 103 if (curVersion != baseVersion) { |
98 // This is the current Chrome path. | 104 // This is the legacy path, which runs only in Chrome. |
99 var setVersionRequest = db.setVersion(baseVersion); | 105 var setVersionRequest = db.setVersion(baseVersion); |
100 setVersionRequest.onerror = errorHandler; | 106 setVersionRequest.onerror = errorHandler; |
101 setVersionRequest.onsuccess = function(e) { | 107 setVersionRequest.onsuccess = function(e) { |
102 curVersion = db.version; | |
103 assert(setVersionRequest == e.target); | 108 assert(setVersionRequest == e.target); |
104 createObjectStores(db); | 109 createObjectStores(db); |
105 var versionTransaction = setVersionRequest.result; | 110 var versionTransaction = setVersionRequest.result; |
106 versionTransaction.oncomplete = function() { handler(db); }; | 111 versionTransaction.oncomplete = function() { handler(db); }; |
107 versionTransaction.onerror = onError; | 112 versionTransaction.onerror = onError; |
108 } | 113 } |
109 } else { | 114 } else { |
110 handler(db); | 115 handler(db); |
111 } | 116 } |
112 } | 117 } |
113 } | 118 } |
114 | 119 |
115 // You must close all database connections before calling this. | 120 // You must close all database connections before calling this. |
116 function alterObjectStores( | 121 function alterObjectStores( |
117 name, objectStoreNames, func, handler, errorHandler) { | 122 name, objectStoreNames, func, handler, errorHandler) { |
118 var version = curVersion + 1; | 123 var version = curVersion + 1; |
119 var openRequest = indexedDB.open(name, version); | 124 var openRequest = indexedDB.open(name, version); |
120 openRequest.onblocked = errorHandler; | 125 openRequest.onblocked = errorHandler; |
121 // TODO(ericu): This won't work in Firefox yet; see above in createDatabase. | 126 openRequest.onupgradeneeded = function(ev) { |
| 127 // This is the spec-compliant path, which doesn't yet run in Chrome, but |
| 128 // works in Firefox. |
| 129 doAlteration(ev.target.transaction); |
| 130 // onsuccess will get called after this exits. |
| 131 }; |
122 openRequest.onsuccess = function(ev) { | 132 openRequest.onsuccess = function(ev) { |
123 assert(openRequest == ev.target); | 133 assert(openRequest == ev.target); |
124 var db = openRequest.result; | 134 var db = openRequest.result; |
125 db.onerror = function(ev) { | 135 db.onerror = function(ev) { |
126 console.log("error altering db", arguments, | 136 console.log("error altering db", arguments, |
127 openRequest.webkitErrorMessage); | 137 openRequest.webkitErrorMessage); |
128 errorHandler(); | 138 errorHandler(); |
129 } | 139 } |
130 if (db.version != version) { | 140 if (db.version != version) { |
| 141 // This is the legacy path, which runs only in Chrome. |
131 var setVersionRequest = db.setVersion(version); | 142 var setVersionRequest = db.setVersion(version); |
132 setVersionRequest.onerror = errorHandler; | 143 setVersionRequest.onerror = errorHandler; |
133 setVersionRequest.onsuccess = | 144 setVersionRequest.onsuccess = |
134 function(e) { | 145 function(e) { |
135 curVersion = db.version; | 146 curVersion = db.version; |
136 assert(setVersionRequest == e.target); | 147 assert(setVersionRequest == e.target); |
137 var versionTransaction = setVersionRequest.result; | 148 var versionTransaction = setVersionRequest.result; |
138 versionTransaction.oncomplete = function() { handler(db); }; | 149 versionTransaction.oncomplete = function() { handler(db); }; |
139 versionTransaction.onerror = onError; | 150 versionTransaction.onerror = onError; |
140 for (var store in objectStoreNames) { | 151 doAlteration(versionTransaction); |
141 func(versionTransaction.objectStore(objectStoreNames[store])); | |
142 } | |
143 } | 152 } |
144 } else { | 153 } else { |
145 errorHandler(); | 154 handler(db); |
| 155 } |
| 156 } |
| 157 function doAlteration(target) { |
| 158 for (var store in objectStoreNames) { |
| 159 func(target.objectStore(objectStoreNames[store])); |
146 } | 160 } |
147 } | 161 } |
148 } | 162 } |
149 | 163 |
150 function getTransaction(db, objectStoreNames, mode, opt_handler) { | 164 function getTransaction(db, objectStoreNames, mode, opt_handler) { |
151 var transaction = db.transaction(objectStoreNames, mode); | 165 var transaction = db.transaction(objectStoreNames, mode); |
152 transaction.onerror = onError; | 166 transaction.onerror = onError; |
153 transaction.onabort = onError; | 167 transaction.onabort = onError; |
154 if (opt_handler) { | 168 if (opt_handler) { |
155 transaction.oncomplete = opt_handler; | 169 transaction.oncomplete = opt_handler; |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 // outside its range. | 353 // outside its range. |
340 oos.put(cursor.value, numKeys + Math.random()); | 354 oos.put(cursor.value, numKeys + Math.random()); |
341 values.push({key: cursor.key, value: cursor.value}); | 355 values.push({key: cursor.key, value: cursor.value}); |
342 cursor.continue(); | 356 cursor.continue(); |
343 } else { | 357 } else { |
344 assert(!numReadsLeft); | 358 assert(!numReadsLeft); |
345 } | 359 } |
346 } | 360 } |
347 request.onerror = onError; | 361 request.onerror = onError; |
348 } | 362 } |
OLD | NEW |