11
11
12
12
let React ;
13
13
let Scheduler ;
14
- let ReactCache ;
14
+ // let ReactCache;
15
15
let ReactDOM ;
16
- let Suspense ;
16
+ // let Suspense;
17
17
let originalCreateElement ;
18
- let TextResource ;
19
- let textResourceShouldFail ;
18
+ // let TextResource;
19
+ // let textResourceShouldFail;
20
20
21
21
let images = [ ] ;
22
22
let onLoadSpy = null ;
@@ -48,21 +48,21 @@ function Text(props) {
48
48
return props . text ;
49
49
}
50
50
51
- function AsyncText ( props ) {
52
- const text = props . text ;
53
- try {
54
- TextResource . read ( [ props . text , props . ms ] ) ;
55
- Scheduler . unstable_yieldValue ( text ) ;
56
- return text ;
57
- } catch ( promise ) {
58
- if ( typeof promise . then === 'function' ) {
59
- Scheduler . unstable_yieldValue ( `Suspend! [${ text } ]` ) ;
60
- } else {
61
- Scheduler . unstable_yieldValue ( `Error! [${ text } ]` ) ;
62
- }
63
- throw promise ;
64
- }
65
- }
51
+ // function AsyncText(props) {
52
+ // const text = props.text;
53
+ // try {
54
+ // TextResource.read([props.text, props.ms]);
55
+ // Scheduler.unstable_yieldValue(text);
56
+ // return text;
57
+ // } catch (promise) {
58
+ // if (typeof promise.then === 'function') {
59
+ // Scheduler.unstable_yieldValue(`Suspend! [${text}]`);
60
+ // } else {
61
+ // Scheduler.unstable_yieldValue(`Error! [${text}]`);
62
+ // }
63
+ // throw promise;
64
+ // }
65
+ // }
66
66
67
67
function Img ( { src : maybeSrc , onLoad, useImageLoader, ref} ) {
68
68
const src = maybeSrc || 'default' ;
@@ -82,14 +82,14 @@ function loadImage(element) {
82
82
element . dispatchEvent ( event ) ;
83
83
}
84
84
85
- describe . only ( 'ReactDOMImageLoad' , ( ) => {
85
+ describe ( 'ReactDOMImageLoad' , ( ) => {
86
86
beforeEach ( ( ) => {
87
87
jest . resetModules ( ) ;
88
88
React = require ( 'react' ) ;
89
89
Scheduler = require ( 'scheduler' ) ;
90
- ReactCache = require ( 'react-cache' ) ;
90
+ // ReactCache = require('react-cache');
91
91
ReactDOM = require ( 'react-dom' ) ;
92
- Suspense = React . Suspense ;
92
+ // Suspense = React.Suspense;
93
93
94
94
onLoadSpy = jest . fn ( reactEvent => {
95
95
const src = reactEvent . target . getAttribute ( 'src' ) ;
@@ -102,54 +102,54 @@ describe.only('ReactDOMImageLoad', () => {
102
102
nativeEvent . __originalDispatch = false ;
103
103
} ) ;
104
104
105
- TextResource = ReactCache . unstable_createResource (
106
- ( [ text , ms = 0 ] ) => {
107
- let listeners = null ;
108
- let status = 'pending' ;
109
- let value = null ;
110
- return {
111
- then ( resolve , reject ) {
112
- switch ( status ) {
113
- case 'pending' : {
114
- if ( listeners === null ) {
115
- listeners = [ { resolve, reject} ] ;
116
- setTimeout ( ( ) => {
117
- if ( textResourceShouldFail ) {
118
- Scheduler . unstable_yieldValue (
119
- `Promise rejected [${ text } ]` ,
120
- ) ;
121
- status = 'rejected' ;
122
- value = new Error ( 'Failed to load: ' + text ) ;
123
- listeners . forEach ( listener => listener . reject ( value ) ) ;
124
- } else {
125
- Scheduler . unstable_yieldValue (
126
- `Promise resolved [${ text } ]` ,
127
- ) ;
128
- status = 'resolved' ;
129
- value = text ;
130
- listeners . forEach ( listener => listener . resolve ( value ) ) ;
131
- }
132
- } , ms ) ;
133
- } else {
134
- listeners . push ( { resolve, reject} ) ;
135
- }
136
- break ;
137
- }
138
- case 'resolved' : {
139
- resolve ( value ) ;
140
- break ;
141
- }
142
- case 'rejected' : {
143
- reject ( value ) ;
144
- break ;
145
- }
146
- }
147
- } ,
148
- } ;
149
- } ,
150
- ( [ text , ms ] ) => text ,
151
- ) ;
152
- textResourceShouldFail = false ;
105
+ // TextResource = ReactCache.unstable_createResource(
106
+ // ([text, ms = 0]) => {
107
+ // let listeners = null;
108
+ // let status = 'pending';
109
+ // let value = null;
110
+ // return {
111
+ // then(resolve, reject) {
112
+ // switch (status) {
113
+ // case 'pending': {
114
+ // if (listeners === null) {
115
+ // listeners = [{resolve, reject}];
116
+ // setTimeout(() => {
117
+ // if (textResourceShouldFail) {
118
+ // Scheduler.unstable_yieldValue(
119
+ // `Promise rejected [${text}]`,
120
+ // );
121
+ // status = 'rejected';
122
+ // value = new Error('Failed to load: ' + text);
123
+ // listeners.forEach(listener => listener.reject(value));
124
+ // } else {
125
+ // Scheduler.unstable_yieldValue(
126
+ // `Promise resolved [${text}]`,
127
+ // );
128
+ // status = 'resolved';
129
+ // value = text;
130
+ // listeners.forEach(listener => listener.resolve(value));
131
+ // }
132
+ // }, ms);
133
+ // } else {
134
+ // listeners.push({resolve, reject});
135
+ // }
136
+ // break;
137
+ // }
138
+ // case 'resolved': {
139
+ // resolve(value);
140
+ // break;
141
+ // }
142
+ // case 'rejected': {
143
+ // reject(value);
144
+ // break;
145
+ // }
146
+ // }
147
+ // },
148
+ // };
149
+ // },
150
+ // ([text, ms]) => text,
151
+ // );
152
+ // textResourceShouldFail = false;
153
153
154
154
images = [ ] ;
155
155
@@ -442,67 +442,67 @@ describe.only('ReactDOMImageLoad', () => {
442
442
expect ( onLoadSpy ) . not . toHaveBeenCalled ( ) ;
443
443
} ) ;
444
444
445
- fit ( 'captures the load event if it happens in a suspended subtree and replays it between layout and passive effects on resumption' , async function ( ) {
446
- function SuspendingWithImage ( ) {
447
- Scheduler . unstable_yieldValue ( 'SuspendingWithImage' ) ;
448
- return (
449
- < Suspense fallback = { < Text text = "Loading..." /> } >
450
- < AsyncText text = "A" ms = { 100 } />
451
- < PhaseMarkers >
452
- < Img onLoad = { onLoadSpy } />
453
- </ PhaseMarkers >
454
- </ Suspense >
455
- ) ;
456
- }
457
-
458
- const container = document . createElement ( 'div' ) ;
459
- const root = ReactDOM . createRoot ( container ) ;
460
-
461
- React . startTransition ( ( ) => root . render ( < SuspendingWithImage /> ) ) ;
462
-
463
- expect ( Scheduler ) . toFlushAndYield ( [
464
- 'SuspendingWithImage' ,
465
- 'Suspend! [A]' ,
466
- 'render start' ,
467
- 'Img default' ,
468
- 'Loading...' ,
469
- ] ) ;
470
- let img = last ( images ) ;
471
- loadImage ( img ) ;
472
- expect ( Scheduler ) . toHaveYielded ( [ 'actualLoadSpy [default]' ] ) ;
473
- expect ( onLoadSpy ) . not . toHaveBeenCalled ( ) ;
474
-
475
- // Flush some of the time
476
- jest . advanceTimersByTime ( 50 ) ;
477
- // Still nothing...
478
- expect ( Scheduler ) . toFlushWithoutYielding ( ) ;
479
-
480
- // Flush the promise completely
481
- jest . advanceTimersByTime ( 50 ) ;
482
- // Renders successfully
483
- expect ( Scheduler ) . toHaveYielded ( [ 'Promise resolved [A]' ] ) ;
484
-
485
- expect ( Scheduler ) . toFlushAndYieldThrough ( [
486
- 'A' ,
487
- // img was recreated on unsuspended tree causing new load event
488
- 'render start' ,
489
- 'Img default' ,
490
- 'last layout' ,
491
- ] ) ;
492
-
493
- expect ( images . length ) . toBe ( 2 ) ;
494
- img = last ( images ) ;
495
- expect ( img . __needsDispatch ) . toBe ( true ) ;
496
- loadImage ( img ) ;
497
- expect ( Scheduler ) . toHaveYielded ( [
498
- 'actualLoadSpy [default]' ,
499
- 'onLoadSpy [default]' ,
500
- ] ) ;
501
-
502
- expect ( Scheduler ) . toFlushAndYield ( [ 'last passive' ] ) ;
503
-
504
- expect ( onLoadSpy ) . toHaveBeenCalledTimes ( 1 ) ;
505
- } ) ;
445
+ // it ('captures the load event if it happens in a suspended subtree and replays it between layout and passive effects on resumption', async function() {
446
+ // function SuspendingWithImage() {
447
+ // Scheduler.unstable_yieldValue('SuspendingWithImage');
448
+ // return (
449
+ // <Suspense fallback={<Text text="Loading..." />}>
450
+ // <AsyncText text="A" ms={100} />
451
+ // <PhaseMarkers>
452
+ // <Img onLoad={onLoadSpy} />
453
+ // </PhaseMarkers>
454
+ // </Suspense>
455
+ // );
456
+ // }
457
+
458
+ // const container = document.createElement('div');
459
+ // const root = ReactDOM.createRoot(container);
460
+
461
+ // React.startTransition(() => root.render(<SuspendingWithImage />));
462
+
463
+ // expect(Scheduler).toFlushAndYield([
464
+ // 'SuspendingWithImage',
465
+ // 'Suspend! [A]',
466
+ // 'render start',
467
+ // 'Img default',
468
+ // 'Loading...',
469
+ // ]);
470
+ // let img = last(images);
471
+ // loadImage(img);
472
+ // expect(Scheduler).toHaveYielded(['actualLoadSpy [default]']);
473
+ // expect(onLoadSpy).not.toHaveBeenCalled();
474
+
475
+ // // Flush some of the time
476
+ // jest.advanceTimersByTime(50);
477
+ // // Still nothing...
478
+ // expect(Scheduler).toFlushWithoutYielding();
479
+
480
+ // // Flush the promise completely
481
+ // jest.advanceTimersByTime(50);
482
+ // // Renders successfully
483
+ // expect(Scheduler).toHaveYielded(['Promise resolved [A]']);
484
+
485
+ // expect(Scheduler).toFlushAndYieldThrough([
486
+ // 'A',
487
+ // // img was recreated on unsuspended tree causing new load event
488
+ // 'render start',
489
+ // 'Img default',
490
+ // 'last layout',
491
+ // ]);
492
+
493
+ // expect(images.length).toBe(2);
494
+ // img = last(images);
495
+ // expect(img.__needsDispatch).toBe(true);
496
+ // loadImage(img);
497
+ // expect(Scheduler).toHaveYielded([
498
+ // 'actualLoadSpy [default]',
499
+ // 'onLoadSpy [default]',
500
+ // ]);
501
+
502
+ // expect(Scheduler).toFlushAndYield(['last passive']);
503
+
504
+ // expect(onLoadSpy).toHaveBeenCalledTimes(1);
505
+ // });
506
506
507
507
it ( 'correctly replays the last img load even when a yield + update causes the host element to change' , async function ( ) {
508
508
let externalSetSrc = null ;
0 commit comments