diff --git a/test/language/import/import-defer/deferred-namespace-object/deferred_ns_export_FIXTURE.js b/test/language/import/import-defer/deferred-namespace-object/deferred_ns_export_FIXTURE.js new file mode 100644 index 00000000000..6a0971b2035 --- /dev/null +++ b/test/language/import/import-defer/deferred-namespace-object/deferred_ns_export_FIXTURE.js @@ -0,0 +1,9 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +import "./setup_FIXTURE.js"; +import defer * as ns from "./dep2_FIXTURE.js"; + +globalThis.evaluations.push("reexport"); + +export { ns }; diff --git a/test/language/import/import-defer/deferred-namespace-object/dep2_FIXTURE.js b/test/language/import/import-defer/deferred-namespace-object/dep2_FIXTURE.js new file mode 100644 index 00000000000..ae6b9902bb3 --- /dev/null +++ b/test/language/import/import-defer/deferred-namespace-object/dep2_FIXTURE.js @@ -0,0 +1,6 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +globalThis.evaluations.push("dep"); + +export let foo = 42; diff --git a/test/language/import/import-defer/deferred-namespace-object/reexport-deferred-ns-evaluation.js b/test/language/import/import-defer/deferred-namespace-object/reexport-deferred-ns-evaluation.js new file mode 100644 index 00000000000..56d22a88141 --- /dev/null +++ b/test/language/import/import-defer/deferred-namespace-object/reexport-deferred-ns-evaluation.js @@ -0,0 +1,39 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-resolveexport +description: > + Re-exported deferred namespace preserves deferred semantics +info: | + ResolveExport ( _exportName_ ) + 1. ... + 1. For each ExportEntry Record _e_ of _module_.[[IndirectExportEntries]], do + 1. If _e_.[[ExportName]] is _exportName_, then + 1. Assert: _e_.[[ModuleRequest]] is not *null*. + 1. Let _importedModule_ be GetImportedModule(_module_, _e_.[[ModuleRequest]]). + 1. If _e_.[[ImportName]] is ~all~, then + 1. Assert: _module_ does not provide the direct binding for this export. + 1. If _e_.[[ModuleRequest]].[[Phase]] is ~defer~, then + 1. Return ResolvedBinding Record { [[Module]]: _importedModule_, + [[BindingName]]: ~deferred-namespace~ }. + 1. Else, + 1. Assert: _e_.[[Phase]] is ~evaluation~. + 1. Return ResolvedBinding Record { [[Module]]: _importedModule_, + [[BindingName]]: ~namespace~ }. +flags: [module] +features: [import-defer] +includes: [compareArray.js] +---*/ + +import { ns } from "./deferred_ns_export_FIXTURE.js"; + +assert.compareArray(globalThis.evaluations, ["reexport"], + "deferred module should not be evaluated"); + +assert.sameValue(ns[Symbol.toStringTag], "Deferred Module", + "'ns' should be a deferred namespace object"); + +assert.sameValue(ns.foo, 42); +assert.compareArray(globalThis.evaluations, ["reexport", "dep"], + "deferred module should be evaluated after property access"); diff --git a/test/language/import/import-defer/deferred-namespace-object/setup_FIXTURE.js b/test/language/import/import-defer/deferred-namespace-object/setup_FIXTURE.js new file mode 100644 index 00000000000..c72aabeac21 --- /dev/null +++ b/test/language/import/import-defer/deferred-namespace-object/setup_FIXTURE.js @@ -0,0 +1,4 @@ +// Copyright (C) 2026 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +globalThis.evaluations = [];