@@ -715,4 +715,143 @@ describe('SchedulingProfiler', () => {
715
715
` ) ;
716
716
}
717
717
} ) ;
718
+
719
+ it ( 'should mark sync render that throws' , async ( ) => {
720
+ class ErrorBoundary extends React . Component {
721
+ state = { error : null } ;
722
+ componentDidCatch ( error ) {
723
+ this . setState ( { error} ) ;
724
+ }
725
+ render ( ) {
726
+ if ( this . state . error ) {
727
+ return null ;
728
+ }
729
+ return this . props . children ;
730
+ }
731
+ }
732
+
733
+ function ExampleThatThrows ( ) {
734
+ throw Error ( 'Expected error' ) ;
735
+ }
736
+
737
+ ReactTestRenderer . create (
738
+ < ErrorBoundary >
739
+ < ExampleThatThrows />
740
+ </ ErrorBoundary > ,
741
+ ) ;
742
+
743
+ if ( gate ( flags => flags . enableSchedulingProfiler ) ) {
744
+ expect ( getMarks ( ) ) . toMatchInlineSnapshot ( `
745
+ Array [
746
+ "--schedule-render-1",
747
+ "--render-start-1",
748
+ "--component-render-start-ErrorBoundary",
749
+ "--component-render-stop",
750
+ "--component-render-start-ExampleThatThrows",
751
+ "--component-render-start-ExampleThatThrows",
752
+ "--component-render-stop",
753
+ "--error-ExampleThatThrows-mount-Expected error",
754
+ "--render-stop",
755
+ "--commit-start-1",
756
+ "--react-version-17.0.3",
757
+ "--profiler-version-1",
758
+ "--react-lane-labels-Sync,InputContinuousHydration,InputContinuous,DefaultHydration,Default,TransitionHydration,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Retry,Retry,Retry,Retry,Retry,SelectiveHydration,IdleHydration,Idle,Offscreen",
759
+ "--layout-effects-start-1",
760
+ "--schedule-state-update-1-ErrorBoundary",
761
+ "--layout-effects-stop",
762
+ "--commit-stop",
763
+ "--render-start-1",
764
+ "--component-render-start-ErrorBoundary",
765
+ "--component-render-stop",
766
+ "--render-stop",
767
+ "--commit-start-1",
768
+ "--react-version-17.0.3",
769
+ "--profiler-version-1",
770
+ "--react-lane-labels-Sync,InputContinuousHydration,InputContinuous,DefaultHydration,Default,TransitionHydration,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Retry,Retry,Retry,Retry,Retry,SelectiveHydration,IdleHydration,Idle,Offscreen",
771
+ "--commit-stop",
772
+ ]
773
+ ` ) ;
774
+ }
775
+ } ) ;
776
+
777
+ it ( 'should mark concurrent render that throws' , async ( ) => {
778
+ spyOnProd ( console , 'error' ) ;
779
+
780
+ class ErrorBoundary extends React . Component {
781
+ state = { error : null } ;
782
+ componentDidCatch ( error ) {
783
+ this . setState ( { error} ) ;
784
+ }
785
+ render ( ) {
786
+ if ( this . state . error ) {
787
+ return null ;
788
+ }
789
+ return this . props . children ;
790
+ }
791
+ }
792
+
793
+ function ExampleThatThrows ( ) {
794
+ // eslint-disable-next-line no-throw-literal
795
+ throw 'Expected error' ;
796
+ }
797
+
798
+ ReactTestRenderer . create (
799
+ < ErrorBoundary >
800
+ < ExampleThatThrows />
801
+ </ ErrorBoundary > ,
802
+ { unstable_isConcurrent : true } ,
803
+ ) ;
804
+
805
+ if ( gate ( flags => flags . enableSchedulingProfiler ) ) {
806
+ expect ( getMarks ( ) ) . toMatchInlineSnapshot ( `
807
+ Array [
808
+ "--schedule-render-16",
809
+ ]
810
+ ` ) ;
811
+ }
812
+
813
+ clearPendingMarks ( ) ;
814
+
815
+ expect ( Scheduler ) . toFlushUntilNextPaint ( [ ] ) ;
816
+
817
+ if ( gate ( flags => flags . enableSchedulingProfiler ) ) {
818
+ expect ( getMarks ( ) ) . toMatchInlineSnapshot ( `
819
+ Array [
820
+ "--render-start-16",
821
+ "--component-render-start-ErrorBoundary",
822
+ "--component-render-stop",
823
+ "--component-render-start-ExampleThatThrows",
824
+ "--component-render-start-ExampleThatThrows",
825
+ "--component-render-stop",
826
+ "--error-ExampleThatThrows-mount-Expected error",
827
+ "--render-stop",
828
+ "--render-start-16",
829
+ "--component-render-start-ErrorBoundary",
830
+ "--component-render-stop",
831
+ "--component-render-start-ExampleThatThrows",
832
+ "--component-render-start-ExampleThatThrows",
833
+ "--component-render-stop",
834
+ "--error-ExampleThatThrows-mount-Expected error",
835
+ "--render-stop",
836
+ "--commit-start-16",
837
+ "--react-version-17.0.3",
838
+ "--profiler-version-1",
839
+ "--react-lane-labels-Sync,InputContinuousHydration,InputContinuous,DefaultHydration,Default,TransitionHydration,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Retry,Retry,Retry,Retry,Retry,SelectiveHydration,IdleHydration,Idle,Offscreen",
840
+ "--layout-effects-start-16",
841
+ "--schedule-state-update-1-ErrorBoundary",
842
+ "--layout-effects-stop",
843
+ "--render-start-1",
844
+ "--component-render-start-ErrorBoundary",
845
+ "--component-render-stop",
846
+ "--render-stop",
847
+ "--commit-start-1",
848
+ "--react-version-17.0.3",
849
+ "--profiler-version-1",
850
+ "--react-lane-labels-Sync,InputContinuousHydration,InputContinuous,DefaultHydration,Default,TransitionHydration,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Transition,Retry,Retry,Retry,Retry,Retry,SelectiveHydration,IdleHydration,Idle,Offscreen",
851
+ "--commit-stop",
852
+ "--commit-stop",
853
+ ]
854
+ ` ) ;
855
+ }
856
+ } ) ;
718
857
} ) ;
0 commit comments