97
FormReset,
98
Cloned,
99
PerformedWork,
100
+ ForceClientRender,
101
} from './ReactFiberFlags';
102
import {
103
commitStartTime,
114
import {
115
logComponentRender,
116
logComponentEffect,
117
+ logSuspenseBoundaryClientRendered,
118
} from './ReactFiberPerformanceTrack';
119
import {ConcurrentMode, NoMode, ProfileMode} from './ReactTypeOfMode';
120
import {deferHiddenCallbacks} from './ReactFiberClassUpdateQueue';
2691
}
2692
}
2693
2694
+let inHydratedSubtree = false;
2695
+
2696
function commitPassiveMountOnFiber(
2697
finishedRoot: FiberRoot,
2698
finishedWork: Fiber,
2717
finishedWork,
2718
((finishedWork.actualStartTime: any): number),
2719
endTime,
2720
+ inHydratedSubtree,
2721
);
2722
}
2723
2746
}
2747
case HostRoot: {
2748
const prevEffectDuration = pushNestedEffectDurations();
2749
+
2750
+ const wasInHydratedSubtree = inHydratedSubtree;
2751
+ if (enableProfilerTimer && enableComponentPerformanceTrack) {
2752
+ // Detect if this was a hydration commit by look at if the previous state was
2753
+ // dehydrated and this wasn't a forced client render.
2754
+ inHydratedSubtree =
2755
+ finishedWork.alternate !== null &&
2756
+ (finishedWork.alternate.memoizedState: RootState).isDehydrated &&
2757
+ (finishedWork.flags & ForceClientRender) === NoFlags;
2758
+ }
2759
+
2760
recursivelyTraversePassiveMountEffects(
2761
finishedRoot,
2762
finishedWork,
2764
committedTransitions,
2765
endTime,
2766
);
2767
+
2768
+ if (enableProfilerTimer && enableComponentPerformanceTrack) {
2769
+ inHydratedSubtree = wasInHydratedSubtree;
2770
+ }
2771
+
2772
if (flags & Passive) {
2773
let previousCache: Cache | null = null;
2774
if (finishedWork.alternate !== null) {
2862
}
2863
break;
2864
}
2865
+ case SuspenseComponent: {
2866
+ const wasInHydratedSubtree = inHydratedSubtree;
2867
+ if (enableProfilerTimer && enableComponentPerformanceTrack) {
2868
+ const prevState: SuspenseState | null =
2869
+ finishedWork.alternate !== null
2870
+ ? finishedWork.alternate.memoizedState
2871
+ : null;
2872
+ const nextState: SuspenseState | null = finishedWork.memoizedState;
2873
+ if (
2874
+ prevState !== null &&
2875
+ prevState.dehydrated !== null &&
2876
+ (nextState === null || nextState.dehydrated === null)
2877
+ ) {
2878
+ // This was dehydrated but is no longer dehydrated. We may have now either hydrated it
2879
+ // or client rendered it.
2880
+ const deletions = finishedWork.deletions;
2881
+ if (
2882
+ deletions !== null &&
2883
+ deletions.length > 0 &&
2884
+ deletions[0].tag === DehydratedFragment
2885
+ ) {
2886
+ // This was an abandoned hydration that deleted the dehydrated fragment. That means we
2887
+ // are not hydrating this Suspense boundary.
2888
+ inHydratedSubtree = false;
2889
+ const hydrationErrors = prevState.hydrationErrors;
2890
+ // If there were no hydration errors, that suggests that this was an intentional client
2891
+ // rendered boundary. Such as postpone.
2892
+ if (hydrationErrors !== null) {
2893
+ const startTime: number = (finishedWork.actualStartTime: any);
2894
+ logSuspenseBoundaryClientRendered(
2895
+ finishedWork,
2896
+ startTime,
2897
+ endTime,
2898
+ hydrationErrors,
2899
+ );
2900
+ }
2901
+ } else {
2902
+ // If any children committed they were hydrated.
2903
+ inHydratedSubtree = true;
2904
+ }
2905
+ } else {
2906
+ inHydratedSubtree = false;
2907
+ }
2908
+ }
2909
+
2910
+ recursivelyTraversePassiveMountEffects(
2911
+ finishedRoot,
2912
+ finishedWork,
2913
+ committedLanes,
2914
+ committedTransitions,
2915
+ endTime,
2916
+ );
2917
+
2918
+ if (enableProfilerTimer && enableComponentPerformanceTrack) {
2919
+ inHydratedSubtree = wasInHydratedSubtree;
2920
+ }
2921
+ break;
2922
+ }
2923
case LegacyHiddenComponent: {
2924
if (enableLegacyHidden) {
2925
recursivelyTraversePassiveMountEffects(
3153
finishedWork,
3154
((finishedWork.actualStartTime: any): number),
3155
endTime,
3156
+ inHydratedSubtree,
3157
);
3158
}
3159
3397
finishedWork,
3398
((finishedWork.actualStartTime: any): number),
3399
endTime,
3400
+ inHydratedSubtree,
3401
);
3402
}
3403