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/module/dynamic-import/blob-url.any.html - WPT Dashboard Interop Dashboard
- /html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.sharedworker-module.html - WPT Dashboard Interop Dashboard
- /html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.sharedworker.html - WPT Dashboard Interop Dashboard
- /html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.worker-module.html - WPT Dashboard Interop Dashboard
- /html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.worker.html - WPT Dashboard Interop Dashboard
// META: global=window,dedicatedworker,sharedworker,dedicatedworker-module,sharedworker-module
function objectUrlFromModule(module) {
const blob = new Blob([module], { type: "text/javascript" });
return URL.createObjectURL(blob);
}
const moduleText = `export const foo = "bar";`;
promise_test(async (t) => {
const moduleBlobUrl = objectUrlFromModule(moduleText);
t.add_cleanup(() => URL.revokeObjectURL(moduleBlobUrl));
const module = await import(moduleBlobUrl);
assert_equals(module.foo, "bar");
}, "Blob URLs are supported in dynamic imports");
promise_test(async (t) => {
const moduleBlobUrl = objectUrlFromModule(moduleText);
t.add_cleanup(() => URL.revokeObjectURL(moduleBlobUrl));
const module1 = await import(moduleBlobUrl);
const module2 = await import(moduleBlobUrl);
assert_equals(module1, module2);
}, "Identical blob URLs resolve to the same module");
promise_test(async (t) => {
const moduleBlob = new Blob([moduleText], { type: "text/javascript" });
const moduleBlobUrl1 = URL.createObjectURL(moduleBlob);
const moduleBlobUrl2 = URL.createObjectURL(moduleBlob);
t.add_cleanup(() => {
URL.revokeObjectURL(moduleBlobUrl1);
URL.revokeObjectURL(moduleBlobUrl2);
});
const module1 = await import(moduleBlobUrl1);
const module2 = await import(moduleBlobUrl2);
assert_not_equals(module1, module2);
}, "Different blob URLs pointing to the same blob resolve to different modules");
promise_test(async (t) => {
const moduleBlobUrl = objectUrlFromModule(moduleText);
URL.revokeObjectURL(moduleBlobUrl);
await promise_rejects_js(t, TypeError, import(moduleBlobUrl));
}, "A revoked blob URL will not resolve");
promise_test(async () => {
const moduleBlobUrl = objectUrlFromModule(moduleText);
const module1 = await import(moduleBlobUrl);
URL.revokeObjectURL(moduleBlobUrl);
const module2 = await import(moduleBlobUrl);
assert_equals(module1, module2);
}, "A revoked blob URL will resolve if it's already in the module graph");
promise_test(async () => {
const moduleBlobUrl = objectUrlFromModule(moduleText);
const importPromise = import(moduleBlobUrl);
URL.revokeObjectURL(moduleBlobUrl);
const module = await importPromise;
assert_equals(module.foo, "bar");
}, "Revoking a blob URL immediately after calling import will not fail");