test_blocked_order.js (4687B)
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 databaseName = "window" in this ? window.location.pathname : "Test"; 11 const databaseCount = 10; 12 13 // Test 1: Make sure basic versionchange events work and that they don't 14 // trigger blocked events. 15 info("Opening " + databaseCount + " databases with version 1"); 16 17 let databases = []; 18 19 for (let i = 0; i < databaseCount; i++) { 20 let thisIndex = i; 21 22 info("Opening database " + thisIndex); 23 24 let request = indexedDB.open(databaseName, 1); 25 request.onerror = errorHandler; 26 request.onblocked = errorHandler; 27 request.onsuccess = grabEventAndContinueHandler; 28 29 let event = yield undefined; 30 31 is(event.type, "success", "Got success event"); 32 33 let db = request.result; 34 is(db.version, 1, "Got version 1"); 35 36 db.onversionchange = function () { 37 info("Closing database " + thisIndex); 38 db.close(); 39 40 databases.splice(databases.indexOf(db), 1); 41 }; 42 43 databases.push(db); 44 } 45 46 is(databases.length, databaseCount, "Created all databases with version 1"); 47 48 info("Opening database with version 2"); 49 50 let request = indexedDB.open(databaseName, 2); 51 request.onerror = errorHandler; 52 request.onsuccess = grabEventAndContinueHandler; 53 54 request.onblocked = function () { 55 ok(false, "Should not receive a blocked event"); 56 }; 57 58 let event = yield undefined; 59 60 is(event.type, "success", "Got success event"); 61 is(databases.length, 0, "All databases with version 1 were closed"); 62 63 let db = request.result; 64 is(db.version, 2, "Got version 2"); 65 66 info("Deleting database with version 2"); 67 db.close(); 68 69 request = indexedDB.deleteDatabase(databaseName); 70 request.onerror = errorHandler; 71 request.onsuccess = grabEventAndContinueHandler; 72 73 event = yield undefined; 74 75 is(event.type, "success", "Got success event"); 76 77 // Test 2: Make sure blocked events aren't delivered until all versionchange 78 // events have been delivered. 79 info("Opening " + databaseCount + " databases with version 1"); 80 81 for (let i = 0; i < databaseCount; i++) { 82 let thisIndex = i; 83 84 info("Opening database " + thisIndex); 85 86 let request = indexedDB.open(databaseName, 1); 87 request.onerror = errorHandler; 88 request.onblocked = errorHandler; 89 request.onsuccess = grabEventAndContinueHandler; 90 91 let event = yield undefined; 92 93 is(event.type, "success", "Got success event"); 94 95 let db = request.result; 96 is(db.version, 1, "Got version 1"); 97 98 db.onversionchange = function () { 99 if (thisIndex == databaseCount - 1) { 100 info("Closing all databases with version 1"); 101 102 for (let j = 0; j < databases.length; j++) { 103 databases[j].close(); 104 } 105 106 databases = []; 107 info("Done closing all databases with version 1"); 108 } else { 109 info("Not closing database " + thisIndex); 110 } 111 }; 112 113 databases.push(db); 114 } 115 116 is(databases.length, databaseCount, "Created all databases with version 1"); 117 118 info("Opening database with version 2"); 119 120 request = indexedDB.open(databaseName, 2); 121 request.onerror = errorHandler; 122 request.onsuccess = grabEventAndContinueHandler; 123 124 request.onblocked = function () { 125 ok(false, "Should not receive a blocked event"); 126 }; 127 128 event = yield undefined; 129 130 is(event.type, "success", "Got success event"); 131 is(databases.length, 0, "All databases with version 1 were closed"); 132 133 db = request.result; 134 is(db.version, 2, "Got version 2"); 135 136 info("Deleting database with version 2"); 137 db.close(); 138 139 request = indexedDB.deleteDatabase(databaseName); 140 request.onerror = errorHandler; 141 request.onsuccess = grabEventAndContinueHandler; 142 143 event = yield undefined; 144 145 is(event.type, "success", "Got success event"); 146 147 // Test 3: A blocked database left in that state should not hang shutdown. 148 info("Opening 1 database with version 1"); 149 150 request = indexedDB.open(databaseName, 1); 151 request.onerror = errorHandler; 152 request.onblocked = errorHandler; 153 request.onsuccess = grabEventAndContinueHandler; 154 155 event = yield undefined; 156 157 is(event.type, "success", "Got success event"); 158 159 db = request.result; 160 is(db.version, 1, "Got version 1"); 161 162 info("Opening database with version 2"); 163 164 request = indexedDB.open(databaseName, 2); 165 request.onerror = function (e) { 166 e.preventDefault(); 167 }; 168 request.onsuccess = errorHandler; 169 170 request.onblocked = grabEventAndContinueHandler; 171 172 event = yield undefined; 173 ok(true, "Got blocked"); 174 // Just allow this to remain blocked ... 175 176 finishTest(); 177 }