// META: script=support.js

indexeddb_test(
  (t, db) => {
    const store = db.createObjectStore('store');
  },

  (t, db1) => {
    // Open a second database.
    const db2name = db1.name + '-2';
    const delete_request = indexedDB.deleteDatabase(db2name);
    delete_request.onerror = t.unreached_func('deleteDatabase() should succeed');
    const open_request = indexedDB.open(db2name, 1);
    open_request.onerror = t.unreached_func('open() should succeed');
    open_request.onupgradeneeded = t.step_func(() => {
      const db2 = open_request.result;
      const store = db2.createObjectStore('store');
    });
    open_request.onsuccess = t.step_func(() => {
      const db2 = open_request.result;
      t.add_cleanup(() => {
        db2.close();
        indexedDB.deleteDatabase(db2.name);
      });

      let transaction1PutSuccess = false;
      let transaction2PutSuccess = false;

      const onTransactionComplete = barrier_func(2, t.step_func_done(() => {
        assert_true(transaction1PutSuccess,
                    'transaction1 should have executed at least one request');
        assert_true(transaction2PutSuccess,
                    'transaction1 should have executed at least one request');
      }));


      const transaction1 = db1.transaction('store', 'readwrite');
      transaction1.onabort = t.unreached_func('transaction1 should complete');
      transaction1.oncomplete = t.step_func(onTransactionComplete);

      const transaction2 = db2.transaction('store', 'readwrite');
      transaction2.onabort = t.unreached_func('transaction2 should complete');
      transaction2.oncomplete = t.step_func(onTransactionComplete);

      // Keep both transactions alive until each has reported at least one
      // successful operation.

      function doTransaction1Put() {
        const request = transaction1.objectStore('store').put(0, 0);
        request.onerror = t.unreached_func('put request should succeed');
        request.onsuccess = t.step_func(() => {
          transaction1PutSuccess = true;
          if (!transaction2PutSuccess)
            doTransaction1Put();
        });
      }

      function doTransaction2Put() {
        const request = transaction2.objectStore('store').put(0, 0);
        request.onerror = t.unreached_func('put request should succeed');
        request.onsuccess = t.step_func(() => {
          transaction2PutSuccess = true;
          if (!transaction1PutSuccess)
            doTransaction2Put();
        });
      }

      doTransaction1Put();
      doTransaction2Put();
    });
  },
  "Check that transactions in different databases can run in parallel.");
