| <!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> |