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; | |
50 | 53 |
51 function createDatabase(name, objectStores, handler, errorHandler) { | 54 // Valid options fields: |
| 55 // indexName: the name of an index to create on each object store |
| 56 // indexKeyPath: likewise |
| 57 // indexIsUnique: the "unique" option for IDBIndexParameters |
| 58 // indexIsMultiEntry: the "multiEntry" option for IDBIndexParameters |
| 59 // |
| 60 function createDatabase( |
| 61 name, objectStoreNames, handler, errorHandler, options) { |
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 objectStoreNames) { |
56 var name = objectStores[store]; | 66 var name = objectStoreNames[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('indexKeyPath' in options); |
| 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 createObjectStores(openRequest.result); |
66 createObjectStores(db); | |
67 // onsuccess will get called after this exits. | 82 // onsuccess will get called after this exits. |
68 }; | 83 }; |
69 openRequest.onsuccess = function(ev) { | 84 openRequest.onsuccess = function(ev) { |
70 assert(openRequest == ev.target); | 85 assert(openRequest == ev.target); |
71 db = openRequest.result; | 86 var db = openRequest.result; |
72 db.onerror = function(ev) { | 87 db.onerror = function(ev) { |
73 console.log("db error", arguments, openRequest.webkitErrorMessage); | 88 console.log("db error", arguments, openRequest.webkitErrorMessage); |
74 errorHandler(); | 89 errorHandler(); |
75 } | 90 }; |
76 if (db.version != version) { | 91 if (db.version != version) { |
77 // This is the current Chrome path. | 92 // This is the current Chrome path. |
78 var setVersionRequest = db.setVersion(version); | 93 var setVersionRequest = db.setVersion(version); |
79 setVersionRequest.onfailure = errorHandler; | 94 setVersionRequest.onfailure = errorHandler; |
80 setVersionRequest.onsuccess = | 95 setVersionRequest.onsuccess = function(e) { |
81 function(e) { | 96 assert(setVersionRequest == e.target); |
82 assert(setVersionRequest == e.target); | 97 createObjectStores(db); |
83 createObjectStores(db); | 98 var versionTransaction = setVersionRequest.result; |
84 var versionTransaction = setVersionRequest.result; | 99 versionTransaction.oncomplete = function() {handler(db); }; |
85 versionTransaction.oncomplete = function() {handler(db); }; | 100 versionTransaction.onerror = onError; |
86 versionTransaction.onerror = onError; | 101 }; |
87 } | |
88 } else { | 102 } else { |
89 handler(db); | 103 handler(db); |
90 } | 104 } |
91 } | 105 } |
92 } | 106 } |
93 | 107 |
94 function getTransaction(db, objectStoreNames, mode, opt_handler) { | 108 function getTransaction(db, objectStoreNames, mode, opt_handler) { |
95 var transaction = db.transaction(objectStoreNames, mode); | 109 var transaction = db.transaction(objectStoreNames, mode); |
96 transaction.onerror = onError; | 110 transaction.onerror = onError; |
97 transaction.onabort = onError; | 111 transaction.onabort = onError; |
98 if (opt_handler) { | 112 if (opt_handler) { |
99 transaction.oncomplete = opt_handler; | 113 transaction.oncomplete = opt_handler; |
100 } | 114 } |
101 return transaction; | 115 return transaction; |
102 } | 116 } |
103 | 117 |
104 function deleteDatabase(name, opt_handler) { | 118 function deleteDatabase(name, opt_handler) { |
105 var deleteRequest = indexedDB.deleteDatabase(name); | 119 var deleteRequest = indexedDB.deleteDatabase(name); |
106 deleteRequest.onerror = onError; | 120 deleteRequest.onerror = onError; |
107 if (opt_handler) { | 121 if (opt_handler) { |
108 deleteRequest.onsuccess = opt_handler; | 122 deleteRequest.onsuccess = opt_handler; |
109 } | 123 } |
110 } | 124 } |
111 | 125 |
112 function cleanUp(opt_handler) { | 126 function getCompletionFunc(testName, startTime, onTestComplete) { |
113 if (db) { | 127 function onDeleted() { |
114 deleteDatabase(db, opt_handler); | 128 automation.setStatus("Deleted database."); |
115 db = null; | 129 onTestComplete(); |
| 130 } |
| 131 return function() { |
| 132 var duration = Date.now() - startTime; |
| 133 // Ignore the cleanup time for this test. |
| 134 automation.addResult(testName, duration); |
| 135 automation.setStatus("Deleting database."); |
| 136 // TODO: Turn on actual deletion; for now it's way too slow. |
| 137 // deleteDatabase(testName, onDeleted); |
| 138 onTestComplete(); |
116 } | 139 } |
117 } | 140 } |
118 | 141 |
119 function stringOfLength(n) { | 142 function stringOfLength(n) { |
120 assert(n > 0); | 143 assert(n > 0); |
121 assert(n == Math.floor(n)); | 144 assert(n == Math.floor(n)); |
122 return new Array(n + 1).join('0'); | 145 return new Array(n + 1).join('0'); |
123 } | 146 } |
OLD | NEW |