Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
- This WPT test may be referenced by the following Test IDs:
            - /dom/indexedDB/idb-filelist-indexing.https.html - WPT Dashboard Interop Dashboard
 
<!--
  Any copyright is dedicated to the Public Domain.
-->
<html>
<head>
  <meta charset="utf-8">
  <meta name="timeout" content="long">
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
</head>
<body>
<script>
var fileCounter = 0;
var globalIdx = 0;
const fileListSize = 3;
const elementSize = 8196;
function makeFileList(dataGenerators) {
  const fileOpts = { type: "text/plain" };
  const dataTransfer = new DataTransfer();
  dataGenerators.forEach((generator, i) => {
    const file = new File(generator(i), "test_" + fileCounter, fileOpts);
    dataTransfer.items.add(file);
    ++fileCounter;
  });
  return dataTransfer.files;
}
function indexTest(testName, indexValueName, elements) {
  promise_test(async t => {
    const dbName = "indexTest_" + indexValueName;
    const array = new Uint32Array(elementSize);
    crypto.getRandomValues(array);
    const randomFile = new Blob(array);
    const fileListStatic = makeFileList(
      Array(fileListSize).fill(() => [randomFile])
    );
    const makeDataItem = keyName => {
      return { key: keyName, idx: globalIdx++, fileList: fileListStatic, blob: randomFile };
    };
    const objectStoreInfo = [
        {
          name: "FileLists",
          options: { keyPath: "key" },
          data: makeDataItem("A"),
        },
        {
          name: "Other FileLists",
          options: { keyPath: "key" },
          data: makeDataItem("B"),
        },
      ];
    let db = await new Promise((resolve, reject) => {
      const openReq = indexedDB.open(dbName, 1);
      openReq.onerror = () => {
        reject(openReq.error);
      };
      openReq.onupgradeneeded = ev => {
        const dbObj = ev.target.result;
        for (const info of objectStoreInfo) {
          const objectStore = dbObj.createObjectStore(info.name, info.options);
          objectStore.add(info.data);
        }
      };
      openReq.onsuccess = () => {
        resolve(openReq.result);
      };
    });
    t.add_cleanup(() => {
      if (db) {
        db.close();
        indexedDB.deleteDatabase(db.name);
      }
    });
    db.close();
    db = await new Promise((resolve, reject) => {
      const openReq = indexedDB.open(dbName, 2);
      openReq.onerror = () => {
        reject(openReq.error);
      };
      openReq.onupgradeneeded = ev => {
        let objectStore = event.target.transaction.objectStore("FileLists");
        objectStore.createIndex("test", indexValueName, {unique: false});
      };
      openReq.onsuccess = () => {
        resolve(openReq.result);
      };
    });
    db.close();
    db = await new Promise((resolve, reject) => {
      const openReq = indexedDB.open(dbName, 2);
      let done = false;
      openReq.onerror = () => {
        reject(openReq.error);
      };
      openReq.onupgradeneeded = () => {
        done = true;
        reject(openReq.error);
      };
      openReq.onsuccess = () => {
        if (!done) {
          resolve(openReq.result);
        }
      };
    });
    let tx = db.transaction(["FileLists"], "readonly");
    let store = tx.objectStore("FileLists");
    t.step(() => {
      assert_equals(store.indexNames.length, 1, "Do we have exactly one index?");
      assert_equals(store.indexNames[0], "test", "Is the only index name as expected?");
    });
    let testIndex = store.index("test");
    request = testIndex.openCursor();
    var cursorItems = 0;
    await new Promise((resolve, reject) => {
      request.onerror = () => reject(request.error);
      request.onsuccess = (event) => {
        const cursor = event.target.result;
        if (cursor) {
          cursorItems = cursorItems + 1;
          cursor.continue();
        } else {
          t.step(() => {
            assert_equals(cursorItems, elements);
          });
          resolve();
        }
      };
    });
    t.done();
  }, testName);
}
// FileList - exposed in Workers, but not constructable.
if ("document" in self) {
  indexTest("Indexing on an integer value of an object containing a filelist should work", "idx", 1);
  indexTest("Indexing on a filelist value of an object containing a filelist should work", "filelist", 0);
  indexTest("Indexing on a blob value of an object containing a filelist should work", "blob", 0);
}
</script>
</body>
</html>