Test features of IndexedDB's multiEntry indices.

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


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

indexedDB.deleteDatabase(dbname)
indexedDB.open(dbname)
store = db.createObjectStore('store')
store.createIndex('index', 'x', {multiEntry: true})
store2 = db.createObjectStore('store-unique')
store2.createIndex('index-unique', 'x', {multiEntry: true, unique: true})

Populating stores (and indexes)
transaction = db.transaction(['store'], 'readwrite')
First try some keys that aren't what we're expecting
transaction.objectStore('store').put({x: [7, 8, 9], y: 'a'}, 'foo')
Now overwrite them with what we're expecting
transaction.objectStore('store').put({x: [1, 2, 3], y: 'a'}, 'foo')
transaction.objectStore('store').put({x: [4, 5, 6], y: 'b'}, 'bar')
transaction.objectStore('store').put({x: [7, 7, 8, 7], y: 'c'}, 'baz')
transaction.objectStore('store').put({x: [null, 9, 9], y: 'd'}, 'bloop')
transaction.objectStore('store').put({x: [1, [2, null]], y:'e'}, 'oh')

Verifying index: index
transaction = db.transaction(['store'], 'readonly')
transaction.objectStore('store').index('index').openCursor()
cursor = event.target.result
PASS ex is non-null.
PASS cursor.key is 1
PASS cursor.primaryKey is "foo"
PASS cursor.value.y is "a"
cursor.continue()
cursor = event.target.result
PASS ex is non-null.
PASS cursor.key is 1
PASS cursor.primaryKey is "oh"
PASS cursor.value.y is "e"
cursor.continue()
cursor = event.target.result
PASS ex is non-null.
PASS cursor.key is 2
PASS cursor.primaryKey is "foo"
PASS cursor.value.y is "a"
cursor.continue()
cursor = event.target.result
PASS ex is non-null.
PASS cursor.key is 3
PASS cursor.primaryKey is "foo"
PASS cursor.value.y is "a"
cursor.continue()
cursor = event.target.result
PASS ex is non-null.
PASS cursor.key is 4
PASS cursor.primaryKey is "bar"
PASS cursor.value.y is "b"
cursor.continue()
cursor = event.target.result
PASS ex is non-null.
PASS cursor.key is 5
PASS cursor.primaryKey is "bar"
PASS cursor.value.y is "b"
cursor.continue()
cursor = event.target.result
PASS ex is non-null.
PASS cursor.key is 6
PASS cursor.primaryKey is "bar"
PASS cursor.value.y is "b"
cursor.continue()
cursor = event.target.result
PASS ex is non-null.
PASS cursor.key is 7
PASS cursor.primaryKey is "baz"
PASS cursor.value.y is "c"
cursor.continue()
cursor = event.target.result
PASS ex is non-null.
PASS cursor.key is 8
PASS cursor.primaryKey is "baz"
PASS cursor.value.y is "c"
cursor.continue()
cursor = event.target.result
PASS ex is non-null.
PASS cursor.key is 9
PASS cursor.primaryKey is "bloop"
PASS cursor.value.y is "d"
cursor.continue()
cursor = event.target.result
PASS expected.length is 0
transaction = db.transaction(['store'])
transaction.objectStore('store').index('index')
index.count()
PASS event.target.result is 10
index.count(7)
PASS event.target.result is 1

Verifying unique constraint on multiEntry index
transaction = db.transaction(['store-unique'], 'readwrite')
transaction.objectStore('store-unique').put({x: [1, 2, 3], y: 'a'}, 'foo')
success!
Replace an existing record - this should work
transaction.objectStore('store-unique').put({x: [1, 2, 7], y: 'a'}, 'foo')
success!
This should fail the uniqueness constraint on the index, and fail:
transaction.objectStore('store-unique').put({x: [5, 2], y: 'c'}, 'should fail')
Request failed, as expected (ConstraintError)
Transaction aborted as expected

Create an index on a populated store
db.close()
indexedDB.open(dbname, 2)
db = event.target.result
trans = event.target.transaction
store = trans.objectStore('store')
store.createIndex('index-new', 'x', {multiEntry: true})

Verifying index: index-new
transaction = db.transaction(['store'], 'readonly')
transaction.objectStore('store').index('index-new').openCursor()
cursor = event.target.result
PASS ex is non-null.
PASS cursor.key is 1
PASS cursor.primaryKey is "foo"
PASS cursor.value.y is "a"
cursor.continue()
cursor = event.target.result
PASS ex is non-null.
PASS cursor.key is 1
PASS cursor.primaryKey is "oh"
PASS cursor.value.y is "e"
cursor.continue()
cursor = event.target.result
PASS ex is non-null.
PASS cursor.key is 2
PASS cursor.primaryKey is "foo"
PASS cursor.value.y is "a"
cursor.continue()
cursor = event.target.result
PASS ex is non-null.
PASS cursor.key is 3
PASS cursor.primaryKey is "foo"
PASS cursor.value.y is "a"
cursor.continue()
cursor = event.target.result
PASS ex is non-null.
PASS cursor.key is 4
PASS cursor.primaryKey is "bar"
PASS cursor.value.y is "b"
cursor.continue()
cursor = event.target.result
PASS ex is non-null.
PASS cursor.key is 5
PASS cursor.primaryKey is "bar"
PASS cursor.value.y is "b"
cursor.continue()
cursor = event.target.result
PASS ex is non-null.
PASS cursor.key is 6
PASS cursor.primaryKey is "bar"
PASS cursor.value.y is "b"
cursor.continue()
cursor = event.target.result
PASS ex is non-null.
PASS cursor.key is 7
PASS cursor.primaryKey is "baz"
PASS cursor.value.y is "c"
cursor.continue()
cursor = event.target.result
PASS ex is non-null.
PASS cursor.key is 8
PASS cursor.primaryKey is "baz"
PASS cursor.value.y is "c"
cursor.continue()
cursor = event.target.result
PASS ex is non-null.
PASS cursor.key is 9
PASS cursor.primaryKey is "bloop"
PASS cursor.value.y is "d"
cursor.continue()
cursor = event.target.result
PASS expected.length is 0
transaction = db.transaction(['store'])
transaction.objectStore('store').index('index')
index.count()
PASS event.target.result is 10
index.count(7)
PASS event.target.result is 1
PASS successfullyParsed is true

TEST COMPLETE

