tor-browser

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

envChain_frame-eval.js (1793B)


      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 var qualified = 10;
     15 unqualified = 20;
     16 let lexical = 30;
     17 this.prop = 40;
     18 
     19 const envs = [];
     20 let env = getInnerMostEnvironmentObject();
     21 while (env) {
     22  envs.push({
     23    type: getEnvironmentObjectType(env) || "*global*",
     24    qualified: !!Object.getOwnPropertyDescriptor(env, "qualified"),
     25    unqualified: !!Object.getOwnPropertyDescriptor(env, "unqualified"),
     26    lexical: !!Object.getOwnPropertyDescriptor(env, "lexical"),
     27    prop: !!Object.getOwnPropertyDescriptor(env, "prop"),
     28  });
     29 
     30  env = getEnclosingEnvironmentObject(env);
     31 }
     32 JSON.stringify(envs);
     33 `).return);
     34 
     35  assertEq(envs.length, 3);
     36 
     37  let i = 0, env;
     38 
     39  // NOTE: lexical is optimized and uses frame slot.
     40 
     41  env = envs[i]; i++;
     42  assertEq(env.type, "[DebugProxy] CallObject");
     43  assertEq(env.qualified, true, "qualified var must live in the CallObject");
     44  assertEq(env.unqualified, false);
     45  assertEq(env.lexical, false);
     46  assertEq(env.prop, false);
     47 
     48  env = envs[i]; i++;
     49  assertEq(env.type, "[DebugProxy] GlobalLexicalEnvironmentObject");
     50  assertEq(env.qualified, false);
     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, "*global*");
     57  assertEq(env.qualified, false);
     58  assertEq(env.unqualified, true, "unqualified name must live in the global");
     59  assertEq(env.lexical, false);
     60  assertEq(env.prop, true, "this property must live in the global");
     61 };
     62 
     63 g.eval(`
     64 function target() {
     65 }
     66 target();
     67 `);