From 1c5c947ec7287cbf95555a81581e04a8d2539ba3 Mon Sep 17 00:00:00 2001 From: Sebastian Markbage Date: Wed, 1 Oct 2025 21:47:14 -0400 Subject: [PATCH] Clean up ViewTransition when it fails to start --- .../src/client/ReactFiberConfigDOM.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js b/packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js index 7d28dc43ca569..0f75d5f8cd78e 100644 --- a/packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js +++ b/packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js @@ -2279,6 +2279,11 @@ export function startViewTransition( spawnedWorkCallback(); }; const handleError = (error: mixed) => { + // $FlowFixMe[prop-missing] + if (ownerDocument.__reactViewTransition === transition) { + // $FlowFixMe[prop-missing] + ownerDocument.__reactViewTransition = null; + } try { error = customizeViewTransitionError(error, false); if (error !== null) { @@ -2293,6 +2298,9 @@ export function startViewTransition( layoutCallback(); // Skip afterMutationCallback() since we're not animating. spawnedWorkCallback(); + if (enableProfilerTimer) { + finishedAnimation(); + } } }; transition.ready.then(readyCallback, handleError); @@ -2699,6 +2707,11 @@ export function startGestureTransition( ? () => requestAnimationFrame(readyCallback) : readyCallback; const handleError = (error: mixed) => { + // $FlowFixMe[prop-missing] + if (ownerDocument.__reactViewTransition === transition) { + // $FlowFixMe[prop-missing] + ownerDocument.__reactViewTransition = null; + } try { error = customizeViewTransitionError(error, true); if (error !== null) { @@ -2713,6 +2726,9 @@ export function startGestureTransition( // Skip readyCallback() and go straight to animateCallbck() since we're not animating. // animateCallback() is still required to restore states. animateCallback(); + if (enableProfilerTimer) { + finishedAnimation(); + } } }; transition.ready.then(readyForAnimations, handleError);