| if (this.importScripts) { |
| importScripts('../../../resources/js-test.js'); |
| importScripts('shared.js'); |
| } |
| |
| description("Regression test for http://crbug.com/108071"); |
| |
| // Have to be at least 5 here: 1 initial, 3 continues to trigger prefetch and 1 |
| // post-abort outstanding continue. |
| var names = ['Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo']; |
| |
| indexedDBTest(prepareDatabase, iterateAndDeleteFirstElement); |
| function prepareDatabase() |
| { |
| db = event.target.result; |
| event.target.transaction.onabort = unexpectedAbortCallback; |
| trans = event.target.transaction; |
| |
| var objectStore = evalAndLog("objectStore = db.createObjectStore('store', {keyPath: 'id'})"); |
| resetObjectStore(); |
| } |
| |
| function resetObjectStore() |
| { |
| debug("\nresetObjectStore():"); |
| |
| objectStore = trans.objectStore('store'); |
| evalAndLog("objectStore.clear()"); |
| for (i = 0; i < names.length; i++) { |
| request = evalAndLog("objectStore.add({id: " + i + ", name: \"" + names[i] + "\"})"); |
| request.onerror = unexpectedErrorCallback; |
| } |
| |
| debug(""); |
| } |
| |
| function iterateAndDeleteFirstElement() |
| { |
| debug("iterateAndDeleteFirstElement():"); |
| |
| evalAndLog("trans = db.transaction(['store'], 'readwrite')"); |
| trans.onabort = transactionAborted; |
| trans.oncomplete = unexpectedCompleteCallback; |
| |
| // Create the cursor and iterate over the whole thing. |
| request = evalAndLog("trans.objectStore('store').openCursor()"); |
| request.onerror = unexpectedErrorCallback; |
| request.onsuccess = function () { |
| var cursor = event.target.result; |
| if (cursor == null) { |
| resetObjectStore(); |
| prefetchAndAbort(); |
| return; |
| } |
| |
| debug(cursor.value.id + ": " + cursor.value.name); |
| |
| if (cursor.value.id == 0) { |
| // Delete the first element when we see it. |
| request = evalAndLog("trans.objectStore('store').delete(0)"); |
| request.onerror = unexpectedErrorCallback; |
| request.onsuccess = function() { cursor.continue(); }; |
| } else { |
| cursor.continue(); |
| } |
| } |
| } |
| |
| function prefetchAndAbort() |
| { |
| debug("prefetchAndAbort():"); |
| |
| request = evalAndLog("trans.objectStore('store').openCursor()"); |
| request.onerror = unexpectedErrorCallback; |
| request.onsuccess = function () { |
| var cursor = event.target.result; |
| debug(cursor.value.id + ": " + cursor.value.name); |
| // Have to iterate to 3 in order to prefetch, but can't iterate past 3 |
| // so that there will be a continue remaining. |
| if (cursor.value.id == 3) { |
| evalAndLog("trans.abort()"); |
| } else { |
| cursor.continue(); |
| } |
| } |
| } |
| |
| function transactionAborted() |
| { |
| testPassed("Transaction aborted as expected"); |
| finishJSTest(); |
| } |