<!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>
