// META: title=IDBRequest onupgradeneeded tests // META: global=window,worker 'use strict'; function upgradeneeded_test( upgrade_func, success_func, error_func, description) { async_test(function(t) { let dbName = 'db' + self.location.pathname + '-' + description; let delete_request = indexedDB.deleteDatabase(dbName); delete_request.onerror = t.unreached_func('deleteDatabase should not fail'); delete_request.onsuccess = t.step_func(function() { let open_request = indexedDB.open(dbName); open_request.onupgradeneeded = t.step_func(function() { t.add_cleanup(function() { if (open_request.result) { open_request.result.close(); indexedDB.deleteDatabase(dbName); } }); upgrade_func(t, open_request); }); open_request.onsuccess = t.step_func(function() { success_func(t, open_request); }); if (error_func) { open_request.onerror = function() { error_func(t, open_request); }; } else { open_request.onerror = t.unreached_func('open failed'); } }); }, description); } (function() { let order = []; upgradeneeded_test( function upgrade(t, request) { order.push('Upgrade'); let db = request.result; let deleteRequest = indexedDB.deleteDatabase(db.name); deleteRequest.onsuccess = t.step_func(function() { assert_array_equals(order, ['Upgrade', 'Open Success']); t.done(); }); deleteRequest.onerror = t.unreached_func('delete failed'); }, function success(t, request) { let db = request.result; db.close(); order.push('Open Success'); }, null, 'indexedDB.delete called from upgradeneeded handler'); }()); (function() { let order = []; upgradeneeded_test( function upgrade(t, request) { order.push('Upgrade'); request.transaction.abort(); order.push('Upgrade Transaction Aborted'); let db = request.result; let deleteRequest = indexedDB.deleteDatabase(db.name); deleteRequest.onsuccess = t.step_func(function() { assert_array_equals( order, ['Upgrade', 'Upgrade Transaction Aborted', 'Open Error']); t.done(); }); deleteRequest.onerror = t.unreached_func('delete failed'); }, function success(t, request) { t.unreached_func('open should not succeed'); }, function error_func(t, request) { assert_array_equals(order, ['Upgrade', 'Upgrade Transaction Aborted']); order.push('Open Error'); }, 'Abort transaction before deleting database in upgradeneeded handler'); }()); (function() { let order = []; upgradeneeded_test( function upgrade(t, request) { order.push('Upgrade'); let db = request.result; let deleteRequest = indexedDB.deleteDatabase(db.name); request.transaction.abort(); order.push('Upgrade Transaction Aborted'); deleteRequest.onsuccess = t.step_func(function() { assert_array_equals( order, ['Upgrade', 'Upgrade Transaction Aborted', 'Open Error']); t.done(); }); deleteRequest.onerror = t.unreached_func('delete failed'); }, function success(t, request) { t.unreached_func('open should not succeed'); }, function error_func(t, request) { assert_array_equals(order, ['Upgrade', 'Upgrade Transaction Aborted']); order.push('Open Error'); }, 'Abort transaction after deleting database in upgradeneeded event handler'); }()); (function() { let order = []; upgradeneeded_test( function upgrade(t, request) { order.push('Upgrade'); let db = request.result; db.createObjectStore('store'); request.transaction.oncomplete = t.step_func(function() { order.push('Upgrade transaction complete'); let txn = db.transaction('store', 'readwrite'); let store = txn.objectStore('store'); store.put('value', 'key'); txn.oncomplete = t.step_func(function() { assert_array_equals( order, ['Upgrade', 'Upgrade transaction complete', 'Open Success']); t.done(); }); txn.onerror = t.unreached_func('error on transaction'); txn.onabort = t.unreached_func('aborting transaction'); }); }, function success(t, request) { order.push('Open Success'); }, null, 'transaction oncomplete ordering relative to open request onsuccess'); }());