test_view_put_get_values.js (4594B)
1 /** 2 * Any copyright is dedicated to the Public Domain. 3 * http://creativecommons.org/publicdomain/zero/1.0/ 4 */ 5 6 /* exported testSteps, disableWorkerTest */ 7 var disableWorkerTest = "Need a way to set temporary prefs from a worker"; 8 9 async function testSteps() { 10 // Setting dom.indexedDB.dataThreshold to 99999 ensures that the first random 11 // view (size 100000) is stored as a separate file when 12 // dom.indexedDB.preprocessing is true. The second random view (size 10000) 13 // is always stored directly in the database. This setup creates a scenario 14 // where requests in a transaction are processed in the wrong order if they 15 // are not properly queued internally. 16 const dataThreshold = 99999; 17 18 const name = this.window 19 ? window.location.pathname 20 : "test_view_put_get_values.js"; 21 22 const objectStoreName = "Views"; 23 24 const viewDataArray = [ 25 { key: 1, view: getRandomView(100000) }, 26 { key: 2, view: getRandomView(10000) }, 27 ]; 28 29 const tests = [ 30 { 31 external: false, 32 preprocessing: false, 33 }, 34 { 35 external: true, 36 preprocessing: false, 37 }, 38 { 39 external: true, 40 preprocessing: true, 41 }, 42 ]; 43 44 for (let test of tests) { 45 if (test.external) { 46 info("Setting data threshold pref"); 47 48 if (this.window) { 49 await SpecialPowers.pushPrefEnv({ 50 set: [["dom.indexedDB.dataThreshold", dataThreshold]], 51 }); 52 } else { 53 setDataThreshold(dataThreshold); 54 } 55 } 56 57 if (test.preprocessing) { 58 info("Setting preprocessing pref"); 59 60 if (this.window) { 61 await SpecialPowers.pushPrefEnv({ 62 set: [["dom.indexedDB.preprocessing", true]], 63 }); 64 } else { 65 enablePreprocessing(); 66 } 67 } 68 69 info("Opening database"); 70 71 const db = await (async function () { 72 const request = indexedDB.open(name); 73 74 { 75 const event = await expectingUpgrade(request); 76 77 const database = event.target.result; 78 79 database.createObjectStore(objectStoreName); 80 } 81 82 const event = await expectingSuccess(request); 83 84 const database = event.target.result; 85 86 return database; 87 })(); 88 89 { 90 const objectStore = db 91 .transaction([objectStoreName], "readwrite") 92 .objectStore(objectStoreName); 93 94 info("Storing views"); 95 96 for (const viewData of viewDataArray) { 97 const request = objectStore.add(viewData.view, viewData.key); 98 99 await requestSucceeded(request); 100 101 is(request.result, viewData.key, "Got correct key"); 102 } 103 104 info("Getting views"); 105 106 for (const viewData of viewDataArray) { 107 const request = objectStore.get(viewData.key); 108 109 await requestSucceeded(request); 110 111 verifyView(request.result, viewData.view); 112 } 113 } 114 115 info("Getting views in separate transactions"); 116 117 for (const viewData of viewDataArray) { 118 const request = db 119 .transaction([objectStoreName]) 120 .objectStore(objectStoreName) 121 .get(viewData.key); 122 123 await requestSucceeded(request); 124 125 verifyView(request.result, viewData.view); 126 } 127 128 info("Getting file usage"); 129 130 { 131 const fileUsage = await new Promise(function (resolve) { 132 getCurrentUsage(function (request) { 133 resolve(request.result.fileUsage); 134 }); 135 }); 136 137 if (test.external) { 138 ok(fileUsage > 0, "File usage is not zero"); 139 } else { 140 ok(fileUsage == 0, "File usage is zero"); 141 } 142 } 143 144 info("Getting views in parallel"); 145 146 { 147 const objectStore = db 148 .transaction([objectStoreName]) 149 .objectStore(objectStoreName); 150 151 const promises = []; 152 const keys = []; 153 154 for (const viewData of viewDataArray) { 155 const request = objectStore.get(viewData.key); 156 157 promises.push( 158 requestSucceeded(request, function () { 159 keys.push(viewData.key); 160 }) 161 ); 162 } 163 164 await Promise.all(promises); 165 166 is(keys.length, viewDataArray.length, "Correct number of keys"); 167 168 for (let i = 0; i < keys.length; i++) { 169 is(keys[i], viewDataArray[i].key, "Correct key"); 170 } 171 } 172 173 info("Deleting database"); 174 175 { 176 db.close(); 177 const request = indexedDB.deleteDatabase(name); 178 await expectingSuccess(request); 179 } 180 181 info("Resetting prefs"); 182 183 if (this.window) { 184 await SpecialPowers.popPrefEnv(); 185 } else { 186 if (test.external) { 187 resetDataThreshold(); 188 } 189 190 if (test.preprocessing) { 191 resetPreprocessing(); 192 } 193 } 194 } 195 }