Test IndexedDB: adds, gets, deletes, and re-gets a record in a variety of different object store configurations

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


data = [
        { name: 'inline key; key generator',
          autoIncrement: true,
          storedObject: {name: 'Lincoln'},
          keyName: 'id',
          keyValue: undefined,
        },
        { name: 'inline key; no key generator',
          autoIncrement: false,
          storedObject: {id: 1, name: 'Lincoln'},
          keyName: 'id',
          keyValue: undefined,
        },
        { name: 'out of line key; key generator',
          autoIncrement: true,
          storedObject: {name: 'Lincoln'},
          keyName: undefined,
          keyValue: undefined,
        },
        { name: 'out of line key; no key generator',
          autoIncrement: false,
          storedObject: {name: 'Lincoln'},
          keyName: undefined,
          keyValue: 1,
        }
    ];
i = 0;

indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;

dbname = "object-store-remove-values.html"
indexedDB.deleteDatabase(dbname)
indexedDB.open(dbname)
objectStore = db.createObjectStore(test.name, { keyPath: test.keyName, autoIncrement: test.autoIncrement });
request = objectStore.add(test.storedObject);
id = event.target.result;
request = objectStore.get(id);
PASS test.storedObject.name is event.target.result.name
request = objectStore.delete(id);
request = objectStore.get(id);
PASS event.target.result === undefined is true
indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;

dbname = "object-store-remove-values.html"
indexedDB.deleteDatabase(dbname)
indexedDB.open(dbname)
objectStore = db.createObjectStore(test.name, { keyPath: test.keyName, autoIncrement: test.autoIncrement });
request = objectStore.add(test.storedObject);
id = event.target.result;
request = objectStore.get(id);
PASS test.storedObject.name is event.target.result.name
request = objectStore.delete(id);
request = objectStore.get(id);
PASS event.target.result === undefined is true
indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;

dbname = "object-store-remove-values.html"
indexedDB.deleteDatabase(dbname)
indexedDB.open(dbname)
objectStore = db.createObjectStore(test.name, { autoIncrement: test.autoIncrement });
request = objectStore.add(test.storedObject);
id = event.target.result;
request = objectStore.get(id);
PASS test.storedObject.name is event.target.result.name
request = objectStore.delete(id);
request = objectStore.get(id);
PASS event.target.result === undefined is true
indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;

dbname = "object-store-remove-values.html"
indexedDB.deleteDatabase(dbname)
indexedDB.open(dbname)
objectStore = db.createObjectStore(test.name, { autoIncrement: test.autoIncrement });
request = objectStore.add(test.storedObject, test.keyValue);
id = event.target.result;
request = objectStore.get(id);
PASS test.storedObject.name is event.target.result.name
request = objectStore.delete(id);
request = objectStore.get(id);
PASS event.target.result === undefined is true
PASS successfullyParsed is true

TEST COMPLETE

