1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/indexedDB/test/unit/test_index_update_delete.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,171 @@ 1.4 +/** 1.5 + * Any copyright is dedicated to the Public Domain. 1.6 + * http://creativecommons.org/publicdomain/zero/1.0/ 1.7 + */ 1.8 + 1.9 +var testGenerator = testSteps(); 1.10 + 1.11 +function testSteps() 1.12 +{ 1.13 + let name = this.window ? window.location.pathname : "Splendid Test"; 1.14 + let request = indexedDB.open(name, 1); 1.15 + request.onerror = errorHandler; 1.16 + request.onupgradeneeded = grabEventAndContinueHandler; 1.17 + request.onsuccess = grabEventAndContinueHandler; 1.18 + 1.19 + let event = yield undefined; 1.20 + 1.21 + let db = event.target.result; 1.22 + db.onerror = errorHandler; 1.23 + 1.24 + for each (let autoIncrement in [false, true]) { 1.25 + let objectStore = 1.26 + db.createObjectStore(autoIncrement, { keyPath: "id", 1.27 + autoIncrement: autoIncrement }); 1.28 + 1.29 + for (let i = 0; i < 10; i++) { 1.30 + objectStore.add({ id: i, index: i }); 1.31 + } 1.32 + 1.33 + for each (let unique in [false, true]) { 1.34 + objectStore.createIndex(unique, "index", { unique: unique }); 1.35 + } 1.36 + 1.37 + for (let i = 10; i < 20; i++) { 1.38 + objectStore.add({ id: i, index: i }); 1.39 + } 1.40 + } 1.41 + 1.42 + event = yield undefined; 1.43 + is(event.type, "success", "expect a success event"); 1.44 + 1.45 + for each (let autoIncrement in [false, true]) { 1.46 + let objectStore = db.transaction(autoIncrement) 1.47 + .objectStore(autoIncrement); 1.48 + 1.49 + objectStore.count().onsuccess = grabEventAndContinueHandler; 1.50 + let event = yield undefined; 1.51 + 1.52 + is(event.target.result, 20, "Correct number of entries in objectStore"); 1.53 + 1.54 + let objectStoreCount = event.target.result; 1.55 + let indexCount = event.target.result; 1.56 + 1.57 + for each (let unique in [false, true]) { 1.58 + let index = db.transaction(autoIncrement, "readwrite") 1.59 + .objectStore(autoIncrement) 1.60 + .index(unique); 1.61 + 1.62 + index.count().onsuccess = grabEventAndContinueHandler; 1.63 + let event = yield undefined; 1.64 + 1.65 + is(event.target.result, indexCount, 1.66 + "Correct number of entries in index"); 1.67 + 1.68 + let modifiedEntry = unique ? 5 : 10; 1.69 + let keyRange = IDBKeyRange.only(modifiedEntry); 1.70 + 1.71 + let sawEntry = false; 1.72 + index.openCursor(keyRange).onsuccess = function(event) { 1.73 + let cursor = event.target.result; 1.74 + if (cursor) { 1.75 + sawEntry = true; 1.76 + is(cursor.key, modifiedEntry, "Correct key"); 1.77 + 1.78 + cursor.value.index = unique ? 30 : 35; 1.79 + cursor.update(cursor.value).onsuccess = function(event) { 1.80 + cursor.continue(); 1.81 + } 1.82 + } 1.83 + else { 1.84 + continueToNextStep(); 1.85 + } 1.86 + } 1.87 + yield undefined; 1.88 + 1.89 + is(sawEntry, true, "Saw entry for key value " + modifiedEntry); 1.90 + 1.91 + // Recount index. Shouldn't change. 1.92 + index = db.transaction(autoIncrement, "readwrite") 1.93 + .objectStore(autoIncrement) 1.94 + .index(unique); 1.95 + 1.96 + index.count().onsuccess = grabEventAndContinueHandler; 1.97 + event = yield undefined; 1.98 + 1.99 + is(event.target.result, indexCount, 1.100 + "Correct number of entries in index"); 1.101 + 1.102 + modifiedEntry = unique ? 30 : 35; 1.103 + keyRange = IDBKeyRange.only(modifiedEntry); 1.104 + 1.105 + sawEntry = false; 1.106 + index.openCursor(keyRange).onsuccess = function(event) { 1.107 + let cursor = event.target.result; 1.108 + if (cursor) { 1.109 + sawEntry = true; 1.110 + is(cursor.key, modifiedEntry, "Correct key"); 1.111 + 1.112 + delete cursor.value.index; 1.113 + cursor.update(cursor.value).onsuccess = function(event) { 1.114 + indexCount--; 1.115 + cursor.continue(); 1.116 + } 1.117 + } 1.118 + else { 1.119 + continueToNextStep(); 1.120 + } 1.121 + } 1.122 + yield undefined; 1.123 + 1.124 + is(sawEntry, true, "Saw entry for key value " + modifiedEntry); 1.125 + 1.126 + // Recount objectStore. Should be unchanged. 1.127 + objectStore = db.transaction(autoIncrement, "readwrite") 1.128 + .objectStore(autoIncrement); 1.129 + 1.130 + objectStore.count().onsuccess = grabEventAndContinueHandler; 1.131 + event = yield undefined; 1.132 + 1.133 + is(event.target.result, objectStoreCount, 1.134 + "Correct number of entries in objectStore"); 1.135 + 1.136 + // Recount index. Should be one item less. 1.137 + index = objectStore.index(unique); 1.138 + 1.139 + index.count().onsuccess = grabEventAndContinueHandler; 1.140 + event = yield undefined; 1.141 + 1.142 + is(event.target.result, indexCount, 1.143 + "Correct number of entries in index"); 1.144 + 1.145 + modifiedEntry = objectStoreCount - 1; 1.146 + 1.147 + objectStore.delete(modifiedEntry).onsuccess = 1.148 + grabEventAndContinueHandler; 1.149 + event = yield undefined; 1.150 + 1.151 + objectStoreCount--; 1.152 + indexCount--; 1.153 + 1.154 + objectStore.count().onsuccess = grabEventAndContinueHandler; 1.155 + event = yield undefined; 1.156 + 1.157 + is(event.target.result, objectStoreCount, 1.158 + "Correct number of entries in objectStore"); 1.159 + 1.160 + index.count().onsuccess = grabEventAndContinueHandler; 1.161 + event = yield undefined; 1.162 + 1.163 + is(event.target.result, indexCount, 1.164 + "Correct number of entries in index"); 1.165 + 1.166 + index = event = null; // Bug 943409 workaround. 1.167 + } 1.168 + objectStore = event = null; // Bug 943409 workaround. 1.169 + } 1.170 + 1.171 + finishTest(); 1.172 + event = db = request = null; // Bug 943409 workaround. 1.173 + yield undefined; 1.174 +}