Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
add_task(async function testJsonImportAttribute() {
let ns = ChromeUtils.importESModule("resource://test/import_attributes.mjs");
Assert.equal(ns.data.value, 42);
});
add_task(async function testJsonImportAttributeInCurrentGlobal() {
const win = createChromeWindow();
win.eval(`
var ns = ChromeUtils.importESModule("resource://test/import_attributes.mjs", {
global: "current",
});
`);
Assert.equal(win.eval(`ns.data.value`), 42);
});
add_task(async function testJsonImportAttributeAsyncThenSyncCurrentGlobal() {
// Import via dynamic import (async, uses window's module loader), then
// import via ChromeUtils.importESModule (sync). The modules are shared
// between both loaders via JS::loader::ModuleLoaderBase::CopyModulesTo.
const win = createChromeWindow();
win.eval(`
var ns = null;
import("resource://test/import_attributes.mjs").then(v => { ns = v; });
`);
Services.tm.spinEventLoopUntil(
"Wait until dynamic import finishes",
() => win.eval(`ns !== null`)
);
Assert.equal(win.eval(`ns.data.value`), 42);
win.eval(`
var ns2 = ChromeUtils.importESModule("resource://test/import_attributes.mjs", {
global: "current",
});
`);
Assert.equal(win.eval(`ns2.data.value`), 42);
});
add_task(async function testJsonImportAttributeSyncThenAsyncCurrentGlobal() {
// Import via ChromeUtils.importESModule (sync), then import via dynamic
// import (async). The modules are shared between both loaders via
// JS::loader::ModuleLoaderBase::MoveModulesTo.
const win = createChromeWindow();
win.eval(`
var ns = ChromeUtils.importESModule("resource://test/import_attributes.mjs", {
global: "current",
});
`);
Assert.equal(win.eval(`ns.data.value`), 42);
win.eval(`
var ns2 = null;
import("resource://test/import_attributes.mjs").then(v => { ns2 = v; });
`);
Services.tm.spinEventLoopUntil(
"Wait until dynamic import finishes",
() => win.eval(`ns2 !== null`)
);
Assert.equal(win.eval(`ns2.data.value`), 42);
});
add_task(async function testCssImportAttribute() {
const win = createChromeWindow();
const ns = win.eval(
`ChromeUtils.importESModule("resource://test/import_attributes_css.mjs", { global: "current" })`
);
Assert.ok(ns.sheet instanceof win.CSSStyleSheet);
Assert.equal(ns.sheet.cssRules.length, 1);
});
add_task(async function testCssImportAttributeAsyncThenSyncCurrentGlobal() {
// Import via dynamic import (async, uses window's module loader), then
// import via ChromeUtils.importESModule (sync). The modules are shared
// between both loaders via JS::loader::ModuleLoaderBase::CopyModulesTo.
const win = createChromeWindow();
win.eval(`
var ns = null;
import("resource://test/import_attributes_css.mjs").then(v => { ns = v; });
`);
Services.tm.spinEventLoopUntil(
"Wait until dynamic import finishes",
() => win.eval(`ns !== null`)
);
Assert.ok(win.eval(`ns.sheet instanceof CSSStyleSheet`));
Assert.equal(win.eval(`ns.sheet.cssRules.length`), 1);
win.eval(`
var ns2 = ChromeUtils.importESModule("resource://test/import_attributes_css.mjs", {
global: "current",
});
`);
Assert.ok(win.eval(`ns2.sheet instanceof CSSStyleSheet`));
Assert.equal(win.eval(`ns2.sheet.cssRules.length`), 1);
});
add_task(async function testCssImportAttributeSyncThenAsyncCurrentGlobal() {
// Import via ChromeUtils.importESModule (sync), then import via dynamic
// import (async). The modules are shared between both loaders via
// JS::loader::ModuleLoaderBase::MoveModulesTo.
const win = createChromeWindow();
win.eval(`
var ns = ChromeUtils.importESModule("resource://test/import_attributes_css.mjs", {
global: "current",
});
`);
Assert.ok(win.eval(`ns.sheet instanceof CSSStyleSheet`));
Assert.equal(win.eval(`ns.sheet.cssRules.length`), 1);
win.eval(`
var ns2 = null;
import("resource://test/import_attributes_css.mjs").then(v => { ns2 = v; });
`);
Services.tm.spinEventLoopUntil(
"Wait until dynamic import finishes",
() => win.eval(`ns2 !== null`)
);
Assert.ok(win.eval(`ns2.sheet instanceof CSSStyleSheet`));
Assert.equal(win.eval(`ns2.sheet.cssRules.length`), 1);
});