tor-browser

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

envChain_object-executeInGlobalWithBindings-existing-bindings.js (3877B)


      1 // Verify the environment chain for Debugger.Object described in
      2 // js/src/vm/EnvironmentObject.h.
      3 
      4 // WithEnvironmentObject shouldn't contain bindings conflicts with existing
      5 // globals.
      6 
      7 const g = newGlobal({newCompartment: true});
      8 const dbg = new Debugger();
      9 const gw = dbg.addDebuggee(g);
     10 
     11 const bindings = {
     12  bindings_prop: 50,
     13 
     14  bindings_prop_var: 61,
     15  bindings_prop_lexical: 71,
     16  bindings_prop_unqualified: 81,
     17 };
     18 
     19 gw.executeInGlobal(`
     20 var bindings_prop_var = 60;
     21 let bindings_prop_lexical = 70;
     22 bindings_prop_unqualified = 80;
     23 `);
     24 
     25 const {envs, vars} = JSON.parse(gw.executeInGlobalWithBindings(`
     26 const vars = {
     27  bindings_prop,
     28  bindings_prop_var,
     29  bindings_prop_lexical,
     30  bindings_prop_unqualified,
     31 };
     32 
     33 const envs = [];
     34 let env = getInnerMostEnvironmentObject();
     35 while (env) {
     36  envs.push({
     37    type: getEnvironmentObjectType(env) || "*global*",
     38    bindings_prop: !!Object.getOwnPropertyDescriptor(env, "bindings_prop"),
     39 
     40    bindings_prop_var: !!Object.getOwnPropertyDescriptor(env, "bindings_prop_var"),
     41    bindings_prop_var_value: Object.getOwnPropertyDescriptor(env, "bindings_prop_var")?.value,
     42    bindings_prop_lexical: !!Object.getOwnPropertyDescriptor(env, "bindings_prop_lexical"),
     43    bindings_prop_lexical_value: Object.getOwnPropertyDescriptor(env, "bindings_prop_lexical")?.value,
     44    bindings_prop_unqualified: !!Object.getOwnPropertyDescriptor(env, "bindings_prop_unqualified"),
     45    bindings_prop_unqualified_value: Object.getOwnPropertyDescriptor(env, "bindings_prop_unqualified")?.value,
     46  });
     47 
     48  env = getEnclosingEnvironmentObject(env);
     49 }
     50 JSON.stringify({envs, vars});
     51 `, bindings).return);
     52 
     53 assertEq(vars.bindings_prop, 50,
     54         "qualified var should read the value set by the declaration");
     55 assertEq(vars.bindings_prop_var, 60,
     56         "qualified var should read the value set by the declaration");
     57 assertEq(vars.bindings_prop_lexical, 70,
     58         "lexical should read the value set by the declaration");
     59 assertEq(vars.bindings_prop_unqualified, 80,
     60         "unqualified name should read the value set by the assignment");
     61 
     62 assertEq(bindings.bindings_prop_var, 61,
     63         "the original bindings property must not be overwritten for var");
     64 assertEq(bindings.bindings_prop_lexical, 71,
     65         "the original bindings property must not be overwritten for lexical");
     66 assertEq(bindings.bindings_prop_unqualified, 81,
     67         "the original bindings property must not be overwritten for unqualified");
     68 
     69 assertEq(envs.length, 3);
     70 
     71 let i = 0, env;
     72 
     73 env = envs[i]; i++;
     74 assertEq(env.type, "WithEnvironmentObject");
     75 assertEq(env.bindings_prop, true, "bindings property must live in the with env for bindings");
     76 
     77 assertEq(env.bindings_prop_var, false,
     78         "bindings property must not live in the with env for bindings if it conflicts with existing global");
     79 assertEq(env.bindings_prop_lexical, false,
     80         "bindings property must not live in the with env for bindings if it conflicts with existing global");
     81 assertEq(env.bindings_prop_unqualified, false,
     82         "bindings property must not live in the with env for bindings if it conflicts with existing global");
     83 assertEq(env.bindings_prop_unqualified, false,
     84         "bindings property must not live in the with env for bindings if it conflicts with existing global");
     85 
     86 env = envs[i]; i++;
     87 assertEq(env.type, "GlobalLexicalEnvironmentObject");
     88 assertEq(env.bindings_prop, false);
     89 
     90 assertEq(env.bindings_prop_var, false);
     91 assertEq(env.bindings_prop_lexical, true);
     92 assertEq(env.bindings_prop_lexical_value, 70);
     93 assertEq(env.bindings_prop_unqualified, false);
     94 
     95 env = envs[i]; i++;
     96 assertEq(env.type, "*global*");
     97 assertEq(env.bindings_prop, false);
     98 
     99 assertEq(env.bindings_prop_var, true);
    100 assertEq(env.bindings_prop_var_value, 60);
    101 assertEq(env.bindings_prop_lexical, false);
    102 assertEq(env.bindings_prop_unqualified, true);
    103 assertEq(env.bindings_prop_unqualified_value, 80);