tor-browser

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

Object-setProperty-01.js (7306B)


      1 // tests calling script functions via Debugger.Object.prototype.setProperty
      2 "use strict";
      3 
      4 var global = newGlobal({newCompartment: true});
      5 var dbg = new Debugger(global);
      6 dbg.onDebuggerStatement = onDebuggerStatement;
      7 
      8 global.eval(`
      9 const sym = Symbol("a symbol key");
     10 
     11 const arr = [];
     12 const obj = {
     13    set stringNormal(value) {
     14        this._stringNormal = value;
     15    },
     16    set stringAbrupt(value) {
     17        throw value;
     18    },
     19 
     20    set objectNormal(value) {
     21        this._objectNormal = value;
     22    },
     23    set objectAbrupt(value) {
     24        throw value;
     25    },
     26 
     27    set context(value) {
     28        this._context = this;
     29    },
     30 
     31    set 1234(value) {
     32        this._1234 = value;
     33    },
     34 
     35    set [sym](value) {
     36        this._sym = value;
     37    },
     38 
     39    get getterOnly() {},
     40    readOnly: "",
     41 
     42    stringProp: "",
     43    objProp: {},
     44 };
     45 Object.defineProperty(obj, "readOnly", { writable: false });
     46 
     47 const objChild = Object.create(obj);
     48 const proxyChild = new Proxy(obj, {});
     49 
     50 const testObj = { };
     51 const testChildObj = { };
     52 const testProxyObj = { };
     53 
     54 debugger;
     55 `);
     56 
     57 function onDebuggerStatement(frame) {
     58    const { environment } = frame;
     59    const sym = environment.getVariable("sym");
     60    const arr = environment.getVariable("arr");
     61    const obj = environment.getVariable("obj");
     62    const objChild = environment.getVariable("objChild");
     63    const proxyChild = environment.getVariable("proxyChild");
     64 
     65    assertEq(arr.setProperty(1, "index 1").return, true);
     66    assertEq(arr.getProperty(1).return, "index 1");
     67    assertEq(arr.getProperty("1").return, "index 1");
     68    assertEq(arr.getProperty(0).return, undefined);
     69    assertEq(arr.getProperty("length").return, 2);
     70 
     71    assertEq(arr.setProperty("2", "index 2").return, true);
     72    assertEq(arr.getProperty(2).return, "index 2");
     73    assertEq(arr.getProperty("2").return, "index 2");
     74    assertEq(arr.getProperty(0).return, undefined);
     75    assertEq(arr.getProperty("length").return, 3);
     76 
     77    const testObj = environment.getVariable("testObj");
     78    assertEq(obj.setProperty("undefined", 123).return, true);
     79    assertEq(obj.getProperty("undefined").return, 123);
     80    assertEq(obj.setProperty().return, true);
     81    assertEq(obj.getProperty("undefined").return, undefined);
     82 
     83    assertEq(obj.setProperty("missing", 42).return, true);
     84    assertEq(obj.getProperty("missing").return, 42);
     85 
     86    assertEq(obj.setProperty("stringNormal", "a normal value").return, true);
     87    assertEq(obj.getProperty("_stringNormal").return, "a normal value");
     88    assertEq(obj.setProperty("stringAbrupt", "an abrupt value").throw, "an abrupt value");
     89 
     90    assertEq(obj.setProperty("objectNormal", testObj).return, true);
     91    assertEq(obj.getProperty("_objectNormal").return, testObj);
     92    assertEq(obj.setProperty("objectAbrupt", testObj).throw, testObj);
     93 
     94    assertEq(obj.setProperty("context", "a value").return, true);
     95    assertEq(obj.getProperty("_context").return, obj);
     96 
     97    assertEq(obj.setProperty(1234, "number value").return, true);
     98    assertEq(obj.getProperty("_1234").return, "number value");
     99 
    100    assertEq(obj.setProperty(sym, "symbol value").return, true);
    101    assertEq(obj.getProperty("_sym").return, "symbol value");
    102 
    103    assertEq(obj.setProperty("getterOnly", "a value").return, false);
    104    assertEq(obj.setProperty("readOnly", "a value").return, false);
    105 
    106    assertEq(obj.setProperty("stringProp", "a normal value").return, true);
    107    assertEq(obj.getProperty("stringProp").return, "a normal value");
    108 
    109    assertEq(obj.setProperty("objectProp", testObj).return, true);
    110    assertEq(obj.getProperty("objectProp").return, testObj);
    111 
    112    const testChildObj = environment.getVariable("testChildObj");
    113    assertEq(objChild.setProperty("undefined", 123).return, true);
    114    assertEq(objChild.getProperty("undefined").return, 123);
    115    assertEq(objChild.setProperty().return, true);
    116    assertEq(objChild.getProperty("undefined").return, undefined);
    117 
    118    assertEq(objChild.setProperty("missing", 42).return, true);
    119    assertEq(objChild.getProperty("missing").return, 42);
    120 
    121    assertEq(objChild.setProperty("stringNormal", "a normal child value").return, true);
    122    assertEq(objChild.getProperty("_stringNormal").return, "a normal child value");
    123 
    124    assertEq(objChild.setProperty("stringAbrupt", "an abrupt child value").throw, "an abrupt child value");
    125 
    126    assertEq(objChild.setProperty("objectNormal", testChildObj).return, true);
    127    assertEq(objChild.getProperty("_objectNormal").return, testChildObj);
    128 
    129    assertEq(objChild.setProperty("objectAbrupt", testChildObj).throw, testChildObj);
    130 
    131    assertEq(objChild.setProperty("context", "a value").return, true);
    132    assertEq(objChild.getProperty("_context").return, objChild);
    133 
    134    assertEq(objChild.setProperty(1234, "number value").return, true);
    135    assertEq(objChild.getProperty("_1234").return, "number value");
    136 
    137    assertEq(objChild.setProperty(sym, "symbol value").return, true);
    138    assertEq(objChild.getProperty("_sym").return, "symbol value");
    139 
    140    assertEq(objChild.setProperty("getterOnly", "a value").return, false);
    141    assertEq(objChild.setProperty("readOnly", "a value").return, false);
    142 
    143    assertEq(objChild.setProperty("stringProp", "a normal child value").return, true);
    144    assertEq(objChild.getProperty("stringProp").return, "a normal child value");
    145 
    146    assertEq(objChild.setProperty("objectProp", testChildObj).return, true);
    147    assertEq(objChild.getProperty("objectProp").return, testChildObj);
    148 
    149    const testProxyObj = environment.getVariable("testProxyObj");
    150    assertEq(proxyChild.setProperty("undefined", 123).return, true);
    151    assertEq(proxyChild.getProperty("undefined").return, 123);
    152    assertEq(proxyChild.setProperty().return, true);
    153    assertEq(proxyChild.getProperty("undefined").return, undefined);
    154 
    155    assertEq(proxyChild.setProperty("missing", 42).return, true);
    156    assertEq(proxyChild.getProperty("missing").return, 42);
    157 
    158    assertEq(proxyChild.setProperty("stringNormal", "a normal child value").return, true);
    159    assertEq(proxyChild.getProperty("_stringNormal").return, "a normal child value");
    160 
    161    assertEq(proxyChild.setProperty("stringAbrupt", "an abrupt child value").throw, "an abrupt child value");
    162 
    163    assertEq(proxyChild.setProperty("objectNormal", testProxyObj).return, true);
    164    assertEq(proxyChild.getProperty("_objectNormal").return, testProxyObj);
    165 
    166    assertEq(proxyChild.setProperty("objectAbrupt", testProxyObj).throw, testProxyObj);
    167 
    168    assertEq(proxyChild.setProperty("context", "a value").return, true);
    169    assertEq(proxyChild.getProperty("_context").return, proxyChild);
    170 
    171    assertEq(proxyChild.setProperty(1234, "number value").return, true);
    172    assertEq(proxyChild.getProperty("_1234").return, "number value");
    173 
    174    assertEq(proxyChild.setProperty(sym, "symbol value").return, true);
    175    assertEq(proxyChild.getProperty("_sym").return, "symbol value");
    176 
    177    assertEq(proxyChild.setProperty("getterOnly", "a value").return, false);
    178    assertEq(proxyChild.setProperty("readOnly", "a value").return, false);
    179 
    180    assertEq(proxyChild.setProperty("stringProp", "a normal child value").return, true);
    181    assertEq(proxyChild.getProperty("stringProp").return, "a normal child value");
    182 
    183    assertEq(proxyChild.setProperty("objectProp", testProxyObj).return, true);
    184    assertEq(proxyChild.getProperty("objectProp").return, testProxyObj);
    185 };