| <!doctype html> | |
| <meta charset=utf-8> | |
| <title>IndexedDB: Index iteration with cursor updates/deletes</title> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="support.js"></script> | |
| <script> | |
| const objStoreValues = [ | |
| {name: 'foo', id: 1}, | |
| {name: 'bar', id: 2}, | |
| {name: 'foo', id: 3}, | |
| {name: 'bar', id: 4}, | |
| ]; | |
| const objStoreValuesByIndex = [ | |
| objStoreValues[1], | |
| objStoreValues[3], | |
| objStoreValues[0], | |
| objStoreValues[2], | |
| ]; | |
| const functionsThatShouldNotAffectIteration = [ | |
| cursor => cursor.update({}), | |
| cursor => cursor.delete(), | |
| ]; | |
| functionsThatShouldNotAffectIteration.forEach((func) => indexeddb_test( | |
| (t, db) => { | |
| const objStore = db.createObjectStore('items', {autoIncrement: true}); | |
| objStore.createIndex('name', 'name', {unique: false}); | |
| objStoreValues.forEach((value) => objStore.add(value)); | |
| }, | |
| (t, db) => { | |
| const txn = db.transaction('items', 'readwrite'); | |
| const objStore = txn.objectStore('items'); | |
| const nameIndex = objStore.index('name'); | |
| const cursorValues = []; | |
| nameIndex.openCursor().onsuccess = (evt) => { | |
| const cursor = evt.target.result; | |
| if (cursor) { | |
| func(cursor); | |
| cursorValues.push(cursor.value); | |
| cursor.continue(); | |
| } else { | |
| assert_equals(cursorValues.length, 4, | |
| `Cursor should iterate over 4 records`); | |
| cursorValues.forEach((value, i) => { | |
| assert_object_equals(value, objStoreValuesByIndex[i]); | |
| }); | |
| t.done(); | |
| } | |
| } | |
| }, | |
| `Calling ${func} doesn't affect index iteration` | |
| )); | |
| </script> |