test_rename_index.js (6160B)
1 /** 2 * Any copyright is dedicated to the Public Domain. 3 * http://creativecommons.org/publicdomain/zero/1.0/ 4 */ 5 6 /* exported testGenerator */ 7 var testGenerator = testSteps(); 8 9 function* testSteps() { 10 const name = this.window ? window.location.pathname : "Splendid Test"; 11 const storeName = "test store"; 12 const indexName_ToBeDeleted = "test index to be deleted"; 13 const indexName_v0 = "test index v0"; 14 const indexName_v1 = "test index v1"; 15 const indexName_v2 = "test index v2"; 16 const indexName_v3 = indexName_ToBeDeleted; 17 const indexName_v4 = "test index v4"; 18 19 info("Rename in v1."); 20 let request = indexedDB.open(name, 1); 21 request.onerror = errorHandler; 22 request.onupgradeneeded = grabEventAndContinueHandler; 23 request.onsuccess = unexpectedSuccessHandler; 24 let event = yield undefined; 25 26 let db = event.target.result; 27 let txn = event.target.transaction; 28 29 is(db.objectStoreNames.length, 0, "Correct objectStoreNames list"); 30 31 let objectStore = db.createObjectStore(storeName, { keyPath: "foo" }); 32 is(db.objectStoreNames.length, 1, "Correct objectStoreNames list"); 33 is( 34 db.objectStoreNames.item(0), 35 objectStore.name, 36 "Correct object store name" 37 ); 38 39 // create index to be deleted later in v3. 40 objectStore.createIndex(indexName_ToBeDeleted, "foo"); 41 ok(objectStore.index(indexName_ToBeDeleted), "Index created."); 42 43 // create target index to be renamed. 44 let index = objectStore.createIndex(indexName_v0, "bar"); 45 ok(objectStore.index(indexName_v0), "Index created."); 46 is(index.name, indexName_v0, "Correct index name"); 47 index.name = indexName_v1; 48 is(index.name, indexName_v1, "Renamed index successfully"); 49 50 txn.oncomplete = continueToNextStepSync; 51 yield undefined; 52 request.onsuccess = continueToNextStep; 53 yield undefined; 54 db.close(); 55 56 info("Verify renaming done in v1 and run renaming in v2."); 57 request = indexedDB.open(name, 2); 58 request.onerror = errorHandler; 59 request.onupgradeneeded = grabEventAndContinueHandler; 60 request.onsuccess = unexpectedSuccessHandler; 61 event = yield undefined; 62 63 db = event.target.result; 64 txn = event.target.transaction; 65 66 objectStore = txn.objectStore(storeName); 67 68 // indexName_v0 created in v1 shall not be available. 69 try { 70 index = objectStore.index(indexName_v0); 71 ok(false, "NotFoundError shall be thrown."); 72 } catch (e) { 73 ok(e instanceof DOMException, "got a database exception"); 74 is(e.name, "NotFoundError", "correct error"); 75 } 76 77 // rename to "v2". 78 index = objectStore.index(indexName_v1); 79 is(index.name, indexName_v1, "Correct index name"); 80 index.name = indexName_v2; 81 is(index.name, indexName_v2, "Renamed index successfully"); 82 83 txn.oncomplete = continueToNextStepSync; 84 yield undefined; 85 request.onsuccess = continueToNextStep; 86 yield undefined; 87 db.close(); 88 89 info("Verify renaming done in v2."); 90 request = indexedDB.open(name, 2); 91 request.onerror = errorHandler; 92 request.onupgradeneeded = errorHandler; 93 request.onsuccess = grabEventAndContinueHandler; 94 event = yield undefined; 95 96 db = event.target.result; 97 txn = db.transaction(storeName); 98 99 objectStore = txn.objectStore(storeName); 100 index = objectStore.index(indexName_v2); 101 is(index.name, indexName_v2, "Correct index name"); 102 103 db.close(); 104 105 info("Rename in v3."); 106 request = indexedDB.open(name, 3); 107 request.onerror = errorHandler; 108 request.onupgradeneeded = grabEventAndContinueHandler; 109 request.onsuccess = unexpectedSuccessHandler; 110 event = yield undefined; 111 112 db = event.target.result; 113 txn = event.target.transaction; 114 115 objectStore = txn.objectStore(storeName); 116 ok(objectStore.index(indexName_ToBeDeleted), "index is valid."); 117 objectStore.deleteIndex(indexName_ToBeDeleted); 118 try { 119 objectStore.index(indexName_ToBeDeleted); 120 ok(false, "NotFoundError shall be thrown if the index name is deleted."); 121 } catch (e) { 122 ok(e instanceof DOMException, "got a database exception"); 123 is(e.name, "NotFoundError", "correct error"); 124 } 125 126 info("Rename with the name of the deleted index."); 127 index = objectStore.index(indexName_v2); 128 index.name = indexName_v3; 129 is(index.name, indexName_v3, "Renamed index successfully"); 130 131 txn.oncomplete = continueToNextStepSync; 132 yield undefined; 133 request.onsuccess = continueToNextStep; 134 yield undefined; 135 db.close(); 136 137 info("Verify renaming done in v3."); 138 request = indexedDB.open(name, 3); 139 request.onerror = errorHandler; 140 request.onupgradeneeded = errorHandler; 141 request.onsuccess = grabEventAndContinueHandler; 142 event = yield undefined; 143 144 db = event.target.result; 145 txn = db.transaction(storeName); 146 147 objectStore = txn.objectStore(storeName); 148 index = objectStore.index(indexName_v3); 149 is(index.name, indexName_v3, "Correct index name"); 150 151 db.close(); 152 153 info("Abort the version change transaction while renaming index."); 154 request = indexedDB.open(name, 4); 155 request.onerror = errorHandler; 156 request.onupgradeneeded = grabEventAndContinueHandler; 157 request.onsuccess = unexpectedSuccessHandler; 158 event = yield undefined; 159 160 db = event.target.result; 161 txn = event.target.transaction; 162 163 objectStore = txn.objectStore(storeName); 164 index = objectStore.index(indexName_v3); 165 index.name = indexName_v4; 166 is(index.name, indexName_v4, "Renamed successfully"); 167 let putRequest = objectStore.put({ foo: "fooValue", bar: "barValue" }); 168 putRequest.onsuccess = continueToNextStepSync; 169 yield undefined; 170 171 // Aborting the transaction. 172 request.onerror = expectedErrorHandler("AbortError"); 173 txn.abort(); 174 yield undefined; 175 176 // Verify if the name of the index handle is reverted. 177 is(index.name, indexName_v3, "The name is reverted after aborted."); 178 179 info("Verify if the objectstore name is unchanged."); 180 request = indexedDB.open(name, 3); 181 request.onerror = errorHandler; 182 request.onupgradeneeded = errorHandler; 183 request.onsuccess = grabEventAndContinueHandler; 184 event = yield undefined; 185 186 db = event.target.result; 187 txn = db.transaction(storeName); 188 189 objectStore = txn.objectStore(storeName); 190 index = objectStore.index(indexName_v3); 191 is(index.name, indexName_v3, "Correct index name"); 192 193 db.close(); 194 195 finishTest(); 196 }