¿Cómo puedo eliminar una database IndexedDB entera de JavaScript?

¿Cómo se puede eliminar una database IndexedDB completa de JavaScript, en lugar de simplemente un almacén de objects? Estoy usando el shim IndexedDB , que puede usar WebSQL como su back-end.

Principalmente me gustaría saber cómo hacer esto para el browser PhantomJS (sin cabeza), aunque Chrome, Safari (en iPad) e IE10 son otros browseres importantes.

Por lo que puedo decir, uno debe usar indexedDB.deleteDatabase :

var req = indexedDB.deleteDatabase(databaseName); req.onsuccess = function () { console.log("Deleted database successfully"); }; req.onerror = function () { console.log("Couldn't delete database"); }; req.onblocked = function () { console.log("Couldn't delete database due to the operation being blocked"); }; 

Puedo confirmar que funciona con PhantomJS 1.9.0 y Chrome 26.0.1410.43.

Descubrí que el siguiente código funciona bien, pero para ver la database eliminada en la pestaña de resources de Chrome tuve que actualizar la página. También descubrí que tenía problemas con las herramientas de debugging de Chrome que se ejecutaban mientras hacía transactions. Hace que sea más difícil depurarlo, pero si lo cierra mientras ejecuta el código, el código parece funcionar bien. También es importante establecer una reference al almacén de objects al abrir la página. Obviamente, la parte eliminada del código está en el método deleteTheDB.

Código derivado del ejemplo proporcionado por Craig Shoemaker en Pluralsight.

 var IndDb = { name: 'SiteVisitInsp', version: 1000, instance: {}, storenames: { inspRecords: 'inspRecords', images: 'images' }, defaultErrorHandler: function (e) { WriteOutText("Error found : " + e); }, setDefaultErrorHandler: function (request) { if ('onerror' in request) { request.onerror = db.defaultErrorHandler; } if ('onblocked' in request) { request.onblocked = db.defaultErrorHandler; } } }; var dt = new Date(); var oneInspRecord = { recordId: 0, dateCreated: dt, dateOfInsp: dt, weatherId: 0, timeArrived: '', timeDeparted: '', projectId: 0, contractorName: '', DIWConsultant: '', SiteForeman: '', NoOfStaffOnSite: 0, FileME: '', ObservationNotes: '', DiscussionNotes: '', MachineryEquipment: '', Materials: '' }; var oneImage = { recordId: '', imgSequence: 0, imageStr: '', dateCreated: dt } var SVInsp = { nameOfDBStore: function () { alert("Indexed DB Store name : " + IndDb.name); }, createDB: function () { openRequest = window.indexedDB.open(IndDb.name, IndDb.version); openRequest.onupgradeneeded = function (e) { var newVersion = e.target.result; if (!newVersion.objectStoreNames.contains(IndDb.storenames.inspRecords)) { newVersion.createObjectStore(IndDb.storenames.inspRecords, { autoIncrement: true }); } if (!newVersion.objectStoreNames.contains(IndDb.storenames.images)) { newVersion.createObjectStore(IndDb.storenames.images, { autoIncrement: true }); } }; openRequest.onerror = openRequest.onblocked = 'Error'; //resultText; openRequest.onsuccess = function (e) { //WriteOutText("Database open"); IndDb.instance = e.target.result; }; }, deleteTheDB: function () { if (typeof IndDb.instance !== 'undefined') { //WriteOutText("Closing the DB"); IndDb.instance.close(); var deleteRequest = indexedDB.deleteDatabase(IndDb.name) deleteRequest.onblocked = function () { console.log("Delete blocked."); } deleteRequest.onerror = function () { console.log("Error deleting the DB"); //alert("Error deleting the DB"); }; //"Error deleting the DB"; deleteRequest.onsuccess = function () { console.log("Deleted OK."); alert("*** NOTE : Requires page refresh to see the DB removed from the Resources IndexedDB tab in Chrome."); //WriteOutText("Database deleted."); }; }; } }