tor-browser

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

test_envChain_subscript_in_frameScript.js (8382B)


      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 subscripts in frame script 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_with_target() {
     17  const page = await XPCShellContentUtils.loadContentPage("about:blank", {
     18    remote: true,
     19  });
     20 
     21  const envsPromise = new Promise(resolve => {
     22    Services.mm.addMessageListener("unique-with-target-envs-result", msg => {
     23      resolve(msg.data);
     24    });
     25  });
     26 
     27  const runInUniqueScope = true;
     28  const runInGlobalScope = !runInUniqueScope;
     29 
     30  Services.mm.loadFrameScript(
     31    `data:,
     32 const target = {};
     33 Services.scriptloader.loadSubScript("resource://test/file_envChain_subscript_unique_target.js", target);
     34 
     35 const envs = target.ENVS;
     36 
     37 sendSyncMessage("unique-with-target-envs-result", envs);
     38 `, false, runInGlobalScope);
     39 
     40  const envs = await envsPromise;
     41 
     42  Assert.equal(envs.length, 7);
     43 
     44  let i = 0, env;
     45 
     46  env = envs[i]; i++;
     47  Assert.equal(env.type, "NonSyntacticLexicalEnvironmentObject");
     48  Assert.equal(env.qualified, false);
     49  Assert.equal(env.unqualified, false);
     50  Assert.equal(env.lexical, true, "lexical must live in the NSLEO");
     51  Assert.equal(env.prop, false);
     52 
     53  env = envs[i]; i++;
     54  Assert.equal(env.type, "WithEnvironmentObject");
     55  Assert.equal(env.qualified, true, "qualified var must live in the with env");
     56  Assert.equal(env.unqualified, false);
     57  Assert.equal(env.lexical, false);
     58  Assert.equal(env.prop, true, "this property must live in the with env");
     59 
     60  env = envs[i]; i++;
     61  Assert.equal(env.type, "NonSyntacticLexicalEnvironmentObject");
     62  Assert.equal(env.qualified, false);
     63  Assert.equal(env.unqualified, false);
     64  Assert.equal(env.lexical, false);
     65  Assert.equal(env.prop, false);
     66 
     67  env = envs[i]; i++;
     68  Assert.equal(env.type, "WithEnvironmentObject");
     69  Assert.equal(env.qualified, false);
     70  Assert.equal(env.unqualified, false);
     71  Assert.equal(env.lexical, false);
     72  Assert.equal(env.prop, false);
     73 
     74  env = envs[i]; i++;
     75  Assert.equal(env.type, "NonSyntacticVariablesObject");
     76  Assert.equal(env.qualified, false);
     77  Assert.equal(env.unqualified, true, "unqualified var must live in the NSVO");
     78  Assert.equal(env.lexical, false);
     79  Assert.equal(env.prop, false);
     80 
     81  env = envs[i]; i++;
     82  Assert.equal(env.type, "GlobalLexicalEnvironmentObject");
     83  Assert.equal(env.qualified, false);
     84  Assert.equal(env.unqualified, false);
     85  Assert.equal(env.lexical, false);
     86  Assert.equal(env.prop, false);
     87 
     88  env = envs[i]; i++;
     89  Assert.equal(env.type, "*SystemGlobal*");
     90  Assert.equal(env.qualified, false);
     91  Assert.equal(env.unqualified, false);
     92  Assert.equal(env.lexical, false);
     93  Assert.equal(env.prop, false);
     94 
     95  await page.close();
     96 });
     97 
     98 add_task(async function non_unique_scope_with_target() {
     99  const page = await XPCShellContentUtils.loadContentPage("about:blank", {
    100    remote: true,
    101  });
    102 
    103  const envsPromise = new Promise(resolve => {
    104    Services.mm.addMessageListener("non-unique-with-target-envs-result", msg => {
    105      resolve(msg.data);
    106    });
    107  });
    108 
    109  const runInUniqueScope = false;
    110  const runInGlobalScope = !runInUniqueScope;
    111 
    112  Services.mm.loadFrameScript(`data:,
    113 const target = {};
    114 Services.scriptloader.loadSubScript("resource://test/file_envChain_subscript_non_unique_target.js", target);
    115 
    116 const envs = target.ENVS;
    117 
    118 sendSyncMessage("non-unique-with-target-envs-result", envs);
    119 `, false, runInGlobalScope);
    120 
    121  const envs = await envsPromise;
    122 
    123  Assert.equal(envs.length, 4);
    124 
    125  let i = 0, env;
    126 
    127  env = envs[i]; i++;
    128  Assert.equal(env.type, "NonSyntacticLexicalEnvironmentObject");
    129  Assert.equal(env.qualified, false);
    130  Assert.equal(env.unqualified, false);
    131  Assert.equal(env.lexical, true, "lexical must live in the NSLEO");
    132  Assert.equal(env.prop, false);
    133 
    134  env = envs[i]; i++;
    135  Assert.equal(env.type, "WithEnvironmentObject");
    136  Assert.equal(env.qualified, true, "qualified var must live in the with env");
    137  Assert.equal(env.unqualified, false);
    138  Assert.equal(env.lexical, false);
    139  Assert.equal(env.prop, true, "this property must live in the with env");
    140 
    141  env = envs[i]; i++;
    142  Assert.equal(env.type, "GlobalLexicalEnvironmentObject");
    143  Assert.equal(env.qualified, false);
    144  Assert.equal(env.unqualified, false);
    145  Assert.equal(env.lexical, false);
    146  Assert.equal(env.prop, false);
    147 
    148  env = envs[i]; i++;
    149  Assert.equal(env.type, "*SystemGlobal*");
    150  Assert.equal(env.qualified, false);
    151  Assert.equal(env.unqualified, true, "unqualified var must live in the system global");
    152  Assert.equal(env.lexical, false);
    153  Assert.equal(env.prop, false);
    154 
    155  await page.close();
    156 });
    157 
    158 add_task(async function unique_scope_no_target() {
    159  const page = await XPCShellContentUtils.loadContentPage("about:blank", {
    160    remote: true,
    161  });
    162 
    163  const envsPromise = new Promise(resolve => {
    164    Services.mm.addMessageListener("unique-no-target-envs-result", msg => {
    165      resolve(msg.data);
    166    });
    167  });
    168 
    169  const runInUniqueScope = true;
    170  const runInGlobalScope = !runInUniqueScope;
    171 
    172  Services.mm.loadFrameScript(`data:,
    173 Services.scriptloader.loadSubScript("resource://test/file_envChain_subscript_unique_no_target.js");
    174 
    175 const outerEnvs = globalThis.ENVS;
    176 
    177 sendSyncMessage("unique-no-target-envs-result", outerEnvs);
    178 `, false, runInGlobalScope);
    179 
    180  const envs = await envsPromise;
    181 
    182  Assert.equal(envs.length, 5);
    183 
    184  let i = 0, env;
    185 
    186  env = envs[i]; i++;
    187  Assert.equal(env.type, "NonSyntacticLexicalEnvironmentObject");
    188  Assert.equal(env.qualified, false);
    189  Assert.equal(env.unqualified, false);
    190  Assert.equal(env.lexical, true, "lexical must live in the NSLEO");
    191  Assert.equal(env.prop, false);
    192 
    193  env = envs[i]; i++;
    194  Assert.equal(env.type, "WithEnvironmentObject");
    195  Assert.equal(env.qualified, false);
    196  Assert.equal(env.unqualified, false);
    197  Assert.equal(env.lexical, false);
    198  Assert.equal(env.prop, true, "this property must live in the with env");
    199 
    200  env = envs[i]; i++;
    201  Assert.equal(env.type, "NonSyntacticVariablesObject");
    202  Assert.equal(env.qualified, true, "qualified var must live in the NSVO");
    203  Assert.equal(env.unqualified, true, "unqualified var must live in the NSVO");
    204  Assert.equal(env.lexical, false);
    205  Assert.equal(env.prop, false);
    206 
    207  env = envs[i]; i++;
    208  Assert.equal(env.type, "GlobalLexicalEnvironmentObject");
    209  Assert.equal(env.qualified, false);
    210  Assert.equal(env.unqualified, false);
    211  Assert.equal(env.lexical, false);
    212  Assert.equal(env.prop, false);
    213 
    214  env = envs[i]; i++;
    215  Assert.equal(env.type, "*SystemGlobal*");
    216  Assert.equal(env.qualified, false);
    217  Assert.equal(env.unqualified, false);
    218  Assert.equal(env.lexical, false);
    219  Assert.equal(env.prop, false);
    220 
    221  await page.close();
    222 });
    223 
    224 add_task(async function non_unique_scope_no_target() {
    225  const page = await XPCShellContentUtils.loadContentPage("about:blank", {
    226    remote: true,
    227  });
    228 
    229  const envsPromise = new Promise(resolve => {
    230    Services.mm.addMessageListener("non-unique-no-target-envs-result", msg => {
    231      resolve(msg.data);
    232    });
    233  });
    234 
    235  const runInUniqueScope = false;
    236  const runInGlobalScope = !runInUniqueScope;
    237 
    238  Services.mm.loadFrameScript(`data:,
    239 Services.scriptloader.loadSubScript("resource://test/file_envChain_subscript_non_unique_no_target.js");
    240 
    241 const outerEnvs = globalThis.ENVS;
    242 
    243 sendSyncMessage("non-unique-no-target-envs-result", outerEnvs);
    244 `, false, runInGlobalScope);
    245 
    246  const envs = await envsPromise;
    247 
    248  Assert.equal(envs.length, 2);
    249 
    250  let i = 0, env;
    251 
    252  env = envs[i]; i++;
    253  Assert.equal(env.type, "GlobalLexicalEnvironmentObject");
    254  Assert.equal(env.qualified, false);
    255  Assert.equal(env.unqualified, false);
    256  Assert.equal(env.lexical, true, "lexical must live in the global lexical");
    257  Assert.equal(env.prop, false);
    258 
    259  env = envs[i]; i++;
    260  Assert.equal(env.type, "*SystemGlobal*");
    261  Assert.equal(env.qualified, true, "qualified var must live in the with system global");
    262  Assert.equal(env.unqualified, true, "unqualified name must live in the system global");
    263  Assert.equal(env.lexical, false);
    264  Assert.equal(env.prop, true, "this property must live in the with system global");
    265 
    266  await page.close();
    267 });