<!DOCTYPE html>
<meta charset="utf-8">
<title>IDBObjectStore.put() - record with same key already exists </title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com">
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="support.js"></script>

<script>
    var db, success_event,
      t = async_test(),
      record = { key: 1, property: "data" },
      record_put = { key: 1, property: "changed", more: ["stuff", 2] };

    var open_rq = createdb(t);
    open_rq.onupgradeneeded = function(e) {
        db = e.target.result;
        var objStore = db.createObjectStore("store", { keyPath: "key" });
        objStore.put(record);

        var rq = objStore.put(record_put);
        rq.onerror = fail(t, "error on put");

        rq.onsuccess = t.step_func(function(e) {
            success_event = true;
        });
    };

    open_rq.onsuccess = function(e) {
        assert_true(success_event);

        var rq = db.transaction("store")
                   .objectStore("store")
                   .get(1);

        rq.onsuccess = t.step_func(function(e) {
            var rec = e.target.result;

            assert_equals(rec.key, record_put.key);
            assert_equals(rec.property, record_put.property);
            assert_array_equals(rec.more, record_put.more);

            t.done();
        });
    };
</script>

<div id="log"></div>
