tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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], {}));