tor-browser

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

Object-setProperty-03.js (2738B)


      1 // tests calling script functions via Debugger.Object.prototype.setProperty
      2 // with different receiver objects.
      3 "use strict";
      4 load(libdir + "/asserts.js");
      5 
      6 var global = newGlobal({newCompartment: true});
      7 var dbg = new Debugger();
      8 var globalDO = dbg.addDebuggee(global);
      9 var windowProxyDO = globalDO.makeDebuggeeValue(global);
     10 dbg.onDebuggerStatement = onDebuggerStatement;
     11 
     12 global.eval(`
     13 let receiver;
     14 function check(value, thisVal) {
     15  receiver = thisVal;
     16  if (value !== "value") throw "Unexpected value";
     17 }
     18 const sloppy = {
     19  set setter(value) { check(value, this); },
     20 };
     21 const strict = {
     22  set setter(value) { "use strict"; check(value, this); },
     23 };
     24 debugger;
     25 `);
     26 
     27 function onDebuggerStatement(frame) {
     28    const { environment } = frame;
     29    const sloppy = environment.getVariable("sloppy");
     30    const strict = environment.getVariable("strict");
     31    const receiver = () => environment.getVariable("receiver");
     32    const value = "value";
     33 
     34    assertEq(sloppy.setProperty("setter", value).return, true);
     35    assertEq(receiver(), sloppy);
     36    assertEq(sloppy.setProperty("setter", value, sloppy).return, true);
     37    assertEq(receiver(), sloppy);
     38    assertEq(sloppy.setProperty("setter", value, strict).return, true);
     39    assertEq(receiver(), strict);
     40    assertEq(sloppy.setProperty("setter", value, 1).return, true);
     41    assertEq(receiver().class, "Number");
     42    assertEq(sloppy.setProperty("setter", value, true).return, true);
     43    assertEq(receiver().class, "Boolean");
     44    assertEq(sloppy.setProperty("setter", value, null).return, true);
     45    assertEq(receiver(), windowProxyDO);
     46    assertEq(sloppy.setProperty("setter", value, undefined).return, true);
     47    assertEq(receiver(), windowProxyDO);
     48    assertErrorMessage(() => sloppy.setProperty("setter", value, {}), TypeError,
     49                       "Debugger: expected Debugger.Object, got Object");
     50 
     51    assertEq(strict.setProperty("setter", value).return, true);
     52    assertEq(receiver(), strict);
     53    assertEq(strict.setProperty("setter", value, sloppy).return, true);
     54    assertEq(receiver(), sloppy);
     55    assertEq(strict.setProperty("setter", value, strict).return, true);
     56    assertEq(receiver(), strict);
     57    assertEq(strict.setProperty("setter", value, 1).return, true);
     58    assertEq(receiver(), 1);
     59    assertEq(strict.setProperty("setter", value, true).return, true);
     60    assertEq(receiver(), true);
     61    assertEq(strict.setProperty("setter", value, null).return, true);
     62    assertEq(receiver(), null);
     63    assertEq(strict.setProperty("setter", value, undefined).return, true);
     64    assertEq(receiver(), undefined);
     65    assertErrorMessage(() => strict.setProperty("setter", value, {}), TypeError,
     66                       "Debugger: expected Debugger.Object, got Object");
     67 };