idbrequest-onupgradeneeded.any.js (4510B)
1 // META: title=IDBRequest onupgradeneeded tests 2 // META: global=window,worker 3 4 'use strict'; 5 6 function upgradeneeded_test( 7 upgrade_func, success_func, error_func, description) { 8 async_test(function(t) { 9 let dbName = 'db' + self.location.pathname + '-' + description; 10 let delete_request = indexedDB.deleteDatabase(dbName); 11 delete_request.onerror = t.unreached_func('deleteDatabase should not fail'); 12 delete_request.onsuccess = t.step_func(function() { 13 let open_request = indexedDB.open(dbName); 14 15 open_request.onupgradeneeded = t.step_func(function() { 16 t.add_cleanup(function() { 17 if (open_request.result) { 18 open_request.result.close(); 19 indexedDB.deleteDatabase(dbName); 20 } 21 }); 22 upgrade_func(t, open_request); 23 }); 24 open_request.onsuccess = t.step_func(function() { 25 success_func(t, open_request); 26 }); 27 if (error_func) { 28 open_request.onerror = function() { 29 error_func(t, open_request); 30 }; 31 } else { 32 open_request.onerror = t.unreached_func('open failed'); 33 } 34 }); 35 }, description); 36 } 37 38 (function() { 39 let order = []; 40 upgradeneeded_test( 41 function upgrade(t, request) { 42 order.push('Upgrade'); 43 let db = request.result; 44 let deleteRequest = indexedDB.deleteDatabase(db.name); 45 deleteRequest.onsuccess = t.step_func(function() { 46 assert_array_equals(order, ['Upgrade', 'Open Success']); 47 t.done(); 48 }); 49 deleteRequest.onerror = t.unreached_func('delete failed'); 50 }, 51 function success(t, request) { 52 let db = request.result; 53 db.close(); 54 order.push('Open Success'); 55 }, 56 null, 'indexedDB.delete called from upgradeneeded handler'); 57 }()); 58 59 (function() { 60 let order = []; 61 upgradeneeded_test( 62 function upgrade(t, request) { 63 order.push('Upgrade'); 64 request.transaction.abort(); 65 order.push('Upgrade Transaction Aborted'); 66 let db = request.result; 67 let deleteRequest = indexedDB.deleteDatabase(db.name); 68 deleteRequest.onsuccess = t.step_func(function() { 69 assert_array_equals( 70 order, ['Upgrade', 'Upgrade Transaction Aborted', 'Open Error']); 71 t.done(); 72 }); 73 deleteRequest.onerror = t.unreached_func('delete failed'); 74 }, 75 function success(t, request) { 76 t.unreached_func('open should not succeed'); 77 }, 78 function error_func(t, request) { 79 assert_array_equals(order, ['Upgrade', 'Upgrade Transaction Aborted']); 80 order.push('Open Error'); 81 }, 82 'Abort transaction before deleting database in upgradeneeded handler'); 83 }()); 84 85 (function() { 86 let order = []; 87 upgradeneeded_test( 88 function upgrade(t, request) { 89 order.push('Upgrade'); 90 let db = request.result; 91 let deleteRequest = indexedDB.deleteDatabase(db.name); 92 request.transaction.abort(); 93 order.push('Upgrade Transaction Aborted'); 94 deleteRequest.onsuccess = t.step_func(function() { 95 assert_array_equals( 96 order, ['Upgrade', 'Upgrade Transaction Aborted', 'Open Error']); 97 t.done(); 98 }); 99 deleteRequest.onerror = t.unreached_func('delete failed'); 100 }, 101 function success(t, request) { 102 t.unreached_func('open should not succeed'); 103 }, 104 function error_func(t, request) { 105 assert_array_equals(order, ['Upgrade', 'Upgrade Transaction Aborted']); 106 order.push('Open Error'); 107 }, 108 'Abort transaction after deleting database in upgradeneeded event handler'); 109 }()); 110 111 (function() { 112 let order = []; 113 upgradeneeded_test( 114 function upgrade(t, request) { 115 order.push('Upgrade'); 116 let db = request.result; 117 db.createObjectStore('store'); 118 request.transaction.oncomplete = t.step_func(function() { 119 order.push('Upgrade transaction complete'); 120 let txn = db.transaction('store', 'readwrite'); 121 let store = txn.objectStore('store'); 122 store.put('value', 'key'); 123 txn.oncomplete = t.step_func(function() { 124 assert_array_equals( 125 order, 126 ['Upgrade', 'Upgrade transaction complete', 'Open Success']); 127 t.done(); 128 }); 129 txn.onerror = t.unreached_func('error on transaction'); 130 txn.onabort = t.unreached_func('aborting transaction'); 131 }); 132 }, 133 function success(t, request) { 134 order.push('Open Success'); 135 }, 136 null, 'transaction oncomplete ordering relative to open request onsuccess'); 137 }());