Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
- This WPT test may be referenced by the following Test IDs:
- /html/semantics/scripting-1/the-script-element/json-module/repeated-imports.any.html - WPT Dashboard Interop Dashboard
- /html/semantics/scripting-1/the-script-element/json-module/repeated-imports.any.sharedworker.html - WPT Dashboard Interop Dashboard
- /html/semantics/scripting-1/the-script-element/json-module/repeated-imports.any.worker.html - WPT Dashboard Interop Dashboard
// META: global=window,dedicatedworker,sharedworker
// META: script=/common/utils.js
promise_test(async test => {
await promise_rejects_js(test, TypeError,
import("./module.json"),
"Dynamic import of a JSON module without a type attribute should fail");
// This time the import should succeed because we're using the correct
// import even though the previous attempt with the same specifier failed.
const result = await import("./module.json", { with: { type: "json" } });
assert_true(result.default.test);
}, "Importing a specifier that previously failed due to an incorrect type attribute can succeed if the correct attribute is later given");
promise_test(async test => {
// Append a URL fragment to the specifier so that this is independent
// from the previous test.
const result = await import("./module.json#2", { with: { type: "json" } });
assert_true(result.default.test);
await promise_rejects_js(test, TypeError,
import("./module.json#2"),
"Dynamic import should fail with the type attribute missing even if the same specifier previously succeeded");
}, "Importing a specifier that previously succeeded with the correct type attribute should fail if the incorrect attribute is later given");
promise_test(async test => {
const uuid_token = token();
// serve-json-then-js.py gives us JSON the first time
const result_json = await import(`../serve-json-then-js.py?key=${uuid_token}`, { with: { type: "json" } });
assert_equals(result_json.default.hello, "world");
// Import using the same specifier again; this time we get JS, which
// should succeed since we're not asserting a non-JS type this time.
const result_js = await import(`../serve-json-then-js.py?key=${uuid_token}`);
assert_equals(result_js.default, "hello");
}, "Two modules of different type with the same specifier can load if the server changes its responses");
promise_test(async test => {
const uuid_token = token();
// serve-json-then-js.py gives us JSON the first time
await promise_rejects_js(test, TypeError,
import(`../serve-json-then-js.py?key=${uuid_token}`),
"Dynamic import of JS with a JSON type attribute should fail");
// Import using the same specifier/module type pair again; this time we get JS,
// but the import should still fail because the module map entry for this
// specifier/module type pair already contains a failure.
await promise_rejects_js(test, TypeError,
import(`../serve-json-then-js.py?key=${uuid_token}`),
"import should always fail if the same specifier/type attribute pair failed previously");
}, "An import should always fail if the same specifier/type attribute pair failed previously");
promise_test(async test => {
const uuid_token = token();
// serve-json-then-js.py gives us JSON the first time
const result_json = await import(`../serve-json-then-js.py?key=${uuid_token}`, { with: { type: "json" } });
assert_equals(result_json.default.hello, "world");
// If this were to do another fetch, the import would fail because
// serve-json-then-js.py would give us JS this time. But, the module map
// entry for this specifier/module type pair already exists, so we
// successfully reuse the entry instead of fetching again.
const result_json_2 = await import(`../serve-json-then-js.py?key=${uuid_token}`, { with: { type: "json" } });
assert_equals(result_json_2.default.hello, "world");
}, "If an import previously succeeded for a given specifier/type attribute pair, future uses of that pair should yield the same result");