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 });