Files
sousa-gecko/testing/web-platform/tests/IndexedDB/idbfactory_deleteDatabase.any.js
T
Evan Stade dfed61b655 Bug 1973799 [wpt PR 53362] - IDB: handle double deletion in SQLite store., a=testonly
Automatic update from web-platform-tests
IDB: handle double deletion in SQLite store.

calling deleteDatabase() on a non-existent database normally doesn't
even create a Database object, but if it does exist and
deleteDatabase is called on it twice, the first call will delete the
DatabaseConnection and the second call (enqueued behind the first)
needs to be able to handle this state.

Bug: 40253999
Change-Id: I64279e940e79af5435447cda7cf9304d5f61a288
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6658503
Reviewed-by: Abhishek Shanthkumar <abhishek.shanthkumar@microsoft.com>
Commit-Queue: Evan Stade <evanstade@microsoft.com>
Cr-Commit-Position: refs/heads/main@{#1478097}

--

wpt-commits: dbb289b9161da8f183186ce0940466985f7b0f42
wpt-pr: 53362
2025-07-04 08:42:36 +00:00

130 lines
3.7 KiB
JavaScript

// META: title=IDBFactory.deleteDatabase()
// META: global=window,worker
// META: script=resources/support.js
'use strict';
async_test(t => {
const delete_rq = indexedDB.deleteDatabase('db-that-doesnt-exist');
delete_rq.onerror = fail(t, 'delete_rq.error');
delete_rq.onsuccess = t.step_func(e => {
assert_equals(e.oldVersion, 0, 'event.oldVersion');
assert_equals(e.target.source, null, 'event.target.source');
});
const open_rq = createdb(t, undefined, 9);
open_rq.onupgradeneeded = t.step_func(e => {});
open_rq.onsuccess = t.step_func(e => {
const db = e.target.result;
db.close();
const delete_rq1 = indexedDB.deleteDatabase(db.name);
delete_rq1.onerror = fail(t, 'delete_rq1.error');
delete_rq1.onsuccess = t.step_func(e => {
assert_equals(e.oldVersion, 9, 'event.oldVersion');
assert_equals(e.target.source, null, 'event.target.source');
});
const delete_rq2 = indexedDB.deleteDatabase(db.name);
delete_rq2.onerror = fail(t, 'delete_rq2.error');
delete_rq2.onsuccess = t.step_func_done(e => {
assert_equals(e.oldVersion, 0, 'event.oldVersion');
assert_equals(e.target.source, null, 'event.target.source');
});
});
}, 'deleteDatabase() request should have no source, and deleting a non-existent\
database should succeed with oldVersion of 0.');
async_test(t => {
const open_rq = createdb(t, undefined, 9);
open_rq.onupgradeneeded = t.step_func(e => {});
open_rq.onsuccess = t.step_func(e => {
const db = e.target.result;
db.close();
const delete_rq = indexedDB.deleteDatabase(db.name);
delete_rq.onerror = t.step_func(e => {
assert_unreached('Unexpected delete_rq.error event');
});
delete_rq.onsuccess = t.step_func(e => {
assert_equals(e.target.result, undefined, 'result');
t.done();
});
});
}, 'Result of the deleteDatabase() request is set to undefined.');
async_test(t => {
let db;
const open_rq = createdb(t, undefined, 9);
open_rq.onupgradeneeded = t.step_func(e => {
db = e.target.result;
db.createObjectStore('os');
});
open_rq.onsuccess = t.step_func(e => {
db.close();
const delete_rq = indexedDB.deleteDatabase(db.name);
delete_rq.onerror = t.step_func(e => {
assert_unreached('Unexpected delete_rq.error event');
});
delete_rq.onsuccess = t.step_func(e => {
assert_equals(e.oldVersion, 9, 'oldVersion');
assert_equals(e.newVersion, null, 'newVersion');
assert_equals(e.target.result, undefined, 'result');
assert_true(
e instanceof IDBVersionChangeEvent,
'e instanceof IDBVersionChangeEvent');
t.done();
});
});
}, 'The deleteDatabase() request\'s success event is an IDBVersionChangeEvent.');
async_test(t => {
const dbname = location + '-' + t.name;
indexedDB.deleteDatabase(dbname);
let db;
const openrq = indexedDB.open(dbname, 3);
openrq.onupgradeneeded = t.step_func(e => {
e.target.result.createObjectStore('store');
});
openrq.onsuccess = t.step_func(e => {
db = e.target.result;
// Errors
db.onversionchange = fail(t, 'db.versionchange');
db.onerror = fail(t, 'db.error');
db.abort = fail(t, 'db.abort');
step_timeout(t.step_func(() => Second(t, dbname)), 4);
db.close();
});
// Errors
openrq.onerror = fail(t, 'open.error');
openrq.onblocked = fail(t, 'open.blocked');
}, 'Delete an existing database - Test events opening a second \
database when one connection is open already');
function Second(t, dbname) {
const deleterq = indexedDB.deleteDatabase(dbname);
deleterq.onsuccess = e => {
t.done();
};
deleterq.onerror = fail(t, 'delete.error');
deleterq.onblocked = fail(t, 'delete.blocked');
deleterq.onupgradeneeded = fail(t, 'delete.upgradeneeded');
}