test_cleanup_transaction.js (3816B)
1 /** 2 * Any copyright is dedicated to the Public Domain. 3 * http://creativecommons.org/publicdomain/zero/1.0/ 4 */ 5 6 /* exported testGenerator, disableWorkerTest */ 7 var disableWorkerTest = "Need a way to set temporary prefs from a worker"; 8 9 var testGenerator = testSteps(); 10 11 function* testSteps() { 12 const spec = "http://foo.com"; 13 const name = this.window 14 ? window.location.pathname 15 : "test_quotaExceeded_recovery"; 16 const objectStoreName = "foo"; 17 18 // We want 32 MB database, but there's the group limit so we need to 19 // multiply by 5. 20 const tempStorageLimitKB = 32 * 1024 * 5; 21 22 // Store in 1 MB chunks. 23 const dataSize = 1024 * 1024; 24 25 for (let blobs of [false, true]) { 26 setTemporaryStorageLimit(tempStorageLimitKB); 27 28 clearAllDatabases(continueToNextStepSync); 29 yield undefined; 30 31 info("Opening database"); 32 33 let request = indexedDB.openForPrincipal(getPrincipal(spec), name); 34 request.onerror = errorHandler; 35 request.onupgradeneeded = grabEventAndContinueHandler; 36 request.onsuccess = unexpectedSuccessHandler; 37 38 yield undefined; 39 40 // upgradeneeded 41 request.onupgradeneeded = unexpectedSuccessHandler; 42 request.onsuccess = grabEventAndContinueHandler; 43 44 info("Creating objectStore"); 45 46 request.result.createObjectStore(objectStoreName); 47 48 yield undefined; 49 50 // success 51 let db = request.result; 52 db.onerror = errorHandler; 53 54 ok(true, "Adding data until quota is reached"); 55 56 let obj = { 57 name: "foo", 58 }; 59 60 if (!blobs) { 61 obj.data = getRandomView(dataSize); 62 } 63 64 let i = 1; 65 let j = 1; 66 while (true) { 67 if (blobs) { 68 obj.data = getBlob(getView(dataSize)); 69 } 70 71 let trans = db.transaction(objectStoreName, "readwrite"); 72 request = trans.objectStore(objectStoreName).add(obj, i); 73 request.onerror = function (event) { 74 event.stopPropagation(); 75 }; 76 77 trans.oncomplete = function () { 78 i++; 79 j++; 80 testGenerator.next(true); 81 }; 82 trans.onabort = function () { 83 is(trans.error.name, "QuotaExceededError", "Reached quota limit"); 84 testGenerator.next(false); 85 }; 86 87 let completeFired = yield undefined; 88 if (completeFired) { 89 ok(true, "Got complete event"); 90 } else { 91 ok(true, "Got abort event"); 92 93 if (j == 1) { 94 // Plain cleanup transaction (just vacuuming and checkpointing) 95 // couldn't shrink database any further. 96 break; 97 } 98 99 j = 1; 100 101 trans = db.transaction(objectStoreName, "cleanup"); 102 trans.onabort = unexpectedSuccessHandler; 103 trans.oncomplete = grabEventAndContinueHandler; 104 105 yield undefined; 106 } 107 } 108 109 info("Reopening database"); 110 111 db.close(); 112 113 request = indexedDB.openForPrincipal(getPrincipal(spec), name); 114 request.onerror = errorHandler; 115 request.onsuccess = grabEventAndContinueHandler; 116 117 yield undefined; 118 119 db = request.result; 120 db.onerror = errorHandler; 121 122 info("Deleting some data"); 123 124 let trans = db.transaction(objectStoreName, "cleanup"); 125 trans.objectStore(objectStoreName).delete(1); 126 127 trans.onabort = unexpectedSuccessHandler; 128 trans.oncomplete = grabEventAndContinueHandler; 129 130 yield undefined; 131 132 info("Adding data again"); 133 134 trans = db.transaction(objectStoreName, "readwrite"); 135 trans.objectStore(objectStoreName).add(obj, 1); 136 137 trans.onabort = unexpectedSuccessHandler; 138 trans.oncomplete = grabEventAndContinueHandler; 139 140 yield undefined; 141 142 info("Deleting database"); 143 144 db.close(); 145 146 request = indexedDB.deleteForPrincipal(getPrincipal(spec), name); 147 request.onerror = errorHandler; 148 request.onsuccess = grabEventAndContinueHandler; 149 150 yield undefined; 151 } 152 153 finishTest(); 154 yield undefined; 155 }