@@ -1581,6 +1581,143 @@ describe('preprocessData', () => {
1581
1581
) ;
1582
1582
}
1583
1583
} ) ;
1584
+
1585
+ it ( 'should not warn about transition updates scheduled during commit phase' , async ( ) => {
1586
+ function Component ( ) {
1587
+ const [ value , setValue ] = React . useState ( 0 ) ;
1588
+ // eslint-disable-next-line no-unused-vars
1589
+ const [ isPending , startTransition ] = React . useTransition ( ) ;
1590
+
1591
+ Scheduler . unstable_yieldValue (
1592
+ `Component rendered with value ${ value } ` ,
1593
+ ) ;
1594
+
1595
+ // Fake a long render
1596
+ if ( value !== 0 ) {
1597
+ Scheduler . unstable_yieldValue ( 'Long render' ) ;
1598
+ startTime += 20000 ;
1599
+ }
1600
+
1601
+ React . useLayoutEffect ( ( ) => {
1602
+ startTransition ( ( ) => {
1603
+ setValue ( 1 ) ;
1604
+ } ) ;
1605
+ } , [ ] ) ;
1606
+
1607
+ return value ;
1608
+ }
1609
+
1610
+ if ( gate ( flags => flags . enableSchedulingProfiler ) ) {
1611
+ const cpuProfilerSample = creactCpuProfilerSample ( ) ;
1612
+
1613
+ const root = ReactDOM . createRoot ( document . createElement ( 'div' ) ) ;
1614
+ act ( ( ) => {
1615
+ root . render ( < Component /> ) ;
1616
+ } ) ;
1617
+
1618
+ expect ( Scheduler ) . toHaveYielded ( [
1619
+ 'Component rendered with value 0' ,
1620
+ 'Component rendered with value 0' ,
1621
+ 'Component rendered with value 1' ,
1622
+ 'Long render' ,
1623
+ ] ) ;
1624
+
1625
+ const testMarks = [ ] ;
1626
+ clearedMarks . forEach ( markName => {
1627
+ if ( markName === '--component-render-start-Component' ) {
1628
+ // Fake a long running render
1629
+ startTime += 20000 ;
1630
+ }
1631
+
1632
+ testMarks . push ( {
1633
+ pid : ++ pid ,
1634
+ tid : ++ tid ,
1635
+ ts : ++ startTime ,
1636
+ args : { data : { } } ,
1637
+ cat : 'blink.user_timing' ,
1638
+ name : markName ,
1639
+ ph : 'R' ,
1640
+ } ) ;
1641
+ } ) ;
1642
+
1643
+ const data = await preprocessData ( [
1644
+ cpuProfilerSample ,
1645
+ ...createBoilerplateEntries ( ) ,
1646
+ ...testMarks ,
1647
+ ] ) ;
1648
+
1649
+ data . schedulingEvents . forEach ( event => {
1650
+ expect ( event . warning ) . toBeNull ( ) ;
1651
+ } ) ;
1652
+ }
1653
+ } ) ;
1654
+
1655
+ it ( 'should not warn about deferred value updates scheduled during commit phase' , async ( ) => {
1656
+ function Component ( ) {
1657
+ const [ value , setValue ] = React . useState ( 0 ) ;
1658
+ const deferredValue = React . useDeferredValue ( value ) ;
1659
+
1660
+ Scheduler . unstable_yieldValue (
1661
+ `Component rendered with value ${ value } and deferredValue ${ deferredValue } ` ,
1662
+ ) ;
1663
+
1664
+ // Fake a long render
1665
+ if ( deferredValue !== 0 ) {
1666
+ Scheduler . unstable_yieldValue ( 'Long render' ) ;
1667
+ startTime += 20000 ;
1668
+ }
1669
+
1670
+ React . useLayoutEffect ( ( ) => {
1671
+ setValue ( 1 ) ;
1672
+ } , [ ] ) ;
1673
+
1674
+ return value + deferredValue ;
1675
+ }
1676
+
1677
+ if ( gate ( flags => flags . enableSchedulingProfiler ) ) {
1678
+ const cpuProfilerSample = creactCpuProfilerSample ( ) ;
1679
+
1680
+ const root = ReactDOM . createRoot ( document . createElement ( 'div' ) ) ;
1681
+ act ( ( ) => {
1682
+ root . render ( < Component /> ) ;
1683
+ } ) ;
1684
+
1685
+ expect ( Scheduler ) . toHaveYielded ( [
1686
+ 'Component rendered with value 0 and deferredValue 0' ,
1687
+ 'Component rendered with value 1 and deferredValue 0' ,
1688
+ 'Component rendered with value 1 and deferredValue 1' ,
1689
+ 'Long render' ,
1690
+ ] ) ;
1691
+
1692
+ const testMarks = [ ] ;
1693
+ clearedMarks . forEach ( markName => {
1694
+ if ( markName === '--component-render-start-Component' ) {
1695
+ // Fake a long running render
1696
+ startTime += 20000 ;
1697
+ }
1698
+
1699
+ testMarks . push ( {
1700
+ pid : ++ pid ,
1701
+ tid : ++ tid ,
1702
+ ts : ++ startTime ,
1703
+ args : { data : { } } ,
1704
+ cat : 'blink.user_timing' ,
1705
+ name : markName ,
1706
+ ph : 'R' ,
1707
+ } ) ;
1708
+ } ) ;
1709
+
1710
+ const data = await preprocessData ( [
1711
+ cpuProfilerSample ,
1712
+ ...createBoilerplateEntries ( ) ,
1713
+ ...testMarks ,
1714
+ ] ) ;
1715
+
1716
+ data . schedulingEvents . forEach ( event => {
1717
+ expect ( event . warning ) . toBeNull ( ) ;
1718
+ } ) ;
1719
+ }
1720
+ } ) ;
1584
1721
} ) ;
1585
1722
1586
1723
describe ( 'errors thrown while rendering' , ( ) => {
0 commit comments