@@ -238,14 +238,15 @@ const ACTIVITY_END_DATA = '/&';
238
238
const SUSPENSE_START_DATA = '$' ;
239
239
const SUSPENSE_END_DATA = '/$' ;
240
240
const SUSPENSE_PENDING_START_DATA = '$?' ;
241
+ const SUSPENSE_QUEUED_START_DATA = '$~' ;
241
242
const SUSPENSE_FALLBACK_START_DATA = '$!' ;
242
243
const PREAMBLE_CONTRIBUTION_HTML = 'html' ;
243
244
const PREAMBLE_CONTRIBUTION_BODY = 'body' ;
244
245
const PREAMBLE_CONTRIBUTION_HEAD = 'head' ;
245
246
const FORM_STATE_IS_MATCHING = 'F!' ;
246
247
const FORM_STATE_IS_NOT_MATCHING = 'F' ;
247
248
248
- const DOCUMENT_READY_STATE_COMPLETE = 'complete ' ;
249
+ const DOCUMENT_READY_STATE_LOADING = 'loading ' ;
249
250
250
251
const STYLE = 'style' ;
251
252
@@ -1084,6 +1085,7 @@ function clearHydrationBoundary(
1084
1085
} else if (
1085
1086
data === SUSPENSE_START_DATA ||
1086
1087
data === SUSPENSE_PENDING_START_DATA ||
1088
+ data === SUSPENSE_QUEUED_START_DATA ||
1087
1089
data === SUSPENSE_FALLBACK_START_DATA ||
1088
1090
data === ACTIVITY_START_DATA
1089
1091
) {
@@ -1205,6 +1207,7 @@ function hideOrUnhideDehydratedBoundary(
1205
1207
} else if (
1206
1208
data === SUSPENSE_START_DATA ||
1207
1209
data === SUSPENSE_PENDING_START_DATA ||
1210
+ data === SUSPENSE_QUEUED_START_DATA ||
1208
1211
data === SUSPENSE_FALLBACK_START_DATA
1209
1212
) {
1210
1213
depth ++ ;
@@ -3140,7 +3143,10 @@ export function canHydrateSuspenseInstance(
3140
3143
}
3141
3144
3142
3145
export function isSuspenseInstancePending(instance: SuspenseInstance): boolean {
3143
- return instance.data === SUSPENSE_PENDING_START_DATA;
3146
+ return (
3147
+ instance.data === SUSPENSE_PENDING_START_DATA ||
3148
+ instance.data === SUSPENSE_QUEUED_START_DATA
3149
+ );
3144
3150
}
3145
3151
3146
3152
export function isSuspenseInstanceFallback(
@@ -3149,7 +3155,7 @@ export function isSuspenseInstanceFallback(
3149
3155
return (
3150
3156
instance.data === SUSPENSE_FALLBACK_START_DATA ||
3151
3157
(instance.data === SUSPENSE_PENDING_START_DATA &&
3152
- instance.ownerDocument.readyState === DOCUMENT_READY_STATE_COMPLETE )
3158
+ instance.ownerDocument.readyState !== DOCUMENT_READY_STATE_LOADING )
3153
3159
);
3154
3160
}
3155
3161
@@ -3192,15 +3198,19 @@ export function registerSuspenseInstanceRetry(
3192
3198
callback: () => void,
3193
3199
) {
3194
3200
const ownerDocument = instance.ownerDocument;
3195
- if (
3201
+ if (instance.data === SUSPENSE_QUEUED_START_DATA) {
3202
+ // The Fizz runtime has already queued this boundary for reveal. We wait for it
3203
+ // to be revealed and then retries.
3204
+ instance._reactRetry = callback;
3205
+ } else if (
3196
3206
// The Fizz runtime must have put this boundary into client render or complete
3197
3207
// state after the render finished but before it committed. We need to call the
3198
3208
// callback now rather than wait
3199
3209
instance.data !== SUSPENSE_PENDING_START_DATA ||
3200
3210
// The boundary is still in pending status but the document has finished loading
3201
3211
// before we could register the event handler that would have scheduled the retry
3202
3212
// on load so we call teh callback now.
3203
- ownerDocument.readyState === DOCUMENT_READY_STATE_COMPLETE
3213
+ ownerDocument.readyState !== DOCUMENT_READY_STATE_LOADING
3204
3214
) {
3205
3215
callback();
3206
3216
} else {
@@ -3255,18 +3265,19 @@ function getNextHydratable(node: ?Node) {
3255
3265
break;
3256
3266
}
3257
3267
if (nodeType === COMMENT_NODE) {
3258
- const nodeData = (node: any).data;
3268
+ const data = (node: any).data;
3259
3269
if (
3260
- nodeData === SUSPENSE_START_DATA ||
3261
- nodeData === SUSPENSE_FALLBACK_START_DATA ||
3262
- nodeData === SUSPENSE_PENDING_START_DATA ||
3263
- nodeData === ACTIVITY_START_DATA ||
3264
- nodeData === FORM_STATE_IS_MATCHING ||
3265
- nodeData === FORM_STATE_IS_NOT_MATCHING
3270
+ data === SUSPENSE_START_DATA ||
3271
+ data === SUSPENSE_FALLBACK_START_DATA ||
3272
+ data === SUSPENSE_PENDING_START_DATA ||
3273
+ data === SUSPENSE_QUEUED_START_DATA ||
3274
+ data === ACTIVITY_START_DATA ||
3275
+ data === FORM_STATE_IS_MATCHING ||
3276
+ data === FORM_STATE_IS_NOT_MATCHING
3266
3277
) {
3267
3278
break;
3268
3279
}
3269
- if (nodeData === SUSPENSE_END_DATA || nodeData === ACTIVITY_END_DATA) {
3280
+ if (data === SUSPENSE_END_DATA || data === ACTIVITY_END_DATA) {
3270
3281
return null;
3271
3282
}
3272
3283
}
@@ -3494,6 +3505,7 @@ function getNextHydratableInstanceAfterHydrationBoundary(
3494
3505
data === SUSPENSE_START_DATA ||
3495
3506
data === SUSPENSE_FALLBACK_START_DATA ||
3496
3507
data === SUSPENSE_PENDING_START_DATA ||
3508
+ data === SUSPENSE_QUEUED_START_DATA ||
3497
3509
data === ACTIVITY_START_DATA
3498
3510
) {
3499
3511
depth++;
@@ -3535,6 +3547,7 @@ export function getParentHydrationBoundary(
3535
3547
data === SUSPENSE_START_DATA ||
3536
3548
data === SUSPENSE_FALLBACK_START_DATA ||
3537
3549
data === SUSPENSE_PENDING_START_DATA ||
3550
+ data === SUSPENSE_QUEUED_START_DATA ||
3538
3551
data === ACTIVITY_START_DATA
3539
3552
) {
3540
3553
if (depth === 0) {
0 commit comments