https://github.com/web-platform-tests/wpt
Raw File
Tip revision: d1463947fea0898b42b2cb1bfd8ee40b1619bc71 authored by Simon Pieters on 27 August 2018, 13:57:36 UTC
Rename dir
Tip revision: d146394
bindings-inject-key.html
<!doctype html>
<meta charset=utf-8>
<title>IndexedDB: ES bindings - Inject a key into a value</title>
<meta name="help" href="https://w3c.github.io/IndexedDB/#inject-key-into-value">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support.js"></script>
<script>

indexeddb_test(
  (t, db) => {
    db.createObjectStore('store');
  },
  (t, db) => {
    const tx = db.transaction('store', 'readwrite');
    const request = tx.objectStore('store').put(
        'value', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'key']);

    const setter_called = false;
    Object.defineProperty(Object.prototype, '10', {
      configurable: true,
      set: t.step_func((value) => { setter_called = true; }),
    });
    request.onerror = t.unreached_func('request should not fail');
    request.onsuccess = t.step_func(() => {
      const result = request.result;
      assert_false(setter_called,
                   'Setter should not be called for key result.');
      assert_true(
          result.hasOwnProperty('10'),
          'Result should have own-property overriding prototype setter.');
      assert_equals(result[10], 'key',
                    'Result should have expected property.');

      delete Object.prototype['10'];
      t.done();
    });
  },
  'Returning keys to script should bypass prototype setters'
);

indexeddb_test(
  (t, db) => {
    db.createObjectStore('store', {autoIncrement: true, keyPath: 'id'});
  },
  (t, db) => {
    const tx = db.transaction('store', 'readwrite');
    tx.objectStore('store').put({});
    const request = tx.objectStore('store').get(1);

    const setter_called = false;
    Object.defineProperty(Object.prototype, 'id', {
      configurable: true,
      set: t.step_func(function(value) { setter_called = true; }),
    });
    request.onerror = t.unreached_func('request should not fail');
    request.onsuccess = t.step_func(function() {
        const result = request.result;
      assert_false(setter_called,
                   'Setter should not be called for key result.');
      assert_true(
          result.hasOwnProperty('id'),
          'Result should have own-property overriding prototype setter.');
      assert_equals(result.id, 1,
                    'Own property should match primary key generator value');

      delete Object.prototype['id'];
      t.done();
    });
  },
  'Returning values to script should bypass prototype setters'
);

indexeddb_test(
  (t, db) => {
    db.createObjectStore('store', {autoIncrement: true, keyPath: 'a.b.c'});
  },
  (t, db) => {
    const tx = db.transaction('store', 'readwrite');
    tx.objectStore('store').put({});
    const request = tx.objectStore('store').get(1);

    Object.prototype.a = {b: {c: 'on proto'}};

    request.onerror = t.unreached_func('request should not fail');
    request.onsuccess = t.step_func(function() {
      const result = request.result;
      assert_true(result.hasOwnProperty('a'),
                  'Result should have own-properties overriding prototype.');
      assert_true(result.a.hasOwnProperty('b'),
                  'Result should have own-properties overriding prototype.');
      assert_true(result.a.b.hasOwnProperty('c'),
                  'Result should have own-properties overriding prototype.');
      assert_equals(result.a.b.c, 1,
                    'Own property should match primary key generator value');
      assert_equals(Object.prototype.a.b.c, 'on proto',
                  'Prototype should not be modified');
      t.done();
    });
  },
  'Returning values to script should bypass prototype chain'
);

</script>
back to top