key_invalid.any.js (3147B)
1 // META: global=window,worker 2 // META: title=Invalid key 3 // META: script=resources/support.js 4 5 // Spec: https://w3c.github.io/IndexedDB/#key-construct 6 7 'use strict'; 8 9 const invalid_key = (desc, key) => { 10 async_test(t => { 11 const db = createdb_for_multiple_tests(); 12 let objStore = null; 13 let objStore2 = null; 14 15 const is_cloneable = o => { 16 try { 17 self.postMessage(o, '*'); 18 return true; 19 } catch (ex) { 20 return false; 21 } 22 }; 23 24 db.setTest(t).onupgradeneeded = t.step_func(e => { 25 objStore = objStore || e.target.result.createObjectStore('store'); 26 assert_throws_dom('DataError', () => { 27 objStore.add('value', key); 28 }); 29 30 if (is_cloneable(key)) { 31 objStore2 = objStore2 || e.target.result.createObjectStore('store2', { 32 keyPath: ['x', 'keypath'], 33 }); 34 assert_throws_dom('DataError', () => { 35 objStore.add('value', key); 36 }); 37 } 38 t.done(); 39 }); 40 }, 'Invalid key - ' + desc); 41 }; 42 43 const fake_array = { 44 length: 0, 45 constructor: Array, 46 }; 47 48 const ArrayClone = function() {}; 49 ArrayClone.prototype = Array; 50 const ArrayClone_instance = new ArrayClone(); 51 52 // booleans 53 invalid_key('true', true); 54 invalid_key('false', false); 55 56 // null/NaN/undefined 57 invalid_key('null', null); 58 invalid_key('NaN', NaN); 59 invalid_key('undefined', undefined); 60 invalid_key('undefined2'); 61 62 // functions 63 invalid_key('function() {}', function() {}); 64 65 // objects 66 invalid_key('{}', {}); 67 invalid_key('{ obj: 1 }', {obj: 1}); 68 invalid_key('Math', Math); 69 invalid_key('self', self); 70 invalid_key('{length:0,constructor:Array}', fake_array); 71 invalid_key('Array clone’s instance', ArrayClone_instance); 72 invalid_key('Array (object)', Array); 73 invalid_key('String (object)', String); 74 invalid_key('new String()', new String()); 75 invalid_key('new Number()', new Number()); 76 invalid_key('new Boolean()', new Boolean()); 77 78 // arrays 79 invalid_key('[{}]', [{}]); 80 invalid_key('[[], [], [], [[ Date ]]]', [[], [], [], [[Date]]]); 81 invalid_key('[undefined]', [undefined]); 82 invalid_key('[,1]', [, 1]); 83 84 if (typeof document !== 'undefined') { 85 invalid_key( 86 'document.getElementsByTagName("script")', 87 document.getElementsByTagName('script')); 88 } 89 90 // dates 91 invalid_key('new Date(NaN)', new Date(NaN)); 92 invalid_key('new Date(Infinity)', new Date(Infinity)); 93 94 // regexes 95 invalid_key('/foo/', /foo/); 96 invalid_key('new RegExp()', new RegExp()); 97 98 const sparse = []; 99 sparse[10] = 'hei'; 100 invalid_key('sparse array', sparse); 101 102 const sparse2 = []; 103 sparse2[0] = 1; 104 sparse2[''] = 2; 105 sparse2[2] = 3; 106 invalid_key('sparse array 2', sparse2); 107 108 invalid_key('[[1], [3], [7], [[ sparse array ]]]', [ 109 [1], 110 [3], 111 [7], 112 [[sparse2]], 113 ]); 114 115 // sparse3 116 invalid_key('[1,2,3,,]', [ 117 1, 118 2, 119 3, 120 , 121 ]); 122 123 const recursive = []; 124 recursive.push(recursive); 125 invalid_key('array directly contains self', recursive); 126 127 const recursive2 = []; 128 recursive2.push([recursive2]); 129 invalid_key('array indirectly contains self', recursive2); 130 131 const recursive3 = [recursive]; 132 invalid_key('array member contains self', recursive3); 133 134 invalid_key('proxy of an array', new Proxy([1, 2, 3], {}));