Chromium Code Reviews| 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 | 7 |
| 8 var automation = { | 8 var automation = { |
| 9 results: {} | 9 results: {} |
| 10 }; | 10 }; |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 33 | 33 |
| 34 function assert(t) { | 34 function assert(t) { |
| 35 if (!t) { | 35 if (!t) { |
| 36 var e = new Error("Assertion failed!"); | 36 var e = new Error("Assertion failed!"); |
| 37 console.log(e.stack); | 37 console.log(e.stack); |
| 38 throw e; | 38 throw e; |
| 39 } | 39 } |
| 40 } | 40 } |
| 41 | 41 |
| 42 function onError(e) { | 42 function onError(e) { |
| 43 console.log(e); | 43 var s = "Caught error."; |
| 44 if (e.target && e.target.webkitErrorMessage) | |
| 45 s += "\n" + e.target.webkitErrorMessage; | |
| 46 console.log(s); | |
| 47 automation.setStatus(s); | |
| 44 e.stopPropagation(); | 48 e.stopPropagation(); |
| 45 throw new Error(e); | 49 throw new Error(e); |
| 46 } | 50 } |
| 47 | 51 |
| 48 var version = 2; // The version with our object stores. | 52 var version = 2; // The version with our object stores. |
| 49 var db; | 53 var db; |
|
jsbell
2012/07/26 18:23:30
db is global here, but passed as arguments elsewhe
ericu
2012/07/26 20:24:11
Done.
| |
| 50 | 54 |
| 51 function createDatabase(name, objectStores, handler, errorHandler) { | 55 // Valid options fields: |
| 56 // indexName: the name of an index to create on each object store | |
| 57 // indexKeyPath: likewise | |
| 58 // indexIsUnique: the "unique" option for IDBIndexParameters | |
| 59 // indexIsMultiEntry: the "multiEntry" option for IDBIndexParameters | |
| 60 // | |
| 61 function createDatabase(name, objectStores, handler, errorHandler, options) { | |
|
jsbell
2012/07/26 18:23:30
So, rather than special casing options for indexes
ericu
2012/07/26 20:24:11
Let me think about that one for a later CL. Depen
| |
| 52 var openRequest = indexedDB.open(name, version); | 62 var openRequest = indexedDB.open(name, version); |
| 53 openRequest.onblocked = errorHandler; | 63 openRequest.onblocked = errorHandler; |
| 54 function createObjectStores(db) { | 64 function createObjectStores(db) { |
| 55 for (var store in objectStores) { | 65 for (var store in objectStores) { |
| 56 var name = objectStores[store]; | 66 var name = objectStores[store]; |
| 57 assert(!db.objectStoreNames.contains(name)); | 67 assert(!db.objectStoreNames.contains(name)); |
| 58 db.createObjectStore(name); | 68 var os = db.createObjectStore(name); |
| 69 if (options && options.indexName) { | |
| 70 assert(options.indexKeyPath || options.indexKeyPath == ""); | |
|
jsbell
2012/07/26 18:23:30
I'd go with: assert('indexKeyPath' in options);
ericu
2012/07/26 20:24:11
Much better, thanks.
| |
| 71 os.createIndex(options.indexName, options.indexKeyPath, | |
| 72 { unique: options.indexIsUnique, | |
| 73 multiEntry: options.indexIsMultiEntry }); | |
| 74 } | |
| 59 } | 75 } |
| 60 } | 76 } |
| 61 openRequest.onupgradeneeded = function(ev) { | 77 openRequest.onupgradeneeded = function(ev) { |
| 62 // TODO: This is the spec-compliant path, which doesn't yet work in Chrome, | 78 // TODO: This is the spec-compliant path, which doesn't yet work in Chrome, |
| 63 // and isn't yet tested, as this function won't currently be called. | 79 // and isn't yet tested, as this function won't currently be called. |
| 64 assert(openRequest == ev.target); | 80 assert(openRequest == ev.target); |
| 65 db = openRequest.result; | 81 db = openRequest.result; |
| 66 createObjectStores(db); | 82 createObjectStores(db); |
| 67 // onsuccess will get called after this exits. | 83 // onsuccess will get called after this exits. |
| 68 }; | 84 }; |
| 69 openRequest.onsuccess = function(ev) { | 85 openRequest.onsuccess = function(ev) { |
| 70 assert(openRequest == ev.target); | 86 assert(openRequest == ev.target); |
| 71 db = openRequest.result; | 87 db = openRequest.result; |
| 72 db.onerror = function(ev) { | 88 db.onerror = function(ev) { |
| 73 console.log("db error", arguments, openRequest.webkitErrorMessage); | 89 console.log("db error", arguments, openRequest.webkitErrorMessage); |
| 74 errorHandler(); | 90 errorHandler(); |
| 75 } | 91 } |
|
jsbell
2012/07/26 18:23:30
Missing semicolon. (Sorry about the style nits on
ericu
2012/07/26 20:24:11
No prob; it still needs fixing.
| |
| 76 if (db.version != version) { | 92 if (db.version != version) { |
| 77 // This is the current Chrome path. | 93 // This is the current Chrome path. |
| 78 var setVersionRequest = db.setVersion(version); | 94 var setVersionRequest = db.setVersion(version); |
| 79 setVersionRequest.onfailure = errorHandler; | 95 setVersionRequest.onfailure = errorHandler; |
| 80 setVersionRequest.onsuccess = | 96 setVersionRequest.onsuccess = |
| 81 function(e) { | 97 function(e) { |
|
jsbell
2012/07/26 18:23:30
Put on previous line to reduce indentation on foll
ericu
2012/07/26 20:24:11
Had to go and reread the style guide on this one;
| |
| 82 assert(setVersionRequest == e.target); | 98 assert(setVersionRequest == e.target); |
| 83 createObjectStores(db); | 99 createObjectStores(db); |
| 84 var versionTransaction = setVersionRequest.result; | 100 var versionTransaction = setVersionRequest.result; |
| 85 versionTransaction.oncomplete = function() {handler(db); }; | 101 versionTransaction.oncomplete = function() {handler(db); }; |
| 86 versionTransaction.onerror = onError; | 102 versionTransaction.onerror = onError; |
| 87 } | 103 } |
|
jsbell
2012/07/26 18:23:30
Missing semicolon.
ericu
2012/07/26 20:24:11
Done.
| |
| 88 } else { | 104 } else { |
| 89 handler(db); | 105 handler(db); |
| 90 } | 106 } |
| 91 } | 107 } |
| 92 } | 108 } |
| 93 | 109 |
| 94 function getTransaction(db, objectStoreNames, mode, opt_handler) { | 110 function getTransaction(db, objectStoreNames, mode, opt_handler) { |
| 95 var transaction = db.transaction(objectStoreNames, mode); | 111 var transaction = db.transaction(objectStoreNames, mode); |
| 96 transaction.onerror = onError; | 112 transaction.onerror = onError; |
| 97 transaction.onabort = onError; | 113 transaction.onabort = onError; |
| 98 if (opt_handler) { | 114 if (opt_handler) { |
| 99 transaction.oncomplete = opt_handler; | 115 transaction.oncomplete = opt_handler; |
| 100 } | 116 } |
| 101 return transaction; | 117 return transaction; |
| 102 } | 118 } |
| 103 | 119 |
| 104 function deleteDatabase(name, opt_handler) { | 120 function deleteDatabase(name, opt_handler) { |
| 105 var deleteRequest = indexedDB.deleteDatabase(name); | 121 var deleteRequest = indexedDB.deleteDatabase(name); |
| 106 deleteRequest.onerror = onError; | 122 deleteRequest.onerror = onError; |
| 107 if (opt_handler) { | 123 if (opt_handler) { |
| 108 deleteRequest.onsuccess = opt_handler; | 124 deleteRequest.onsuccess = opt_handler; |
| 109 } | 125 } |
| 110 } | 126 } |
| 111 | 127 |
| 112 function cleanUp(opt_handler) { | 128 function getCleanUpFunc(testName, startTime, onTestComplete) { |
| 113 if (db) { | 129 function onDeleted() { |
| 114 deleteDatabase(db, opt_handler); | 130 automation.setStatus("Deleted database."); |
| 115 db = null; | 131 onTestComplete(); |
| 132 } | |
| 133 return function() { | |
| 134 var duration = Date.now() - startTime; | |
| 135 // Ignore the cleanup time for this test. | |
| 136 automation.addResult(testName, duration); | |
| 137 automation.setStatus("Deleting database."); | |
| 138 // TODO: Turn on actual deletion; for now it's way too slow. | |
| 139 // deleteDatabase(testName, onDeleted); | |
| 140 onTestComplete(); | |
| 116 } | 141 } |
| 117 } | 142 } |
| 118 | 143 |
| 119 function stringOfLength(n) { | 144 function stringOfLength(n) { |
| 120 assert(n > 0); | 145 assert(n > 0); |
| 121 assert(n == Math.floor(n)); | 146 assert(n == Math.floor(n)); |
| 122 return new Array(n + 1).join('0'); | 147 return new Array(n + 1).join('0'); |
| 123 } | 148 } |
| OLD | NEW |