Changeset 129142 in webkit
- Timestamp:
- Sep 20, 2012 11:00:18 AM (12 years ago)
- Location:
- trunk/LayoutTests
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r129141 r129142 1 2012-09-20 Joshua Bell <jsbell@chromium.org> 2 3 IndexedDB: Rewrite confusing call sequence layout tests 4 https://bugs.webkit.org/show_bug.cgi?id=97051 5 6 Reviewed by Tony Chang. 7 8 Rewrite some convoluted and hard to understand/maintain tests in a more idiomatic fashion. 9 This patch maintains the bulk of the non-standard output to verify that the tests have not 10 changed in behavior; follow-ups will make the output more standard and split the tests 11 into separate files. 12 13 * storage/indexeddb/factory-deletedatabase-interactions-expected.txt: 14 * storage/indexeddb/open-close-version-expected.txt: 15 * storage/indexeddb/resources/factory-deletedatabase-interactions.js: 16 * storage/indexeddb/resources/open-close-version.js: 17 1 18 2012-09-20 Joanmarie Diggs <jdiggs@igalia.com> 2 19 -
trunk/LayoutTests/storage/indexeddb/factory-deletedatabase-interactions-expected.txt
r129090 r129142 8 8 indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB; 9 9 10 dbname = "factory-deletedatabase-interactions.html" 10 11 11 12 TEST: deleteDatabase blocked on open handles 12 self. dbname = 'test1'; self.ver = 1; self.steps = []13 self.testname = 'test1'; self.ver = 1 13 14 'h.open' 14 15 'h.open.onsuccess' … … 20 21 'h.close' 21 22 'deleteDatabase().onsuccess' 22 PASS self.steps.toString() is "h.open,h.open.onsuccess,deleteDatabase(),h.onversionchange,deleteDatabase().onblocked,h.close,deleteDatabase().onsuccess"23 PASS blockedEventFired is true 23 24 24 25 TEST: deleteDatabase not blocked when handles close immediately 25 self. dbname = 'test2'; self.ver = 1; self.steps = []26 self.testname = 'test2'; self.ver = 1 26 27 'h.open' 27 28 'h.open.onsuccess' … … 34 35 'deleteDatabase().onsuccess' 35 36 NOTE: Will FAIL with extra bogus deleteDatabase().onblocked step; https://bugs.webkit.org/show_bug.cgi?id=71130 36 FAIL self.steps.toString() should be h.open,h.open.onsuccess,deleteDatabase(),h.onversionchange,h.close,deleteDatabase().onsuccess. Was h.open,h.open.onsuccess,deleteDatabase(),h.onversionchange,h.close,deleteDatabase().onblocked,deleteDatabase().onsuccess.37 FAIL blockedEventFired should be false. Was true. 37 38 38 39 TEST: deleteDatabase is delayed if a VERSION_CHANGE transaction is running 39 self. dbname = 'test3'; self.ver = 1; self.steps = []40 self.testname = 'test3'; self.ver = 1 40 41 'h.open' 41 42 'h.open.onsuccess' … … 50 51 'h.close' 51 52 'deleteDatabase().onsuccess' 52 PASS self.steps.toString() is "h.open,h.open.onsuccess,h.setVersion,deleteDatabase(),h.setVersion.onsuccess,h.setVersion.transaction-complete,h.onversionchange,deleteDatabase().onblocked,h.close,deleteDatabase().onsuccess"53 PASS versionChangeComplete is true 53 54 54 55 TEST: Correct order when there are pending setVersion, delete and open calls. 55 self. dbname = 'test4'; self.ver = 1; self.steps = []56 self.testname = 'test4'; self.ver = 1 56 57 'h.open' 57 58 'h.open.onsuccess' … … 74 75 'deleteDatabase().onsuccess' 75 76 'h3.open.onsuccess' 76 PASS self.steps.toString() is "h.open,h.open.onsuccess,h2.open,h2.open.onsuccess,h.setVersion,deleteDatabase(),h2.onversionchange,h.setVersion.onblocked,h3.open,h2.close,h.setVersion.onsuccess,h.setVersion.transaction-complete,h.onversionchange,deleteDatabase().onblocked,h.close,deleteDatabase().onsuccess,h3.open.onsuccess" 77 PASS versionChangeComplete is true 78 PASS blockedEventFired is true 79 PASS deleteDatabaseComplete is true 77 80 PASS successfullyParsed is true 78 81 -
trunk/LayoutTests/storage/indexeddb/open-close-version-expected.txt
r129090 r129142 13 13 indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB; 14 14 15 dbname = "open-close-version.html" 15 16 16 17 TEST: setVersion blocked on open handles 17 self. dbname = 'test1'; self.ver = 1; self.steps = []18 self.testname = 'test1'; self.ver = 1 18 19 'h1.open' 19 20 'h1.open.onsuccess' … … 27 28 'h1.setVersion.onsuccess' 28 29 'h1.setVersion.transaction-complete' 29 PASS self.steps.toString() is "h1.open,h1.open.onsuccess,h2.open,h2.open.onsuccess,h1.setVersion,h2.onversionchange,h1.setVersion.onblocked,h2.close,h1.setVersion.onsuccess,h1.setVersion.transaction-complete"30 PASS blockedEventFired is true 30 31 31 32 TEST: setVersion not blocked if handle closed immediately 32 self. dbname = 'test2'; self.ver = 1; self.steps = []33 self.testname = 'test2'; self.ver = 1 33 34 'h1.open' 34 35 'h1.open.onsuccess' … … 43 44 'h1.setVersion.transaction-complete' 44 45 NOTE: Will FAIL with extra bogus h1.setVersion.onblocked step; https://bugs.webkit.org/show_bug.cgi?id=71130 45 FAIL self.steps.toString() should be h1.open,h1.open.onsuccess,h2.open,h2.open.onsuccess,h1.setVersion,h2.onversionchange,h2.close,h1.setVersion.onsuccess,h1.setVersion.transaction-complete. Was h1.open,h1.open.onsuccess,h2.open,h2.open.onsuccess,h1.setVersion,h2.onversionchange,h2.close,h1.setVersion.onblocked,h1.setVersion.onsuccess,h1.setVersion.transaction-complete.46 FAIL blockedEventFired should be false. Was true. 46 47 47 48 TEST: open and setVersion blocked if a VERSION_CHANGE transaction is running - close when blocked 48 self. dbname = 'test3'; self.ver = 1; self.steps = []49 self.testname = 'test3'; self.ver = 1 49 50 'h1.open' 50 51 'h1.open.onsuccess' … … 64 65 'h1.setVersion.transaction-complete' 65 66 'h3.open.onsuccess' 66 PASS self.steps.toString() is "h1.open,h1.open.onsuccess,h2.open,h2.open.onsuccess,h1.setVersion,h2.setVersion,h2.onversionchange,h1.setVersion.onblocked,h1.onversionchange,h2.setVersion.onblocked,h2.close,h3.open,h2.setVersion.onerror,h1.setVersion.onsuccess,h1.setVersion.transaction-complete,h3.open.onsuccess" 67 PASS blockedEventFired is true 68 PASS versionChangeComplete is true 67 69 68 70 TEST: open and setVersion blocked if a VERSION_CHANGE transaction is running - just close 69 self. dbname = 'test4'; self.ver = 1; self.steps = []71 self.testname = 'test4'; self.ver = 1 70 72 'h1.open' 71 73 'h1.open.onsuccess' … … 80 82 'h3.open.onsuccess' 81 83 NOTE: Will FAIL with extra bogus h1.setVersion.onblocked step; https://bugs.webkit.org/show_bug.cgi?id=71130 82 FAIL self.steps.toString() should be h1.open,h1.open.onsuccess,h2.open,h2.open.onsuccess,h1.setVersion,h3.open,h2.close,h1.setVersion.onsuccess,h1.setVersion.transaction-complete,h3.open.onsuccess. Was h1.open,h1.open.onsuccess,h2.open,h2.open.onsuccess,h1.setVersion,h3.open,h2.close,h1.setVersion.onblocked,h1.setVersion.onsuccess,h1.setVersion.transaction-complete,h3.open.onsuccess. 84 FAIL blockedEventFired should be false. Was true. 85 PASS versionChangeComplete is true 83 86 84 87 TEST: open blocked if a VERSION_CHANGE transaction is running 85 self. dbname = 'test5'; self.ver = 1; self.steps = []88 self.testname = 'test5'; self.ver = 1 86 89 'h1.open' 87 90 'h1.open.onsuccess' … … 91 94 'h1.setVersion.transaction-complete' 92 95 'h2.open.onsuccess' 93 PASS self.steps.toString() is "h1.open,h1.open.onsuccess,h1.setVersion,h2.open,h1.setVersion.onsuccess,h1.setVersion.transaction-complete,h2.open.onsuccess"96 PASS versionChangeComplete is true 94 97 95 98 TEST: two setVersions from the same connection 96 self. dbname = 'test6'; self.ver = 1; self.steps = []99 self.testname = 'test6'; self.ver = 1 97 100 'h1.open' 98 101 'h1.open.onsuccess' … … 104 107 'h1.setVersion.onsuccess' 105 108 'h1.setVersion.transaction-complete' 106 PASS self.steps.toString() is "h1.open,h1.open.onsuccess,h1.setVersion,h1.setVersion,h1.setVersion.onsuccess,h1.setVersion.transaction-complete,h1.setVersion.onsuccess,h1.setVersion.transaction-complete"109 PASS versionChangeComplete is true 107 110 PASS successfullyParsed is true 108 111 -
trunk/LayoutTests/storage/indexeddb/resources/factory-deletedatabase-interactions.js
r120976 r129142 6 6 description("Test the deleteDatabase call and its interaction with open/setVersion"); 7 7 8 var dbprefix = 'factory-deletedatabase-interactions-'; 9 function Connection(id) { 10 id = String(id); 11 var that = this; 12 this.open = function(opts) { 13 self.steps.push(evalAndLog("'" + id + ".open'")); 14 var req = indexedDB.open(dbprefix + self.dbname); 15 req.onerror = unexpectedErrorCallback; 16 req.onsuccess = function (e) { 17 that.handle = e.target.result; 18 self.steps.push(evalAndLog("'" + id + ".open.onsuccess'")); 19 that.handle.onversionchange = function(e) { 20 self.steps.push(evalAndLog("'" + id + ".onversionchange'")); 21 debug(" in versionchange, old = " + JSON.stringify(e.target.version) + " new = " + JSON.stringify(e.version)); 22 if (opts && opts.onversion) { opts.onversion.call(that); } 23 }; 24 if (opts && opts.onsuccess) { opts.onsuccess.call(that); } 25 }; 26 }; 27 28 this.close = function() { 29 self.steps.push(evalAndLog("'" + id + ".close'")); 30 this.handle.close(); 31 }; 32 33 this.setVersion = function(opts) { 34 self.steps.push(evalAndLog("'" + id + ".setVersion'")); 35 var req = this.handle.setVersion(String(self.ver++)); 36 req.onabort = function (e) { 37 self.steps.push(evalAndLog("'" + id + ".setVersion.onabort'")); 38 if (opts && opts.onabort) { opts.onabort.call(that); } 39 }; 40 req.onblocked = function (e) { 41 self.steps.push(evalAndLog("'" + id + ".setVersion.onblocked'")); 42 if (opts && opts.onblocked) { opts.onblocked.call(that); } 43 }; 44 req.onsuccess = function (e) { 45 self.steps.push(evalAndLog("'" + id + ".setVersion.onsuccess'")); 46 if (that.handle.objectStoreNames.contains("test-store" + self.ver)) { 47 that.handle.deleteObjectStore("test-store" + self.ver); 48 } 49 var store = that.handle.createObjectStore("test-store" + self.ver); 50 var count = 0; 51 do_async_puts(); // Keep this transaction running for a while 52 function do_async_puts() { 53 var req = store.put(count, count); 54 req.onerror = unexpectedErrorCallback; 55 req.onsuccess = function (e) { 56 if (++count < 10) { 57 do_async_puts(); 58 } else { 59 self.steps.push(evalAndLog("'" + id + ".setVersion.transaction-complete'")); 60 if (opts && opts.onsuccess) { opts.onsuccess.call(that); } 61 } 62 }; 63 } 64 }; 65 req.onerror = function (e) { 66 self.steps.push(evalAndLog("'" + id + ".setVersion.onerror'")); 67 if (opts && opts.onerror) { opts.onerror.call(that); } 68 }; 69 }; 70 } 71 72 function deleteDatabase(id, name, opts) { 73 self.steps.push(evalAndLog("'deleteDatabase(" + id + ")'")); 74 var req = indexedDB.deleteDatabase(dbprefix + name); 75 req.onsuccess = function (e) { 76 self.steps.push(evalAndLog("'deleteDatabase(" + id + ").onsuccess'")); 77 if (opts && opts.onsuccess) { opts.onsuccess.call(null); } 78 }; 79 req.onerror = function (e) { 80 self.steps.push(evalAndLog("'deleteDatabase(" + id + ").onerror'")); 81 if (opts && opts.onerror) { opts.onerror.call(null); } 82 }; 83 req.onblocked = function (e) { 84 self.steps.push(evalAndLog("'deleteDatabase(" + id + ").onblocked'")); 85 if (opts && opts.onblocked) { opts.onblocked.call(null); } 86 }; 87 } 88 89 // run a series of steps that take a continuation function 90 function runSteps(commands) { 91 if (commands.length) { 92 var command = commands.shift(); 93 command(function() { runSteps(commands); }); 94 } 8 // This is used to get the safety of evalAndLog() but produce no output 9 // like earlier iterations of this layout test. 10 // FIXME: Just use evalAndLog() once test conversion is complete. 11 function evalNoLog(_a) 12 { 13 if (typeof _a != "string") 14 debug("WARN: evalNoLog() expects a string argument"); 15 16 var _av; 17 try { 18 _av = eval(_a); 19 } catch (e) { 20 testFailed(_a + " threw exception " + e); 21 } 22 return _av; 95 23 } 96 24 97 25 function test() { 98 26 removeVendorPrefixes(); 27 setDBNameFromPath(); 99 28 test1(); 100 29 } … … 103 32 debug(""); 104 33 debug("TEST: deleteDatabase blocked on open handles"); 105 evalAndLog("self.dbname = 'test1'; self.ver = 1; self.steps = []"); 106 var h = new Connection("h"); 107 runSteps([function(doNext) { h.open({onsuccess: doNext, 108 onversion: function() { 109 debug(" h closing, but not immediately"); 110 setTimeout(function() { h.close(); }, 0); 111 }}); }, 112 function(doNext) { deleteDatabase("", self.dbname, { 113 onsuccess: finishTest}); }, 114 ]); 115 function finishTest() { 116 shouldBeEqualToString("self.steps.toString()", 117 ["h.open", 118 "h.open.onsuccess", 119 "deleteDatabase()", 120 "h.onversionchange", 121 "deleteDatabase().onblocked", 122 "h.close", 123 "deleteDatabase().onsuccess" 124 ].toString()); 125 test2(); 126 } 34 evalAndLog("self.testname = 'test1'; self.ver = 1"); 35 evalNoLog("blockedEventFired = false"); 36 37 debug("'h.open'"); 38 request = evalNoLog("indexedDB.open(dbname + testname)"); 39 request.onblocked = unexpectedBlockedCallback; 40 request.onerror = unexpectedErrorCallback; 41 request.onsuccess = function(e) { 42 debug("'h.open.onsuccess'"); 43 h = e.target.result; 44 45 h.onversionchange = function(e) { 46 debug("'h.onversionchange'"); 47 debug(" in versionchange, old = " + JSON.stringify(e.target.version) + " new = " + JSON.stringify(e.version)); 48 debug(" h closing, but not immediately"); 49 // This setTimeout() is used to move the close call outside of the event dispatch 50 // callback. Per spec, a blocked event should only fire if connections are still 51 // open after the versionchange event dispatch is complete. 52 // FIXME: There is potential for test flakiness in the timing between when the 53 // timeout runs and when the blocked event is dispatched. Move the close call 54 // into or after the blocked event handler. 55 setTimeout(function() { 56 debug("'h.close'"); 57 h.close(); 58 }, 0); 59 }; 60 61 debug("'deleteDatabase()'"); 62 request = evalNoLog("indexedDB.deleteDatabase(dbname + testname)"); 63 request.onerror = unexpectedErrorCallback; 64 request.onblocked = function(e) { 65 debug("'deleteDatabase().onblocked'"); 66 evalNoLog("blockedEventFired = true"); 67 }; 68 request.onsuccess = function(e) { 69 debug("'deleteDatabase().onsuccess'"); 70 shouldBeTrue("blockedEventFired"); 71 test2(); 72 }; 73 }; 127 74 } 128 75 … … 130 77 debug(""); 131 78 debug("TEST: deleteDatabase not blocked when handles close immediately"); 132 evalAndLog("self.dbname = 'test2'; self.ver = 1; self.steps = []"); 133 var h = new Connection("h"); 134 runSteps([function(doNext) { h.open({onsuccess: doNext, 135 onversion: function() { 136 debug(" h closing immediately"); 137 h.close(); 138 }}); }, 139 function(doNext) { deleteDatabase("", self.dbname, { 140 onsuccess: finishTest}); }, 141 ]); 142 function finishTest() { 143 debug("NOTE: Will FAIL with extra bogus deleteDatabase().onblocked step; https://bugs.webkit.org/show_bug.cgi?id=71130"); 144 shouldBeEqualToString("self.steps.toString()", 145 ["h.open", 146 "h.open.onsuccess", 147 "deleteDatabase()", 148 "h.onversionchange", 149 "h.close", 150 "deleteDatabase().onsuccess" 151 ].toString()); 152 test3(); 153 } 79 evalAndLog("self.testname = 'test2'; self.ver = 1"); 80 evalNoLog("blockedEventFired = false"); 81 82 debug("'h.open'"); 83 request = evalNoLog("indexedDB.open(dbname + testname)"); 84 request.onblocked = unexpectedBlockedCallback; 85 request.onerror = unexpectedErrorCallback; 86 request.onsuccess = function(e) { 87 debug("'h.open.onsuccess'"); 88 h = e.target.result; 89 90 h.onversionchange = function(e) { 91 debug("'h.onversionchange'"); 92 debug(" in versionchange, old = " + JSON.stringify(e.target.version) + " new = " + JSON.stringify(e.version)); 93 debug(" h closing immediately"); 94 debug("'h.close'"); 95 h.close(); 96 }; 97 98 debug("'deleteDatabase()'"); 99 request = evalNoLog("indexedDB.deleteDatabase(dbname + testname)"); 100 request.onerror = unexpectedErrorCallback; 101 request.onblocked = function(e) { 102 debug("'deleteDatabase().onblocked'"); 103 evalNoLog("blockedEventFired = true"); 104 }; 105 request.onsuccess = function(e) { 106 debug("'deleteDatabase().onsuccess'"); 107 debug("NOTE: Will FAIL with extra bogus deleteDatabase().onblocked step; https://bugs.webkit.org/show_bug.cgi?id=71130"); 108 shouldBeFalse("blockedEventFired"); 109 test3(); 110 }; 111 }; 154 112 } 155 113 … … 157 115 debug(""); 158 116 debug("TEST: deleteDatabase is delayed if a VERSION_CHANGE transaction is running"); 159 evalAndLog("self.dbname = 'test3'; self.ver = 1; self.steps = []"); 160 var h = new Connection("h"); 161 runSteps([function(doNext) { h.open({onsuccess: doNext, 162 onversion: function() { 163 debug(" h closing, but not immediately"); 164 setTimeout(function() { h.close(); }, 0); 165 }}); }, 166 function(doNext) { h.setVersion(); doNext(); }, 167 function(doNext) { deleteDatabase("", self.dbname, 168 {onsuccess: finishTest}); }, 169 ]); 170 171 function finishTest() { 172 shouldBeEqualToString("self.steps.toString()", 173 ["h.open", 174 "h.open.onsuccess", 175 "h.setVersion", 176 "deleteDatabase()", 177 "h.setVersion.onsuccess", 178 "h.setVersion.transaction-complete", 179 "h.onversionchange", 180 "deleteDatabase().onblocked", 181 "h.close", 182 "deleteDatabase().onsuccess" 183 ].toString()); 184 test4(); 185 } 117 evalAndLog("self.testname = 'test3'; self.ver = 1"); 118 evalNoLog("versionChangeComplete = false"); 119 120 debug("'h.open'"); 121 request = evalNoLog("indexedDB.open(dbname + testname)"); 122 request.onblocked = unexpectedBlockedCallback; 123 request.onerror = unexpectedErrorCallback; 124 request.onsuccess = function(e) { 125 debug("'h.open.onsuccess'"); 126 h = e.target.result; 127 128 h.onversionchange = function(e) { 129 debug("'h.onversionchange'"); 130 debug(" in versionchange, old = " + JSON.stringify(e.target.version) + " new = " + JSON.stringify(e.version)); 131 debug(" h closing, but not immediately"); 132 // This setTimeout() is used to move the close call outside of the event dispatch 133 // callback. Per spec, a blocked event should only fire if connections are still 134 // open after the versionchange event dispatch is complete. 135 // FIXME: There is potential for test flakiness in the timing between when the 136 // timeout runs and when the blocked event is dispatched. Move the close call 137 // into or after the blocked event handler. 138 setTimeout(function() { 139 debug("'h.close'"); 140 h.close(); 141 }, 0); 142 }; 143 144 debug("'h.setVersion'"); 145 request = evalNoLog("h.setVersion(String(ver++))"); 146 request.onerror = unexpectedErrorCallback; 147 request.onblocked = unexpectedBlockedCallback; 148 request.onsuccess = function(e) { 149 debug("'h.setVersion.onsuccess'"); 150 151 transaction = e.target.result; 152 transaction.onabort = unexpectedAbortCallback; 153 transaction.oncomplete = function() { 154 debug("'h.setVersion.transaction-complete'"); 155 evalNoLog("versionChangeComplete = true"); 156 }; 157 }; 158 159 debug("'deleteDatabase()'"); 160 request = evalNoLog("indexedDB.deleteDatabase(dbname + testname)"); 161 request.onerror = unexpectedErrorCallback; 162 request.onblocked = function(e) { 163 debug("'deleteDatabase().onblocked'"); 164 }; 165 request.onsuccess = function(e) { 166 debug("'deleteDatabase().onsuccess'"); 167 shouldBeTrue("versionChangeComplete"); 168 test4(); 169 }; 170 }; 186 171 } 187 172 … … 189 174 debug(""); 190 175 debug("TEST: Correct order when there are pending setVersion, delete and open calls."); 191 evalAndLog("self.dbname = 'test4'; self.ver = 1; self.steps = []"); 192 var h = new Connection("h"); 193 var h2 = new Connection("h2"); 194 var h3 = new Connection("h3"); 195 runSteps([function(doNext) { h.open({onsuccess: doNext, 196 onversion: function() { 197 debug(" h closing, but not immediately"); 198 setTimeout(function() { h.close(); }, 0); 199 }}); 200 }, 201 function(doNext) { h2.open({onsuccess: doNext}); }, 202 function(doNext) { h.setVersion({onblocked: function() { 203 h3.open({onsuccess: finishTest}); 204 h2.close(); 205 }}); 206 doNext(); 207 }, 208 function(doNext) { deleteDatabase("", self.dbname); }, 209 ]); 210 211 function finishTest() { 212 shouldBeEqualToString("self.steps.toString()", 213 ["h.open", 214 "h.open.onsuccess", 215 "h2.open", 216 "h2.open.onsuccess", 217 "h.setVersion", 218 "deleteDatabase()", 219 "h2.onversionchange", 220 "h.setVersion.onblocked", 221 "h3.open", 222 "h2.close", 223 "h.setVersion.onsuccess", 224 "h.setVersion.transaction-complete", 225 "h.onversionchange", 226 "deleteDatabase().onblocked", 227 "h.close", 228 "deleteDatabase().onsuccess", 229 "h3.open.onsuccess" 230 ].toString()); 231 finishJSTest(); 232 } 176 evalAndLog("self.testname = 'test4'; self.ver = 1"); 177 evalNoLog("setVersionBlockedEventFired = false"); 178 evalNoLog("versionChangeComplete = false"); 179 evalNoLog("deleteDatabaseBlockedEventFired = false"); 180 evalNoLog("deleteDatabaseComplete = false"); 181 182 debug("'h.open'"); 183 request = evalNoLog("indexedDB.open(dbname + testname)"); 184 request.onblocked = unexpectedBlockedCallback; 185 request.onerror = unexpectedErrorCallback; 186 request.onsuccess = function(e) { 187 debug("'h.open.onsuccess'"); 188 h = e.target.result; 189 190 h.onversionchange = function(e) { 191 debug("'h.onversionchange'"); 192 debug(" in versionchange, old = " + JSON.stringify(e.target.version) + " new = " + JSON.stringify(e.version)); 193 debug(" h closing, but not immediately"); 194 // This setTimeout() is used to move the close call outside of the event dispatch 195 // callback. Per spec, a blocked event should only fire if connections are still 196 // open after the versionchange event dispatch is complete. 197 // FIXME: There is potential for test flakiness in the timing between when the 198 // timeout runs and when the blocked event is dispatched. Move the close call 199 // into or after the blocked event handler. 200 setTimeout(function() { 201 debug("'h.close'"); 202 h.close(); 203 }, 0); 204 }; 205 206 debug("'h2.open'"); 207 request = evalNoLog("indexedDB.open(dbname + testname)"); 208 request.onblocked = unexpectedBlockedCallback; 209 request.onerror = unexpectedErrorCallback; 210 request.onsuccess = function(e) { 211 debug("'h2.open.onsuccess'"); 212 h2 = e.target.result; 213 214 h2.onversionchange = function(e) { 215 debug("'h2.onversionchange'"); 216 debug(" in versionchange, old = " + JSON.stringify(e.target.version) + " new = " + JSON.stringify(e.version)); 217 }; 218 219 debug("'h.setVersion'"); 220 request = evalNoLog("h.setVersion(String(ver++))"); 221 request.onerror = unexpectedErrorCallback; 222 request.onblocked = function() { 223 debug("'h.setVersion.onblocked'"); 224 evalNoLog("setVersionBlockedEventFired = true"); 225 226 debug("'h3.open'"); 227 request = evalNoLog("indexedDB.open(dbname + testname)"); 228 request.onblocked = unexpectedBlockedCallback; 229 request.onerror = unexpectedErrorCallback; 230 request.onsuccess = function(e) { 231 debug("'h3.open.onsuccess'"); 232 h3 = e.target.result; 233 h3.onversionchange = unexpectedVersionChangeCallback; 234 235 shouldBeTrue("versionChangeComplete"); 236 shouldBeTrue("blockedEventFired"); 237 shouldBeTrue("deleteDatabaseComplete"); 238 239 finishJSTest(); 240 }; 241 242 debug("'h2.close'"); 243 h2.close(); 244 }; 245 request.onsuccess = function(e) { 246 debug("'h.setVersion.onsuccess'"); 247 248 transaction = e.target.result; 249 transaction.onabort = unexpectedAbortCallback; 250 transaction.oncomplete = function() { 251 debug("'h.setVersion.transaction-complete'"); 252 evalNoLog("versionChangeComplete = true"); 253 }; 254 }; 255 256 debug("'deleteDatabase()'"); 257 request = evalNoLog("indexedDB.deleteDatabase(dbname + testname)"); 258 request.onerror = unexpectedErrorCallback; 259 request.onblocked = function(e) { 260 debug("'deleteDatabase().onblocked'"); 261 evalNoLog("deleteDatabaseBlockedEventFired = true"); 262 }; 263 request.onsuccess = function(e) { 264 debug("'deleteDatabase().onsuccess'"); 265 evalNoLog("deleteDatabaseComplete = true"); 266 }; 267 }; 268 }; 233 269 } 234 270 -
trunk/LayoutTests/storage/indexeddb/resources/open-close-version.js
r120976 r129142 6 6 description("Test interleaved open/close/setVersion calls in various permutations"); 7 7 8 function Connection(id) { 9 id = String(id); 10 var that = this; 11 this.open = function(opts) { 12 self.steps.push(evalAndLog("'" + id + ".open'")); 13 var req = indexedDB.open('open-close-version-' + self.dbname); 14 req.onerror = unexpectedErrorCallback; 15 req.onsuccess = function (e) { 16 that.handle = e.target.result; 17 self.steps.push(evalAndLog("'" + id + ".open.onsuccess'")); 18 that.handle.onversionchange = function(e) { 19 self.steps.push(evalAndLog("'" + id + ".onversionchange'")); 20 if (opts && opts.onversion) { opts.onversion.call(that); } 21 }; 22 if (opts && opts.onsuccess) { opts.onsuccess.call(that); } 23 }; 24 }; 25 26 this.close = function() { 27 self.steps.push(evalAndLog("'" + id + ".close'")); 28 this.handle.close(); 29 }; 30 31 this.setVersion = function(opts) { 32 self.steps.push(evalAndLog("'" + id + ".setVersion'")); 33 var req = this.handle.setVersion(String(self.ver++)); 34 req.onabort = function (e) { 35 self.steps.push(evalAndLog("'" + id + ".setVersion.onabort'")); 36 if (opts && opts.onabort) { opts.onabort.call(that); } 37 }; 38 req.onblocked = function (e) { 39 self.steps.push(evalAndLog("'" + id + ".setVersion.onblocked'")); 40 if (opts && opts.onblocked) { opts.onblocked.call(that); } 41 }; 42 req.onsuccess = function (e) { 43 self.steps.push(evalAndLog("'" + id + ".setVersion.onsuccess'")); 44 if (that.handle.objectStoreNames.contains("test-store" + self.ver)) { 45 that.handle.deleteObjectStore("test-store" + self.ver); 46 } 47 var store = that.handle.createObjectStore("test-store" + self.ver); 48 var count = 0; 49 do_async_puts(); // Keep this transaction running for a while 50 function do_async_puts() { 51 var req = store.put(count, count); 52 req.onerror = unexpectedErrorCallback; 53 req.onsuccess = function (e) { 54 if (++count < 10) { 55 do_async_puts(); 56 } else { 57 self.steps.push(evalAndLog("'" + id + ".setVersion.transaction-complete'")); 58 if (opts && opts.onsuccess) { opts.onsuccess.call(that); } 59 } 60 }; 61 } 62 }; 63 req.onerror = function (e) { 64 self.steps.push(evalAndLog("'" + id + ".setVersion.onerror'")); 65 if (opts && opts.onerror) { opts.onerror.call(that); } 66 }; 67 }; 68 } 69 70 // run a series of steps that take a continuation function 71 function runSteps(commands) { 72 if (commands.length) { 73 var command = commands.shift(); 74 command(function() { runSteps(commands); }); 75 } 8 // This is used to get the safety of evalAndLog() but produce no output 9 // like earlier iterations of this layout test. 10 // FIXME: Just use evalAndLog() once test conversion is complete. 11 function evalNoLog(_a) 12 { 13 if (typeof _a != "string") 14 debug("WARN: evalNoLog() expects a string argument"); 15 16 var _av; 17 try { 18 _av = eval(_a); 19 } catch (e) { 20 testFailed(_a + " threw exception " + e); 21 } 22 return _av; 76 23 } 77 24 78 25 function test() { 79 26 removeVendorPrefixes(); 27 setDBNameFromPath(); 80 28 test1(); 81 29 } … … 84 32 debug(""); 85 33 debug("TEST: setVersion blocked on open handles"); 86 evalAndLog("self.dbname = 'test1'; self.ver = 1; self.steps = []"); 87 var h1 = new Connection("h1"); 88 var h2 = new Connection("h2"); 89 runSteps([function(doNext) { h1.open({onsuccess: doNext}); }, 90 function(doNext) { h2.open({onsuccess: doNext, 91 onversion: function() { 92 debug(" h2 closing, but not immediately"); 93 setTimeout(function() { h2.close(); }, 0); 94 }}); }, 95 function(doNext) { h1.setVersion({onsuccess: finishTest}); }, 96 ]); 97 function finishTest() { 98 shouldBeEqualToString("self.steps.toString()", 99 ["h1.open", 100 "h1.open.onsuccess", 101 "h2.open", 102 "h2.open.onsuccess", 103 "h1.setVersion", 104 "h2.onversionchange", 105 "h1.setVersion.onblocked", 106 "h2.close", 107 "h1.setVersion.onsuccess", 108 "h1.setVersion.transaction-complete" 109 ].toString()); 110 test2(); 111 } 34 evalAndLog("self.testname = 'test1'; self.ver = 1"); 35 evalNoLog("blockedEventFired = false"); 36 37 debug("'h1.open'"); 38 request = evalNoLog("indexedDB.open(dbname + testname)"); 39 request.onblocked = unexpectedBlockedCallback; 40 request.onerror = unexpectedErrorCallback; 41 request.onsuccess = function(e) { 42 debug("'h1.open.onsuccess'"); 43 h1 = e.target.result; 44 45 h1.onversionchange = unexpectedVersionChangeCallback; 46 47 debug("'h2.open'"); 48 request = evalNoLog("indexedDB.open(dbname + testname)"); 49 request.onblocked = unexpectedBlockedCallback; 50 request.onerror = unexpectedErrorCallback; 51 request.onsuccess = function(e) { 52 debug("'h2.open.onsuccess'"); 53 h2 = e.target.result; 54 55 h2.onversionchange = function() { 56 debug("'h2.onversionchange'"); 57 debug(" h2 closing, but not immediately"); 58 // This setTimeout() is used to move the close call outside of the event dispatch 59 // callback. Per spec, a blocked event should only fire if connections are still 60 // open after the versionchange event dispatch is complete. 61 // FIXME: There is potential for test flakiness in the timing between when the 62 // timeout runs and when the blocked event is dispatched. Move the close call 63 // into or after the blocked event handler. 64 setTimeout(function() { 65 debug("'h2.close'"); 66 evalNoLog("h2.close()"); 67 }, 0); 68 }; 69 70 debug("'h1.setVersion'"); 71 request = evalNoLog("h1.setVersion(String(ver++))"); 72 request.onerror = unexpectedErrorCallback; 73 request.onblocked = function() { 74 debug("'h1.setVersion.onblocked'"); 75 evalNoLog("blockedEventFired = true"); 76 }; 77 request.onsuccess = function(e) { 78 debug("'h1.setVersion.onsuccess'"); 79 80 transaction = e.target.result; 81 transaction.onabort = unexpectedAbortCallback; 82 transaction.oncomplete = function() { 83 debug("'h1.setVersion.transaction-complete'"); 84 shouldBeTrue("blockedEventFired"); 85 test2(); 86 }; 87 }; 88 }; 89 }; 112 90 } 113 91 … … 115 93 debug(""); 116 94 debug("TEST: setVersion not blocked if handle closed immediately"); 117 evalAndLog("self.dbname = 'test2'; self.ver = 1; self.steps = []"); 118 var h1 = new Connection("h1"); 119 var h2 = new Connection("h2"); 120 runSteps([function(doNext) { h1.open({onsuccess: doNext}); }, 121 function(doNext) { h2.open({onsuccess: doNext, 122 onversion: function() { 123 debug(" h2 closing immediately"); 124 h2.close(); 125 }}); }, 126 function(doNext) { h1.setVersion({onsuccess: doNext}); }, 127 finishTest 128 ]); 129 130 function finishTest() { 131 debug("NOTE: Will FAIL with extra bogus h1.setVersion.onblocked step; https://bugs.webkit.org/show_bug.cgi?id=71130"); 132 shouldBeEqualToString("self.steps.toString()", 133 ["h1.open", 134 "h1.open.onsuccess", 135 "h2.open", 136 "h2.open.onsuccess", 137 "h1.setVersion", 138 "h2.onversionchange", 139 "h2.close", 140 "h1.setVersion.onsuccess", 141 "h1.setVersion.transaction-complete" 142 ].toString()); 143 test3(); 144 } 95 evalAndLog("self.testname = 'test2'; self.ver = 1"); 96 evalNoLog("blockedEventFired = false"); 97 98 debug("'h1.open'"); 99 request = evalNoLog("indexedDB.open(dbname + testname)"); 100 request.onblocked = unexpectedBlockedCallback; 101 request.onerror = unexpectedErrorCallback; 102 request.onsuccess = function(e) { 103 debug("'h1.open.onsuccess'"); 104 h1 = e.target.result; 105 106 h1.onversionchange = unexpectedVersionChangeCallback; 107 108 debug("'h2.open'"); 109 request = evalNoLog("indexedDB.open(dbname + testname)"); 110 request.onblocked = unexpectedBlockedCallback; 111 request.onerror = unexpectedErrorCallback; 112 request.onsuccess = function(e) { 113 debug("'h2.open.onsuccess'"); 114 h2 = e.target.result; 115 116 h2.onversionchange = function() { 117 debug("'h2.onversionchange'"); 118 debug(" h2 closing immediately"); 119 debug("'h2.close'"); 120 evalNoLog("h2.close()"); 121 }; 122 123 debug("'h1.setVersion'"); 124 request = evalNoLog("h1.setVersion(String(ver++))"); 125 request.onerror = unexpectedErrorCallback; 126 request.onblocked = function() { 127 debug("'h1.setVersion.onblocked'"); 128 evalNoLog("blockedEventFired = true"); 129 }; 130 request.onsuccess = function(e) { 131 debug("'h1.setVersion.onsuccess'"); 132 133 transaction = e.target.result; 134 transaction.onabort = unexpectedAbortCallback; 135 transaction.oncomplete = function() { 136 debug("'h1.setVersion.transaction-complete'"); 137 debug("NOTE: Will FAIL with extra bogus h1.setVersion.onblocked step; https://bugs.webkit.org/show_bug.cgi?id=71130"); 138 shouldBeFalse("blockedEventFired"); 139 test3(); 140 }; 141 }; 142 }; 143 }; 145 144 } 146 145 … … 148 147 debug(""); 149 148 debug("TEST: open and setVersion blocked if a VERSION_CHANGE transaction is running - close when blocked"); 150 evalAndLog("self.dbname = 'test3'; self.ver = 1; self.steps = []"); 151 var h1 = new Connection("h1"); 152 var h2 = new Connection("h2"); 153 var h3 = new Connection("h3"); 154 runSteps([function(doNext) { h1.open({onsuccess: doNext}); }, 155 function(doNext) { h2.open({onsuccess: doNext}); }, 156 function(doNext) { h1.setVersion(); doNext(); }, 157 function(doNext) { h2.setVersion({ 158 onblocked: function() { 159 debug(" h2 blocked so closing"); 160 h2.close(); 161 doNext(); 162 }}); }, 163 function() { h3.open({onsuccess: finishTest});} 164 ]); 165 166 function finishTest() { 167 shouldBeEqualToString("self.steps.toString()", 168 ["h1.open", 169 "h1.open.onsuccess", 170 "h2.open", 171 "h2.open.onsuccess", 172 "h1.setVersion", 173 "h2.setVersion", 174 "h2.onversionchange", 175 "h1.setVersion.onblocked", 176 "h1.onversionchange", 177 "h2.setVersion.onblocked", 178 "h2.close", 179 "h3.open", 180 "h2.setVersion.onerror", 181 "h1.setVersion.onsuccess", 182 "h1.setVersion.transaction-complete", 183 "h3.open.onsuccess" 184 ].toString()); 185 test4(); 186 } 149 evalAndLog("self.testname = 'test3'; self.ver = 1"); 150 evalNoLog("blockedEventFired = false"); 151 evalNoLog("versionChangeComplete = false"); 152 153 debug("'h1.open'"); 154 request = evalNoLog("indexedDB.open(dbname + testname)"); 155 request.onblocked = unexpectedBlockedCallback; 156 request.onerror = unexpectedErrorCallback; 157 request.onsuccess = function(e) { 158 debug("'h1.open.onsuccess'"); 159 h1 = e.target.result; 160 161 h1.onversionchange = function() { 162 debug("'h1.onversionchange'"); 163 }; 164 165 debug("'h2.open'"); 166 request = evalNoLog("indexedDB.open(dbname + testname)"); 167 request.onblocked = unexpectedBlockedCallback; 168 request.onerror = unexpectedErrorCallback; 169 request.onsuccess = function(e) { 170 debug("'h2.open.onsuccess'"); 171 h2 = e.target.result; 172 173 h2.onversionchange = function() { 174 debug("'h2.onversionchange'"); 175 }; 176 177 debug("'h1.setVersion'"); 178 request = evalNoLog("h1.setVersion(String(ver++))"); 179 request.onerror = unexpectedErrorCallback; 180 request.onblocked = function() { 181 debug("'h1.setVersion.onblocked'"); 182 evalNoLog("blockedEventFired = true"); 183 }; 184 request.onsuccess = function(e) { 185 debug("'h1.setVersion.onsuccess'"); 186 187 transaction = e.target.result; 188 transaction.onabort = unexpectedAbortCallback; 189 transaction.oncomplete = function() { 190 debug("'h1.setVersion.transaction-complete'"); 191 evalNoLog("versionChangeComplete = true"); 192 }; 193 }; 194 195 debug("'h2.setVersion'"); 196 request = evalNoLog("h2.setVersion(String(ver++))"); 197 request.onblocked = function() { 198 debug("'h2.setVersion.onblocked'"); 199 debug(" h2 blocked so closing"); 200 debug("'h2.close'"); 201 h2.close(); 202 203 debug("'h3.open'"); 204 request = evalNoLog("indexedDB.open(dbname + testname)"); 205 request.onblocked = unexpectedBlockedCallback; 206 request.onerror = unexpectedErrorCallback; 207 request.onsuccess = function() { 208 debug("'h3.open.onsuccess'"); 209 shouldBeTrue("blockedEventFired"); 210 shouldBeTrue("versionChangeComplete"); 211 test4(); 212 }; 213 }; 214 request.onerror = function() { 215 debug("'h2.setVersion.onerror'"); 216 }; 217 }; 218 }; 187 219 } 188 220 … … 190 222 debug(""); 191 223 debug("TEST: open and setVersion blocked if a VERSION_CHANGE transaction is running - just close"); 192 evalAndLog("self.dbname = 'test4'; self.ver = 1; self.steps = []"); 193 var h1 = new Connection("h1"); 194 var h2 = new Connection("h2"); 195 var h3 = new Connection("h3"); 196 runSteps([function(doNext) { h1.open({onsuccess: doNext}); }, 197 function(doNext) { h2.open({onsuccess: doNext}); }, 198 function(doNext) { h1.setVersion(); doNext(); }, 199 function(doNext) { h3.open({onsuccess: finishTest}); doNext(); }, 200 function(doNext) { h2.close(); }, 201 ]); 202 203 function finishTest() { 204 debug("NOTE: Will FAIL with extra bogus h1.setVersion.onblocked step; https://bugs.webkit.org/show_bug.cgi?id=71130"); 205 shouldBeEqualToString("self.steps.toString()", 206 ["h1.open", 207 "h1.open.onsuccess", 208 "h2.open", 209 "h2.open.onsuccess", 210 "h1.setVersion", 211 "h3.open", 212 "h2.close", 213 "h1.setVersion.onsuccess", 214 "h1.setVersion.transaction-complete", 215 "h3.open.onsuccess" 216 ].toString()); 217 test5(); 218 } 224 evalAndLog("self.testname = 'test4'; self.ver = 1"); 225 evalNoLog("blockedEventFired = false"); 226 evalNoLog("versionChangeComplete = false"); 227 228 debug("'h1.open'"); 229 request = evalNoLog("indexedDB.open(dbname + testname)"); 230 request.onblocked = unexpectedBlockedCallback; 231 request.onerror = unexpectedErrorCallback; 232 request.onsuccess = function(e) { 233 debug("'h1.open.onsuccess'"); 234 h1 = e.target.result; 235 236 h1.onversionchange = unexpectedVersionChangeCallback; 237 238 debug("'h2.open'"); 239 request = evalNoLog("indexedDB.open(dbname + testname)"); 240 request.onblocked = unexpectedBlockedCallback; 241 request.onerror = unexpectedErrorCallback; 242 request.onsuccess = function(e) { 243 debug("'h2.open.onsuccess'"); 244 h2 = e.target.result; 245 246 h2.onversionchange = unexpectedVersionChangeCallback; 247 248 debug("'h1.setVersion'"); 249 request = evalNoLog("h1.setVersion(String(ver++))"); 250 request.onerror = unexpectedErrorCallback; 251 request.onblocked = function() { 252 debug("'h1.setVersion.onblocked'"); 253 evalNoLog("blockedEventFired = true"); 254 }; 255 request.onsuccess = function(e) { 256 debug("'h1.setVersion.onsuccess'"); 257 258 transaction = e.target.result; 259 transaction.onabort = unexpectedAbortCallback; 260 transaction.oncomplete = function() { 261 debug("'h1.setVersion.transaction-complete'"); 262 evalNoLog("versionChangeComplete = true"); 263 }; 264 }; 265 266 debug("'h3.open'"); 267 request = evalNoLog("indexedDB.open(dbname + testname)"); 268 request.onblocked = unexpectedBlockedCallback; 269 request.onerror = unexpectedErrorCallback; 270 request.onsuccess = function() { 271 debug("'h3.open.onsuccess'"); 272 debug("NOTE: Will FAIL with extra bogus h1.setVersion.onblocked step; https://bugs.webkit.org/show_bug.cgi?id=71130"); 273 shouldBeFalse("blockedEventFired"); 274 shouldBeTrue("versionChangeComplete"); 275 test5(); 276 }; 277 278 debug("'h2.close'"); 279 evalNoLog("h2.close()"); 280 }; 281 }; 219 282 } 220 283 … … 222 285 debug(""); 223 286 debug("TEST: open blocked if a VERSION_CHANGE transaction is running"); 224 evalAndLog("self.dbname = 'test5'; self.ver = 1; self.steps = []"); 225 var h1 = new Connection("h1"); 226 var h2 = new Connection("h2"); 227 228 runSteps([function(doNext) { h1.open({onsuccess: doNext}); }, 229 function(doNext) { h1.setVersion(); doNext(); }, 230 function(doNext) { h2.open({onsuccess: finishTest}); } 231 ]); 232 233 function finishTest() { 234 shouldBeEqualToString("self.steps.toString()", 235 ["h1.open", 236 "h1.open.onsuccess", 237 "h1.setVersion", 238 "h2.open", 239 "h1.setVersion.onsuccess", 240 "h1.setVersion.transaction-complete", 241 "h2.open.onsuccess" 242 ].toString()); 243 test6(); 244 } 287 evalAndLog("self.testname = 'test5'; self.ver = 1"); 288 evalNoLog("versionChangeComplete = false"); 289 290 debug("'h1.open'"); 291 request = evalNoLog("indexedDB.open(dbname + testname)"); 292 request.onblocked = unexpectedBlockedCallback; 293 request.onerror = unexpectedErrorCallback; 294 request.onsuccess = function(e) { 295 debug("'h1.open.onsuccess'"); 296 h1 = e.target.result; 297 298 h1.onversionchange = unexpectedVersionChangeCallback; 299 300 debug("'h1.setVersion'"); 301 request = evalNoLog("h1.setVersion(String(ver++))"); 302 request.onerror = unexpectedErrorCallback; 303 request.onblocked = unexpectedBlockedCallback; 304 request.onsuccess = function(e) { 305 debug("'h1.setVersion.onsuccess'"); 306 307 transaction = e.target.result; 308 transaction.onabort = unexpectedAbortCallback; 309 transaction.oncomplete = function() { 310 debug("'h1.setVersion.transaction-complete'"); 311 evalNoLog("versionChangeComplete = true"); 312 }; 313 }; 314 315 debug("'h2.open'"); 316 request = evalNoLog("indexedDB.open(dbname + testname)"); 317 request.onblocked = unexpectedBlockedCallback; 318 request.onerror = unexpectedErrorCallback; 319 request.onsuccess = function(e) { 320 debug("'h2.open.onsuccess'"); 321 h2 = e.target.result; 322 h2.onversionchange = unexpectedVersionChangeCallback; 323 shouldBeTrue("versionChangeComplete"); 324 test6(); 325 }; 326 }; 245 327 } 246 328 … … 248 330 debug(""); 249 331 debug("TEST: two setVersions from the same connection"); 250 evalAndLog("self.dbname = 'test6'; self.ver = 1; self.steps = []"); 251 var h1 = new Connection("h1"); 252 253 runSteps([function(doNext) { h1.open({onsuccess: doNext}); }, 254 function(doNext) { h1.setVersion({onsuccess: halfDone}); 255 h1.setVersion({onsuccess: halfDone}); } 256 ]); 257 258 var counter = 0; 259 function halfDone() { 260 counter++; 261 if (counter < 2) { 262 debug('half done'); 263 } else { 264 finishTest(); 265 } 266 } 267 268 function finishTest() { 269 shouldBeEqualToString("self.steps.toString()", 270 ["h1.open", 271 "h1.open.onsuccess", 272 "h1.setVersion", 273 "h1.setVersion", 274 "h1.setVersion.onsuccess", 275 "h1.setVersion.transaction-complete", 276 "h1.setVersion.onsuccess", 277 "h1.setVersion.transaction-complete" 278 ].toString()); 279 finishJSTest(); 280 } 332 evalAndLog("self.testname = 'test6'; self.ver = 1"); 333 evalNoLog("versionChangeComplete = false"); 334 335 debug("'h1.open'"); 336 request = evalNoLog("indexedDB.open(dbname + testname)"); 337 request.onblocked = unexpectedBlockedCallback; 338 request.onerror = unexpectedErrorCallback; 339 request.onsuccess = function(e) { 340 debug("'h1.open.onsuccess'"); 341 h1 = e.target.result; 342 h1.onversionchange = unexpectedVersionChangeCallback; 343 344 debug("'h1.setVersion'"); 345 request = evalNoLog("h1.setVersion(String(ver++))"); 346 request.onerror = unexpectedErrorCallback; 347 request.onblocked = unexpectedBlockedCallback; 348 request.onsuccess = function(e) { 349 debug("'h1.setVersion.onsuccess'"); 350 351 transaction = e.target.result; 352 transaction.onabort = unexpectedAbortCallback; 353 transaction.oncomplete = function() { 354 debug("'h1.setVersion.transaction-complete'"); 355 debug("half done"); 356 evalNoLog("versionChangeComplete = true"); 357 }; 358 }; 359 360 361 debug("'h1.setVersion'"); 362 request = evalNoLog("h1.setVersion(String(ver++))"); 363 request.onerror = unexpectedErrorCallback; 364 request.onblocked = unexpectedBlockedCallback; 365 request.onsuccess = function(e) { 366 debug("'h1.setVersion.onsuccess'"); 367 368 transaction = e.target.result; 369 transaction.onabort = unexpectedAbortCallback; 370 transaction.oncomplete = function() { 371 debug("'h1.setVersion.transaction-complete'"); 372 shouldBeTrue("versionChangeComplete"); 373 finishJSTest(); 374 }; 375 }; 376 }; 281 377 } 282 378
Note: See TracChangeset
for help on using the changeset viewer.