idbcursor_advance_objectstore.any.js (4586B)
1 // META: global=window,worker 2 // META: title=IDBCursor.advance() 3 // META: script=resources/support.js 4 // @author Microsoft <https://www.microsoft.com> 5 // @author Intel <http://www.intel.com> 6 7 'use strict'; 8 9 function createAndPopulateObjectStore(db, records) { 10 let objStore = db.createObjectStore("store", { keyPath: "pKey" }); 11 for (let i = 0; i < records.length; i++) { 12 objStore.add(records[i]); 13 } 14 return objStore; 15 } 16 17 function setOnUpgradeNeeded(dbObj, records) { 18 return function (event) { 19 dbObj.db = event.target.result; 20 createAndPopulateObjectStore(dbObj.db, records); 21 }; 22 } 23 24 async_test(t => { 25 let dbObj = {}; 26 let count = 0; 27 const records = [ 28 { pKey: "primaryKey_0" }, 29 { pKey: "primaryKey_1" }, 30 { pKey: "primaryKey_2" }, 31 { pKey: "primaryKey_3" } 32 ]; 33 34 let open_rq = createdb(t); 35 open_rq.onupgradeneeded = setOnUpgradeNeeded(dbObj, records); 36 37 open_rq.onsuccess = function (e) { 38 let cursor_rq = dbObj.db.transaction("store", "readonly") 39 .objectStore("store") 40 .openCursor(); 41 42 cursor_rq.onsuccess = t.step_func(function (e) { 43 let cursor = e.target.result; 44 assert_true(cursor instanceof IDBCursor); 45 46 switch (count) { 47 case 0: 48 count += 3; 49 cursor.advance(3); 50 break; 51 case 3: 52 assert_equals(cursor.value.pKey, records[count].pKey, "cursor.value.pKey"); 53 t.done(); 54 break; 55 default: 56 assert_unreached("unexpected count"); 57 break; 58 } 59 }); 60 } 61 }, "object store - iterate cursor number of times specified by count"); 62 63 async_test(t => { 64 let dbObj = {}; 65 const records = [ 66 { pKey: "primaryKey_0" }, 67 { pKey: "primaryKey_1" } 68 ]; 69 70 let open_rq = createdb(t); 71 open_rq.onupgradeneeded = setOnUpgradeNeeded(dbObj, records); 72 73 open_rq.onsuccess = function (event) { 74 let txn = dbObj.db.transaction("store", "readwrite"); 75 let rq = txn.objectStore("store").openCursor(); 76 rq.onsuccess = t.step_func(function (event) { 77 let cursor = event.target.result; 78 assert_true(cursor instanceof IDBCursor); 79 80 assert_throws_js(TypeError, 81 function () { cursor.advance(0); }); 82 t.done(); 83 }); 84 } 85 }, "Calling advance() with count argument 0 should throw TypeError."); 86 87 async_test(t => { 88 let dbObj = {}; 89 const records = [ 90 { pKey: "primaryKey_0" }, 91 { pKey: "primaryKey_1" } 92 ]; 93 94 let open_rq = createdb(t); 95 open_rq.onupgradeneeded = setOnUpgradeNeeded(dbObj, records); 96 97 open_rq.onsuccess = function (event) { 98 let txn = dbObj.db.transaction("store", "readwrite"); 99 let rq = txn.objectStore("store").openCursor(); 100 rq.onsuccess = t.step_func(function (event) { 101 let cursor = event.target.result; 102 assert_true(cursor instanceof IDBCursor); 103 104 event.target.transaction.abort(); 105 assert_throws_dom("TransactionInactiveError", 106 function () { cursor.advance(1); }); 107 t.done(); 108 }); 109 } 110 }, "Calling advance() should throws an exception TransactionInactiveError when the transaction is not active"); 111 112 async_test(t => { 113 let dbObj = {}; 114 const records = [ 115 { pKey: "primaryKey_0" }, 116 { pKey: "primaryKey_1" } 117 ]; 118 119 let open_rq = createdb(t); 120 open_rq.onupgradeneeded = setOnUpgradeNeeded(dbObj, records); 121 122 open_rq.onsuccess = function (event) { 123 let txn = dbObj.db.transaction("store", "readwrite"); 124 let rq = txn.objectStore("store").openCursor(); 125 rq.onsuccess = t.step_func(function (event) { 126 let cursor = event.target.result; 127 assert_true(cursor instanceof IDBCursor); 128 129 cursor.advance(1); 130 assert_throws_dom("InvalidStateError", 131 function () { cursor.advance(1); }); 132 t.done(); 133 }); 134 } 135 }, "Calling advance() should throw DOMException when the cursor is currently being iterated."); 136 137 async_test(t => { 138 let db; 139 const records = [ 140 { pKey: "primaryKey_0" }, 141 { pKey: "primaryKey_1" } 142 ]; 143 144 let open_rq = createdb(t); 145 open_rq.onupgradeneeded = function (event) { 146 db = event.target.result; 147 let objStore = createAndPopulateObjectStore(db, records); 148 let rq = objStore.openCursor(); 149 rq.onsuccess = t.step_func(function (event) { 150 let cursor = event.target.result; 151 assert_true(cursor instanceof IDBCursor, "cursor exist"); 152 153 db.deleteObjectStore("store"); 154 assert_throws_dom("InvalidStateError", 155 function () { cursor.advance(1); }); 156 t.done(); 157 }); 158 } 159 }, "If the cursor's source or effective object store has been deleted, the implementation MUST throw a DOMException of type InvalidStateError");