tor-browser

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

envChain_frame-eval-with-eval.js (2058B)


      1 // Verify the environment chain for Debugger.Frame described in
      2 // js/src/vm/EnvironmentObject.h.
      3 
      4 const g = newGlobal({ newCompartment: true });
      5 const dbg = Debugger(g);
      6 
      7 dbg.onEnterFrame = frame => {
      8  if (frame.script.displayName !== "target") {
      9    return;
     10  }
     11  dbg.onEnterFrame = () => {};
     12 
     13  const envs = JSON.parse(frame.eval(`
     14 // Put direct eval to de-optimize lexical.
     15 eval("");
     16 var qualified = 10;
     17 unqualified = 20;
     18 let lexical = 30;
     19 this.prop = 40;
     20 
     21 const envs = [];
     22 let env = getInnerMostEnvironmentObject();
     23 while (env) {
     24  envs.push({
     25    type: getEnvironmentObjectType(env) || "*global*",
     26    qualified: !!Object.getOwnPropertyDescriptor(env, "qualified"),
     27    unqualified: !!Object.getOwnPropertyDescriptor(env, "unqualified"),
     28    lexical: !!Object.getOwnPropertyDescriptor(env, "lexical"),
     29    prop: !!Object.getOwnPropertyDescriptor(env, "prop"),
     30  });
     31 
     32  env = getEnclosingEnvironmentObject(env);
     33 }
     34 JSON.stringify(envs);
     35 `).return);
     36 
     37  assertEq(envs.length, 4);
     38 
     39  let i = 0, env;
     40 
     41  env = envs[i]; i++;
     42  assertEq(env.type, "BlockLexicalEnvironmentObject");
     43  assertEq(env.qualified, false);
     44  assertEq(env.unqualified, false);
     45  assertEq(env.lexical, true, "lexical must live in the BlockLexicalEnvironmentObject");
     46  assertEq(env.prop, false);
     47 
     48  env = envs[i]; i++;
     49  assertEq(env.type, "[DebugProxy] CallObject");
     50  assertEq(env.qualified, true, "qualified var must live in the CallObject");
     51  assertEq(env.unqualified, false);
     52  assertEq(env.lexical, false);
     53  assertEq(env.prop, false);
     54 
     55  env = envs[i]; i++;
     56  assertEq(env.type, "[DebugProxy] GlobalLexicalEnvironmentObject");
     57  assertEq(env.qualified, false);
     58  assertEq(env.unqualified, false);
     59  assertEq(env.lexical, false);
     60  assertEq(env.prop, false);
     61 
     62  env = envs[i]; i++;
     63  assertEq(env.type, "*global*");
     64  assertEq(env.qualified, false);
     65  assertEq(env.unqualified, true, "unqualified name must live in the global");
     66  assertEq(env.lexical, false);
     67  assertEq(env.prop, true, "this property must live in the global");
     68 };
     69 
     70 g.eval(`
     71 function target() {
     72 }
     73 target();
     74 `);