<!DOCTYPE html>
<meta charset="utf-8">
<title>Keygenerator overflow</title>
<link rel="author" href="mailto:odinho@opera.com" title="Odin Hørthe Omdal">
<link rel=help href="http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#key-generator-concept">
<link rel=assert title="When the current number of a key generator reaches above the value 2^53 (9007199254740992) any attempts to use the key generator to generate a new key will result in an error. It's still possible to insert records into the object store by specifying an explicit key, however the only way to use a key generator again for the object store is to delete the object store and create a new one.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support.js"></script>

<script>

    var db,
      t = async_test(document.title, {timeout: 10000}),
      overflow_error_fired = false,
      objects =  [9007199254740991, null, "error", 2, "error" ],
      expected_keys = [2, 9007199254740991, 9007199254740992];

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

        for (var i = 0; i < objects.length; i++)
        {
            if (objects[i] === null)
            {
                objStore.add({});
            }
            else if (objects[i] === "error")
            {
                var rq = objStore.add({});
                rq.onsuccess = fail(t, 'When "current number" overflows, error event is expected');
                rq.onerror = t.step_func(function(e) {
                    overflow_error_fired = true;
                    assert_equals(e.target.error.name, "ConstraintError", "error name");
                    e.preventDefault();
                    e.stopPropagation();
                });
            }
            else
                objStore.add({ id: objects[i] });
        }
    };

    open_rq.onsuccess = function(e) {
        var actual_keys = [],
          rq = db.transaction("store")
                 .objectStore("store")
                 .openCursor();

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

            if (cursor) {
                actual_keys.push(cursor.key.valueOf());
                cursor.continue();
            }
            else {
                assert_true(overflow_error_fired, "error fired on 'current number' overflow");
                assert_array_equals(actual_keys, expected_keys, "keygenerator array");

                t.done();
            }
        });
    };

</script>

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