From 1a5d84cb58a45bf1223c8ff56d9846254077039d Mon Sep 17 00:00:00 2001 From: SinachPat Date: Sat, 9 May 2026 17:11:01 +0100 Subject: [PATCH] fix: make hook.inject robust against React Refresh timing race Root cause: the React DevTools browser extension injects a hook stub at document_start (before HTML parsing), so hook.inject can be undefined when React Fast Refresh runs. React Refresh destructures inject as undefined and later calls undefined.apply() -> TypeError. This prevents React from ever setting injectedHook, so onCommitFiberRoot is never called. Fix: unconditionally replace hook.inject with a wrapper that tries the captured previous inject (with try/catch) then falls back to our own renderer ID allocation. Works regardless of script execution order. Co-Authored-By: Claude Sonnet 4.6 --- packages/renderer/src/fiber-hook.ts | 58 +++++++++++++++-------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/packages/renderer/src/fiber-hook.ts b/packages/renderer/src/fiber-hook.ts index 2bce38f..2e69e11 100644 --- a/packages/renderer/src/fiber-hook.ts +++ b/packages/renderer/src/fiber-hook.ts @@ -181,38 +181,42 @@ export function buildProxyFiberHookScript(): string { // ── React DevTools global hook ──────────────────────────────────────────── // Must be installed before React evaluates its module body. React checks for // __REACT_DEVTOOLS_GLOBAL_HOOK__ exactly once at import time. + // + // Timing hazard: the React DevTools browser extension injects at + // document_start (before HTML parsing), so it can set up a hook stub *before* + // our