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 is_cloneable(o) { | |
21 try { | |
22 self.postMessage(o, '*'); | |
23 return true; | |
24 } catch (ex) { | |
25 return false; | |
26 } | |
27 } | |
28 | |
29 function invalid_key(desc, key) { | |
30 var t = async_test(document.title + " - " + desc); | |
31 | |
32 // set the current test, and run it | |
33 db.setTest(t).onupgradeneeded = function(e) { | |
34 objStore = objStore || e.target.result.createObjectStore("store"); | |
35 assert_throws('DataError', function() { | |
36 objStore.add("value", key); | |
37 }); | |
38 | |
39 if (is_cloneable(key)) { | |
40 objStore2 = objStore2 || e.target.result.createObjectStore("stor
e2", { keyPath: ["x", "keypath"] }); | |
41 assert_throws('DataError', function() { | |
42 objStore2.add({ x: "value", keypath: key }); | |
43 }); | |
44 } | |
45 this.done(); | |
46 }; | |
47 } | |
48 | |
49 var fake_array = { | |
50 length : 0, | |
51 constructor : Array | |
52 }; | |
53 | |
54 var ArrayClone = function(){}; | |
55 ArrayClone.prototype = Array; | |
56 var ArrayClone_instance = new ArrayClone(); | |
57 | |
58 // booleans | |
59 invalid_key( 'true' , true ); | |
60 invalid_key( 'false' , false ); | |
61 | |
62 // null/NaN/undefined | |
63 invalid_key( 'null' , null ); | |
64 invalid_key( 'NaN' , NaN ); | |
65 invalid_key( 'undefined' , undefined ); | |
66 invalid_key( 'undefined2'); | |
67 | |
68 // functions | |
69 invalid_key( 'function() {}', function(){} ); | |
70 | |
71 // objects | |
72 invalid_key( '{}' , {} ); | |
73 invalid_key( '{ obj: 1 }' , { obj: 1 }); | |
74 invalid_key( 'Math' , Math ); | |
75 invalid_key( 'window' , window ); | |
76 invalid_key( '{length:0,constructor:Array}' , fake_array ); | |
77 invalid_key( 'Array clone’s instance' , ArrayClone_instance ); | |
78 invalid_key( 'Array (object)' , Array ); | |
79 invalid_key( 'String (object)' , String ); | |
80 invalid_key( 'new String()' , new String() ); | |
81 invalid_key( 'new Number()' , new Number() ); | |
82 invalid_key( 'new Boolean()' , new Boolean() ); | |
83 | |
84 // arrays | |
85 invalid_key( '[{}]' , [{}] ); | |
86 invalid_key( '[[], [], [], [[ Date ]]]' , [ [], [], [], [[ Date ]] ] ); | |
87 invalid_key( '[undefined]' , [undefined] ); | |
88 invalid_key( '[,1]' , [,1] ); | |
89 | |
90 invalid_key( 'document.getElements' | |
91 +'ByTagName("script")' , document.getElementsByTagName("scr
ipt") ); | |
92 | |
93 // dates | |
94 invalid_key( 'new Date(NaN)' , new Date(NaN) ); | |
95 invalid_key( 'new Date(Infinity)' , new Date(Infinity) ); | |
96 | |
97 // regexes | |
98 invalid_key( '/foo/' , /foo/ ); | |
99 invalid_key( 'new RegExp()' , new RegExp() ); | |
100 | |
101 var sparse = []; | |
102 sparse[10] = "hei"; | |
103 invalid_key('sparse array', sparse); | |
104 | |
105 var sparse2 = []; | |
106 sparse2[0] = 1; | |
107 sparse2[""] = 2; | |
108 sparse2[2] = 3; | |
109 invalid_key('sparse array 2', sparse2); | |
110 | |
111 invalid_key('[[1], [3], [7], [[ sparse array ]]]', [ [1], [3], [7], [[ spars
e2 ]] ]); | |
112 | |
113 // sparse3 | |
114 invalid_key( '[1,2,3,,]', [1,2,3,,] ); | |
115 | |
116 var recursive = []; | |
117 recursive.push(recursive); | |
118 invalid_key('array directly contains self', recursive); | |
119 | |
120 var recursive2 = []; | |
121 recursive2.push([recursive2]); | |
122 invalid_key('array indirectly contains self', recursive2); | |
123 | |
124 var recursive3 = [recursive]; | |
125 invalid_key('array member contains self', recursive3); | |
126 | |
127 </script> | |
128 | |
129 <div id=log></div> | |
OLD | NEW |