<!doctype html>
<meta charset=utf-8>
<title>IndexedDB: UpgradeNeeded Tests</title>
<meta name="help" href="https://w3c.github.io/IndexedDB/#commit-transaction">
<meta name="help" href="https://w3c.github.io/IndexedDB/#dom-idbfactory-open">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>

function upgradeneeded_test(upgrade_func, success_func, error_func, description) {
  async_test(function(t) {
    var dbName = 'db' + self.location.pathname + '-' + description;
    var delete_request = indexedDB.deleteDatabase(dbName);
    delete_request.onerror = t.unreached_func('deleteDatabase should not fail');
    delete_request.onsuccess = t.step_func(function() {
      var open_request = indexedDB.open(dbName);

      open_request.onupgradeneeded = t.step_func(function() {
        t.add_cleanup(function() {
          if (open_request.result) {
            open_request.result.close(),
            indexedDB.deleteDatabase(dbName);
          }
        });
        upgrade_func(t, open_request);
      });
      open_request.onsuccess = t.step_func(function() {
        success_func(t, open_request);
      });
      if (error_func) {
        open_request.onerror = function() { error_func(t, open_request); };
      } else {
        open_request.onerror = t.unreached_func('open failed');
      }
    });
  }, description);
}

(function() {
  var order = [];
  upgradeneeded_test(
    function upgrade(t, request) {
      order.push('Upgrade');
      var db = request.result;
      var deleteRequest = indexedDB.deleteDatabase(db.name);
      deleteRequest.onsuccess = t.step_func(function() {
        assert_array_equals(order, ['Upgrade', 'Open Success']);
        t.done();
      });
      deleteRequest.onerror = t.unreached_func('delete failed');
    },
    function success(t, request) {
      var db = request.result;
      db.close();
      order.push('Open Success');
    },
    null,
    'indexedDB.delete called from upgradeneeded handler'
  );
}());

(function() {
  var order = [];
  upgradeneeded_test(
    function upgrade(t, request) {
      order.push('Upgrade');
      request.transaction.abort();
      order.push('Upgrade Transaction Aborted');
      var db = request.result;
      var deleteRequest = indexedDB.deleteDatabase(db.name);
      deleteRequest.onsuccess = t.step_func(function() {
        assert_array_equals(
            order, ['Upgrade', 'Upgrade Transaction Aborted', 'Open Error']);
        t.done();
      });
      deleteRequest.onerror = t.unreached_func('delete failed');
    },
    function success(t, request) {
      t.unreached_func('open should not succeed');
    },
    function error_func(t, request) {
      assert_array_equals(order, ['Upgrade', 'Upgrade Transaction Aborted']);
      order.push('Open Error');
    },
    'Abort transaction before deleting database in upgradeneeded handler'
  );
}());

(function() {
  var order = [];
  upgradeneeded_test(
    function upgrade(t, request) {
      order.push('Upgrade');
      var db = request.result;
      var deleteRequest = indexedDB.deleteDatabase(db.name);
      request.transaction.abort();
      order.push('Upgrade Transaction Aborted');
      deleteRequest.onsuccess = t.step_func(function() {
        assert_array_equals(
            order, ['Upgrade', 'Upgrade Transaction Aborted', 'Open Error']);
        t.done();
      });
      deleteRequest.onerror = t.unreached_func('delete failed');
    },
    function success(t, request) {
      t.unreached_func('open should not succeed');
    },
    function error_func(t, request) {
      assert_array_equals(order, ['Upgrade', 'Upgrade Transaction Aborted']);
      order.push('Open Error');
    },
    'Abort transaction after deleting database in upgradeneeded event handler'
  );
}());

(function() {
  var order = [];
  upgradeneeded_test(
    function upgrade(t, request) {
      order.push('Upgrade');
      var db = request.result;
      db.createObjectStore('store');
      request.transaction.oncomplete = t.step_func(function() {
        order.push('Upgrade transaction complete');
        var txn = db.transaction('store', 'readwrite');
        var store = txn.objectStore('store');
        store.put('value', 'key');
        txn.oncomplete = t.step_func(function() {
          assert_array_equals(
              order,
              ['Upgrade', 'Upgrade transaction complete', 'Open Success']);
          t.done();
        });
        txn.onerror = t.unreached_func('error on transaction');
        txn.onabort = t.unreached_func('aborting transaction');
      });
    },
    function success(t, request) {
      order.push('Open Success');
    },
    null,
    'transaction oncomplete ordering relative to open request onsuccess'
  );
}());

</script>
