<!DOCTYPE html>
<title>IDBTransaction</title>
<link rel="author" href="mailto:odinho@opera.com" title="Odin Hørthe Omdal">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support.js"></script>

<script>
async_test(function(t) {
  var open_rq = indexedDB.open("idbtransaction-" + document.location + t.name);

  open_rq.onblocked = t.unreached_func('open_rq.onblocked');
  open_rq.onerror = t.unreached_func('open_rq.onerror');

  open_rq.onupgradeneeded = t.step_func(function(e) {
    t.add_cleanup(function() {
      open_rq.onerror = function(e) {
        e.preventDefault();
      };
      open_rq.result.close();
      indexedDB.deleteDatabase(open_rq.result.name);
    });

    assert_equals(e.target, open_rq, "e.target is reusing the same IDBOpenDBRequest");
    assert_equals(e.target.transaction, open_rq.transaction, "IDBOpenDBRequest.transaction");

    assert_true(e.target.transaction instanceof IDBTransaction, "transaction instanceof IDBTransaction");
    t.done();
  });

}, document.title + " - request gotten by the handler");

async_test(function(t) {
  var open_rq = indexedDB.open("idbtransaction-" + document.location + t.name);

  assert_equals(open_rq.transaction, null, "IDBOpenDBRequest.transaction");
  assert_equals(open_rq.source, null, "IDBOpenDBRequest.source");
  assert_equals(open_rq.readyState, "pending", "IDBOpenDBRequest.readyState");

  assert_true(open_rq instanceof IDBOpenDBRequest, "open_rq instanceof IDBOpenDBRequest");
  assert_equals(open_rq + "", "[object IDBOpenDBRequest]", "IDBOpenDBRequest (open_rq)");

  open_rq.onblocked = t.unreached_func('open_rq.onblocked');
  open_rq.onerror = t.unreached_func('open_rq.onerror');

  open_rq.onupgradeneeded = t.step_func(function() {
    t.add_cleanup(function() {
      open_rq.onerror = function(e) {
        e.preventDefault();
      };
      open_rq.result.close();
      indexedDB.deleteDatabase(open_rq.result.name);
    });
    t.done();
  });

}, document.title + " - request returned by open()");

</script>
