// META: script=support.js

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

  (t, db) => {
    let transaction1Started = false;
    let transaction1Complete = false;
    let transaction2Started = false;
    let transaction2Complete = false;
    let transaction3Started = false;
    let transaction3Complete = false;

    const transaction1 = db.transaction(['a'], 'readonly');
    let request = transaction1.objectStore('a').get(0);
    request.onerror = t.unreached_func('request should succeed');
    request.onsuccess = t.step_func(() => {
      transaction1Started = true;
    });
    transaction1.onabort = t.unreached_func('transaction1 should complete');
    transaction1.oncomplete = t.step_func(() => {
      transaction1Complete = true;
      assert_false(transaction2Started);
      assert_false(transaction3Started);
    });


    // transaction2 overlaps with transaction1, so must wait until transaction1
    // completes.
    const transaction2 = db.transaction(['a', 'b'], 'readwrite');
    request = transaction2.objectStore('a').get(0);
    request.onerror = t.unreached_func('request should succeed');
    request.onsuccess = t.step_func(() => {
      assert_true(transaction1Complete);
      transaction2Started = true;
    });
    transaction2.onabort = t.unreached_func('transaction2 should complete');
    transaction2.oncomplete = t.step_func(() => {
      transaction2Complete = true;
      assert_false(transaction3Started);
    });

    // transaction3 overlaps with transaction2, so must wait until transaction2
    // completes even though it does not overlap with transaction1.
    const transaction3 = db.transaction(['b', 'c'], 'readonly');
    request = transaction3.objectStore('b').get(0);
    request.onerror = t.unreached_func('request should succeed');
    request.onsuccess = t.step_func(() => {
      assert_true(transaction1Complete);
      assert_true(transaction2Complete);
      transaction3Started = true;
    });
    transaction3.onabort = t.unreached_func('transaction3 should complete');
    transaction3.oncomplete = t.step_func_done(() => {
      transaction3Complete = true;
    });
  },
  "Check that scope restrictions on mixed transactions are enforced.");
