OLD | NEW |
(Empty) | |
| 1 <!DOCTYPE html> |
| 2 <!-- Submitted from TestTWF Paris --> |
| 3 <meta charset=utf-8"> |
| 4 <title>Invalid key</title> |
| 5 <link rel=help href="http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#
key-construct"> |
| 6 <link rel=assert title="A value is said to be a valid key if it is one of the fo
llowing types: Array JavaScript objects [ECMA-262], DOMString [WEBIDL], Date [EC
MA-262] or float [WEBIDL]. However Arrays are only valid keys if every item in t
he 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-numeri
c 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 i
s not NaN, and if the value is of type Date it is only a valid key if its [[Prim
itiveValue]] internal property, as defined by [ECMA-262], is not NaN. Conforming
user agents must support all valid keys as keys."> |
| 7 <!-- original author --> |
| 8 <link rel=author href="mailto:odinho@opera.com" title="Odin Hørthe Omdal"> |
| 9 <!-- some additions by Baptiste Fontaine (batifon@yahoo.fr) --> |
| 10 <script src=../../../resources/testharness.js></script> |
| 11 <script src=../../../resources/testharnessreport.js></script> |
| 12 <script src=support.js></script> |
| 13 |
| 14 <script> |
| 15 var db = createdb_for_multiple_tests(), |
| 16 // cache for ObjectStores |
| 17 objStore = null, |
| 18 objStore2 = null; |
| 19 |
| 20 function invalid_key(desc, key) { |
| 21 var t = async_test(document.title + " - " + desc); |
| 22 |
| 23 // set the current test, and run it |
| 24 db.setTest(t).onupgradeneeded = function(e) { |
| 25 objStore = objStore || e.target.result.createObjectStore("store"); |
| 26 assert_throws('DataError', function() { |
| 27 objStore.add("value", key); |
| 28 }); |
| 29 |
| 30 objStore2 = objStore2 || e.target.result.createObjectStore("store2",
{ keyPath: ["x", "keypath"] }); |
| 31 assert_throws('DataError', function() { |
| 32 objStore2.add({ x: "value", keypath: key }); |
| 33 }); |
| 34 |
| 35 this.done(); |
| 36 }; |
| 37 } |
| 38 |
| 39 var fake_array = { |
| 40 length : 0, |
| 41 constructor : Array |
| 42 }; |
| 43 |
| 44 var ArrayClone = function(){}; |
| 45 ArrayClone.prototype = Array; |
| 46 var ArrayClone_instance = new ArrayClone(); |
| 47 |
| 48 // booleans |
| 49 invalid_key( 'true' , true ); |
| 50 invalid_key( 'false' , false ); |
| 51 |
| 52 // null/NaN/undefined |
| 53 invalid_key( 'null' , null ); |
| 54 invalid_key( 'NaN' , NaN ); |
| 55 invalid_key( 'undefined' , undefined ); |
| 56 invalid_key( 'undefined2'); |
| 57 |
| 58 // functions |
| 59 invalid_key( 'function() {}', function(){} ); |
| 60 |
| 61 // objects |
| 62 invalid_key( '{}' , {} ); |
| 63 invalid_key( '{ obj: 1 }' , { obj: 1 }); |
| 64 invalid_key( 'Math' , Math ); |
| 65 invalid_key( 'window' , window ); |
| 66 invalid_key( '{length:0,constructor:Array}' , fake_array ); |
| 67 invalid_key( 'Array clone’s instance' , ArrayClone_instance ); |
| 68 invalid_key( 'Array (object)' , Array ); |
| 69 invalid_key( 'String (object)' , String ); |
| 70 invalid_key( 'new String()' , new String() ); |
| 71 invalid_key( 'new Number()' , new Number() ); |
| 72 invalid_key( 'new Boolean()' , new Boolean() ); |
| 73 |
| 74 // arrays |
| 75 invalid_key( '[{}]' , [{}] ); |
| 76 invalid_key( '[[], [], [], [[ Date ]]]' , [ [], [], [], [[ Date ]] ] ); |
| 77 invalid_key( '[undefined]' , [undefined] ); |
| 78 invalid_key( '[,1]' , [,1] ); |
| 79 |
| 80 invalid_key( 'document.getElements' |
| 81 +'ByTagName("script")' , document.getElementsByTagName("scr
ipt") ); |
| 82 |
| 83 // dates |
| 84 invalid_key( 'new Date(NaN)' , new Date(NaN) ); |
| 85 invalid_key( 'new Date(Infinity)' , new Date(Infinity) ); |
| 86 |
| 87 // regexes |
| 88 invalid_key( '/foo/' , /foo/ ); |
| 89 invalid_key( 'new RegExp()' , new RegExp() ); |
| 90 |
| 91 var sparse = []; |
| 92 sparse[10] = "hei"; |
| 93 invalid_key('sparse array', sparse); |
| 94 |
| 95 var sparse2 = []; |
| 96 sparse2[0] = 1; |
| 97 sparse2[""] = 2; |
| 98 sparse2[2] = 3; |
| 99 invalid_key('sparse array 2', sparse2); |
| 100 |
| 101 invalid_key('[[1], [3], [7], [[ sparse array ]]]', [ [1], [3], [7], [[ spars
e2 ]] ]); |
| 102 |
| 103 // sparse3 |
| 104 invalid_key( '[1,2,3,,]', [1,2,3,,] ); |
| 105 |
| 106 var recursive = []; |
| 107 recursive.push(recursive); |
| 108 invalid_key('array directly contains self', recursive); |
| 109 |
| 110 var recursive2 = []; |
| 111 recursive2.push([recursive2]); |
| 112 invalid_key('array indirectly contains self', recursive2); |
| 113 |
| 114 var recursive3 = [recursive]; |
| 115 invalid_key('array member contains self', recursive3); |
| 116 |
| 117 </script> |
| 118 |
| 119 <div id=log></div> |
OLD | NEW |