test_table_rollback.js (3076B)
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 dbName = "window" in this ? window.location.pathname : "test"; 11 const objName1 = "foo"; 12 const objName2 = "bar"; 13 const data1 = "1234567890"; 14 const data2 = "0987654321"; 15 const dataCount = 500; 16 17 let request = indexedDB.open(dbName, 1); 18 request.onerror = errorHandler; 19 request.onupgradeneeded = grabEventAndContinueHandler; 20 21 let event = yield undefined; 22 23 is(event.type, "upgradeneeded", "Got upgradeneeded"); 24 25 request.onupgradeneeded = errorHandler; 26 request.onsuccess = grabEventAndContinueHandler; 27 28 let db = request.result; 29 30 let objectStore1 = db.createObjectStore(objName1, { autoIncrement: true }); 31 let objectStore2 = db.createObjectStore(objName2, { autoIncrement: true }); 32 33 info("Created object stores, adding data"); 34 35 for (let i = 0; i < dataCount; i++) { 36 objectStore1.add(data1); 37 objectStore2.add(data2); 38 } 39 40 info("Done adding data"); 41 42 event = yield undefined; 43 44 is(event.type, "success", "Got success"); 45 46 let readResult = null; 47 let readError = null; 48 let writeAborted = false; 49 50 info("Creating readwrite transaction"); 51 52 objectStore1 = db.transaction(objName1, "readwrite").objectStore(objName1); 53 objectStore1.openCursor().onsuccess = grabEventAndContinueHandler; 54 55 event = yield undefined; 56 57 let cursor = event.target.result; 58 is(cursor.value, data1, "Got correct data for readwrite transaction"); 59 60 info("Modifying object store on readwrite transaction"); 61 62 cursor.update(data2); 63 cursor.continue(); 64 65 event = yield undefined; 66 67 info( 68 "Done modifying object store on readwrite transaction, creating " + 69 "readonly transaction" 70 ); 71 72 objectStore2 = db.transaction(objName2, "readonly").objectStore(objName2); 73 request = objectStore2.getAll(); 74 request.onsuccess = function (event) { 75 readResult = event.target.result; 76 is( 77 readResult.length, 78 dataCount, 79 "Got correct number of results on readonly transaction" 80 ); 81 for (let i = 0; i < readResult.length; i++) { 82 is(readResult[i], data2, "Got correct data for readonly transaction"); 83 } 84 if (writeAborted) { 85 continueToNextStep(); 86 } 87 }; 88 request.onerror = function (event) { 89 readResult = null; 90 readError = event.target.error; 91 92 ok(false, "Got read error: " + readError.name); 93 event.preventDefault(); 94 95 if (writeAborted) { 96 continueToNextStep(); 97 } 98 }; 99 100 cursor = event.target.result; 101 is(cursor.value, data1, "Got correct data for readwrite transaction"); 102 103 info("Aborting readwrite transaction"); 104 105 cursor.source.transaction.abort(); 106 writeAborted = true; 107 108 if (!readError && !readResult) { 109 info("Waiting for readonly transaction to complete"); 110 yield undefined; 111 } 112 113 ok(readResult, "Got result from readonly transaction"); 114 is(readError, null, "No read error"); 115 is(writeAborted, true, "Aborted readwrite transaction"); 116 117 finishTest(); 118 }