137
buffer = '';
138
}
139
140
- function getVisibleChildren(element) {
140
+ function getMeaningfulChildren(element) {
141
const children = [];
142
let node = element.firstChild;
143
while (node) {
144
if (node.nodeType === 1) {
145
if (
146
- node.tagName !== 'SCRIPT' &&
147
- node.tagName !== 'TEMPLATE' &&
148
- node.tagName !== 'template' &&
149
- !node.hasAttribute('hidden') &&
150
- !node.hasAttribute('aria-hidden')
146
+ // some tags are ambiguous and might be hidden because they look like non-meaningful children
147
+ // so we have a global override where if this data attribute is included we also include the node
148
+ node.hasAttribute('data-meaningful') ||
149
+ (node.tagName === 'SCRIPT' &&
150
+ node.hasAttribute('src') &&
151
+ node.hasAttribute('async')) ||
152
+ (node.tagName !== 'SCRIPT' &&
153
+ node.tagName !== 'TEMPLATE' &&
154
+ node.tagName !== 'template' &&
155
+ !node.hasAttribute('hidden') &&
156
+ !node.hasAttribute('aria-hidden'))
157
) {
158
const props = {};
159
const attributes = node.attributes;
167
}
168
props[attributes[i].name] = attributes[i].value;
169
}
164
- props.children = getVisibleChildren(node);
170
+ props.children = getMeaningfulChildren(node);
171
children.push(React.createElement(node.tagName.toLowerCase(), props));
172
}
173
} else if (node.nodeType === 3) {
270
<App />,
271
)}</head><body>foo</body></html>`;
272
});
267
- expect(getVisibleChildren(document)).toEqual(
273
+ expect(getMeaningfulChildren(document)).toEqual(
274
<html>
275
<head>
276
<link rel="preload" href="foo" as="style" />
297
<App />,
298
)}<body>foo</body></html>`;
299
});
294
- expect(getVisibleChildren(document)).toEqual(
300
+ expect(getMeaningfulChildren(document)).toEqual(
301
<html>
302
<head>
303
<link rel="preload" href="foo" as="style" />
333
' a Resource at all. valid rel types for Resources are "stylesheet" and "preload". The previous' +
334
' rel for this instance was "stylesheet". The updated rel is "author" and the updated href is "bar".',
335
);
330
- expect(getVisibleChildren(document)).toEqual(
336
+ expect(getMeaningfulChildren(document)).toEqual(
337
<html>
338
<head>
333
- <link rel="stylesheet" href="foo" data-rprec="foo" />
339
+ <link rel="stylesheet" href="foo" data-precedence="foo" />
340
<link rel="preload" as="style" href="foo" />
341
</head>
342
<body>
367
);
368
pipe(writable);
369
});
364
- expect(getVisibleChildren(document)).toEqual(
370
+ expect(getMeaningfulChildren(document)).toEqual(
371
<html>
372
<head>
373
<link rel="preload" as="style" href="foo" />
386
const root = ReactDOMClient.createRoot(container);
387
root.render(<Component />);
388
expect(Scheduler).toFlushWithoutYielding();
383
- expect(getVisibleChildren(document)).toEqual(
389
+ expect(getMeaningfulChildren(document)).toEqual(
390
<html>
391
<head>
392
<link rel="preload" as="style" href="foo" />
410
root.render(<App />);
411
expect(Scheduler).toFlushWithoutYielding();
412
407
- expect(getVisibleChildren(document)).toEqual(
413
+ expect(getMeaningfulChildren(document)).toEqual(
414
<html>
415
<head>
416
<link rel="preload" as="style" href="foo" />
434
root.render(<App />);
435
expect(Scheduler).toFlushWithoutYielding();
436
431
- expect(getVisibleChildren(document)).toEqual(
437
+ expect(getMeaningfulChildren(document)).toEqual(
438
<html>
439
<head>
440
<link rel="preload" as="style" href="foo" />
458
// to the window.document global when no other documents have been used
459
// The way the JSDOM runtim is created for these tests the local document
460
// global does not point to the global.document
455
- expect(getVisibleChildren(global.document)).toEqual(
461
+ expect(getMeaningfulChildren(global.document)).toEqual(
462
<html>
463
<head>
464
<link rel="preload" as="style" href="bar" />
511
const {pipe} = ReactDOMFizzServer.renderToPipeableStream(<ServerApp />);
512
pipe(writable);
513
});
508
- expect(getVisibleChildren(document)).toEqual(
514
+ expect(getMeaningfulChildren(document)).toEqual(
515
<html>
516
<head>
517
<link rel="preload" as="script" href="foo" integrity="foo hash" />
532
ReactDOMClient.hydrateRoot(document, <ClientApp />);
533
expect(Scheduler).toFlushWithoutYielding();
534
529
- expect(getVisibleChildren(document)).toEqual(
535
+ expect(getMeaningfulChildren(document)).toEqual(
536
<html>
537
<head>
538
<link rel="preload" as="script" href="foo" integrity="foo hash" />
564
// @gate enableFloat
565
it('creates a style Resource when called during server rendering before first flush', async () => {
566
function Component() {
561
- ReactDOM.preinit('foo', {as: 'style', precedence: 'foo'});
567
+ ReactDOM.preinit('foo', {as: 'style'});
568
return 'foo';
569
}
570
await actIntoEmptyDocument(() => {
578
);
579
pipe(writable);
580
});
575
- expect(getVisibleChildren(document)).toEqual(
581
+ expect(getMeaningfulChildren(document)).toEqual(
582
<html>
583
<head>
578
- <link rel="stylesheet" href="foo" data-rprec="foo" />
584
+ <link rel="stylesheet" href="foo" data-precedence="default" />
585
</head>
586
<body>foo</body>
587
</html>,
616
await act(() => {
617
resolveText('unblock');
618
});
613
- expect(getVisibleChildren(document)).toEqual(
619
+ expect(getMeaningfulChildren(document)).toEqual(
620
<html>
621
<head />
622
<body>
636
const root = ReactDOMClient.createRoot(container);
637
root.render(<Component />);
638
expect(Scheduler).toFlushWithoutYielding();
633
- expect(getVisibleChildren(document)).toEqual(
639
+ expect(getMeaningfulChildren(document)).toEqual(
640
<html>
641
<head>
636
- <link rel="stylesheet" href="foo" data-rprec="foo" />
642
+ <link rel="stylesheet" href="foo" data-precedence="foo" />
643
</head>
644
<body>
645
<div id="container">foo</div>
666
root.render(<App />);
667
expect(Scheduler).toFlushWithoutYielding();
668
663
- expect(getVisibleChildren(document)).toEqual(
669
+ expect(getMeaningfulChildren(document)).toEqual(
670
<html>
671
<head>
672
<link rel="preload" as="style" href="insertion" />
692
// to the window.document global when no other documents have been used
693
// The way the JSDOM runtim is created for these tests the local document
694
// global does not point to the global.document
689
- expect(getVisibleChildren(global.document)).toEqual(
695
+ expect(getMeaningfulChildren(global.document)).toEqual(
696
<html>
697
<head>
698
<link rel="preload" as="style" href="bar" />
703
});
704
});
705
706
+ describe('ReactDOM.preinit as script', () => {
707
+ // @gate enableFloat
708
+ it('can preinit a script', async () => {
709
+ function App({srcs}) {
710
+ srcs.forEach(src => ReactDOM.preinit(src, {as: 'script'}));
711
+ return (
712
+ <html>
713
+ <head>
714
+ <title>title</title>
715
+ </head>
716
+ <body>foo</body>
717
+ </html>
718
+ );
719
+ }
720
+ await actIntoEmptyDocument(() => {
721
+ const {pipe} = ReactDOMFizzServer.renderToPipeableStream(
722
+ <App srcs={['server', 'shared']} />,
723
+ );
724
+ pipe(writable);
725
+ });
726
+ expect(getMeaningfulChildren(document)).toEqual(
727
+ <html>
728
+ <head>
729
+ <script src="server" async="" />
730
+ <script src="shared" async="" />
731
+ <title>title</title>
732
+ </head>
733
+ <body>foo</body>
734
+ </html>,
735
+ );
736
+
737
+ ReactDOMClient.hydrateRoot(document, <App srcs={['client', 'shared']} />);
738
+ expect(Scheduler).toFlushWithoutYielding();
739
+ expect(getMeaningfulChildren(document)).toEqual(
740
+ <html>
741
+ <head>
742
+ <script src="server" async="" />
743
+ <script src="shared" async="" />
744
+ <title>title</title>
745
+ <script src="client" async="" />
746
+ </head>
747
+ <body>foo</body>
748
+ </html>,
749
+ );
750
+ });
751
+ });
752
+
753
describe('document encapsulation', () => {
754
// @gate enableFloat
755
it('can support styles inside portals to a shadowRoot', async () => {
774
</>,
775
);
776
expect(Scheduler).toFlushWithoutYielding();
724
- expect(getVisibleChildren(document)).toEqual(
777
+ expect(getMeaningfulChildren(document)).toEqual(
778
<html>
779
<head>
727
- <link rel="stylesheet" href="foo" data-rprec="default" />
780
+ <link rel="stylesheet" href="foo" data-precedence="default" />
781
<link rel="preload" href="foo" as="style" />
782
</head>
783
<body>
785
</body>
786
</html>,
787
);
735
- expect(getVisibleChildren(shadow)).toEqual([
788
+ expect(getMeaningfulChildren(shadow)).toEqual([
789
<link
790
rel="stylesheet"
791
href="foo"
739
- data-rprec="different"
792
+ data-precedence="different"
793
data-extra-prop="foo"
794
/>,
795
<div>shadow</div>,
834
</>,
835
);
836
expect(Scheduler).toFlushWithoutYielding();
784
- expect(getVisibleChildren(document)).toEqual(
837
+ expect(getMeaningfulChildren(document)).toEqual(
838
<html>
839
<head>
787
- <link rel="stylesheet" href="foo" data-rprec="default" />
840
+ <link rel="stylesheet" href="foo" data-precedence="default" />
841
<link rel="preload" href="foo" as="style" />
842
<link rel="preload" href="bar" as="style" />
843
<link rel="preload" href="baz" as="style" />
848
</body>
849
</html>,
850
);
798
- expect(getVisibleChildren(shadow)).toEqual([
799
- <link rel="stylesheet" href="foo" data-rprec="one" />,
800
- <link rel="stylesheet" href="baz" data-rprec="one" />,
801
- <link rel="stylesheet" href="bar" data-rprec="two" />,
802
- <link rel="stylesheet" href="qux" data-rprec="three" />,
851
+ expect(getMeaningfulChildren(shadow)).toEqual([
852
+ <link rel="stylesheet" href="foo" data-precedence="one" />,
853
+ <link rel="stylesheet" href="baz" data-precedence="one" />,
854
+ <link rel="stylesheet" href="bar" data-precedence="two" />,
855
+ <link rel="stylesheet" href="qux" data-precedence="three" />,
856
<div>
857
<div id="shadowcontainer1">
858
<div>2</div>
882
pipe(writable);
883
});
884
832
- expect(getVisibleChildren(document)).toEqual(
885
+ expect(getMeaningfulChildren(document)).toEqual(
886
<html>
887
<head>
835
- <link rel="stylesheet" href="aresource" data-rprec="foo" />
888
+ <link rel="stylesheet" href="aresource" data-precedence="foo" />
889
</head>
890
<body>
891
<div>hello world</div>
908
);
909
expect(Scheduler).toFlushWithoutYielding();
910
858
- expect(getVisibleChildren(document)).toEqual(
911
+ expect(getMeaningfulChildren(document)).toEqual(
912
<html>
913
<head>
861
- <link rel="stylesheet" href="aresource" data-rprec="foo" />
914
+ <link rel="stylesheet" href="aresource" data-precedence="foo" />
915
</head>
916
<body>
917
<div>hello world</div>
946
);
947
expect(Scheduler).toFlushWithoutYielding();
948
896
- expect(getVisibleChildren(document)).toEqual(
949
+ expect(getMeaningfulChildren(document)).toEqual(
950
<html>
951
<head>
899
- <link rel="stylesheet" href="aresource" data-rprec="foo" />
952
+ <link rel="stylesheet" href="aresource" data-precedence="foo" />
953
</head>
954
<body>
955
<div>hello world</div>
973
pipe(writable);
974
});
975
923
- expect(getVisibleChildren(document)).toEqual(
976
+ expect(getMeaningfulChildren(document)).toEqual(
977
<html>
978
<head>
979
<link rel="preload" as="style" href="notaresource" />
1002
);
1003
pipe(writable);
1004
});
952
- expect(getVisibleChildren(document)).toEqual(
1005
+ expect(getMeaningfulChildren(document)).toEqual(
1006
<html>
1007
<head>
955
- <link rel="stylesheet" href="foo1" data-rprec="foo" />
956
- <link rel="stylesheet" href="foo2" data-rprec="foo" />
957
- <link rel="stylesheet" href="default1" data-rprec="default" />
1008
+ <link rel="stylesheet" href="foo1" data-precedence="foo" />
1009
+ <link rel="stylesheet" href="foo2" data-precedence="foo" />
1010
+ <link rel="stylesheet" href="default1" data-precedence="default" />
1011
</head>
1012
<body>
1013
<div>hello world</div>
1028
</html>,
1029
);
1030
expect(Scheduler).toFlushWithoutYielding();
978
- expect(getVisibleChildren(document)).toEqual(
1031
+ expect(getMeaningfulChildren(document)).toEqual(
1032
<html>
1033
<head>
981
- <link rel="stylesheet" href="foo1" data-rprec="foo" />
982
- <link rel="stylesheet" href="foo2" data-rprec="foo" />
983
- <link rel="stylesheet" href="foo3" data-rprec="foo" />
984
- <link rel="stylesheet" href="default1" data-rprec="default" />
985
- <link rel="stylesheet" href="default2" data-rprec="default" />
986
- <link rel="stylesheet" href="bar1" data-rprec="bar" />
1034
+ <link rel="stylesheet" href="foo1" data-precedence="foo" />
1035
+ <link rel="stylesheet" href="foo2" data-precedence="foo" />
1036
+ <link rel="stylesheet" href="foo3" data-precedence="foo" />
1037
+ <link rel="stylesheet" href="default1" data-precedence="default" />
1038
+ <link rel="stylesheet" href="default2" data-precedence="default" />
1039
+ <link rel="stylesheet" href="bar1" data-precedence="bar" />
1040
<link rel="preload" as="style" href="bar1" />
1041
<link rel="preload" as="style" href="foo3" />
1042
<link rel="preload" as="style" href="default2" />
1071
</html>,
1072
);
1073
expect(Scheduler).toFlushWithoutYielding();
1021
- expect(getVisibleChildren(document)).toEqual(
1074
+ expect(getMeaningfulChildren(document)).toEqual(
1075
<html>
1076
<head>
1024
- <link rel="stylesheet" href="foo" data-rprec="foo" />
1077
+ <link rel="stylesheet" href="foo" data-precedence="foo" />
1078
</head>
1079
<body>hello world</body>
1080
</html>,
1121
],
1122
{withoutStack: 1},
1123
);
1071
- expect(getVisibleChildren(document)).toEqual(
1124
+ expect(getMeaningfulChildren(document)).toEqual(
1125
<html>
1126
<head>
1074
- <link rel="stylesheet" href="foo" data-rprec="foo" />
1075
- <link rel="stylesheet" href="bar" data-rprec="bar" />
1076
- <link rel="stylesheet" href="qux" data-rprec="qux" />
1127
+ <link rel="stylesheet" href="foo" data-precedence="foo" />
1128
+ <link rel="stylesheet" href="bar" data-precedence="bar" />
1129
+ <link rel="stylesheet" href="qux" data-precedence="qux" />
1130
</head>
1131
<body>client</body>
1132
</html>,
1173
],
1174
{withoutStack: 1},
1175
);
1123
- expect(getVisibleChildren(document)).toEqual(
1176
+ expect(getMeaningfulChildren(document)).toEqual(
1177
<html>
1178
<head>
1126
- <link rel="stylesheet" href="qux" data-rprec="qux" />
1127
- <link rel="stylesheet" href="foo" data-rprec="foo" />
1179
+ <link rel="stylesheet" href="qux" data-precedence="qux" />
1180
+ <link rel="stylesheet" href="foo" data-precedence="foo" />
1181
</head>
1182
<body>client</body>
1183
</html>,
1199
</html>,
1200
);
1201
expect(Scheduler).toFlushWithoutYielding();
1149
- expect(getVisibleChildren(document)).toEqual(
1202
+ expect(getMeaningfulChildren(document)).toEqual(
1203
<html>
1204
<head>
1152
- <link rel="stylesheet" href="foo" data-rprec="foo" />
1153
- <link rel="stylesheet" href="bar" data-rprec="bar" />
1205
+ <link rel="stylesheet" href="foo" data-precedence="foo" />
1206
+ <link rel="stylesheet" href="bar" data-precedence="bar" />
1207
</head>
1208
<body>hello</body>
1209
</html>,
1223
expect(Scheduler).toFlushWithoutYielding();
1224
// The reason we do not see preloads in the head is they are inserted synchronously
1225
// during render and then when the new singleton mounts it resets it's content, retaining only styles
1173
- expect(getVisibleChildren(document)).toEqual(
1226
+ expect(getMeaningfulChildren(document)).toEqual(
1227
<html>
1228
<head>
1176
- <link rel="stylesheet" href="foo" data-rprec="foo" />
1177
- <link rel="stylesheet" href="bar" data-rprec="bar" />
1178
- <link rel="stylesheet" href="baz" data-rprec="baz" />
1229
+ <link rel="stylesheet" href="foo" data-precedence="foo" />
1230
+ <link rel="stylesheet" href="bar" data-precedence="bar" />
1231
+ <link rel="stylesheet" href="baz" data-precedence="baz" />
1232
</head>
1233
<body>hello</body>
1234
</html>,
1236
});
1237
});
1238
1239
+ describe('script resources', () => {
1240
+ // @gate enableFloat
1241
+ it('treats async scripts without onLoad or onError as Resources', async () => {
1242
+ await actIntoEmptyDocument(() => {
1243
+ const {pipe} = ReactDOMFizzServer.renderToPipeableStream(
1244
+ <html>
1245
+ <head />
1246
+ <body>
1247
+ <script src="foo" async={true} />
1248
+ <script src="bar" async={true} onLoad={() => {}} />
1249
+ <script src="baz" data-meaningful="" />
1250
+ hello world
1251
+ </body>
1252
+ </html>,
1253
+ );
1254
+ pipe(writable);
1255
+ });
1256
+ // The plain async script is converted to a resource and emitted as part of the shell
1257
+ // The async script with onLoad is preloaded in the shell but is expecting to be added
1258
+ // during hydration. This is novel, the script is NOT a HostResource but it also will
1259
+ // never hydrate
1260
+ // The regular script is just a normal html that should hydrate with a HostComponent
1261
+ expect(getMeaningfulChildren(document)).toEqual(
1262
+ <html>
1263
+ <head>
1264
+ <script src="foo" async="" />
1265
+ <link rel="preload" href="bar" as="script" />
1266
+ </head>
1267
+ <body>
1268
+ <script src="baz" data-meaningful="" />
1269
+ hello world
1270
+ </body>
1271
+ </html>,
1272
+ );
1273
+
1274
+ ReactDOMClient.hydrateRoot(
1275
+ document,
1276
+ <html>
1277
+ <head />
1278
+ <body>
1279
+ <script src="foo" async={true} />
1280
+ <script src="bar" async={true} onLoad={() => {}} />
1281
+ <script src="baz" data-meaningful="" />
1282
+ hello world
1283
+ </body>
1284
+ </html>,
1285
+ );
1286
+ expect(Scheduler).toFlushWithoutYielding();
1287
+ // The async script with onLoad is inserted in the right place but does not cause the hydration
1288
+ // to fail.
1289
+ expect(getMeaningfulChildren(document)).toEqual(
1290
+ <html>
1291
+ <head>
1292
+ <script src="foo" async="" />
1293
+ <link rel="preload" href="bar" as="script" />
1294
+ </head>
1295
+ <body>
1296
+ <script src="bar" async="" />
1297
+ <script src="baz" data-meaningful="" />
1298
+ hello world
1299
+ </body>
1300
+ </html>,
1301
+ );
1302
+ });
1303
+ });
1304
+
1305
// @gate enableFloat
1306
it('client renders a boundary if a style Resource dependency fails to load', async () => {
1307
function BlockedOn({text, children}) {
1333
resolveText('unblock');
1334
});
1335
1217
- expect(getVisibleChildren(document)).toEqual(
1336
+ expect(getMeaningfulChildren(document)).toEqual(
1337
<html>
1338
<head>
1220
- <link rel="stylesheet" href="foo" data-rprec="arbitrary" />
1221
- <link rel="stylesheet" href="bar" data-rprec="arbitrary" />
1339
+ <link rel="stylesheet" href="foo" data-precedence="arbitrary" />
1340
+ <link rel="stylesheet" href="bar" data-precedence="arbitrary" />
1341
</head>
1342
<body>
1343
loading...
1364
'Resource failed to load',
1365
);
1366
1248
- expect(getVisibleChildren(document)).toEqual(
1367
+ expect(getMeaningfulChildren(document)).toEqual(
1368
<html>
1369
<head>
1251
- <link rel="stylesheet" href="foo" data-rprec="arbitrary" />
1252
- <link rel="stylesheet" href="bar" data-rprec="arbitrary" />
1370
+ <link rel="stylesheet" href="foo" data-precedence="arbitrary" />
1371
+ <link rel="stylesheet" href="bar" data-precedence="arbitrary" />
1372
</head>
1373
<body>
1374
loading...
1386
},
1387
});
1388
expect(Scheduler).toFlushWithoutYielding();
1270
- expect(getVisibleChildren(document)).toEqual(
1389
+ expect(getMeaningfulChildren(document)).toEqual(
1390
<html>
1391
<head>
1273
- <link rel="stylesheet" href="foo" data-rprec="arbitrary" />
1274
- <link rel="stylesheet" href="bar" data-rprec="arbitrary" />
1392
+ <link rel="stylesheet" href="foo" data-precedence="arbitrary" />
1393
+ <link rel="stylesheet" href="bar" data-precedence="arbitrary" />
1394
</head>
1395
<body>
1396
<link rel="preload" href="foo" as="style" />
1419
);
1420
pipe(writable);
1421
});
1303
- expect(getVisibleChildren(document)).toEqual(
1422
+ expect(getMeaningfulChildren(document)).toEqual(
1423
<html>
1424
<head>
1306
- <link rel="stylesheet" href="foo" data-rprec="arbitrary" />
1425
+ <link rel="stylesheet" href="foo" data-precedence="arbitrary" />
1426
</head>
1427
<body>Hello</body>
1428
</html>,
1436
</html>,
1437
);
1438
expect(Scheduler).toFlushWithoutYielding();
1320
- expect(getVisibleChildren(document)).toEqual(
1439
+ expect(getMeaningfulChildren(document)).toEqual(
1440
<html>
1441
<head>
1323
- <link rel="stylesheet" href="foo" data-rprec="arbitrary" />
1442
+ <link rel="stylesheet" href="foo" data-precedence="arbitrary" />
1443
</head>
1444
<body>Hello</body>
1445
</html>,
1477
resolveText('baz');
1478
});
1479
1361
- expect(getVisibleChildren(document)).toEqual(
1480
+ expect(getMeaningfulChildren(document)).toEqual(
1481
<html>
1482
<head>
1364
- <link rel="stylesheet" href="foo" data-rprec="one" />
1365
- <link rel="stylesheet" href="bar" data-rprec="two" />
1366
- <link rel="stylesheet" href="baz" data-rprec="three" />
1483
+ <link rel="stylesheet" href="foo" data-precedence="one" />
1484
+ <link rel="stylesheet" href="bar" data-precedence="two" />
1485
+ <link rel="stylesheet" href="baz" data-precedence="three" />
1486
</head>
1487
<body>
1488
{'foo'}
1513
readText(text);
1514
return children;
1515
}
1516
+ function PresetPrecedence() {
1517
+ ReactDOM.preinit('preset', {as: 'style', precedence: 'preset'});
1518
+ }
1519
await actIntoEmptyDocument(() => {
1520
const {pipe} = ReactDOMFizzServer.renderToPipeableStream(
1521
<html>
1522
<head />
1523
<body>
1524
<link rel="stylesheet" href="initial" precedence="one" />
1525
+ <PresetPrecedence />
1526
<div>
1527
<Suspense fallback="loading foo bar...">
1528
<link rel="stylesheet" href="foo" precedence="one" />
1590
pipe(writable);
1591
});
1592
1470
- expect(getVisibleChildren(document)).toEqual(
1593
+ expect(getMeaningfulChildren(document)).toEqual(
1594
<html>
1595
<head>
1473
- <link rel="stylesheet" href="initial" data-rprec="one" />
1596
+ <link rel="stylesheet" href="initial" data-precedence="one" />
1597
+ <link rel="stylesheet" href="preset" data-precedence="preset" />
1598
<link rel="preload" href="foo" as="style" />
1599
</head>
1600
<body>
1610
resolveText('bar');
1611
});
1612
1489
- expect(getVisibleChildren(document)).toEqual(
1613
+ expect(getMeaningfulChildren(document)).toEqual(
1614
<html>
1615
<head>
1492
- <link rel="stylesheet" href="initial" data-rprec="one" />
1493
- <link rel="stylesheet" href="foo" data-rprec="one" />
1616
+ <link rel="stylesheet" href="initial" data-precedence="one" />
1617
+ <link rel="stylesheet" href="foo" data-precedence="one" />
1618
+ <link rel="stylesheet" href="preset" data-precedence="preset" />
1619
<link
1620
rel="stylesheet"
1621
href="bar"
1497
- data-rprec="default"
1622
+ data-precedence="default"
1623
data-foo="foo"
1624
crossorigin="anonymous"
1625
/>
1641
link.dispatchEvent(event);
1642
});
1643
1519
- expect(getVisibleChildren(document)).toEqual(
1644
+ expect(getMeaningfulChildren(document)).toEqual(
1645
<html>
1646
<head>
1522
- <link rel="stylesheet" href="initial" data-rprec="one" />
1523
- <link rel="stylesheet" href="foo" data-rprec="one" />
1647
+ <link rel="stylesheet" href="initial" data-precedence="one" />
1648
+ <link rel="stylesheet" href="foo" data-precedence="one" />
1649
+ <link rel="stylesheet" href="preset" data-precedence="preset" />
1650
<link
1651
rel="stylesheet"
1652
href="bar"
1527
- data-rprec="default"
1653
+ data-precedence="default"
1654
data-foo="foo"
1655
crossorigin="anonymous"
1656
/>
1672
link.dispatchEvent(event);
1673
});
1674
1549
- expect(getVisibleChildren(document)).toEqual(
1675
+ expect(getMeaningfulChildren(document)).toEqual(
1676
<html>
1677
<head>
1552
- <link rel="stylesheet" href="initial" data-rprec="one" />
1553
- <link rel="stylesheet" href="foo" data-rprec="one" />
1678
+ <link rel="stylesheet" href="initial" data-precedence="one" />
1679
+ <link rel="stylesheet" href="foo" data-precedence="one" />
1680
+ <link rel="stylesheet" href="preset" data-precedence="preset" />
1681
<link
1682
rel="stylesheet"
1683
href="bar"
1557
- data-rprec="default"
1684
+ data-precedence="default"
1685
data-foo="foo"
1686
crossorigin="anonymous"
1687
/>
1705
resolveText('baz');
1706
});
1707
1581
- expect(getVisibleChildren(document)).toEqual(
1708
+ expect(getMeaningfulChildren(document)).toEqual(
1709
<html>
1710
<head>
1584
- <link rel="stylesheet" href="initial" data-rprec="one" />
1585
- <link rel="stylesheet" href="foo" data-rprec="one" />
1711
+ <link rel="stylesheet" href="initial" data-precedence="one" />
1712
+ <link rel="stylesheet" href="foo" data-precedence="one" />
1713
+ <link rel="stylesheet" href="preset" data-precedence="preset" />
1714
<link
1715
rel="stylesheet"
1716
href="bar"
1589
- data-rprec="default"
1717
+ data-precedence="default"
1718
data-foo="foo"
1719
crossorigin="anonymous"
1720
/>
1739
resolveText('qux');
1740
});
1741
1614
- expect(getVisibleChildren(document)).toEqual(
1742
+ expect(getMeaningfulChildren(document)).toEqual(
1743
<html>
1744
<head>
1617
- <link rel="stylesheet" href="initial" data-rprec="one" />
1618
- <link rel="stylesheet" href="foo" data-rprec="one" />
1619
- <link rel="stylesheet" href="qux" data-rprec="one" />
1745
+ <link rel="stylesheet" href="initial" data-precedence="one" />
1746
+ <link rel="stylesheet" href="foo" data-precedence="one" />
1747
+ <link rel="stylesheet" href="qux" data-precedence="one" />
1748
+ <link rel="stylesheet" href="preset" data-precedence="preset" />
1749
<link
1750
rel="stylesheet"
1751
href="bar"
1623
- data-rprec="default"
1752
+ data-precedence="default"
1753
data-foo="foo"
1754
crossorigin="anonymous"
1755
/>
1627
- <link rel="stylesheet" href="baz" data-rprec="two" />
1756
+ <link rel="stylesheet" href="baz" data-precedence="two" />
1757
<link rel="preload" href="foo" as="style" />
1758
</head>
1759
<body>
1779
const quxlink = document.querySelector(
1780
'link[rel="stylesheet"][href="qux"]',
1781
);
1782
+ const presetLink = document.querySelector(
1783
+ 'link[rel="stylesheet"][href="preset"]',
1784
+ );
1785
const event = document.createEvent('Events');
1786
event.initEvent('load', true, true);
1787
bazlink.dispatchEvent(event);
1788
quxlink.dispatchEvent(event);
1789
+ presetLink.dispatchEvent(event);
1790
});
1791
1659
- expect(getVisibleChildren(document)).toEqual(
1792
+ expect(getMeaningfulChildren(document)).toEqual(
1793
<html>
1794
<head>
1662
- <link rel="stylesheet" href="initial" data-rprec="one" />
1663
- <link rel="stylesheet" href="foo" data-rprec="one" />
1664
- <link rel="stylesheet" href="qux" data-rprec="one" />
1795
+ <link rel="stylesheet" href="initial" data-precedence="one" />
1796
+ <link rel="stylesheet" href="foo" data-precedence="one" />
1797
+ <link rel="stylesheet" href="qux" data-precedence="one" />
1798
+ <link rel="stylesheet" href="preset" data-precedence="preset" />
1799
<link
1800
rel="stylesheet"
1801
href="bar"
1668
- data-rprec="default"
1802
+ data-precedence="default"
1803
data-foo="foo"
1804
crossorigin="anonymous"
1805
/>
1672
- <link rel="stylesheet" href="baz" data-rprec="two" />
1806
+ <link rel="stylesheet" href="baz" data-precedence="two" />
1807
<link rel="preload" href="foo" as="style" />
1808
</head>
1809
<body>
1832
resolveText('unblock');
1833
});
1834
1701
- expect(getVisibleChildren(document)).toEqual(
1835
+ expect(getMeaningfulChildren(document)).toEqual(
1836
<html>
1837
<head>
1704
- <link rel="stylesheet" href="initial" data-rprec="one" />
1705
- <link rel="stylesheet" href="foo" data-rprec="one" />
1706
- <link rel="stylesheet" href="qux" data-rprec="one" />
1838
+ <link rel="stylesheet" href="initial" data-precedence="one" />
1839
+ <link rel="stylesheet" href="foo" data-precedence="one" />
1840
+ <link rel="stylesheet" href="qux" data-precedence="one" />
1841
+ <link rel="stylesheet" href="preset" data-precedence="preset" />
1842
<link
1843
rel="stylesheet"
1844
href="bar"
1710
- data-rprec="default"
1845
+ data-precedence="default"
1846
data-foo="foo"
1847
crossorigin="anonymous"
1848
/>
1714
- <link rel="stylesheet" href="baz" data-rprec="two" />
1849
+ <link rel="stylesheet" href="baz" data-precedence="two" />
1850
<link rel="preload" href="foo" as="style" />
1851
</head>
1852
<body>
1930
// early. The reason precedences are still ordered correctly between child and parent is because
1931
// the precedence ordering is determined upon first discovernig a resource rather than on hoist and
1932
// so it follows render order
1798
- expect(getVisibleChildren(document)).toEqual(
1933
+ expect(getMeaningfulChildren(document)).toEqual(
1934
<html>
1935
<head>
1801
- <link rel="stylesheet" href="1one" data-rprec="one" />
1802
- <link rel="stylesheet" href="3one" data-rprec="one" />
1803
- <link rel="stylesheet" href="2one" data-rprec="one" />
1804
- <link rel="stylesheet" href="4one" data-rprec="one" />
1805
-
1806
- <link rel="stylesheet" href="1two" data-rprec="two" />
1807
- <link rel="stylesheet" href="3two" data-rprec="two" />
1808
- <link rel="stylesheet" href="2two" data-rprec="two" />
1809
- <link rel="stylesheet" href="4two" data-rprec="two" />
1810
-
1811
- <link rel="stylesheet" href="1three" data-rprec="three" />
1812
- <link rel="stylesheet" href="3three" data-rprec="three" />
1813
- <link rel="stylesheet" href="2three" data-rprec="three" />
1814
- <link rel="stylesheet" href="4three" data-rprec="three" />
1815
-
1816
- <link rel="stylesheet" href="1four" data-rprec="four" />
1817
- <link rel="stylesheet" href="3four" data-rprec="four" />
1818
- <link rel="stylesheet" href="2four" data-rprec="four" />
1819
- <link rel="stylesheet" href="4four" data-rprec="four" />
1820
-
1821
- <link rel="stylesheet" href="3five" data-rprec="five" />
1936
+ <link rel="stylesheet" href="1one" data-precedence="one" />
1937
+ <link rel="stylesheet" href="3one" data-precedence="one" />
1938
+ <link rel="stylesheet" href="2one" data-precedence="one" />
1939
+ <link rel="stylesheet" href="4one" data-precedence="one" />
1940
+
1941
+ <link rel="stylesheet" href="1two" data-precedence="two" />
1942
+ <link rel="stylesheet" href="3two" data-precedence="two" />
1943
+ <link rel="stylesheet" href="2two" data-precedence="two" />
1944
+ <link rel="stylesheet" href="4two" data-precedence="two" />
1945
+
1946
+ <link rel="stylesheet" href="1three" data-precedence="three" />
1947
+ <link rel="stylesheet" href="3three" data-precedence="three" />
1948
+ <link rel="stylesheet" href="2three" data-precedence="three" />
1949
+ <link rel="stylesheet" href="4three" data-precedence="three" />
1950
+
1951
+ <link rel="stylesheet" href="1four" data-precedence="four" />
1952
+ <link rel="stylesheet" href="3four" data-precedence="four" />
1953
+ <link rel="stylesheet" href="2four" data-precedence="four" />
1954
+ <link rel="stylesheet" href="4four" data-precedence="four" />
1955
+
1956
+ <link rel="stylesheet" href="3five" data-precedence="five" />
1957
</head>
1958
<body>
1959
<div>
1986
pipe(writable);
1987
});
1988
1854
- expect(getVisibleChildren(document)).toEqual(
1989
+ expect(getMeaningfulChildren(document)).toEqual(
1990
<html>
1991
<head>
1857
- <link rel="stylesheet" href="foo" data-rprec="one" />
1858
- <link rel="stylesheet" href="bar" data-rprec="two" />
1992
+ <link rel="stylesheet" href="foo" data-precedence="one" />
1993
+ <link rel="stylesheet" href="bar" data-precedence="two" />
1994
</head>
1995
<body>
1996
<div>Hello</div>
2012
</html>,
2013
);
2014
expect(Scheduler).toFlushWithoutYielding();
1880
- expect(getVisibleChildren(document)).toEqual(
2015
+ expect(getMeaningfulChildren(document)).toEqual(
2016
<html>
2017
<head>
1883
- <link rel="stylesheet" href="foo" data-rprec="one" />
1884
- <link rel="stylesheet" href="bar" data-rprec="two" />
2018
+ <link rel="stylesheet" href="foo" data-precedence="one" />
2019
+ <link rel="stylesheet" href="bar" data-precedence="two" />
2020
</head>
2021
<body>
2022
<div>Hello</div>
2034
</html>,
2035
);
2036
expect(Scheduler).toFlushWithoutYielding();
1902
- expect(getVisibleChildren(document)).toEqual(
2037
+ expect(getMeaningfulChildren(document)).toEqual(
2038
<html>
2039
<head>
1905
- <link rel="stylesheet" href="foo" data-rprec="one" />
1906
- <link rel="stylesheet" href="baz" data-rprec="one" />
1907
- <link rel="stylesheet" href="bar" data-rprec="two" />
2040
+ <link rel="stylesheet" href="foo" data-precedence="one" />
2041
+ <link rel="stylesheet" href="baz" data-precedence="one" />
2042
+ <link rel="stylesheet" href="bar" data-precedence="two" />
2043
<link rel="preload" as="style" href="baz" />
2044
</head>
2045
<body>
2079
</ErrorBoundary>,
2080
);
2081
expect(Scheduler).toFlushWithoutYielding();
1947
- expect(getVisibleChildren(document)).toEqual(
2082
+ expect(getMeaningfulChildren(document)).toEqual(
2083
<html>
2084
<head>
2085
<link rel="preload" href="foo" as="style" />
2121
pipe(writable);
2122
});
2123
1989
- expect(getVisibleChildren(document)).toEqual(
2124
+ expect(getMeaningfulChildren(document)).toEqual(
2125
<html>
2126
<head>
1992
- <link rel="stylesheet" href="foo" data-rprec="one" />
1993
- <link rel="stylesheet" href="bar" data-rprec="two" />
2127
+ <link rel="stylesheet" href="foo" data-precedence="one" />
2128
+ <link rel="stylesheet" href="bar" data-precedence="two" />
2129
</head>
2130
<body>
2131
<div>Hello</div>
2137
await act(() => {
2138
resolveText('foo');
2139
});
2005
- expect(getVisibleChildren(document)).toEqual(
2140
+ expect(getMeaningfulChildren(document)).toEqual(
2141
<html>
2142
<head>
2008
- <link rel="stylesheet" href="foo" data-rprec="one" />
2009
- <link rel="stylesheet" href="bar" data-rprec="two" />
2143
+ <link rel="stylesheet" href="foo" data-precedence="one" />
2144
+ <link rel="stylesheet" href="bar" data-precedence="two" />
2145
</head>
2146
<body>
2147
<div>Hello</div>
2155
await act(() => {
2156
resolveText('bar');
2157
});
2023
- expect(getVisibleChildren(document)).toEqual(
2158
+ expect(getMeaningfulChildren(document)).toEqual(
2159
<html>
2160
<head>
2026
- <link rel="stylesheet" href="foo" data-rprec="one" />
2027
- <link rel="stylesheet" href="bar" data-rprec="two" />
2161
+ <link rel="stylesheet" href="foo" data-precedence="one" />
2162
+ <link rel="stylesheet" href="bar" data-precedence="two" />
2163
</head>
2164
<body>
2165
<div>Hello</div>
2212
pipe(writable);
2213
});
2214
2080
- expect(getVisibleChildren(document)).toEqual(
2215
+ expect(getMeaningfulChildren(document)).toEqual(
2216
<html>
2217
<head />
2218
<body>
2224
await act(() => {
2225
resolveText('bar');
2226
});
2092
- expect(getVisibleChildren(document)).toEqual(
2227
+ expect(getMeaningfulChildren(document)).toEqual(
2228
<html>
2229
<head />
2230
<body>
2236
await act(() => {
2237
resolveText('baz');
2238
});
2104
- expect(getVisibleChildren(document)).toEqual(
2239
+ expect(getMeaningfulChildren(document)).toEqual(
2240
<html>
2241
<head />
2242
<body>
2248
await act(() => {
2249
resolveText('foo');
2250
});
2116
- expect(getVisibleChildren(document)).toEqual(
2251
+ expect(getMeaningfulChildren(document)).toEqual(
2252
<html>
2253
<head>
2119
- <link rel="stylesheet" href="foo" data-rprec="default" />
2120
- <link rel="stylesheet" href="bar" data-rprec="default" />
2121
- <link rel="stylesheet" href="baz" data-rprec="default" />
2254
+ <link rel="stylesheet" href="foo" data-precedence="default" />
2255
+ <link rel="stylesheet" href="bar" data-precedence="default" />
2256
+ <link rel="stylesheet" href="baz" data-precedence="default" />
2257
</head>
2258
<body>
2259
<div>loading foo...</div>
2273
},
2274
);
2275
});
2141
- expect(getVisibleChildren(document)).toEqual(
2276
+ expect(getMeaningfulChildren(document)).toEqual(
2277
<html>
2278
<head>
2144
- <link rel="stylesheet" href="foo" data-rprec="default" />
2145
- <link rel="stylesheet" href="bar" data-rprec="default" />
2146
- <link rel="stylesheet" href="baz" data-rprec="default" />
2279
+ <link rel="stylesheet" href="foo" data-precedence="default" />
2280
+ <link rel="stylesheet" href="bar" data-precedence="default" />
2281
+ <link rel="stylesheet" href="baz" data-precedence="default" />
2282
</head>
2283
<body>
2284
<div>
2347
pipe(writable);
2348
});
2349
2215
- expect(getVisibleChildren(document)).toEqual(
2350
+ expect(getMeaningfulChildren(document)).toEqual(
2351
<html>
2352
<head />
2353
<body>
2360
await act(() => {
2361
resolveText('baz');
2362
});
2228
- expect(getVisibleChildren(document)).toEqual(
2363
+ expect(getMeaningfulChildren(document)).toEqual(
2364
<html>
2365
<head />
2366
<body>
2373
await act(() => {
2374
resolveText('bar');
2375
});
2241
- expect(getVisibleChildren(document)).toEqual(
2376
+ expect(getMeaningfulChildren(document)).toEqual(
2377
<html>
2378
<head />
2379
<body>
2389
await act(() => {
2390
resolveText('foo');
2391
});
2257
- expect(getVisibleChildren(document)).toEqual(
2392
+ expect(getMeaningfulChildren(document)).toEqual(
2393
<html>
2394
<head />
2395
<body>
2406
await act(() => {
2407
resolveText('qux');
2408
});
2274
- expect(getVisibleChildren(document)).toEqual(
2409
+ expect(getMeaningfulChildren(document)).toEqual(
2410
<html>
2411
<head>
2277
- <link rel="stylesheet" href="foo" data-rprec="default" />
2278
- <link rel="stylesheet" href="bar" data-rprec="default" />
2279
- <link rel="stylesheet" href="baz" data-rprec="default" />
2280
- <link rel="stylesheet" href="qux" data-rprec="default" />
2412
+ <link rel="stylesheet" href="foo" data-precedence="default" />
2413
+ <link rel="stylesheet" href="bar" data-precedence="default" />
2414
+ <link rel="stylesheet" href="baz" data-precedence="default" />
2415
+ <link rel="stylesheet" href="qux" data-precedence="default" />
2416
</head>
2417
<body>
2418
<div>loading...</div>
2434
},
2435
);
2436
});
2302
- expect(getVisibleChildren(document)).toEqual(
2437
+ expect(getMeaningfulChildren(document)).toEqual(
2438
<html>
2439
<head>
2305
- <link rel="stylesheet" href="foo" data-rprec="default" />
2306
- <link rel="stylesheet" href="bar" data-rprec="default" />
2307
- <link rel="stylesheet" href="baz" data-rprec="default" />
2308
- <link rel="stylesheet" href="qux" data-rprec="default" />
2440
+ <link rel="stylesheet" href="foo" data-precedence="default" />
2441
+ <link rel="stylesheet" href="bar" data-precedence="default" />
2442
+ <link rel="stylesheet" href="baz" data-precedence="default" />
2443
+ <link rel="stylesheet" href="qux" data-precedence="default" />
2444
</head>
2445
<body>
2446
<div>
2536
const {pipe} = ReactDOMFizzServer.renderToPipeableStream(<App />);
2537
pipe(writable);
2538
});
2404
- expect(getVisibleChildren(document)).toEqual(
2539
+ expect(getMeaningfulChildren(document)).toEqual(
2540
<html>
2541
<head>
2542
<link
2587
resolveText('unblock');
2588
});
2589
2455
- expect(getVisibleChildren(document)).toEqual(
2590
+ expect(getMeaningfulChildren(document)).toEqual(
2591
<html>
2592
<head>
2593
<link
2594
rel="stylesheet"
2595
href="foo"
2461
- data-rprec="default"
2596
+ data-precedence="default"
2597
crossorigin="anonymous"
2598
media="all"
2599
integrity="somehash"
2670
);
2671
pipe(writable);
2672
});
2538
- expect(getVisibleChildren(document)).toEqual(
2673
+ expect(getMeaningfulChildren(document)).toEqual(
2674
<html>
2675
<head />
2676
<body>
2684
resolveText('AAAA');
2685
resolveText('AA');
2686
});
2552
- expect(getVisibleChildren(document)).toEqual(
2687
+ expect(getMeaningfulChildren(document)).toEqual(
2688
<html>
2689
<head />
2690
<body>
2707
l.dispatchEvent(event);
2708
});
2709
});
2575
- expect(getVisibleChildren(document)).toEqual(
2710
+ expect(getMeaningfulChildren(document)).toEqual(
2711
<html>
2712
<head>
2578
- <link rel="stylesheet" href="A" data-rprec="A" />
2579
- <link rel="stylesheet" href="AA" data-rprec="AA" />
2713
+ <link rel="stylesheet" href="A" data-precedence="A" />
2714
+ <link rel="stylesheet" href="AA" data-precedence="AA" />
2715
</head>
2716
<body>
2717
<div>
2737
l.dispatchEvent(event);
2738
});
2739
});
2605
- expect(getVisibleChildren(document)).toEqual(
2740
+ expect(getMeaningfulChildren(document)).toEqual(
2741
<html>
2742
<head>
2608
- <link rel="stylesheet" href="A" data-rprec="A" />
2609
- <link rel="stylesheet" href="AA" data-rprec="AA" />
2610
- <link rel="stylesheet" href="AAA" data-rprec="AAA" />
2611
- <link rel="stylesheet" href="AAAA" data-rprec="AAAA" />
2743
+ <link rel="stylesheet" href="A" data-precedence="A" />
2744
+ <link rel="stylesheet" href="AA" data-precedence="AA" />
2745
+ <link rel="stylesheet" href="AAA" data-precedence="AAA" />
2746
+ <link rel="stylesheet" href="AAAA" data-precedence="AAAA" />
2747
</head>
2748
<body>
2749
<div>
2793
);
2794
pipe(writable);
2795
});
2661
- expect(getVisibleChildren(document)).toEqual(
2796
+ expect(getMeaningfulChildren(document)).toEqual(
2797
<html>
2798
<head>
2799
<link rel="preload" as="font" href="foo" crossorigin="" />
3302
async () => {
3303
const expectedMessage =
3304
'Warning: ReactDOM.preinit() expected the second argument to be an options argument containing at least an "as" property' +
3170
- ' specifying the Resource type. It found %s instead. Currently, the only valid resource type for preinit is "style".' +
3171
- ' The href for the preinit call where this warning originated is "%s".%s';
3305
+ ' specifying the Resource type. It found %s instead. Currently, valid resource types for for preinit are "style"' +
3306
+ ' and "script". The href for the preinit call where this warning originated is "%s".%s';
3307
const expectedStack = componentStack(['Preinits', 'head', 'html']);
3308
function makeArgs(...substitutions) {
3309
return [expectedMessage, ...substitutions, expectedStack];
3398
precedence="bar"
3399
data-something-extra="extra"
3400
/>
3401
+ <script src="sfoo" async={true} data-something-extra="extra" />
3402
+ <script src="sbar" async={true} data-something-extra="extra" />
3403
hello
3404
</div>,
3405
);
3419
precedence="baz"
3420
data-something-new="new"
3421
/>
3422
+ <script src="sfoo" async={true} data-something-new="new" />
3423
+ <script src="sbaz" async={true} data-something-new="new" />
3424
hello
3425
</div>,
3426
);
3427
expect(() => {
3428
expect(Scheduler).toFlushWithoutYielding();
3290
- }).toErrorDev(
3429
+ }).toErrorDev([
3430
'Warning: A style Resource with href "foo" recieved new props with different values from the props used' +
3431
' when this Resource was first rendered. React will only use the props provided when' +
3432
' this resource was first rendered until a new href is provided. Unlike conventional' +
3436
'\n data-something-extra: missing or null in latest props, "extra" in original props' +
3437
'\n data-something-new: "new" in latest props, missing or null in original props' +
3438
'\n precedence: "fu" in latest props, "foo" in original props',
3300
- );
3301
- expect(getVisibleChildren(document)).toEqual(
3439
+ 'Warning: A script Resource with src "sfoo" recieved new props with different values from the props used' +
3440
+ ' when this Resource was first rendered. React will only use the props provided when' +
3441
+ ' this resource was first rendered until a new src is provided. Unlike conventional' +
3442
+ ' DOM elements, Resources instances do not have a one to one correspondence with Elements' +
3443
+ ' in the DOM and as such, every instance of a Resource for a single Resource identifier' +
3444
+ ' (src) must have props that agree with each other. The differences are described below.' +
3445
+ '\n data-something-extra: missing or null in latest props, "extra" in original props' +
3446
+ '\n data-something-new: "new" in latest props, missing or null in original props',
3447
+ ]);
3448
+ expect(getMeaningfulChildren(document)).toEqual(
3449
<html>
3450
<head>
3451
<link
3452
rel="stylesheet"
3453
href="foo"
3307
- data-rprec="foo"
3454
+ data-precedence="foo"
3455
data-something-extra="extra"
3456
/>
3457
<link
3458
rel="stylesheet"
3459
href="bar"
3313
- data-rprec="bar"
3460
+ data-precedence="bar"
3461
data-something-extra="extra"
3462
/>
3463
<link
3464
rel="stylesheet"
3465
href="baz"
3319
- data-rprec="baz"
3466
+ data-precedence="baz"
3467
data-something-new="new"
3468
/>
3469
<link rel="preload" as="style" href="foo" />
3470
<link rel="preload" as="style" href="bar" />
3471
+ <script src="sfoo" async="" data-something-extra="extra" />
3472
+ <script src="sbar" async="" data-something-extra="extra" />
3473
<link rel="preload" as="style" href="baz" />
3474
+ <script src="sbaz" async="" data-something-new="new" />
3475
</head>
3476
<body>
3477
<div id="container">
3527
);
3528
pipe(writable);
3529
});
3380
- expect(getVisibleChildren(document)).toEqual(
3530
+ expect(getMeaningfulChildren(document)).toEqual(
3531
<html>
3532
<head>
3383
- <link rel="stylesheet" href="foo" data-rprec="foo" media="all" />
3384
- <link rel="stylesheet" href="bar" data-rprec="bar" />
3533
+ <link
3534
+ rel="stylesheet"
3535
+ href="foo"
3536
+ data-precedence="foo"
3537
+ media="all"
3538
+ />
3539
+ <link rel="stylesheet" href="bar" data-precedence="bar" />
3540
3386
- <link rel="stylesheet" href="baz" data-rprec="baz" media="some" />
3541
+ <link
3542
+ rel="stylesheet"
3543
+ href="baz"
3544
+ data-precedence="baz"
3545
+ media="some"
3546
+ />
3547
</head>
3548
<body />
3549
</html>,
3552
if (__DEV__) {
3553
expect(mockError).toHaveBeenCalledTimes(3);
3554
expect(mockError).toHaveBeenCalledWith(
3395
- 'Warning: A %s with href "%s" has props that disagree with those found on %s. Resources always use the props' +
3555
+ 'Warning: A %s with %s "%s" has props that disagree with those found on %s. Resources always use the props' +
3556
' that were provided the first time they are encountered so any differences will be ignored. Please' +
3397
- ' update Resources that share an href to have props that agree. The differences are described below.%s%s',
3557
+ ' update Resources that share an %s to have props that agree. The differences are described below.%s%s',
3558
'style Resource',
3559
+ 'href',
3560
'foo',
3561
'an earlier instance of this Resource',
3562
+ 'href',
3563
'\n media: missing or null in latest props, "all" in original props',
3564
componentStack(['link', 'head', 'html']),
3565
);
3566
expect(mockError).toHaveBeenCalledWith(
3405
- 'Warning: A %s with href "%s" has props that disagree with those found on %s. Resources always use the props' +
3567
+ 'Warning: A %s with %s "%s" has props that disagree with those found on %s. Resources always use the props' +
3568
' that were provided the first time they are encountered so any differences will be ignored. Please' +
3407
- ' update Resources that share an href to have props that agree. The differences are described below.%s%s',
3569
+ ' update Resources that share an %s to have props that agree. The differences are described below.%s%s',
3570
'style Resource',
3571
+ 'href',
3572
'bar',
3573
'an earlier instance of this Resource',
3574
+ 'href',
3575
'\n media: "all" in latest props, missing or null in original props',
3576
componentStack(['link', 'head', 'html']),
3577
);
3578
expect(mockError).toHaveBeenCalledWith(
3415
- 'Warning: A %s with href "%s" has props that disagree with those found on %s. Resources always use the props' +
3579
+ 'Warning: A %s with %s "%s" has props that disagree with those found on %s. Resources always use the props' +
3580
' that were provided the first time they are encountered so any differences will be ignored. Please' +
3417
- ' update Resources that share an href to have props that agree. The differences are described below.%s%s',
3581
+ ' update Resources that share an %s to have props that agree. The differences are described below.%s%s',
3582
'style Resource',
3583
+ 'href',
3584
'baz',
3585
'an earlier instance of this Resource',
3586
+ 'href',
3587
'\n media: "all" in latest props, "some" in original props',
3588
componentStack(['link', 'head', 'html']),
3589
);
3641
);
3642
pipe(writable);
3643
});
3478
- expect(getVisibleChildren(document)).toEqual(
3644
+ expect(getMeaningfulChildren(document)).toEqual(
3645
<html>
3646
<head>
3647
<link
3648
rel="stylesheet"
3649
href="foo"
3484
- data-rprec="foo"
3650
+ data-precedence="foo"
3651
data-foo="an original value"
3652
/>
3487
- <link rel="stylesheet" href="bar" data-rprec="bar" />
3653
+ <link rel="stylesheet" href="bar" data-precedence="bar" />
3654
<link
3655
rel="stylesheet"
3656
href="baz"
3491
- data-rprec="baz"
3657
+ data-precedence="baz"
3658
data-foo="an original value"
3659
/>
3660
</head>
3665
if (__DEV__) {
3666
expect(mockError).toHaveBeenCalledTimes(3);
3667
expect(mockError).toHaveBeenCalledWith(
3502
- 'Warning: A %s with href "%s" has props that disagree with those found on %s. Resources always use the props' +
3668
+ 'Warning: A %s with %s "%s" has props that disagree with those found on %s. Resources always use the props' +
3669
' that were provided the first time they are encountered so any differences will be ignored. Please' +
3504
- ' update Resources that share an href to have props that agree. The differences are described below.%s%s',
3670
+ ' update Resources that share an %s to have props that agree. The differences are described below.%s%s',
3671
'style Resource',
3672
+ 'href',
3673
'foo',
3674
'an earlier instance of this Resource',
3675
+ 'href',
3676
'\n precedence: "foonew" in latest props, "foo" in original props',
3677
componentStack(['link', 'head', 'html']),
3678
);
3679
expect(mockError).toHaveBeenCalledWith(
3512
- 'Warning: A %s with href "%s" has props that disagree with those found on %s. Resources always use the props' +
3680
+ 'Warning: A %s with %s "%s" has props that disagree with those found on %s. Resources always use the props' +
3681
' that were provided the first time they are encountered so any differences will be ignored. Please' +
3514
- ' update Resources that share an href to have props that agree. The differences are described below.%s%s',
3682
+ ' update Resources that share an %s to have props that agree. The differences are described below.%s%s',
3683
'style Resource',
3684
+ 'href',
3685
'bar',
3686
'an earlier instance of this Resource',
3687
+ 'href',
3688
'\n data-foo: "a new value" in latest props, missing or null in original props',
3689
componentStack(['link', 'head', 'html']),
3690
);
3691
expect(mockError).toHaveBeenCalledWith(
3522
- 'Warning: A %s with href "%s" has props that disagree with those found on %s. Resources always use the props' +
3692
+ 'Warning: A %s with %s "%s" has props that disagree with those found on %s. Resources always use the props' +
3693
' that were provided the first time they are encountered so any differences will be ignored. Please' +
3524
- ' update Resources that share an href to have props that agree. The differences are described below.%s%s',
3694
+ ' update Resources that share an %s to have props that agree. The differences are described below.%s%s',
3695
'style Resource',
3696
+ 'href',
3697
'baz',
3698
'an earlier instance of this Resource',
3699
+ 'href',
3700
'\n data-foo: "a new value" in latest props, "an original value" in original props',
3701
componentStack(['link', 'head', 'html']),
3702
);
3753
});
3754
// precedence is removed from the stylesheets because it is considered a reserved prop for
3755
// stylesheets to opt into resource semantics.
3584
- expect(getVisibleChildren(document)).toEqual(
3756
+ expect(getMeaningfulChildren(document)).toEqual(
3757
<html>
3758
<head>
3759
<link rel="preload" as="style" href="foo" />
3819
}
3820
});
3821
3822
+ // @gate enableFloat
3823
+ it('warns when script Resources have new or different values for props', async () => {
3824
+ const originalConsoleError = console.error;
3825
+ const mockError = jest.fn();
3826
+ console.error = (...args) => {
3827
+ mockError(...args.map(normalizeCodeLocInfo));
3828
+ };
3829
+ try {
3830
+ await actIntoEmptyDocument(() => {
3831
+ const {pipe} = ReactDOMFizzServer.renderToPipeableStream(
3832
+ <html>
3833
+ <head>
3834
+ <script src="foo" async={true} data-foo="a current value" />
3835
+ <script src="foo" async={true} data-foo="a new value" />
3836
+ </head>
3837
+ </html>,
3838
+ );
3839
+ pipe(writable);
3840
+ });
3841
+ expect(getMeaningfulChildren(document)).toEqual(
3842
+ <html>
3843
+ <head>
3844
+ <script src="foo" async="" data-foo="a current value" />
3845
+ </head>
3846
+ <body />
3847
+ </html>,
3848
+ );
3849
+
3850
+ if (__DEV__) {
3851
+ expect(mockError).toHaveBeenCalledTimes(1);
3852
+ expect(mockError).toHaveBeenCalledWith(
3853
+ 'Warning: A %s with %s "%s" has props that disagree with those found on %s. Resources always use the props' +
3854
+ ' that were provided the first time they are encountered so any differences will be ignored. Please' +
3855
+ ' update Resources that share an %s to have props that agree. The differences are described below.%s%s',
3856
+ 'script Resource',
3857
+ 'src',
3858
+ 'foo',
3859
+ 'an earlier instance of this Resource',
3860
+ 'src',
3861
+ '\n data-foo: "a new value" in latest props, "a current value" in original props',
3862
+ componentStack(['script', 'head', 'html']),
3863
+ );
3864
+ } else {
3865
+ expect(mockError).not.toHaveBeenCalled();
3866
+ }
3867
+ } finally {
3868
+ console.error = originalConsoleError;
3869
+ }
3870
+ });
3871
+
3872
// @gate enableFloat
3873
it('warns when preload Resources have new or different values for props', async () => {
3874
const originalConsoleError = console.error;
3912
);
3913
pipe(writable);
3914
});
3693
- expect(getVisibleChildren(document)).toEqual(
3915
+ expect(getMeaningfulChildren(document)).toEqual(
3916
<html>
3917
<head>
3918
<link
3935
if (__DEV__) {
3936
expect(mockError).toHaveBeenCalledTimes(2);
3937
expect(mockError).toHaveBeenCalledWith(
3716
- 'Warning: A %s with href "%s" has props that disagree with those found on %s. Resources always use the props' +
3938
+ 'Warning: A %s with %s "%s" has props that disagree with those found on %s. Resources always use the props' +
3939
' that were provided the first time they are encountered so any differences will be ignored. Please' +
3718
- ' update Resources that share an href to have props that agree. The differences are described below.%s%s',
3940
+ ' update Resources that share an %s to have props that agree. The differences are described below.%s%s',
3941
'preload Resource (as "style")',
3942
+ 'href',
3943
'foo',
3944
'an earlier instance of this Resource',
3945
+ 'href',
3946
'\n data-foo: "a new value" in latest props, "a current value" in original props',
3947
componentStack(['link', 'head', 'html']),
3948
);
3993
);
3994
pipe(writable);
3995
});
3772
- expect(getVisibleChildren(document)).toEqual(
3996
+ expect(getMeaningfulChildren(document)).toEqual(
3997
<html>
3998
<head>
3999
<link
4000
rel="stylesheet"
4001
href="foo"
3778
- data-rprec="foo"
4002
+ data-precedence="foo"
4003
crossorigin="style value"
4004
/>
4005
</head>
4010
if (__DEV__) {
4011
expect(mockError).toHaveBeenCalledTimes(1);
4012
expect(mockError).toHaveBeenCalledWith(
3789
- 'Warning: A %s with href "%s" has props that disagree with those found on %s. Resources always use the props' +
4013
+ 'Warning: A %s with %s "%s" has props that disagree with those found on %s. Resources always use the props' +
4014
' that were provided the first time they are encountered so any differences will be ignored. Please' +
3791
- ' update Resources that share an href to have props that agree. The differences are described below.%s%s',
4015
+ ' update Resources that share an %s to have props that agree. The differences are described below.%s%s',
4016
'style Resource',
4017
+ 'href',
4018
'foo',
4019
'a preload Resource (as "style") with the same href',
4020
+ 'href',
4021
'\n crossOrigin: "style value" in latest props, "preload value" in original props',
4022
componentStack(['link', 'head', 'html']),
4023
);
4065
</div>,
4066
);
4067
expect(Scheduler).toFlushWithoutYielding();
3842
- expect(getVisibleChildren(document)).toEqual(
4068
+ expect(getMeaningfulChildren(document)).toEqual(
4069
<html>
4070
<head>
3845
- <link rel="preload" as="style" href="preload" />
3846
- <link rel="preload" href={'with\nnewline'} as="style" />
3847
- <link rel="stylesheet" href="style" data-rprec="style" />
3848
- <link rel="stylesheet" href="with\slashes" data-rprec="style" />
4071
+ <link rel="stylesheet" href="style" data-precedence="style" />
4072
+ <link
4073
+ rel="stylesheet"
4074
+ href="with\slashes"
4075
+ data-precedence="style"
4076
+ />
4077
<link
4078
rel="stylesheet"
4079
href={'style"][rel="stylesheet'}
3852
- data-rprec="style"
4080
+ data-precedence="style"
4081
/>
4082
+ <link rel="preload" as="style" href="preload" />
4083
+ <link rel="preload" href={'with\nnewline'} as="style" />
4084
<link rel="preload" href={'preload"][rel="preload'} as="style" />
4085
<link rel="preload" href={'style"][rel="stylesheet'} as="style" />
4086
</head>
4129
const root = ReactDOMClient.createRoot(container);
4130
root.render(<App />);
4131
expect(Scheduler).toFlushWithoutYielding();
3902
- expect(getVisibleChildren(document)).toEqual(
4132
+ expect(getMeaningfulChildren(document)).toEqual(
4133
<html>
4134
<head>
3905
- <link rel="preload" as="style" href="preload" />
3906
- <link rel="preload" href={'with\nnewline'} as="style" />
3907
- <link rel="stylesheet" href="style" data-rprec="style" />
3908
- <link rel="stylesheet" href="with\slashes" data-rprec="style" />
4135
+ <link rel="stylesheet" href="style" data-precedence="style" />
4136
+ <link
4137
+ rel="stylesheet"
4138
+ href="with\slashes"
4139
+ data-precedence="style"
4140
+ />
4141
<link
4142
rel="stylesheet"
4143
href={'style"][rel="stylesheet'}
3912
- data-rprec="style"
4144
+ data-precedence="style"
4145
/>
4146
+ <link rel="preload" as="style" href="preload" />
4147
+ <link rel="preload" href={'with\nnewline'} as="style" />
4148
<link rel="preload" href={'preload"][rel="preload'} as="style" />
4149
</head>
4150
<body>