<!DOCTYPE html>
<!-- Submitted from TestTWF Paris -->
<meta charset=utf-8">
<meta name="timeout" content="long">
<title>Valid key</title>
<link rel=help href="http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#key-construct">
<link rel=assert title="A value is said to be a valid key if it is one of the following types: Array JavaScript objects [ECMA-262], DOMString [WEBIDL], Date [ECMA-262] or float [WEBIDL]. However Arrays are only valid keys if every item in the array is defined and is a valid key (i.e. sparse arrays can not be valid keys) and if the Array doesn't directly or indirectly contain itself. Any non-numeric properties are ignored, and thus does not affect whether the Array is a valid key. Additionally, if the value is of type float, it is only a valid key if it is not NaN, and if the value is of type Date it is only a valid key if its [[PrimitiveValue]] internal property, as defined by [ECMA-262], is not NaN. Conforming user agents must support all valid keys as keys.">
<link rel=author href="mailto:batifon@yahoo.fr" title="Baptiste Fontaine">
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=support.js></script>

<script>
    function valid_key(desc, key) {
        var db;
        var t = async_test(document.title + " - " + desc);
        var open_rq = createdb(t);

        open_rq.onupgradeneeded = function(e) {
            db = e.target.result;

            store = db.createObjectStore("store");
            assert_true(store.add('value', key) instanceof IDBRequest);

            store2 = db.createObjectStore("store2", { keyPath: ["x", "keypath"] });
            assert_true(store2.add({ x: 'v', keypath: key }) instanceof IDBRequest);
        };
        open_rq.onsuccess = function(e) {
            var rq = db.transaction("store")
                       .objectStore("store")
                       .get(key)
            rq.onsuccess = t.step_func(function(e) {
                assert_equals(e.target.result, 'value')
                var rq = db.transaction("store2")
                           .objectStore("store2")
                           .get(['v', key])
                rq.onsuccess = t.step_func(function(e) {
                    assert_equals(e.target.result.x, 'v');
                    assert_key_equals(e.target.result.keypath, key);
                    t.done()
                })
            })
        }
    }

    // Date
    valid_key( 'new Date()'    , new Date() );
    valid_key( 'new Date(0)'   , new Date(0) );

    // Array
    valid_key( '[]'            , [] );
    valid_key( 'new Array()'   , new Array() );

    valid_key( '["undefined"]' , ['undefined'] );

    // Float
    valid_key( 'Infinity'      , Infinity );
    valid_key( '-Infinity'     , -Infinity );
    valid_key( '0'             , 0 );
    valid_key( '1.5'           , 1.5 );
    valid_key( '3e38'          , 3e38 );
    valid_key( '3e-38'         , 3e38 );

    // String
    valid_key( '"foo"'         , "foo" );
    valid_key( '"\\n"'         , "\n" );
    valid_key( '""'            , "" );
    valid_key( '"\\""'         , "\"" );
    valid_key( '"\\u1234"'     , "\u1234" );
    valid_key( '"\\u0000"'     , "\u0000" );
    valid_key( '"NaN"'         , "NaN" );

</script>

<div id=log></div>
