tor-browser

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

test_envChain_frameScript.js (6902B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 "use strict";
      6 
      7 // Verify the environment chain for frame scripts described in
      8 // js/src/vm/EnvironmentObject.h.
      9 
     10 const { XPCShellContentUtils } = ChromeUtils.importESModule(
     11  "resource://testing-common/XPCShellContentUtils.sys.mjs"
     12 );
     13 
     14 XPCShellContentUtils.init(this);
     15 
     16 add_task(async function unique_scope() {
     17  const page = await XPCShellContentUtils.loadContentPage("about:blank", {
     18    remote: true,
     19  });
     20 
     21  const envsPromise = new Promise(resolve => {
     22    Services.mm.addMessageListener("unique-envs-result", msg => {
     23      resolve(msg.data);
     24    });
     25  });
     26  const sharePromise = new Promise(resolve => {
     27    Services.mm.addMessageListener("unique-share-result", msg => {
     28      resolve(msg.data);
     29    });
     30  });
     31 
     32  const runInUniqueScope = true;
     33  const runInGlobalScope = !runInUniqueScope;
     34 
     35  Services.mm.loadFrameScript(`data:,
     36 var unique_qualified = 10;
     37 unique_unqualified = 20;
     38 let unique_lexical = 30;
     39 this.unique_prop = 40;
     40 
     41 const funcs = Cu.getJSTestingFunctions();
     42 const envs = [];
     43 let env = funcs.getInnerMostEnvironmentObject();
     44 while (env) {
     45  envs.push({
     46    type: funcs.getEnvironmentObjectType(env) || "*SystemGlobal*",
     47    qualified: !!Object.getOwnPropertyDescriptor(env, "unique_qualified"),
     48    unqualified: !!Object.getOwnPropertyDescriptor(env, "unique_unqualified"),
     49    lexical: !!Object.getOwnPropertyDescriptor(env, "unique_lexical"),
     50    prop: !!Object.getOwnPropertyDescriptor(env, "unique_prop"),
     51  });
     52 
     53  env = funcs.getEnclosingEnvironmentObject(env);
     54 }
     55 
     56 sendSyncMessage("unique-envs-result", envs);
     57 `, false, runInGlobalScope);
     58 
     59  Services.mm.loadFrameScript(`data:,
     60 sendSyncMessage("unique-share-result", {
     61  unique_qualified: typeof unique_qualified,
     62  unique_unqualified: typeof unique_unqualified,
     63  unique_lexical: typeof unique_lexical,
     64  unique_prop: this.unique_prop,
     65 });
     66 `, false, runInGlobalScope);
     67 
     68  const envs = await envsPromise;
     69  const share = await sharePromise;
     70 
     71  Assert.equal(envs.length, 5);
     72 
     73  let i = 0, env;
     74 
     75  env = envs[i]; i++;
     76  Assert.equal(env.type, "NonSyntacticLexicalEnvironmentObject");
     77  Assert.equal(env.qualified, false);
     78  Assert.equal(env.unqualified, false);
     79  Assert.equal(env.lexical, true, "lexical must live in the NSLEO");
     80  Assert.equal(env.prop, false);
     81 
     82  env = envs[i]; i++;
     83  Assert.equal(env.type, "WithEnvironmentObject");
     84  Assert.equal(env.qualified, false);
     85  Assert.equal(env.unqualified, false);
     86  Assert.equal(env.lexical, false);
     87  Assert.equal(env.prop, true, "this property must live in the with env");
     88 
     89  env = envs[i]; i++;
     90  Assert.equal(env.type, "NonSyntacticVariablesObject");
     91  Assert.equal(env.qualified, true, "qualified var must live in the NSVO");
     92  Assert.equal(env.unqualified, true, "unqualified var must live in the NSVO");
     93  Assert.equal(env.lexical, false);
     94  Assert.equal(env.prop, false);
     95 
     96  env = envs[i]; i++;
     97  Assert.equal(env.type, "GlobalLexicalEnvironmentObject");
     98  Assert.equal(env.qualified, false);
     99  Assert.equal(env.unqualified, false);
    100  Assert.equal(env.lexical, false);
    101  Assert.equal(env.prop, false);
    102 
    103  env = envs[i]; i++;
    104  Assert.equal(env.type, "*SystemGlobal*");
    105  Assert.equal(env.qualified, false);
    106  Assert.equal(env.unqualified, false);
    107  Assert.equal(env.lexical, false);
    108  Assert.equal(env.prop, false);
    109 
    110  Assert.equal(share.unique_qualified, "undefined", "qualified var must not be shared");
    111  Assert.equal(share.unique_unqualified, "undefined", "unqualified name must not be shared");
    112  Assert.equal(share.unique_lexical, "undefined", "lexical must not be shared");
    113  Assert.equal(share.unique_prop, 40, "this property must be shared");
    114 
    115  await page.close();
    116 });
    117 
    118 add_task(async function non_unique_scope() {
    119  const page = await XPCShellContentUtils.loadContentPage("about:blank", {
    120    remote: true,
    121  });
    122 
    123  const envsPromise = new Promise(resolve => {
    124    Services.mm.addMessageListener("non-unique-envs-result", msg => {
    125      resolve(msg.data);
    126    });
    127  });
    128  const sharePromise = new Promise(resolve => {
    129    Services.mm.addMessageListener("non-unique-share-result", msg => {
    130      resolve(msg.data);
    131    });
    132  });
    133 
    134  const runInUniqueScope = false;
    135  const runInGlobalScope = !runInUniqueScope;
    136 
    137  Services.mm.loadFrameScript(`data:,
    138 var non_unique_qualified = 10;
    139 non_unique_unqualified = 20;
    140 let non_unique_lexical = 30;
    141 this.non_unique_prop = 40;
    142 
    143 const funcs = Cu.getJSTestingFunctions();
    144 const envs = [];
    145 let env = funcs.getInnerMostEnvironmentObject();
    146 while (env) {
    147  envs.push({
    148    type: funcs.getEnvironmentObjectType(env) || "*SystemGlobal*",
    149    qualified: !!Object.getOwnPropertyDescriptor(env, "non_unique_qualified"),
    150    unqualified: !!Object.getOwnPropertyDescriptor(env, "non_unique_unqualified"),
    151    lexical: !!Object.getOwnPropertyDescriptor(env, "non_unique_lexical"),
    152    prop: !!Object.getOwnPropertyDescriptor(env, "non_unique_prop"),
    153  });
    154 
    155  env = funcs.getEnclosingEnvironmentObject(env);
    156 }
    157 
    158 sendSyncMessage("non-unique-envs-result", envs);
    159 `, false, runInGlobalScope);
    160 
    161  Services.mm.loadFrameScript(`data:,
    162 sendSyncMessage("non-unique-share-result", {
    163  non_unique_qualified,
    164  non_unique_unqualified,
    165  non_unique_lexical,
    166  non_unique_prop,
    167 });
    168 `, false, runInGlobalScope);
    169 
    170  const envs = await envsPromise;
    171  const share = await sharePromise;
    172 
    173  Assert.equal(envs.length, 4);
    174 
    175  let i = 0, env;
    176 
    177  env = envs[i]; i++;
    178  Assert.equal(env.type, "NonSyntacticLexicalEnvironmentObject");
    179  Assert.equal(env.qualified, false);
    180  Assert.equal(env.unqualified, false);
    181  Assert.equal(env.lexical, true, "lexical must live in the NSLEO");
    182  Assert.equal(env.prop, false);
    183 
    184  env = envs[i]; i++;
    185  Assert.equal(env.type, "WithEnvironmentObject");
    186  Assert.equal(env.qualified, true, "qualified var must live in the with env");
    187  Assert.equal(env.unqualified, false);
    188  Assert.equal(env.lexical, false);
    189  Assert.equal(env.prop, true, "this property must live in the with env");
    190 
    191  env = envs[i]; i++;
    192  Assert.equal(env.type, "GlobalLexicalEnvironmentObject");
    193  Assert.equal(env.qualified, false);
    194  Assert.equal(env.unqualified, false);
    195  Assert.equal(env.lexical, false);
    196  Assert.equal(env.prop, false);
    197 
    198  env = envs[i]; i++;
    199  Assert.equal(env.type, "*SystemGlobal*");
    200  Assert.equal(env.qualified, false);
    201  Assert.equal(env.unqualified, true, "unqualified name must live in the system global");
    202  Assert.equal(env.lexical, false);
    203  Assert.equal(env.prop, false);
    204 
    205  Assert.equal(share.non_unique_qualified, 10, "qualified var must be shared");
    206  Assert.equal(share.non_unique_unqualified, 20, "unqualified name must be shared");
    207  Assert.equal(share.non_unique_lexical, 30, "lexical must be shared");
    208  Assert.equal(share.non_unique_prop, 40, "this property must be shared");
    209 
    210  await page.close();
    211 });