3216
);
3217
});
3218
3219
- it('can start a new suspended commit after a previous one finishes', async () => {
3219
+ it('can interrupt a suspended commit with a new transition', async () => {
3220
function App({children}) {
3221
return (
3222
<html>
3225
);
3226
}
3227
const root = ReactDOMClient.createRoot(document);
3228
- root.render(<App />);
3228
+ root.render(<App>(empty)</App>);
3229
+
3230
+ // Start a transition to "A"
3231
React.startTransition(() => {
3232
root.render(
3233
<App>
3232
- hello
3233
- <link rel="stylesheet" href="foo" precedence="default" />
3234
+ A
3235
+ <link rel="stylesheet" href="A" precedence="default" />
3236
</App>,
3237
);
3238
});
3239
await waitForAll([]);
3240
+
3241
+ // "A" hasn't loaded yet, so we remain on the initial UI. Its preload
3242
+ // has been inserted into the head, though.
3243
expect(getMeaningfulChildren(document)).toEqual(
3244
<html>
3245
<head>
3241
- <link rel="preload" href="foo" as="style" />
3246
+ <link rel="preload" href="A" as="style" />
3247
</head>
3243
- <body />
3248
+ <body>(empty)</body>
3249
</html>,
3250
);
3251
3252
+ // Interrupt the "A" transition with a new one, "B"
3253
React.startTransition(() => {
3254
root.render(
3255
<App>
3250
- hello2
3251
- {null}
3252
- <link rel="stylesheet" href="bar" precedence="default" />
3256
+ B
3257
+ <link rel="stylesheet" href="B" precedence="default" />
3258
</App>,
3259
);
3260
});
3261
await waitForAll([]);
3257
- expect(getMeaningfulChildren(document)).toEqual(
3258
- <html>
3259
- <head>
3260
- <link rel="preload" href="foo" as="style" />
3261
- </head>
3262
- <body />
3263
- </html>,
3264
- );
3262
3266
- loadPreloads();
3267
- loadStylesheets();
3268
- assertLog(['load preload: foo', 'load stylesheet: foo']);
3263
+ // Still on the initial UI because "B" hasn't loaded, but its preload
3264
+ // is now in the head, too.
3265
expect(getMeaningfulChildren(document)).toEqual(
3266
<html>
3267
<head>
3272
- <link rel="stylesheet" href="foo" data-precedence="default" />
3273
- <link rel="preload" href="foo" as="style" />
3268
+ <link rel="preload" href="A" as="style" />
3269
+ <link rel="preload" href="B" as="style" />
3270
</head>
3275
- <body>hello</body>
3271
+ <body>(empty)</body>
3272
</html>,
3273
);
3274
3279
- // The second update should process now
3280
- await waitForAll([]);
3281
- expect(getMeaningfulChildren(document)).toEqual(
3282
- <html>
3283
- <head>
3284
- <link rel="stylesheet" href="foo" data-precedence="default" />
3285
- <link rel="preload" href="foo" as="style" />
3286
- <link rel="preload" href="bar" as="style" />
3287
- </head>
3288
- <body>hello</body>
3289
- </html>,
3290
- );
3275
+ // Finish loading
3276
loadPreloads();
3277
loadStylesheets();
3293
- assertLog(['load preload: bar', 'load stylesheet: bar']);
3278
+ assertLog(['load preload: A', 'load preload: B', 'load stylesheet: B']);
3279
+ // The "B" transition has finished.
3280
expect(getMeaningfulChildren(document)).toEqual(
3281
<html>
3282
<head>
3297
- <link rel="stylesheet" href="foo" data-precedence="default" />
3298
- <link rel="stylesheet" href="bar" data-precedence="default" />
3299
- <link rel="preload" href="foo" as="style" />
3300
- <link rel="preload" href="bar" as="style" />
3283
+ <link rel="stylesheet" href="B" data-precedence="default" />
3284
+ <link rel="preload" href="A" as="style" />
3285
+ <link rel="preload" href="B" as="style" />
3286
</head>
3302
- <body>hello2</body>
3287
+ <body>B</body>
3288
</html>,
3289
);
3290
});