From adeef6eb73a245a5f2717532dc26113408d2bf42 Mon Sep 17 00:00:00 2001 From: Johan Kiviniemi Date: Tue, 16 Dec 2025 23:54:41 +0200 Subject: [PATCH] fix: Make `injectScript` wait until script is actually loaded (#1763) Co-authored-by: Aaron --- packages/wxt/src/utils/inject-script.ts | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/packages/wxt/src/utils/inject-script.ts b/packages/wxt/src/utils/inject-script.ts index 25be5c32..37f2fb2e 100644 --- a/packages/wxt/src/utils/inject-script.ts +++ b/packages/wxt/src/utils/inject-script.ts @@ -32,6 +32,8 @@ export async function injectScript( script.src = url; } + const loadedPromise = makeLoadedPromise(script); + await options?.modifyScript?.(script); (document.head ?? document.documentElement).append(script); @@ -39,6 +41,30 @@ export async function injectScript( if (!options?.keepInDom) { script.remove(); } + + await loadedPromise; +} + +function makeLoadedPromise(script: HTMLScriptElement): Promise { + return new Promise((resolve, reject) => { + const onload = () => { + resolve(); + cleanup(); + }; + + const onerror = () => { + reject(new Error(`Failed to load script: ${script.src}`)); + cleanup(); + }; + + const cleanup = () => { + script.removeEventListener('load', onload); + script.removeEventListener('error', onerror); + }; + + script.addEventListener('load', onload); + script.addEventListener('error', onerror); + }); } export interface InjectScriptOptions {