tor-browser

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

redefine-property.js (2383B)


      1 function getLogString(obj) {
      2  let log = getWatchtowerLog();
      3  return log.map(item => {
      4      assertEq(item.object, obj);
      5      if (typeof item.extra === "symbol") {
      6          item.extra = "<symbol>";
      7      }
      8      return item.kind + (item.extra ? ": " + item.extra : "");
      9  }).join("|");
     10 }
     11 
     12 function testDefineProperty() {
     13  let o = {};
     14  addWatchtowerTarget(o);
     15 
     16  Object.defineProperty(o, "a", {value: 1, configurable: true, writable: true, enumerable: true});
     17  assertEq(getLogString(o), "add-prop: a");
     18 
     19  // This doesn't change the property's flags so is just a change-prop-value.
     20  Object.defineProperty(o, "a", {value: 2});
     21  assertEq(getLogString(o), "change-prop-value: a");
     22 
     23  // This changes the property's flags but not its value so is just a change-prop-flags.
     24  Object.defineProperty(o, "a", {value: 2, enumerable: false});
     25  assertEq(getLogString(o), "change-prop-flags: a");
     26 
     27  // This defineProperty is a no-op.
     28  Object.defineProperty(o, "a", {value: 2, enumerable: false});
     29  assertEq(getLogString(o), "");
     30 
     31  // This changes both the property's value and its flags.
     32  Object.defineProperty(o, "a", {value: 1, enumerable: true});
     33  assertEq(getLogString(o), "change-prop-flags: a|change-prop-value: a");
     34 
     35  // Turning the data property into a getter changes both its (slot) value and its flags.
     36  let getter = () => 1;
     37  Object.defineProperty(o, "a", {get: getter});
     38  assertEq(getLogString(o), "change-prop-flags: a|change-prop-value: a");
     39 
     40  // This defineProperty is a no-op.
     41  Object.defineProperty(o, "a", {get: getter, enumerable: true});
     42  assertEq(getLogString(o), "");
     43 
     44  // Changing just the accessor property's flags.
     45  Object.defineProperty(o, "a", {get: getter, enumerable: false});
     46  assertEq(getLogString(o), "change-prop-flags: a");
     47 
     48  // Changing the getter function counts as a property modification.
     49  let getter2 = () => 2;
     50  Object.defineProperty(o, "a", {get: getter2});
     51  assertEq(getLogString(o), "change-prop-value: a");
     52 
     53  // Changing both the property's accessors and its flags.
     54  Object.defineProperty(o, "a", {set: getter, enumerable: true});
     55  assertEq(getLogString(o), "change-prop-flags: a|change-prop-value: a");
     56 
     57  // Change back to a data property.
     58  Object.defineProperty(o, "a", {value: 1});
     59  assertEq(getLogString(o), "change-prop-flags: a|change-prop-value: a");
     60 }
     61 
     62 for (var i = 0; i < 20; i++) {
     63  testDefineProperty();
     64 }