// META: global=window,worker
// META: title=Invalid key
// META: script=resources/support.js
// Spec: https://w3c.github.io/IndexedDB/#key-construct
'use strict' ;
const invalid_key = (desc, key) => {
async_test(t => {
const db = createdb_for_multiple_tests();
let objStore =
null ;
let objStore2 =
null ;
const is_cloneable = o => {
try {
self.postMessage(o,
'*' );
return true ;
}
catch (ex) {
return false ;
}
};
db.setTest(t).onupgradeneeded = t.step_func(e => {
objStore = objStore || e.target.result.createObjectStore(
'store' );
assert_throws_dom(
'DataError' , () => {
objStore.add(
'value' , key);
});
if (is_cloneable(key)) {
objStore2 = objStore2 || e.target.result.createObjectStore(
'store2' , {
keyPath: [
'x' ,
'keypath' ],
});
assert_throws_dom(
'DataError' , () => {
objStore.add(
'value' , key);
});
}
t.done();
});
},
'Invalid key - ' + desc);
};
const fake_array = {
length:
0 ,
constructor: Array,
};
const ArrayClone =
function () {};
ArrayClone.prototype = Array;
const ArrayClone_instance =
new ArrayClone();
// booleans
invalid_key(
'true' ,
true );
invalid_key(
'false' ,
false );
// null/NaN/undefined
invalid_key(
'null' ,
null );
invalid_key(
'NaN' , NaN);
invalid_key(
'undefined' , undefined);
invalid_key(
'undefined2' );
// functions
invalid_key(
'function() {}' ,
function () {});
// objects
invalid_key(
'{}' , {});
invalid_key(
'{ obj: 1 }' , {obj:
1 });
invalid_key(
'Math' , Math);
invalid_key(
'self' , self);
invalid_key(
'{length:0,constructor:Array}' , fake_array);
invalid_key(
'Array clone’s instance' , ArrayClone_instance);
invalid_key(
'Array (object)' , Array);
invalid_key(
'String (object)' , String);
invalid_key(
'new String()' ,
new String());
invalid_key(
'new Number()' ,
new Number());
invalid_key(
'new Boolean()' ,
new Boolean ());
// arrays
invalid_key(
'[{}]' , [{}]);
invalid_key(
'[[], [], [], [[ Date ]]]' , [[], [], [], [[Date]]]);
invalid_key(
'[undefined]' , [undefined]);
invalid_key(
'[,1]' , [,
1 ]);
if (
typeof document !==
'undefined' ) {
invalid_key(
'document.getElementsByTagName("script")' ,
document.getElementsByTagName(
'script' ));
}
// dates
invalid_key(
'new Date(NaN)' ,
new Date(NaN));
invalid_key(
'new Date(Infinity)' ,
new Date(Infinity));
// regexes
invalid_key(
'/foo/' , /foo/);
invalid_key(
'new RegExp()' ,
new RegExp());
const sparse = [];
sparse[
10 ] =
'hei' ;
invalid_key(
'sparse array' , sparse);
const sparse2 = [];
sparse2[
0 ] =
1 ;
sparse2[
'' ] =
2 ;
sparse2[
2 ] =
3 ;
invalid_key(
'sparse array 2' , sparse2);
invalid_key(
'[[1], [3], [7], [[ sparse array ]]]' , [
[
1 ],
[
3 ],
[
7 ],
[[sparse2]],
]);
// sparse3
invalid_key(
'[1,2,3,,]' , [
1 ,
2 ,
3 ,
,
]);
const recursive = [];
recursive.push(recursive);
invalid_key(
'array directly contains self' , recursive);
const recursive2 = [];
recursive2.push([recursive2]);
invalid_key(
'array indirectly contains self' , recursive2);
const recursive3 = [recursive];
invalid_key(
'array member contains self' , recursive3);
invalid_key(
'proxy of an array' ,
new Proxy([
1 ,
2 ,
3 ], {}));
Messung V0.5 in Prozent C=100 H=99 G=99
¤ Dauer der Verarbeitung: 0.3 Sekunden
¤
*© Formatika GbR, Deutschland