{"record":{"id":"6a9eab071d84a888","repo":"facebook/react","slug":"expected-overridesuspense-to-not-get-called-for","errorCode":null,"errorMessage":"Expected overrideSuspense() to not get called for earlier React versions.","messagePattern":"Expected overrideSuspense\\(\\) to not get called for earlier React versions\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/react-devtools-shared/src/backend/fiber/renderer.js","lineNumber":7512,"sourceCode":"  function shouldSuspendFiberAlwaysFalse() {\n    return false;\n  }\n\n  const forceFallbackForFibers = new Set<Fiber>();\n\n  function shouldSuspendFiberAccordingToSet(fiber: Fiber): boolean {\n    return (\n      forceFallbackForFibers.has(fiber) ||\n      (fiber.alternate !== null && forceFallbackForFibers.has(fiber.alternate))\n    );\n  }\n\n  function overrideSuspense(id: number, forceFallback: boolean) {\n    if (\n      typeof setSuspenseHandler !== 'function' ||\n      typeof scheduleUpdate !== 'function'\n    ) {\n      throw new Error(\n        'Expected overrideSuspense() to not get called for earlier React versions.',\n      );\n    }\n    const devtoolsInstance = idToDevToolsInstanceMap.get(id);\n    if (devtoolsInstance === undefined) {\n      return;\n    }\n    const nearestFiber = getNearestFiber(devtoolsInstance);\n    if (nearestFiber === null) {\n      return;\n    }\n    let fiber = nearestFiber;\n    while (fiber.tag !== SuspenseComponent) {\n      if (fiber.return === null) {\n        return;\n      }\n      fiber = fiber.return;\n    }","sourceCodeStart":7494,"sourceCodeEnd":7530,"githubUrl":"https://github.com/facebook/react/blob/eafeac097ba51e1eab809c07102126bd5f8e5425/packages/react-devtools-shared/src/backend/fiber/renderer.js#L7494-L7530","documentation":"overrideSuspense(id, forceFallback) powers the 'toggle suspend' control on Suspense boundaries. It requires the renderer to expose setSuspenseHandler and scheduleUpdate (React 16.9+); on older React, DevTools has no API to force a boundary to show its fallback, so calling this throws immediately. The stock UI hides the control via supportsTogglingSuspense (renderer.js:452-454, also declared false by the legacy and flight backends).","triggerScenarios":"Clicking 'Suspend'/' Unsuspend' on a Suspense boundary on a page running React <16.9, or a custom frontend sending the 'overrideSuspense' bridge message without checking canToggleSuspense / supportsTogglingSuspense.","commonSituations":"Older React 16.x apps (pre-16.9) with suspense UI explored in DevTools; test harnesses embedding react-devtools-shared against pinned legacy renderers; HMR downgrades of react-dom.","solutions":["Upgrade react/react-dom to >=16.9.","Gate the suspense toggle on inspectedElement.canToggleSuspense before sending 'overrideSuspense'.","Reload after dependency version swaps so the hook re-inspects renderer capabilities.","Confirm the selected renderer is the Fiber renderer (legacy/flight backends never support suspense toggling)."],"exampleFix":"// before\nonClick={() => bridge.send('overrideSuspense', {id, rendererID, forceFallback: true})}\n\n// after\nconst canToggleSuspense = inspectedElement?.canToggleSuspense === true;\nonClick={() => canToggleSuspense && bridge.send('overrideSuspense', {id, rendererID, forceFallback: true})}","handlingStrategy":"validation","validationCode":"// gate on the backend-provided flag (renderer.js:6311-6313)\nif (inspectedElement?.canToggleSuspense === true) {\n  bridge.send('overrideSuspense', {id, rendererID, forceFallback});\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Only show suspend/unsuspend controls when canToggleSuspense is true for the current element.","Remember legacy (React 15) and flight backends declare supportsTogglingSuspense: false - never call overrideSuspense for them.","Require React >=16.9 for suspense-toggling workflows."],"tags":["react-devtools","suspense","version-mismatch","legacy-react","bridge-protocol"],"backgroundTag":"unsupported-react-version","analyzedSha":"eafeac097ba51e1eab809c07102126bd5f8e5425","analyzedAt":"2026-08-21T22:01:08.818Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}