Skip to content

Commit be3fb29

Browse files
authored
[internal] revert change merged accidentally (#35546)
I accidentally pushed this to new flag to #35541 and then merged it. Reverting it so I can submit a review.
1 parent 23e5edd commit be3fb29

12 files changed

Lines changed: 6 additions & 245 deletions

‎packages/react-reconciler/src/ReactFiberCommitWork.js‎

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ import type {ViewTransitionState} from './ReactFiberViewTransitionComponent';
4747
import{
4848
alwaysThrottleRetries,
4949
enableCreateEventHandleAPI,
50-
enableEffectEventMutationPhase,
5150
enableHiddenSubtreeInsertionEffectCleanup,
5251
enableProfilerTimer,
5352
enableProfilerCommitHooks,
@@ -500,7 +499,7 @@ function commitBeforeMutationEffectsOnFiber(
500499
caseFunctionComponent:
501500
caseForwardRef:
502501
caseSimpleMemoComponent: {
503-
if(!enableEffectEventMutationPhase&&(flags&Update)!==NoFlags){
502+
if((flags&Update)!==NoFlags){
504503
constupdateQueue: FunctionComponentUpdateQueue|null=
505504
(finishedWork.updateQueue: any);
506505
consteventPayloads=updateQueue!==null ? updateQueue.events : null;
@@ -2047,19 +2046,6 @@ function commitMutationEffectsOnFiber(
20472046
commitReconciliationEffects(finishedWork,lanes);
20482047

20492048
if(flags&Update){
2050-
// Mutate event effect callbacks before insertion effects.
2051-
if(enableEffectEventMutationPhase){
2052-
constupdateQueue: FunctionComponentUpdateQueue|null=
2053-
(finishedWork.updateQueue: any);
2054-
consteventPayloads=
2055-
updateQueue!==null ? updateQueue.events : null;
2056-
if(eventPayloads!==null){
2057-
for(letii=0;ii<eventPayloads.length;ii++){
2058-
const{ref, nextImpl}=eventPayloads[ii];
2059-
ref.impl=nextImpl;
2060-
}
2061-
}
2062-
}
20632049
commitHookEffectListUnmount(
20642050
HookInsertion|HookHasEffect,
20652051
finishedWork,

‎packages/react-reconciler/src/ReactFiberFlags.js‎

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@
77
* @flow
88
*/
99

10-
import{
11-
enableCreateEventHandleAPI,
12-
enableEffectEventMutationPhase,
13-
}from'shared/ReactFeatureFlags';
10+
import{enableCreateEventHandleAPI}from'shared/ReactFeatureFlags';
1411

1512
exporttypeFlags=number;
1613

@@ -102,11 +99,10 @@ export const BeforeMutationMask: number =
10299
// TODO: Only need to visit Deletions during BeforeMutation phase if an
103100
// element is focused.
104101
Update|ChildDeletion|Visibility
105-
: // useEffectEvent uses the snapshot phase,
106-
// but we're moving it to the mutation phase.
107-
enableEffectEventMutationPhase
108-
? 0
109-
: Update);
102+
: // TODO: The useEffectEvent hook uses the snapshot phase for clean up but it
103+
// really should use the mutation phase for this or at least schedule an
104+
// explicit Snapshot phase flag for this.
105+
Update);
110106

111107
// For View Transition support we use the snapshot phase to scan the tree for potentially
112108
// affected ViewTransition components.

‎packages/react-reconciler/src/__tests__/useEffectEvent-test.js‎

Lines changed: 0 additions & 208 deletions
Original file line numberDiff line numberDiff line change
@@ -595,214 +595,6 @@ describe('useEffectEvent', () => {
595595
assertLog(['Effect value: 2','Event value: 2']);
596596
});
597597

598-
it('updates parent and child event effects before their respective effect lifecycles',async()=>{
599-
functionParent({value}){
600-
constparentEvent=useEffectEvent(()=>{
601-
Scheduler.log('Parent event: '+value);
602-
});
603-
604-
useInsertionEffect(()=>{
605-
Scheduler.log('Parent insertion');
606-
parentEvent();
607-
},[value]);
608-
609-
return<Childvalue={value}/>;
610-
}
611-
612-
functionChild({value}){
613-
constchildEvent=useEffectEvent(()=>{
614-
Scheduler.log('Child event: '+value);
615-
});
616-
617-
useInsertionEffect(()=>{
618-
Scheduler.log('Child insertion');
619-
childEvent();
620-
},[value]);
621-
622-
returnnull;
623-
}
624-
625-
ReactNoop.render(<Parentvalue={1}/>);
626-
awaitwaitForAll([
627-
'Child insertion',
628-
'Child event: 1',
629-
'Parent insertion',
630-
'Parent event: 1',
631-
]);
632-
633-
awaitact(()=>ReactNoop.render(<Parentvalue={2}/>));
634-
// Each component's event is updated before its own insertion effect runs
635-
assertLog([
636-
'Child insertion',
637-
'Child event: 2',
638-
'Parent insertion',
639-
'Parent event: 2',
640-
]);
641-
});
642-
643-
it('fires all insertion effects (interleaved) with useEffectEvent before firing any layout effects',async()=>{
644-
// This test mirrors the 'fires all insertion effects (interleaved) before firing any layout effects'
645-
// test in ReactHooksWithNoopRenderer-test.js, but adds useEffectEvent to verify that
646-
// event payloads are updated before each component's insertion effects run.
647-
// It also includes passive effects to verify the full effect lifecycle.
648-
letcommittedA='(empty)';
649-
letcommittedB='(empty)';
650-
651-
functionCounterA(props){
652-
constonEvent=useEffectEvent(()=>{
653-
return`Event A [A: ${committedA}, B: ${committedB}]`;
654-
});
655-
656-
useInsertionEffect(()=>{
657-
// Call the event function to verify it sees the latest value
658-
Scheduler.log(
659-
`Create Insertion A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
660-
);
661-
committedA=String(props.count);
662-
return()=>{
663-
Scheduler.log(
664-
`Destroy Insertion A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
665-
);
666-
};
667-
});
668-
669-
useLayoutEffect(()=>{
670-
Scheduler.log(
671-
`Create Layout A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
672-
);
673-
return()=>{
674-
Scheduler.log(
675-
`Destroy Layout A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
676-
);
677-
};
678-
});
679-
680-
useEffect(()=>{
681-
Scheduler.log(
682-
`Create Passive A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
683-
);
684-
return()=>{
685-
Scheduler.log(
686-
`Destroy Passive A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
687-
);
688-
};
689-
});
690-
691-
returnnull;
692-
}
693-
694-
functionCounterB(props){
695-
constonEvent=useEffectEvent(()=>{
696-
return`Event B [A: ${committedA}, B: ${committedB}]`;
697-
});
698-
699-
useInsertionEffect(()=>{
700-
// Call the event function to verify it sees the latest value
701-
Scheduler.log(
702-
`Create Insertion B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
703-
);
704-
committedB=String(props.count);
705-
return()=>{
706-
Scheduler.log(
707-
`Destroy Insertion B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
708-
);
709-
};
710-
});
711-
712-
useLayoutEffect(()=>{
713-
Scheduler.log(
714-
`Create Layout B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
715-
);
716-
return()=>{
717-
Scheduler.log(
718-
`Destroy Layout B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
719-
);
720-
};
721-
});
722-
723-
useEffect(()=>{
724-
Scheduler.log(
725-
`Create Passive B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
726-
);
727-
return()=>{
728-
Scheduler.log(
729-
`Destroy Passive B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
730-
);
731-
};
732-
});
733-
734-
returnnull;
735-
}
736-
737-
awaitact(async()=>{
738-
ReactNoop.render(
739-
<React.Fragment>
740-
<CounterAcount={0}/>
741-
<CounterBcount={0}/>
742-
</React.Fragment>,
743-
);
744-
// All insertion effects fire before all layout effects, then passive effects
745-
// Event functions should see the state AT THE TIME they're called
746-
awaitwaitForAll([
747-
// Insertion effects (mutation phase)
748-
'Create Insertion A [A: (empty), B: (empty)], event: Event A [A: (empty), B: (empty)]',
749-
'Create Insertion B [A: 0, B: (empty)], event: Event B [A: 0, B: (empty)]',
750-
// Layout effects
751-
'Create Layout A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
752-
'Create Layout B [A: 0, B: 0], event: Event B [A: 0, B: 0]',
753-
// Passive effects
754-
'Create Passive A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
755-
'Create Passive B [A: 0, B: 0], event: Event B [A: 0, B: 0]',
756-
]);
757-
expect([committedA,committedB]).toEqual(['0','0']);
758-
});
759-
760-
awaitact(async()=>{
761-
ReactNoop.render(
762-
<React.Fragment>
763-
<CounterAcount={1}/>
764-
<CounterBcount={1}/>
765-
</React.Fragment>,
766-
);
767-
awaitwaitForAll([
768-
// Component A: insertion destroy, then create
769-
'Destroy Insertion A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
770-
'Create Insertion A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
771-
// Component A: layout destroy (after insertion updated committedA)
772-
'Destroy Layout A [A: 1, B: 0], event: Event A [A: 1, B: 0]',
773-
// Component B: insertion destroy, then create
774-
'Destroy Insertion B [A: 1, B: 0], event: Event B [A: 1, B: 0]',
775-
'Create Insertion B [A: 1, B: 0], event: Event B [A: 1, B: 0]',
776-
// Component B: layout destroy (after insertion updated committedB)
777-
'Destroy Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
778-
// Layout creates
779-
'Create Layout A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
780-
'Create Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
781-
// Passive destroys then creates
782-
'Destroy Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
783-
'Destroy Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
784-
'Create Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
785-
'Create Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
786-
]);
787-
expect([committedA,committedB]).toEqual(['1','1']);
788-
});
789-
790-
// Unmount everything
791-
awaitact(async()=>{
792-
ReactNoop.render(null);
793-
awaitwaitForAll([
794-
// Insertion and layout destroys (mutation/layout phase)
795-
'Destroy Insertion A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
796-
'Destroy Layout A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
797-
'Destroy Insertion B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
798-
'Destroy Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
799-
// Passive destroys
800-
'Destroy Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
801-
'Destroy Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
802-
]);
803-
});
804-
});
805-
806598
it("doesn't provide a stable identity",async()=>{
807599
functionCounter({shouldRender, value}){
808600
constonClick=useEffectEvent(()=>{

‎packages/shared/ReactFeatureFlags.js‎

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,6 @@ export const enableFizzExternalRuntime = __EXPERIMENTAL__;
125125

126126
exportconstalwaysThrottleRetries: boolean=true;
127127

128-
// Gate whether useEffectEvent uses the mutation phase (true) or before-mutation
129-
// phase (false) for updating event function references.
130-
exportconstenableEffectEventMutationPhase: boolean=false;
131-
132128
exportconstpassChildrenWhenCloningPersistedNodes: boolean=false;
133129

134130
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;

‎packages/shared/forks/ReactFeatureFlags.native-fb-dynamic.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,3 @@ export const enableFragmentRefs = __VARIANT__;
2727
exportconstenableFragmentRefsScrollIntoView=__VARIANT__;
2828
exportconstenableFragmentRefsInstanceHandles=__VARIANT__;
2929
exportconstenableComponentPerformanceTrack=__VARIANT__;
30-
exportconstenableEffectEventMutationPhase=__VARIANT__;

‎packages/shared/forks/ReactFeatureFlags.native-fb.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ const dynamicFlags: DynamicExportsType = (dynamicFlagsUntyped: any);
2020
// the exports object every time a flag is read.
2121
exportconst{
2222
alwaysThrottleRetries,
23-
enableEffectEventMutationPhase,
2423
enableHiddenSubtreeInsertionEffectCleanup,
2524
enableObjectFiber,
2625
enableEagerAlternateStateNodeCleanup,

‎packages/shared/forks/ReactFeatureFlags.native-oss.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ export const enableSchedulingProfiler: boolean =
4646
!enableComponentPerformanceTrack&&__PROFILE__;
4747
exportconstenableScopeAPI: boolean=false;
4848
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
49-
exportconstenableEffectEventMutationPhase: boolean=false;
5049
exportconstenableSuspenseAvoidThisFallback: boolean=false;
5150
exportconstenableSuspenseCallback: boolean=false;
5251
exportconstenableTaint: boolean=true;

‎packages/shared/forks/ReactFeatureFlags.test-renderer.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ export const enableInfiniteRenderLoopDetection: boolean = false;
5858

5959
exportconstrenameElementSymbol: boolean=true;
6060
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
61-
exportconstenableEffectEventMutationPhase: boolean=false;
6261

6362
exportconstenableYieldingBeforePassive: boolean=true;
6463

‎packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ export const enableComponentPerformanceTrack = false;
4343
exportconstenablePerformanceIssueReporting=false;
4444
exportconstenableScopeAPI=false;
4545
exportconstenableEagerAlternateStateNodeCleanup=true;
46-
exportconstenableEffectEventMutationPhase=false;
4746
exportconstenableSuspenseAvoidThisFallback=false;
4847
exportconstenableSuspenseCallback=false;
4948
exportconstenableTaint=true;

‎packages/shared/forks/ReactFeatureFlags.test-renderer.www.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ export const renameElementSymbol: boolean = false;
6464

6565
exportconstenableObjectFiber: boolean=false;
6666
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
67-
exportconstenableEffectEventMutationPhase: boolean=false;
6867

6968
exportconstenableHydrationLaneScheduling: boolean=true;
7069

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
[internal] revert change merged accidentally (#35546) · react/react@be3fb29 · GitHub
Skip to content

Commit be3fb29

Browse files
authored
[internal] revert change merged accidentally (#35546)
I accidentally pushed this to new flag to #35541 and then merged it. Reverting it so I can submit a review.
1 parent 23e5edd commit be3fb29

12 files changed

Lines changed: 6 additions & 245 deletions

‎packages/react-reconciler/src/ReactFiberCommitWork.js‎

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ import type {ViewTransitionState} from './ReactFiberViewTransitionComponent';
4747
import{
4848
alwaysThrottleRetries,
4949
enableCreateEventHandleAPI,
50-
enableEffectEventMutationPhase,
5150
enableHiddenSubtreeInsertionEffectCleanup,
5251
enableProfilerTimer,
5352
enableProfilerCommitHooks,
@@ -500,7 +499,7 @@ function commitBeforeMutationEffectsOnFiber(
500499
caseFunctionComponent:
501500
caseForwardRef:
502501
caseSimpleMemoComponent: {
503-
if(!enableEffectEventMutationPhase&&(flags&Update)!==NoFlags){
502+
if((flags&Update)!==NoFlags){
504503
constupdateQueue: FunctionComponentUpdateQueue|null=
505504
(finishedWork.updateQueue: any);
506505
consteventPayloads=updateQueue!==null ? updateQueue.events : null;
@@ -2047,19 +2046,6 @@ function commitMutationEffectsOnFiber(
20472046
commitReconciliationEffects(finishedWork,lanes);
20482047

20492048
if(flags&Update){
2050-
// Mutate event effect callbacks before insertion effects.
2051-
if(enableEffectEventMutationPhase){
2052-
constupdateQueue: FunctionComponentUpdateQueue|null=
2053-
(finishedWork.updateQueue: any);
2054-
consteventPayloads=
2055-
updateQueue!==null ? updateQueue.events : null;
2056-
if(eventPayloads!==null){
2057-
for(letii=0;ii<eventPayloads.length;ii++){
2058-
const{ref, nextImpl}=eventPayloads[ii];
2059-
ref.impl=nextImpl;
2060-
}
2061-
}
2062-
}
20632049
commitHookEffectListUnmount(
20642050
HookInsertion|HookHasEffect,
20652051
finishedWork,

‎packages/react-reconciler/src/ReactFiberFlags.js‎

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@
77
* @flow
88
*/
99

10-
import{
11-
enableCreateEventHandleAPI,
12-
enableEffectEventMutationPhase,
13-
}from'shared/ReactFeatureFlags';
10+
import{enableCreateEventHandleAPI}from'shared/ReactFeatureFlags';
1411

1512
exporttypeFlags=number;
1613

@@ -102,11 +99,10 @@ export const BeforeMutationMask: number =
10299
// TODO: Only need to visit Deletions during BeforeMutation phase if an
103100
// element is focused.
104101
Update|ChildDeletion|Visibility
105-
: // useEffectEvent uses the snapshot phase,
106-
// but we're moving it to the mutation phase.
107-
enableEffectEventMutationPhase
108-
? 0
109-
: Update);
102+
: // TODO: The useEffectEvent hook uses the snapshot phase for clean up but it
103+
// really should use the mutation phase for this or at least schedule an
104+
// explicit Snapshot phase flag for this.
105+
Update);
110106

111107
// For View Transition support we use the snapshot phase to scan the tree for potentially
112108
// affected ViewTransition components.

‎packages/react-reconciler/src/__tests__/useEffectEvent-test.js‎

Lines changed: 0 additions & 208 deletions
Original file line numberDiff line numberDiff line change
@@ -595,214 +595,6 @@ describe('useEffectEvent', () => {
595595
assertLog(['Effect value: 2','Event value: 2']);
596596
});
597597

598-
it('updates parent and child event effects before their respective effect lifecycles',async()=>{
599-
functionParent({value}){
600-
constparentEvent=useEffectEvent(()=>{
601-
Scheduler.log('Parent event: '+value);
602-
});
603-
604-
useInsertionEffect(()=>{
605-
Scheduler.log('Parent insertion');
606-
parentEvent();
607-
},[value]);
608-
609-
return<Childvalue={value}/>;
610-
}
611-
612-
functionChild({value}){
613-
constchildEvent=useEffectEvent(()=>{
614-
Scheduler.log('Child event: '+value);
615-
});
616-
617-
useInsertionEffect(()=>{
618-
Scheduler.log('Child insertion');
619-
childEvent();
620-
},[value]);
621-
622-
returnnull;
623-
}
624-
625-
ReactNoop.render(<Parentvalue={1}/>);
626-
awaitwaitForAll([
627-
'Child insertion',
628-
'Child event: 1',
629-
'Parent insertion',
630-
'Parent event: 1',
631-
]);
632-
633-
awaitact(()=>ReactNoop.render(<Parentvalue={2}/>));
634-
// Each component's event is updated before its own insertion effect runs
635-
assertLog([
636-
'Child insertion',
637-
'Child event: 2',
638-
'Parent insertion',
639-
'Parent event: 2',
640-
]);
641-
});
642-
643-
it('fires all insertion effects (interleaved) with useEffectEvent before firing any layout effects',async()=>{
644-
// This test mirrors the 'fires all insertion effects (interleaved) before firing any layout effects'
645-
// test in ReactHooksWithNoopRenderer-test.js, but adds useEffectEvent to verify that
646-
// event payloads are updated before each component's insertion effects run.
647-
// It also includes passive effects to verify the full effect lifecycle.
648-
letcommittedA='(empty)';
649-
letcommittedB='(empty)';
650-
651-
functionCounterA(props){
652-
constonEvent=useEffectEvent(()=>{
653-
return`Event A [A: ${committedA}, B: ${committedB}]`;
654-
});
655-
656-
useInsertionEffect(()=>{
657-
// Call the event function to verify it sees the latest value
658-
Scheduler.log(
659-
`Create Insertion A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
660-
);
661-
committedA=String(props.count);
662-
return()=>{
663-
Scheduler.log(
664-
`Destroy Insertion A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
665-
);
666-
};
667-
});
668-
669-
useLayoutEffect(()=>{
670-
Scheduler.log(
671-
`Create Layout A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
672-
);
673-
return()=>{
674-
Scheduler.log(
675-
`Destroy Layout A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
676-
);
677-
};
678-
});
679-
680-
useEffect(()=>{
681-
Scheduler.log(
682-
`Create Passive A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
683-
);
684-
return()=>{
685-
Scheduler.log(
686-
`Destroy Passive A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
687-
);
688-
};
689-
});
690-
691-
returnnull;
692-
}
693-
694-
functionCounterB(props){
695-
constonEvent=useEffectEvent(()=>{
696-
return`Event B [A: ${committedA}, B: ${committedB}]`;
697-
});
698-
699-
useInsertionEffect(()=>{
700-
// Call the event function to verify it sees the latest value
701-
Scheduler.log(
702-
`Create Insertion B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
703-
);
704-
committedB=String(props.count);
705-
return()=>{
706-
Scheduler.log(
707-
`Destroy Insertion B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
708-
);
709-
};
710-
});
711-
712-
useLayoutEffect(()=>{
713-
Scheduler.log(
714-
`Create Layout B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
715-
);
716-
return()=>{
717-
Scheduler.log(
718-
`Destroy Layout B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
719-
);
720-
};
721-
});
722-
723-
useEffect(()=>{
724-
Scheduler.log(
725-
`Create Passive B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
726-
);
727-
return()=>{
728-
Scheduler.log(
729-
`Destroy Passive B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
730-
);
731-
};
732-
});
733-
734-
returnnull;
735-
}
736-
737-
awaitact(async()=>{
738-
ReactNoop.render(
739-
<React.Fragment>
740-
<CounterAcount={0}/>
741-
<CounterBcount={0}/>
742-
</React.Fragment>,
743-
);
744-
// All insertion effects fire before all layout effects, then passive effects
745-
// Event functions should see the state AT THE TIME they're called
746-
awaitwaitForAll([
747-
// Insertion effects (mutation phase)
748-
'Create Insertion A [A: (empty), B: (empty)], event: Event A [A: (empty), B: (empty)]',
749-
'Create Insertion B [A: 0, B: (empty)], event: Event B [A: 0, B: (empty)]',
750-
// Layout effects
751-
'Create Layout A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
752-
'Create Layout B [A: 0, B: 0], event: Event B [A: 0, B: 0]',
753-
// Passive effects
754-
'Create Passive A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
755-
'Create Passive B [A: 0, B: 0], event: Event B [A: 0, B: 0]',
756-
]);
757-
expect([committedA,committedB]).toEqual(['0','0']);
758-
});
759-
760-
awaitact(async()=>{
761-
ReactNoop.render(
762-
<React.Fragment>
763-
<CounterAcount={1}/>
764-
<CounterBcount={1}/>
765-
</React.Fragment>,
766-
);
767-
awaitwaitForAll([
768-
// Component A: insertion destroy, then create
769-
'Destroy Insertion A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
770-
'Create Insertion A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
771-
// Component A: layout destroy (after insertion updated committedA)
772-
'Destroy Layout A [A: 1, B: 0], event: Event A [A: 1, B: 0]',
773-
// Component B: insertion destroy, then create
774-
'Destroy Insertion B [A: 1, B: 0], event: Event B [A: 1, B: 0]',
775-
'Create Insertion B [A: 1, B: 0], event: Event B [A: 1, B: 0]',
776-
// Component B: layout destroy (after insertion updated committedB)
777-
'Destroy Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
778-
// Layout creates
779-
'Create Layout A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
780-
'Create Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
781-
// Passive destroys then creates
782-
'Destroy Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
783-
'Destroy Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
784-
'Create Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
785-
'Create Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
786-
]);
787-
expect([committedA,committedB]).toEqual(['1','1']);
788-
});
789-
790-
// Unmount everything
791-
awaitact(async()=>{
792-
ReactNoop.render(null);
793-
awaitwaitForAll([
794-
// Insertion and layout destroys (mutation/layout phase)
795-
'Destroy Insertion A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
796-
'Destroy Layout A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
797-
'Destroy Insertion B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
798-
'Destroy Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
799-
// Passive destroys
800-
'Destroy Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
801-
'Destroy Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
802-
]);
803-
});
804-
});
805-
806598
it("doesn't provide a stable identity",async()=>{
807599
functionCounter({shouldRender, value}){
808600
constonClick=useEffectEvent(()=>{

‎packages/shared/ReactFeatureFlags.js‎

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,6 @@ export const enableFizzExternalRuntime = __EXPERIMENTAL__;
125125

126126
exportconstalwaysThrottleRetries: boolean=true;
127127

128-
// Gate whether useEffectEvent uses the mutation phase (true) or before-mutation
129-
// phase (false) for updating event function references.
130-
exportconstenableEffectEventMutationPhase: boolean=false;
131-
132128
exportconstpassChildrenWhenCloningPersistedNodes: boolean=false;
133129

134130
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;

‎packages/shared/forks/ReactFeatureFlags.native-fb-dynamic.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,3 @@ export const enableFragmentRefs = __VARIANT__;
2727
exportconstenableFragmentRefsScrollIntoView=__VARIANT__;
2828
exportconstenableFragmentRefsInstanceHandles=__VARIANT__;
2929
exportconstenableComponentPerformanceTrack=__VARIANT__;
30-
exportconstenableEffectEventMutationPhase=__VARIANT__;

‎packages/shared/forks/ReactFeatureFlags.native-fb.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ const dynamicFlags: DynamicExportsType = (dynamicFlagsUntyped: any);
2020
// the exports object every time a flag is read.
2121
exportconst{
2222
alwaysThrottleRetries,
23-
enableEffectEventMutationPhase,
2423
enableHiddenSubtreeInsertionEffectCleanup,
2524
enableObjectFiber,
2625
enableEagerAlternateStateNodeCleanup,

‎packages/shared/forks/ReactFeatureFlags.native-oss.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ export const enableSchedulingProfiler: boolean =
4646
!enableComponentPerformanceTrack&&__PROFILE__;
4747
exportconstenableScopeAPI: boolean=false;
4848
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
49-
exportconstenableEffectEventMutationPhase: boolean=false;
5049
exportconstenableSuspenseAvoidThisFallback: boolean=false;
5150
exportconstenableSuspenseCallback: boolean=false;
5251
exportconstenableTaint: boolean=true;

‎packages/shared/forks/ReactFeatureFlags.test-renderer.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ export const enableInfiniteRenderLoopDetection: boolean = false;
5858

5959
exportconstrenameElementSymbol: boolean=true;
6060
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
61-
exportconstenableEffectEventMutationPhase: boolean=false;
6261

6362
exportconstenableYieldingBeforePassive: boolean=true;
6463

‎packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ export const enableComponentPerformanceTrack = false;
4343
exportconstenablePerformanceIssueReporting=false;
4444
exportconstenableScopeAPI=false;
4545
exportconstenableEagerAlternateStateNodeCleanup=true;
46-
exportconstenableEffectEventMutationPhase=false;
4746
exportconstenableSuspenseAvoidThisFallback=false;
4847
exportconstenableSuspenseCallback=false;
4948
exportconstenableTaint=true;

‎packages/shared/forks/ReactFeatureFlags.test-renderer.www.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ export const renameElementSymbol: boolean = false;
6464

6565
exportconstenableObjectFiber: boolean=false;
6666
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
67-
exportconstenableEffectEventMutationPhase: boolean=false;
6867

6968
exportconstenableHydrationLaneScheduling: boolean=true;
7069

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [internal] revert change merged accidentally (#35546) · react/react@be3fb29 · GitHub
Skip to content

Commit be3fb29

Browse files
authored
[internal] revert change merged accidentally (#35546)
I accidentally pushed this to new flag to #35541 and then merged it. Reverting it so I can submit a review.
1 parent 23e5edd commit be3fb29

12 files changed

Lines changed: 6 additions & 245 deletions

‎packages/react-reconciler/src/ReactFiberCommitWork.js‎

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ import type {ViewTransitionState} from './ReactFiberViewTransitionComponent';
4747
import{
4848
alwaysThrottleRetries,
4949
enableCreateEventHandleAPI,
50-
enableEffectEventMutationPhase,
5150
enableHiddenSubtreeInsertionEffectCleanup,
5251
enableProfilerTimer,
5352
enableProfilerCommitHooks,
@@ -500,7 +499,7 @@ function commitBeforeMutationEffectsOnFiber(
500499
caseFunctionComponent:
501500
caseForwardRef:
502501
caseSimpleMemoComponent: {
503-
if(!enableEffectEventMutationPhase&&(flags&Update)!==NoFlags){
502+
if((flags&Update)!==NoFlags){
504503
constupdateQueue: FunctionComponentUpdateQueue|null=
505504
(finishedWork.updateQueue: any);
506505
consteventPayloads=updateQueue!==null ? updateQueue.events : null;
@@ -2047,19 +2046,6 @@ function commitMutationEffectsOnFiber(
20472046
commitReconciliationEffects(finishedWork,lanes);
20482047

20492048
if(flags&Update){
2050-
// Mutate event effect callbacks before insertion effects.
2051-
if(enableEffectEventMutationPhase){
2052-
constupdateQueue: FunctionComponentUpdateQueue|null=
2053-
(finishedWork.updateQueue: any);
2054-
consteventPayloads=
2055-
updateQueue!==null ? updateQueue.events : null;
2056-
if(eventPayloads!==null){
2057-
for(letii=0;ii<eventPayloads.length;ii++){
2058-
const{ref, nextImpl}=eventPayloads[ii];
2059-
ref.impl=nextImpl;
2060-
}
2061-
}
2062-
}
20632049
commitHookEffectListUnmount(
20642050
HookInsertion|HookHasEffect,
20652051
finishedWork,

‎packages/react-reconciler/src/ReactFiberFlags.js‎

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@
77
* @flow
88
*/
99

10-
import{
11-
enableCreateEventHandleAPI,
12-
enableEffectEventMutationPhase,
13-
}from'shared/ReactFeatureFlags';
10+
import{enableCreateEventHandleAPI}from'shared/ReactFeatureFlags';
1411

1512
exporttypeFlags=number;
1613

@@ -102,11 +99,10 @@ export const BeforeMutationMask: number =
10299
// TODO: Only need to visit Deletions during BeforeMutation phase if an
103100
// element is focused.
104101
Update|ChildDeletion|Visibility
105-
: // useEffectEvent uses the snapshot phase,
106-
// but we're moving it to the mutation phase.
107-
enableEffectEventMutationPhase
108-
? 0
109-
: Update);
102+
: // TODO: The useEffectEvent hook uses the snapshot phase for clean up but it
103+
// really should use the mutation phase for this or at least schedule an
104+
// explicit Snapshot phase flag for this.
105+
Update);
110106

111107
// For View Transition support we use the snapshot phase to scan the tree for potentially
112108
// affected ViewTransition components.

‎packages/react-reconciler/src/__tests__/useEffectEvent-test.js‎

Lines changed: 0 additions & 208 deletions
Original file line numberDiff line numberDiff line change
@@ -595,214 +595,6 @@ describe('useEffectEvent', () => {
595595
assertLog(['Effect value: 2','Event value: 2']);
596596
});
597597

598-
it('updates parent and child event effects before their respective effect lifecycles',async()=>{
599-
functionParent({value}){
600-
constparentEvent=useEffectEvent(()=>{
601-
Scheduler.log('Parent event: '+value);
602-
});
603-
604-
useInsertionEffect(()=>{
605-
Scheduler.log('Parent insertion');
606-
parentEvent();
607-
},[value]);
608-
609-
return<Childvalue={value}/>;
610-
}
611-
612-
functionChild({value}){
613-
constchildEvent=useEffectEvent(()=>{
614-
Scheduler.log('Child event: '+value);
615-
});
616-
617-
useInsertionEffect(()=>{
618-
Scheduler.log('Child insertion');
619-
childEvent();
620-
},[value]);
621-
622-
returnnull;
623-
}
624-
625-
ReactNoop.render(<Parentvalue={1}/>);
626-
awaitwaitForAll([
627-
'Child insertion',
628-
'Child event: 1',
629-
'Parent insertion',
630-
'Parent event: 1',
631-
]);
632-
633-
awaitact(()=>ReactNoop.render(<Parentvalue={2}/>));
634-
// Each component's event is updated before its own insertion effect runs
635-
assertLog([
636-
'Child insertion',
637-
'Child event: 2',
638-
'Parent insertion',
639-
'Parent event: 2',
640-
]);
641-
});
642-
643-
it('fires all insertion effects (interleaved) with useEffectEvent before firing any layout effects',async()=>{
644-
// This test mirrors the 'fires all insertion effects (interleaved) before firing any layout effects'
645-
// test in ReactHooksWithNoopRenderer-test.js, but adds useEffectEvent to verify that
646-
// event payloads are updated before each component's insertion effects run.
647-
// It also includes passive effects to verify the full effect lifecycle.
648-
letcommittedA='(empty)';
649-
letcommittedB='(empty)';
650-
651-
functionCounterA(props){
652-
constonEvent=useEffectEvent(()=>{
653-
return`Event A [A: ${committedA}, B: ${committedB}]`;
654-
});
655-
656-
useInsertionEffect(()=>{
657-
// Call the event function to verify it sees the latest value
658-
Scheduler.log(
659-
`Create Insertion A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
660-
);
661-
committedA=String(props.count);
662-
return()=>{
663-
Scheduler.log(
664-
`Destroy Insertion A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
665-
);
666-
};
667-
});
668-
669-
useLayoutEffect(()=>{
670-
Scheduler.log(
671-
`Create Layout A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
672-
);
673-
return()=>{
674-
Scheduler.log(
675-
`Destroy Layout A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
676-
);
677-
};
678-
});
679-
680-
useEffect(()=>{
681-
Scheduler.log(
682-
`Create Passive A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
683-
);
684-
return()=>{
685-
Scheduler.log(
686-
`Destroy Passive A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
687-
);
688-
};
689-
});
690-
691-
returnnull;
692-
}
693-
694-
functionCounterB(props){
695-
constonEvent=useEffectEvent(()=>{
696-
return`Event B [A: ${committedA}, B: ${committedB}]`;
697-
});
698-
699-
useInsertionEffect(()=>{
700-
// Call the event function to verify it sees the latest value
701-
Scheduler.log(
702-
`Create Insertion B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
703-
);
704-
committedB=String(props.count);
705-
return()=>{
706-
Scheduler.log(
707-
`Destroy Insertion B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
708-
);
709-
};
710-
});
711-
712-
useLayoutEffect(()=>{
713-
Scheduler.log(
714-
`Create Layout B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
715-
);
716-
return()=>{
717-
Scheduler.log(
718-
`Destroy Layout B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
719-
);
720-
};
721-
});
722-
723-
useEffect(()=>{
724-
Scheduler.log(
725-
`Create Passive B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
726-
);
727-
return()=>{
728-
Scheduler.log(
729-
`Destroy Passive B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
730-
);
731-
};
732-
});
733-
734-
returnnull;
735-
}
736-
737-
awaitact(async()=>{
738-
ReactNoop.render(
739-
<React.Fragment>
740-
<CounterAcount={0}/>
741-
<CounterBcount={0}/>
742-
</React.Fragment>,
743-
);
744-
// All insertion effects fire before all layout effects, then passive effects
745-
// Event functions should see the state AT THE TIME they're called
746-
awaitwaitForAll([
747-
// Insertion effects (mutation phase)
748-
'Create Insertion A [A: (empty), B: (empty)], event: Event A [A: (empty), B: (empty)]',
749-
'Create Insertion B [A: 0, B: (empty)], event: Event B [A: 0, B: (empty)]',
750-
// Layout effects
751-
'Create Layout A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
752-
'Create Layout B [A: 0, B: 0], event: Event B [A: 0, B: 0]',
753-
// Passive effects
754-
'Create Passive A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
755-
'Create Passive B [A: 0, B: 0], event: Event B [A: 0, B: 0]',
756-
]);
757-
expect([committedA,committedB]).toEqual(['0','0']);
758-
});
759-
760-
awaitact(async()=>{
761-
ReactNoop.render(
762-
<React.Fragment>
763-
<CounterAcount={1}/>
764-
<CounterBcount={1}/>
765-
</React.Fragment>,
766-
);
767-
awaitwaitForAll([
768-
// Component A: insertion destroy, then create
769-
'Destroy Insertion A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
770-
'Create Insertion A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
771-
// Component A: layout destroy (after insertion updated committedA)
772-
'Destroy Layout A [A: 1, B: 0], event: Event A [A: 1, B: 0]',
773-
// Component B: insertion destroy, then create
774-
'Destroy Insertion B [A: 1, B: 0], event: Event B [A: 1, B: 0]',
775-
'Create Insertion B [A: 1, B: 0], event: Event B [A: 1, B: 0]',
776-
// Component B: layout destroy (after insertion updated committedB)
777-
'Destroy Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
778-
// Layout creates
779-
'Create Layout A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
780-
'Create Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
781-
// Passive destroys then creates
782-
'Destroy Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
783-
'Destroy Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
784-
'Create Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
785-
'Create Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
786-
]);
787-
expect([committedA,committedB]).toEqual(['1','1']);
788-
});
789-
790-
// Unmount everything
791-
awaitact(async()=>{
792-
ReactNoop.render(null);
793-
awaitwaitForAll([
794-
// Insertion and layout destroys (mutation/layout phase)
795-
'Destroy Insertion A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
796-
'Destroy Layout A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
797-
'Destroy Insertion B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
798-
'Destroy Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
799-
// Passive destroys
800-
'Destroy Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
801-
'Destroy Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
802-
]);
803-
});
804-
});
805-
806598
it("doesn't provide a stable identity",async()=>{
807599
functionCounter({shouldRender, value}){
808600
constonClick=useEffectEvent(()=>{

‎packages/shared/ReactFeatureFlags.js‎

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,6 @@ export const enableFizzExternalRuntime = __EXPERIMENTAL__;
125125

126126
exportconstalwaysThrottleRetries: boolean=true;
127127

128-
// Gate whether useEffectEvent uses the mutation phase (true) or before-mutation
129-
// phase (false) for updating event function references.
130-
exportconstenableEffectEventMutationPhase: boolean=false;
131-
132128
exportconstpassChildrenWhenCloningPersistedNodes: boolean=false;
133129

134130
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;

‎packages/shared/forks/ReactFeatureFlags.native-fb-dynamic.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,3 @@ export const enableFragmentRefs = __VARIANT__;
2727
exportconstenableFragmentRefsScrollIntoView=__VARIANT__;
2828
exportconstenableFragmentRefsInstanceHandles=__VARIANT__;
2929
exportconstenableComponentPerformanceTrack=__VARIANT__;
30-
exportconstenableEffectEventMutationPhase=__VARIANT__;

‎packages/shared/forks/ReactFeatureFlags.native-fb.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ const dynamicFlags: DynamicExportsType = (dynamicFlagsUntyped: any);
2020
// the exports object every time a flag is read.
2121
exportconst{
2222
alwaysThrottleRetries,
23-
enableEffectEventMutationPhase,
2423
enableHiddenSubtreeInsertionEffectCleanup,
2524
enableObjectFiber,
2625
enableEagerAlternateStateNodeCleanup,

‎packages/shared/forks/ReactFeatureFlags.native-oss.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ export const enableSchedulingProfiler: boolean =
4646
!enableComponentPerformanceTrack&&__PROFILE__;
4747
exportconstenableScopeAPI: boolean=false;
4848
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
49-
exportconstenableEffectEventMutationPhase: boolean=false;
5049
exportconstenableSuspenseAvoidThisFallback: boolean=false;
5150
exportconstenableSuspenseCallback: boolean=false;
5251
exportconstenableTaint: boolean=true;

‎packages/shared/forks/ReactFeatureFlags.test-renderer.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ export const enableInfiniteRenderLoopDetection: boolean = false;
5858

5959
exportconstrenameElementSymbol: boolean=true;
6060
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
61-
exportconstenableEffectEventMutationPhase: boolean=false;
6261

6362
exportconstenableYieldingBeforePassive: boolean=true;
6463

‎packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ export const enableComponentPerformanceTrack = false;
4343
exportconstenablePerformanceIssueReporting=false;
4444
exportconstenableScopeAPI=false;
4545
exportconstenableEagerAlternateStateNodeCleanup=true;
46-
exportconstenableEffectEventMutationPhase=false;
4746
exportconstenableSuspenseAvoidThisFallback=false;
4847
exportconstenableSuspenseCallback=false;
4948
exportconstenableTaint=true;

‎packages/shared/forks/ReactFeatureFlags.test-renderer.www.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ export const renameElementSymbol: boolean = false;
6464

6565
exportconstenableObjectFiber: boolean=false;
6666
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
67-
exportconstenableEffectEventMutationPhase: boolean=false;
6867

6968
exportconstenableHydrationLaneScheduling: boolean=true;
7069

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [internal] revert change merged accidentally (#35546) · react/react@be3fb29 · GitHub
Skip to content

Commit be3fb29

Browse files
authored
[internal] revert change merged accidentally (#35546)
I accidentally pushed this to new flag to #35541 and then merged it. Reverting it so I can submit a review.
1 parent 23e5edd commit be3fb29

12 files changed

Lines changed: 6 additions & 245 deletions

‎packages/react-reconciler/src/ReactFiberCommitWork.js‎

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ import type {ViewTransitionState} from './ReactFiberViewTransitionComponent';
4747
import{
4848
alwaysThrottleRetries,
4949
enableCreateEventHandleAPI,
50-
enableEffectEventMutationPhase,
5150
enableHiddenSubtreeInsertionEffectCleanup,
5251
enableProfilerTimer,
5352
enableProfilerCommitHooks,
@@ -500,7 +499,7 @@ function commitBeforeMutationEffectsOnFiber(
500499
caseFunctionComponent:
501500
caseForwardRef:
502501
caseSimpleMemoComponent: {
503-
if(!enableEffectEventMutationPhase&&(flags&Update)!==NoFlags){
502+
if((flags&Update)!==NoFlags){
504503
constupdateQueue: FunctionComponentUpdateQueue|null=
505504
(finishedWork.updateQueue: any);
506505
consteventPayloads=updateQueue!==null ? updateQueue.events : null;
@@ -2047,19 +2046,6 @@ function commitMutationEffectsOnFiber(
20472046
commitReconciliationEffects(finishedWork,lanes);
20482047

20492048
if(flags&Update){
2050-
// Mutate event effect callbacks before insertion effects.
2051-
if(enableEffectEventMutationPhase){
2052-
constupdateQueue: FunctionComponentUpdateQueue|null=
2053-
(finishedWork.updateQueue: any);
2054-
consteventPayloads=
2055-
updateQueue!==null ? updateQueue.events : null;
2056-
if(eventPayloads!==null){
2057-
for(letii=0;ii<eventPayloads.length;ii++){
2058-
const{ref, nextImpl}=eventPayloads[ii];
2059-
ref.impl=nextImpl;
2060-
}
2061-
}
2062-
}
20632049
commitHookEffectListUnmount(
20642050
HookInsertion|HookHasEffect,
20652051
finishedWork,

‎packages/react-reconciler/src/ReactFiberFlags.js‎

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@
77
* @flow
88
*/
99

10-
import{
11-
enableCreateEventHandleAPI,
12-
enableEffectEventMutationPhase,
13-
}from'shared/ReactFeatureFlags';
10+
import{enableCreateEventHandleAPI}from'shared/ReactFeatureFlags';
1411

1512
exporttypeFlags=number;
1613

@@ -102,11 +99,10 @@ export const BeforeMutationMask: number =
10299
// TODO: Only need to visit Deletions during BeforeMutation phase if an
103100
// element is focused.
104101
Update|ChildDeletion|Visibility
105-
: // useEffectEvent uses the snapshot phase,
106-
// but we're moving it to the mutation phase.
107-
enableEffectEventMutationPhase
108-
? 0
109-
: Update);
102+
: // TODO: The useEffectEvent hook uses the snapshot phase for clean up but it
103+
// really should use the mutation phase for this or at least schedule an
104+
// explicit Snapshot phase flag for this.
105+
Update);
110106

111107
// For View Transition support we use the snapshot phase to scan the tree for potentially
112108
// affected ViewTransition components.

‎packages/react-reconciler/src/__tests__/useEffectEvent-test.js‎

Lines changed: 0 additions & 208 deletions
Original file line numberDiff line numberDiff line change
@@ -595,214 +595,6 @@ describe('useEffectEvent', () => {
595595
assertLog(['Effect value: 2','Event value: 2']);
596596
});
597597

598-
it('updates parent and child event effects before their respective effect lifecycles',async()=>{
599-
functionParent({value}){
600-
constparentEvent=useEffectEvent(()=>{
601-
Scheduler.log('Parent event: '+value);
602-
});
603-
604-
useInsertionEffect(()=>{
605-
Scheduler.log('Parent insertion');
606-
parentEvent();
607-
},[value]);
608-
609-
return<Childvalue={value}/>;
610-
}
611-
612-
functionChild({value}){
613-
constchildEvent=useEffectEvent(()=>{
614-
Scheduler.log('Child event: '+value);
615-
});
616-
617-
useInsertionEffect(()=>{
618-
Scheduler.log('Child insertion');
619-
childEvent();
620-
},[value]);
621-
622-
returnnull;
623-
}
624-
625-
ReactNoop.render(<Parentvalue={1}/>);
626-
awaitwaitForAll([
627-
'Child insertion',
628-
'Child event: 1',
629-
'Parent insertion',
630-
'Parent event: 1',
631-
]);
632-
633-
awaitact(()=>ReactNoop.render(<Parentvalue={2}/>));
634-
// Each component's event is updated before its own insertion effect runs
635-
assertLog([
636-
'Child insertion',
637-
'Child event: 2',
638-
'Parent insertion',
639-
'Parent event: 2',
640-
]);
641-
});
642-
643-
it('fires all insertion effects (interleaved) with useEffectEvent before firing any layout effects',async()=>{
644-
// This test mirrors the 'fires all insertion effects (interleaved) before firing any layout effects'
645-
// test in ReactHooksWithNoopRenderer-test.js, but adds useEffectEvent to verify that
646-
// event payloads are updated before each component's insertion effects run.
647-
// It also includes passive effects to verify the full effect lifecycle.
648-
letcommittedA='(empty)';
649-
letcommittedB='(empty)';
650-
651-
functionCounterA(props){
652-
constonEvent=useEffectEvent(()=>{
653-
return`Event A [A: ${committedA}, B: ${committedB}]`;
654-
});
655-
656-
useInsertionEffect(()=>{
657-
// Call the event function to verify it sees the latest value
658-
Scheduler.log(
659-
`Create Insertion A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
660-
);
661-
committedA=String(props.count);
662-
return()=>{
663-
Scheduler.log(
664-
`Destroy Insertion A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
665-
);
666-
};
667-
});
668-
669-
useLayoutEffect(()=>{
670-
Scheduler.log(
671-
`Create Layout A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
672-
);
673-
return()=>{
674-
Scheduler.log(
675-
`Destroy Layout A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
676-
);
677-
};
678-
});
679-
680-
useEffect(()=>{
681-
Scheduler.log(
682-
`Create Passive A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
683-
);
684-
return()=>{
685-
Scheduler.log(
686-
`Destroy Passive A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
687-
);
688-
};
689-
});
690-
691-
returnnull;
692-
}
693-
694-
functionCounterB(props){
695-
constonEvent=useEffectEvent(()=>{
696-
return`Event B [A: ${committedA}, B: ${committedB}]`;
697-
});
698-
699-
useInsertionEffect(()=>{
700-
// Call the event function to verify it sees the latest value
701-
Scheduler.log(
702-
`Create Insertion B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
703-
);
704-
committedB=String(props.count);
705-
return()=>{
706-
Scheduler.log(
707-
`Destroy Insertion B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
708-
);
709-
};
710-
});
711-
712-
useLayoutEffect(()=>{
713-
Scheduler.log(
714-
`Create Layout B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
715-
);
716-
return()=>{
717-
Scheduler.log(
718-
`Destroy Layout B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
719-
);
720-
};
721-
});
722-
723-
useEffect(()=>{
724-
Scheduler.log(
725-
`Create Passive B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
726-
);
727-
return()=>{
728-
Scheduler.log(
729-
`Destroy Passive B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
730-
);
731-
};
732-
});
733-
734-
returnnull;
735-
}
736-
737-
awaitact(async()=>{
738-
ReactNoop.render(
739-
<React.Fragment>
740-
<CounterAcount={0}/>
741-
<CounterBcount={0}/>
742-
</React.Fragment>,
743-
);
744-
// All insertion effects fire before all layout effects, then passive effects
745-
// Event functions should see the state AT THE TIME they're called
746-
awaitwaitForAll([
747-
// Insertion effects (mutation phase)
748-
'Create Insertion A [A: (empty), B: (empty)], event: Event A [A: (empty), B: (empty)]',
749-
'Create Insertion B [A: 0, B: (empty)], event: Event B [A: 0, B: (empty)]',
750-
// Layout effects
751-
'Create Layout A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
752-
'Create Layout B [A: 0, B: 0], event: Event B [A: 0, B: 0]',
753-
// Passive effects
754-
'Create Passive A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
755-
'Create Passive B [A: 0, B: 0], event: Event B [A: 0, B: 0]',
756-
]);
757-
expect([committedA,committedB]).toEqual(['0','0']);
758-
});
759-
760-
awaitact(async()=>{
761-
ReactNoop.render(
762-
<React.Fragment>
763-
<CounterAcount={1}/>
764-
<CounterBcount={1}/>
765-
</React.Fragment>,
766-
);
767-
awaitwaitForAll([
768-
// Component A: insertion destroy, then create
769-
'Destroy Insertion A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
770-
'Create Insertion A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
771-
// Component A: layout destroy (after insertion updated committedA)
772-
'Destroy Layout A [A: 1, B: 0], event: Event A [A: 1, B: 0]',
773-
// Component B: insertion destroy, then create
774-
'Destroy Insertion B [A: 1, B: 0], event: Event B [A: 1, B: 0]',
775-
'Create Insertion B [A: 1, B: 0], event: Event B [A: 1, B: 0]',
776-
// Component B: layout destroy (after insertion updated committedB)
777-
'Destroy Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
778-
// Layout creates
779-
'Create Layout A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
780-
'Create Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
781-
// Passive destroys then creates
782-
'Destroy Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
783-
'Destroy Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
784-
'Create Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
785-
'Create Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
786-
]);
787-
expect([committedA,committedB]).toEqual(['1','1']);
788-
});
789-
790-
// Unmount everything
791-
awaitact(async()=>{
792-
ReactNoop.render(null);
793-
awaitwaitForAll([
794-
// Insertion and layout destroys (mutation/layout phase)
795-
'Destroy Insertion A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
796-
'Destroy Layout A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
797-
'Destroy Insertion B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
798-
'Destroy Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
799-
// Passive destroys
800-
'Destroy Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
801-
'Destroy Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
802-
]);
803-
});
804-
});
805-
806598
it("doesn't provide a stable identity",async()=>{
807599
functionCounter({shouldRender, value}){
808600
constonClick=useEffectEvent(()=>{

‎packages/shared/ReactFeatureFlags.js‎

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,6 @@ export const enableFizzExternalRuntime = __EXPERIMENTAL__;
125125

126126
exportconstalwaysThrottleRetries: boolean=true;
127127

128-
// Gate whether useEffectEvent uses the mutation phase (true) or before-mutation
129-
// phase (false) for updating event function references.
130-
exportconstenableEffectEventMutationPhase: boolean=false;
131-
132128
exportconstpassChildrenWhenCloningPersistedNodes: boolean=false;
133129

134130
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;

‎packages/shared/forks/ReactFeatureFlags.native-fb-dynamic.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,3 @@ export const enableFragmentRefs = __VARIANT__;
2727
exportconstenableFragmentRefsScrollIntoView=__VARIANT__;
2828
exportconstenableFragmentRefsInstanceHandles=__VARIANT__;
2929
exportconstenableComponentPerformanceTrack=__VARIANT__;
30-
exportconstenableEffectEventMutationPhase=__VARIANT__;

‎packages/shared/forks/ReactFeatureFlags.native-fb.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ const dynamicFlags: DynamicExportsType = (dynamicFlagsUntyped: any);
2020
// the exports object every time a flag is read.
2121
exportconst{
2222
alwaysThrottleRetries,
23-
enableEffectEventMutationPhase,
2423
enableHiddenSubtreeInsertionEffectCleanup,
2524
enableObjectFiber,
2625
enableEagerAlternateStateNodeCleanup,

‎packages/shared/forks/ReactFeatureFlags.native-oss.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ export const enableSchedulingProfiler: boolean =
4646
!enableComponentPerformanceTrack&&__PROFILE__;
4747
exportconstenableScopeAPI: boolean=false;
4848
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
49-
exportconstenableEffectEventMutationPhase: boolean=false;
5049
exportconstenableSuspenseAvoidThisFallback: boolean=false;
5150
exportconstenableSuspenseCallback: boolean=false;
5251
exportconstenableTaint: boolean=true;

‎packages/shared/forks/ReactFeatureFlags.test-renderer.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ export const enableInfiniteRenderLoopDetection: boolean = false;
5858

5959
exportconstrenameElementSymbol: boolean=true;
6060
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
61-
exportconstenableEffectEventMutationPhase: boolean=false;
6261

6362
exportconstenableYieldingBeforePassive: boolean=true;
6463

‎packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ export const enableComponentPerformanceTrack = false;
4343
exportconstenablePerformanceIssueReporting=false;
4444
exportconstenableScopeAPI=false;
4545
exportconstenableEagerAlternateStateNodeCleanup=true;
46-
exportconstenableEffectEventMutationPhase=false;
4746
exportconstenableSuspenseAvoidThisFallback=false;
4847
exportconstenableSuspenseCallback=false;
4948
exportconstenableTaint=true;

‎packages/shared/forks/ReactFeatureFlags.test-renderer.www.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ export const renameElementSymbol: boolean = false;
6464

6565
exportconstenableObjectFiber: boolean=false;
6666
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
67-
exportconstenableEffectEventMutationPhase: boolean=false;
6867

6968
exportconstenableHydrationLaneScheduling: boolean=true;
7069

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' [internal] revert change merged accidentally (#35546) · react/react@be3fb29 · GitHub
Skip to content

Commit be3fb29

Browse files
authored
[internal] revert change merged accidentally (#35546)
I accidentally pushed this to new flag to #35541 and then merged it. Reverting it so I can submit a review.
1 parent 23e5edd commit be3fb29

12 files changed

Lines changed: 6 additions & 245 deletions

‎packages/react-reconciler/src/ReactFiberCommitWork.js‎

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ import type {ViewTransitionState} from './ReactFiberViewTransitionComponent';
4747
import{
4848
alwaysThrottleRetries,
4949
enableCreateEventHandleAPI,
50-
enableEffectEventMutationPhase,
5150
enableHiddenSubtreeInsertionEffectCleanup,
5251
enableProfilerTimer,
5352
enableProfilerCommitHooks,
@@ -500,7 +499,7 @@ function commitBeforeMutationEffectsOnFiber(
500499
caseFunctionComponent:
501500
caseForwardRef:
502501
caseSimpleMemoComponent: {
503-
if(!enableEffectEventMutationPhase&&(flags&Update)!==NoFlags){
502+
if((flags&Update)!==NoFlags){
504503
constupdateQueue: FunctionComponentUpdateQueue|null=
505504
(finishedWork.updateQueue: any);
506505
consteventPayloads=updateQueue!==null ? updateQueue.events : null;
@@ -2047,19 +2046,6 @@ function commitMutationEffectsOnFiber(
20472046
commitReconciliationEffects(finishedWork,lanes);
20482047

20492048
if(flags&Update){
2050-
// Mutate event effect callbacks before insertion effects.
2051-
if(enableEffectEventMutationPhase){
2052-
constupdateQueue: FunctionComponentUpdateQueue|null=
2053-
(finishedWork.updateQueue: any);
2054-
consteventPayloads=
2055-
updateQueue!==null ? updateQueue.events : null;
2056-
if(eventPayloads!==null){
2057-
for(letii=0;ii<eventPayloads.length;ii++){
2058-
const{ref, nextImpl}=eventPayloads[ii];
2059-
ref.impl=nextImpl;
2060-
}
2061-
}
2062-
}
20632049
commitHookEffectListUnmount(
20642050
HookInsertion|HookHasEffect,
20652051
finishedWork,

‎packages/react-reconciler/src/ReactFiberFlags.js‎

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@
77
* @flow
88
*/
99

10-
import{
11-
enableCreateEventHandleAPI,
12-
enableEffectEventMutationPhase,
13-
}from'shared/ReactFeatureFlags';
10+
import{enableCreateEventHandleAPI}from'shared/ReactFeatureFlags';
1411

1512
exporttypeFlags=number;
1613

@@ -102,11 +99,10 @@ export const BeforeMutationMask: number =
10299
// TODO: Only need to visit Deletions during BeforeMutation phase if an
103100
// element is focused.
104101
Update|ChildDeletion|Visibility
105-
: // useEffectEvent uses the snapshot phase,
106-
// but we're moving it to the mutation phase.
107-
enableEffectEventMutationPhase
108-
? 0
109-
: Update);
102+
: // TODO: The useEffectEvent hook uses the snapshot phase for clean up but it
103+
// really should use the mutation phase for this or at least schedule an
104+
// explicit Snapshot phase flag for this.
105+
Update);
110106

111107
// For View Transition support we use the snapshot phase to scan the tree for potentially
112108
// affected ViewTransition components.

‎packages/react-reconciler/src/__tests__/useEffectEvent-test.js‎

Lines changed: 0 additions & 208 deletions
Original file line numberDiff line numberDiff line change
@@ -595,214 +595,6 @@ describe('useEffectEvent', () => {
595595
assertLog(['Effect value: 2','Event value: 2']);
596596
});
597597

598-
it('updates parent and child event effects before their respective effect lifecycles',async()=>{
599-
functionParent({value}){
600-
constparentEvent=useEffectEvent(()=>{
601-
Scheduler.log('Parent event: '+value);
602-
});
603-
604-
useInsertionEffect(()=>{
605-
Scheduler.log('Parent insertion');
606-
parentEvent();
607-
},[value]);
608-
609-
return<Childvalue={value}/>;
610-
}
611-
612-
functionChild({value}){
613-
constchildEvent=useEffectEvent(()=>{
614-
Scheduler.log('Child event: '+value);
615-
});
616-
617-
useInsertionEffect(()=>{
618-
Scheduler.log('Child insertion');
619-
childEvent();
620-
},[value]);
621-
622-
returnnull;
623-
}
624-
625-
ReactNoop.render(<Parentvalue={1}/>);
626-
awaitwaitForAll([
627-
'Child insertion',
628-
'Child event: 1',
629-
'Parent insertion',
630-
'Parent event: 1',
631-
]);
632-
633-
awaitact(()=>ReactNoop.render(<Parentvalue={2}/>));
634-
// Each component's event is updated before its own insertion effect runs
635-
assertLog([
636-
'Child insertion',
637-
'Child event: 2',
638-
'Parent insertion',
639-
'Parent event: 2',
640-
]);
641-
});
642-
643-
it('fires all insertion effects (interleaved) with useEffectEvent before firing any layout effects',async()=>{
644-
// This test mirrors the 'fires all insertion effects (interleaved) before firing any layout effects'
645-
// test in ReactHooksWithNoopRenderer-test.js, but adds useEffectEvent to verify that
646-
// event payloads are updated before each component's insertion effects run.
647-
// It also includes passive effects to verify the full effect lifecycle.
648-
letcommittedA='(empty)';
649-
letcommittedB='(empty)';
650-
651-
functionCounterA(props){
652-
constonEvent=useEffectEvent(()=>{
653-
return`Event A [A: ${committedA}, B: ${committedB}]`;
654-
});
655-
656-
useInsertionEffect(()=>{
657-
// Call the event function to verify it sees the latest value
658-
Scheduler.log(
659-
`Create Insertion A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
660-
);
661-
committedA=String(props.count);
662-
return()=>{
663-
Scheduler.log(
664-
`Destroy Insertion A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
665-
);
666-
};
667-
});
668-
669-
useLayoutEffect(()=>{
670-
Scheduler.log(
671-
`Create Layout A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
672-
);
673-
return()=>{
674-
Scheduler.log(
675-
`Destroy Layout A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
676-
);
677-
};
678-
});
679-
680-
useEffect(()=>{
681-
Scheduler.log(
682-
`Create Passive A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
683-
);
684-
return()=>{
685-
Scheduler.log(
686-
`Destroy Passive A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
687-
);
688-
};
689-
});
690-
691-
returnnull;
692-
}
693-
694-
functionCounterB(props){
695-
constonEvent=useEffectEvent(()=>{
696-
return`Event B [A: ${committedA}, B: ${committedB}]`;
697-
});
698-
699-
useInsertionEffect(()=>{
700-
// Call the event function to verify it sees the latest value
701-
Scheduler.log(
702-
`Create Insertion B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
703-
);
704-
committedB=String(props.count);
705-
return()=>{
706-
Scheduler.log(
707-
`Destroy Insertion B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
708-
);
709-
};
710-
});
711-
712-
useLayoutEffect(()=>{
713-
Scheduler.log(
714-
`Create Layout B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
715-
);
716-
return()=>{
717-
Scheduler.log(
718-
`Destroy Layout B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
719-
);
720-
};
721-
});
722-
723-
useEffect(()=>{
724-
Scheduler.log(
725-
`Create Passive B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
726-
);
727-
return()=>{
728-
Scheduler.log(
729-
`Destroy Passive B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
730-
);
731-
};
732-
});
733-
734-
returnnull;
735-
}
736-
737-
awaitact(async()=>{
738-
ReactNoop.render(
739-
<React.Fragment>
740-
<CounterAcount={0}/>
741-
<CounterBcount={0}/>
742-
</React.Fragment>,
743-
);
744-
// All insertion effects fire before all layout effects, then passive effects
745-
// Event functions should see the state AT THE TIME they're called
746-
awaitwaitForAll([
747-
// Insertion effects (mutation phase)
748-
'Create Insertion A [A: (empty), B: (empty)], event: Event A [A: (empty), B: (empty)]',
749-
'Create Insertion B [A: 0, B: (empty)], event: Event B [A: 0, B: (empty)]',
750-
// Layout effects
751-
'Create Layout A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
752-
'Create Layout B [A: 0, B: 0], event: Event B [A: 0, B: 0]',
753-
// Passive effects
754-
'Create Passive A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
755-
'Create Passive B [A: 0, B: 0], event: Event B [A: 0, B: 0]',
756-
]);
757-
expect([committedA,committedB]).toEqual(['0','0']);
758-
});
759-
760-
awaitact(async()=>{
761-
ReactNoop.render(
762-
<React.Fragment>
763-
<CounterAcount={1}/>
764-
<CounterBcount={1}/>
765-
</React.Fragment>,
766-
);
767-
awaitwaitForAll([
768-
// Component A: insertion destroy, then create
769-
'Destroy Insertion A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
770-
'Create Insertion A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
771-
// Component A: layout destroy (after insertion updated committedA)
772-
'Destroy Layout A [A: 1, B: 0], event: Event A [A: 1, B: 0]',
773-
// Component B: insertion destroy, then create
774-
'Destroy Insertion B [A: 1, B: 0], event: Event B [A: 1, B: 0]',
775-
'Create Insertion B [A: 1, B: 0], event: Event B [A: 1, B: 0]',
776-
// Component B: layout destroy (after insertion updated committedB)
777-
'Destroy Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
778-
// Layout creates
779-
'Create Layout A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
780-
'Create Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
781-
// Passive destroys then creates
782-
'Destroy Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
783-
'Destroy Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
784-
'Create Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
785-
'Create Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
786-
]);
787-
expect([committedA,committedB]).toEqual(['1','1']);
788-
});
789-
790-
// Unmount everything
791-
awaitact(async()=>{
792-
ReactNoop.render(null);
793-
awaitwaitForAll([
794-
// Insertion and layout destroys (mutation/layout phase)
795-
'Destroy Insertion A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
796-
'Destroy Layout A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
797-
'Destroy Insertion B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
798-
'Destroy Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
799-
// Passive destroys
800-
'Destroy Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
801-
'Destroy Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
802-
]);
803-
});
804-
});
805-
806598
it("doesn't provide a stable identity",async()=>{
807599
functionCounter({shouldRender, value}){
808600
constonClick=useEffectEvent(()=>{

‎packages/shared/ReactFeatureFlags.js‎

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,6 @@ export const enableFizzExternalRuntime = __EXPERIMENTAL__;
125125

126126
exportconstalwaysThrottleRetries: boolean=true;
127127

128-
// Gate whether useEffectEvent uses the mutation phase (true) or before-mutation
129-
// phase (false) for updating event function references.
130-
exportconstenableEffectEventMutationPhase: boolean=false;
131-
132128
exportconstpassChildrenWhenCloningPersistedNodes: boolean=false;
133129

134130
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;

‎packages/shared/forks/ReactFeatureFlags.native-fb-dynamic.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,3 @@ export const enableFragmentRefs = __VARIANT__;
2727
exportconstenableFragmentRefsScrollIntoView=__VARIANT__;
2828
exportconstenableFragmentRefsInstanceHandles=__VARIANT__;
2929
exportconstenableComponentPerformanceTrack=__VARIANT__;
30-
exportconstenableEffectEventMutationPhase=__VARIANT__;

‎packages/shared/forks/ReactFeatureFlags.native-fb.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ const dynamicFlags: DynamicExportsType = (dynamicFlagsUntyped: any);
2020
// the exports object every time a flag is read.
2121
exportconst{
2222
alwaysThrottleRetries,
23-
enableEffectEventMutationPhase,
2423
enableHiddenSubtreeInsertionEffectCleanup,
2524
enableObjectFiber,
2625
enableEagerAlternateStateNodeCleanup,

‎packages/shared/forks/ReactFeatureFlags.native-oss.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ export const enableSchedulingProfiler: boolean =
4646
!enableComponentPerformanceTrack&&__PROFILE__;
4747
exportconstenableScopeAPI: boolean=false;
4848
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
49-
exportconstenableEffectEventMutationPhase: boolean=false;
5049
exportconstenableSuspenseAvoidThisFallback: boolean=false;
5150
exportconstenableSuspenseCallback: boolean=false;
5251
exportconstenableTaint: boolean=true;

‎packages/shared/forks/ReactFeatureFlags.test-renderer.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ export const enableInfiniteRenderLoopDetection: boolean = false;
5858

5959
exportconstrenameElementSymbol: boolean=true;
6060
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
61-
exportconstenableEffectEventMutationPhase: boolean=false;
6261

6362
exportconstenableYieldingBeforePassive: boolean=true;
6463

‎packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ export const enableComponentPerformanceTrack = false;
4343
exportconstenablePerformanceIssueReporting=false;
4444
exportconstenableScopeAPI=false;
4545
exportconstenableEagerAlternateStateNodeCleanup=true;
46-
exportconstenableEffectEventMutationPhase=false;
4746
exportconstenableSuspenseAvoidThisFallback=false;
4847
exportconstenableSuspenseCallback=false;
4948
exportconstenableTaint=true;

‎packages/shared/forks/ReactFeatureFlags.test-renderer.www.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ export const renameElementSymbol: boolean = false;
6464

6565
exportconstenableObjectFiber: boolean=false;
6666
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
67-
exportconstenableEffectEventMutationPhase: boolean=false;
6867

6968
exportconstenableHydrationLaneScheduling: boolean=true;
7069

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [internal] revert change merged accidentally (#35546) · react/react@be3fb29 · GitHub
Skip to content

Commit be3fb29

Browse files
authored
[internal] revert change merged accidentally (#35546)
I accidentally pushed this to new flag to #35541 and then merged it. Reverting it so I can submit a review.
1 parent 23e5edd commit be3fb29

12 files changed

Lines changed: 6 additions & 245 deletions

‎packages/react-reconciler/src/ReactFiberCommitWork.js‎

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ import type {ViewTransitionState} from './ReactFiberViewTransitionComponent';
4747
import{
4848
alwaysThrottleRetries,
4949
enableCreateEventHandleAPI,
50-
enableEffectEventMutationPhase,
5150
enableHiddenSubtreeInsertionEffectCleanup,
5251
enableProfilerTimer,
5352
enableProfilerCommitHooks,
@@ -500,7 +499,7 @@ function commitBeforeMutationEffectsOnFiber(
500499
caseFunctionComponent:
501500
caseForwardRef:
502501
caseSimpleMemoComponent: {
503-
if(!enableEffectEventMutationPhase&&(flags&Update)!==NoFlags){
502+
if((flags&Update)!==NoFlags){
504503
constupdateQueue: FunctionComponentUpdateQueue|null=
505504
(finishedWork.updateQueue: any);
506505
consteventPayloads=updateQueue!==null ? updateQueue.events : null;
@@ -2047,19 +2046,6 @@ function commitMutationEffectsOnFiber(
20472046
commitReconciliationEffects(finishedWork,lanes);
20482047

20492048
if(flags&Update){
2050-
// Mutate event effect callbacks before insertion effects.
2051-
if(enableEffectEventMutationPhase){
2052-
constupdateQueue: FunctionComponentUpdateQueue|null=
2053-
(finishedWork.updateQueue: any);
2054-
consteventPayloads=
2055-
updateQueue!==null ? updateQueue.events : null;
2056-
if(eventPayloads!==null){
2057-
for(letii=0;ii<eventPayloads.length;ii++){
2058-
const{ref, nextImpl}=eventPayloads[ii];
2059-
ref.impl=nextImpl;
2060-
}
2061-
}
2062-
}
20632049
commitHookEffectListUnmount(
20642050
HookInsertion|HookHasEffect,
20652051
finishedWork,

‎packages/react-reconciler/src/ReactFiberFlags.js‎

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@
77
* @flow
88
*/
99

10-
import{
11-
enableCreateEventHandleAPI,
12-
enableEffectEventMutationPhase,
13-
}from'shared/ReactFeatureFlags';
10+
import{enableCreateEventHandleAPI}from'shared/ReactFeatureFlags';
1411

1512
exporttypeFlags=number;
1613

@@ -102,11 +99,10 @@ export const BeforeMutationMask: number =
10299
// TODO: Only need to visit Deletions during BeforeMutation phase if an
103100
// element is focused.
104101
Update|ChildDeletion|Visibility
105-
: // useEffectEvent uses the snapshot phase,
106-
// but we're moving it to the mutation phase.
107-
enableEffectEventMutationPhase
108-
? 0
109-
: Update);
102+
: // TODO: The useEffectEvent hook uses the snapshot phase for clean up but it
103+
// really should use the mutation phase for this or at least schedule an
104+
// explicit Snapshot phase flag for this.
105+
Update);
110106

111107
// For View Transition support we use the snapshot phase to scan the tree for potentially
112108
// affected ViewTransition components.

‎packages/react-reconciler/src/__tests__/useEffectEvent-test.js‎

Lines changed: 0 additions & 208 deletions
Original file line numberDiff line numberDiff line change
@@ -595,214 +595,6 @@ describe('useEffectEvent', () => {
595595
assertLog(['Effect value: 2','Event value: 2']);
596596
});
597597

598-
it('updates parent and child event effects before their respective effect lifecycles',async()=>{
599-
functionParent({value}){
600-
constparentEvent=useEffectEvent(()=>{
601-
Scheduler.log('Parent event: '+value);
602-
});
603-
604-
useInsertionEffect(()=>{
605-
Scheduler.log('Parent insertion');
606-
parentEvent();
607-
},[value]);
608-
609-
return<Childvalue={value}/>;
610-
}
611-
612-
functionChild({value}){
613-
constchildEvent=useEffectEvent(()=>{
614-
Scheduler.log('Child event: '+value);
615-
});
616-
617-
useInsertionEffect(()=>{
618-
Scheduler.log('Child insertion');
619-
childEvent();
620-
},[value]);
621-
622-
returnnull;
623-
}
624-
625-
ReactNoop.render(<Parentvalue={1}/>);
626-
awaitwaitForAll([
627-
'Child insertion',
628-
'Child event: 1',
629-
'Parent insertion',
630-
'Parent event: 1',
631-
]);
632-
633-
awaitact(()=>ReactNoop.render(<Parentvalue={2}/>));
634-
// Each component's event is updated before its own insertion effect runs
635-
assertLog([
636-
'Child insertion',
637-
'Child event: 2',
638-
'Parent insertion',
639-
'Parent event: 2',
640-
]);
641-
});
642-
643-
it('fires all insertion effects (interleaved) with useEffectEvent before firing any layout effects',async()=>{
644-
// This test mirrors the 'fires all insertion effects (interleaved) before firing any layout effects'
645-
// test in ReactHooksWithNoopRenderer-test.js, but adds useEffectEvent to verify that
646-
// event payloads are updated before each component's insertion effects run.
647-
// It also includes passive effects to verify the full effect lifecycle.
648-
letcommittedA='(empty)';
649-
letcommittedB='(empty)';
650-
651-
functionCounterA(props){
652-
constonEvent=useEffectEvent(()=>{
653-
return`Event A [A: ${committedA}, B: ${committedB}]`;
654-
});
655-
656-
useInsertionEffect(()=>{
657-
// Call the event function to verify it sees the latest value
658-
Scheduler.log(
659-
`Create Insertion A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
660-
);
661-
committedA=String(props.count);
662-
return()=>{
663-
Scheduler.log(
664-
`Destroy Insertion A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
665-
);
666-
};
667-
});
668-
669-
useLayoutEffect(()=>{
670-
Scheduler.log(
671-
`Create Layout A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
672-
);
673-
return()=>{
674-
Scheduler.log(
675-
`Destroy Layout A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
676-
);
677-
};
678-
});
679-
680-
useEffect(()=>{
681-
Scheduler.log(
682-
`Create Passive A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
683-
);
684-
return()=>{
685-
Scheduler.log(
686-
`Destroy Passive A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
687-
);
688-
};
689-
});
690-
691-
returnnull;
692-
}
693-
694-
functionCounterB(props){
695-
constonEvent=useEffectEvent(()=>{
696-
return`Event B [A: ${committedA}, B: ${committedB}]`;
697-
});
698-
699-
useInsertionEffect(()=>{
700-
// Call the event function to verify it sees the latest value
701-
Scheduler.log(
702-
`Create Insertion B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
703-
);
704-
committedB=String(props.count);
705-
return()=>{
706-
Scheduler.log(
707-
`Destroy Insertion B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
708-
);
709-
};
710-
});
711-
712-
useLayoutEffect(()=>{
713-
Scheduler.log(
714-
`Create Layout B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
715-
);
716-
return()=>{
717-
Scheduler.log(
718-
`Destroy Layout B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
719-
);
720-
};
721-
});
722-
723-
useEffect(()=>{
724-
Scheduler.log(
725-
`Create Passive B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
726-
);
727-
return()=>{
728-
Scheduler.log(
729-
`Destroy Passive B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
730-
);
731-
};
732-
});
733-
734-
returnnull;
735-
}
736-
737-
awaitact(async()=>{
738-
ReactNoop.render(
739-
<React.Fragment>
740-
<CounterAcount={0}/>
741-
<CounterBcount={0}/>
742-
</React.Fragment>,
743-
);
744-
// All insertion effects fire before all layout effects, then passive effects
745-
// Event functions should see the state AT THE TIME they're called
746-
awaitwaitForAll([
747-
// Insertion effects (mutation phase)
748-
'Create Insertion A [A: (empty), B: (empty)], event: Event A [A: (empty), B: (empty)]',
749-
'Create Insertion B [A: 0, B: (empty)], event: Event B [A: 0, B: (empty)]',
750-
// Layout effects
751-
'Create Layout A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
752-
'Create Layout B [A: 0, B: 0], event: Event B [A: 0, B: 0]',
753-
// Passive effects
754-
'Create Passive A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
755-
'Create Passive B [A: 0, B: 0], event: Event B [A: 0, B: 0]',
756-
]);
757-
expect([committedA,committedB]).toEqual(['0','0']);
758-
});
759-
760-
awaitact(async()=>{
761-
ReactNoop.render(
762-
<React.Fragment>
763-
<CounterAcount={1}/>
764-
<CounterBcount={1}/>
765-
</React.Fragment>,
766-
);
767-
awaitwaitForAll([
768-
// Component A: insertion destroy, then create
769-
'Destroy Insertion A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
770-
'Create Insertion A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
771-
// Component A: layout destroy (after insertion updated committedA)
772-
'Destroy Layout A [A: 1, B: 0], event: Event A [A: 1, B: 0]',
773-
// Component B: insertion destroy, then create
774-
'Destroy Insertion B [A: 1, B: 0], event: Event B [A: 1, B: 0]',
775-
'Create Insertion B [A: 1, B: 0], event: Event B [A: 1, B: 0]',
776-
// Component B: layout destroy (after insertion updated committedB)
777-
'Destroy Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
778-
// Layout creates
779-
'Create Layout A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
780-
'Create Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
781-
// Passive destroys then creates
782-
'Destroy Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
783-
'Destroy Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
784-
'Create Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
785-
'Create Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
786-
]);
787-
expect([committedA,committedB]).toEqual(['1','1']);
788-
});
789-
790-
// Unmount everything
791-
awaitact(async()=>{
792-
ReactNoop.render(null);
793-
awaitwaitForAll([
794-
// Insertion and layout destroys (mutation/layout phase)
795-
'Destroy Insertion A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
796-
'Destroy Layout A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
797-
'Destroy Insertion B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
798-
'Destroy Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
799-
// Passive destroys
800-
'Destroy Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
801-
'Destroy Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
802-
]);
803-
});
804-
});
805-
806598
it("doesn't provide a stable identity",async()=>{
807599
functionCounter({shouldRender, value}){
808600
constonClick=useEffectEvent(()=>{

‎packages/shared/ReactFeatureFlags.js‎

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,6 @@ export const enableFizzExternalRuntime = __EXPERIMENTAL__;
125125

126126
exportconstalwaysThrottleRetries: boolean=true;
127127

128-
// Gate whether useEffectEvent uses the mutation phase (true) or before-mutation
129-
// phase (false) for updating event function references.
130-
exportconstenableEffectEventMutationPhase: boolean=false;
131-
132128
exportconstpassChildrenWhenCloningPersistedNodes: boolean=false;
133129

134130
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;

‎packages/shared/forks/ReactFeatureFlags.native-fb-dynamic.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,3 @@ export const enableFragmentRefs = __VARIANT__;
2727
exportconstenableFragmentRefsScrollIntoView=__VARIANT__;
2828
exportconstenableFragmentRefsInstanceHandles=__VARIANT__;
2929
exportconstenableComponentPerformanceTrack=__VARIANT__;
30-
exportconstenableEffectEventMutationPhase=__VARIANT__;

‎packages/shared/forks/ReactFeatureFlags.native-fb.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ const dynamicFlags: DynamicExportsType = (dynamicFlagsUntyped: any);
2020
// the exports object every time a flag is read.
2121
exportconst{
2222
alwaysThrottleRetries,
23-
enableEffectEventMutationPhase,
2423
enableHiddenSubtreeInsertionEffectCleanup,
2524
enableObjectFiber,
2625
enableEagerAlternateStateNodeCleanup,

‎packages/shared/forks/ReactFeatureFlags.native-oss.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ export const enableSchedulingProfiler: boolean =
4646
!enableComponentPerformanceTrack&&__PROFILE__;
4747
exportconstenableScopeAPI: boolean=false;
4848
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
49-
exportconstenableEffectEventMutationPhase: boolean=false;
5049
exportconstenableSuspenseAvoidThisFallback: boolean=false;
5150
exportconstenableSuspenseCallback: boolean=false;
5251
exportconstenableTaint: boolean=true;

‎packages/shared/forks/ReactFeatureFlags.test-renderer.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ export const enableInfiniteRenderLoopDetection: boolean = false;
5858

5959
exportconstrenameElementSymbol: boolean=true;
6060
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
61-
exportconstenableEffectEventMutationPhase: boolean=false;
6261

6362
exportconstenableYieldingBeforePassive: boolean=true;
6463

‎packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ export const enableComponentPerformanceTrack = false;
4343
exportconstenablePerformanceIssueReporting=false;
4444
exportconstenableScopeAPI=false;
4545
exportconstenableEagerAlternateStateNodeCleanup=true;
46-
exportconstenableEffectEventMutationPhase=false;
4746
exportconstenableSuspenseAvoidThisFallback=false;
4847
exportconstenableSuspenseCallback=false;
4948
exportconstenableTaint=true;

‎packages/shared/forks/ReactFeatureFlags.test-renderer.www.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ export const renameElementSymbol: boolean = false;
6464

6565
exportconstenableObjectFiber: boolean=false;
6666
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
67-
exportconstenableEffectEventMutationPhase: boolean=false;
6867

6968
exportconstenableHydrationLaneScheduling: boolean=true;
7069

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [internal] revert change merged accidentally (#35546) · react/react@be3fb29 · GitHub
Skip to content

Commit be3fb29

Browse files
authored
[internal] revert change merged accidentally (#35546)
I accidentally pushed this to new flag to #35541 and then merged it. Reverting it so I can submit a review.
1 parent 23e5edd commit be3fb29

12 files changed

Lines changed: 6 additions & 245 deletions

‎packages/react-reconciler/src/ReactFiberCommitWork.js‎

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ import type {ViewTransitionState} from './ReactFiberViewTransitionComponent';
4747
import{
4848
alwaysThrottleRetries,
4949
enableCreateEventHandleAPI,
50-
enableEffectEventMutationPhase,
5150
enableHiddenSubtreeInsertionEffectCleanup,
5251
enableProfilerTimer,
5352
enableProfilerCommitHooks,
@@ -500,7 +499,7 @@ function commitBeforeMutationEffectsOnFiber(
500499
caseFunctionComponent:
501500
caseForwardRef:
502501
caseSimpleMemoComponent: {
503-
if(!enableEffectEventMutationPhase&&(flags&Update)!==NoFlags){
502+
if((flags&Update)!==NoFlags){
504503
constupdateQueue: FunctionComponentUpdateQueue|null=
505504
(finishedWork.updateQueue: any);
506505
consteventPayloads=updateQueue!==null ? updateQueue.events : null;
@@ -2047,19 +2046,6 @@ function commitMutationEffectsOnFiber(
20472046
commitReconciliationEffects(finishedWork,lanes);
20482047

20492048
if(flags&Update){
2050-
// Mutate event effect callbacks before insertion effects.
2051-
if(enableEffectEventMutationPhase){
2052-
constupdateQueue: FunctionComponentUpdateQueue|null=
2053-
(finishedWork.updateQueue: any);
2054-
consteventPayloads=
2055-
updateQueue!==null ? updateQueue.events : null;
2056-
if(eventPayloads!==null){
2057-
for(letii=0;ii<eventPayloads.length;ii++){
2058-
const{ref, nextImpl}=eventPayloads[ii];
2059-
ref.impl=nextImpl;
2060-
}
2061-
}
2062-
}
20632049
commitHookEffectListUnmount(
20642050
HookInsertion|HookHasEffect,
20652051
finishedWork,

‎packages/react-reconciler/src/ReactFiberFlags.js‎

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@
77
* @flow
88
*/
99

10-
import{
11-
enableCreateEventHandleAPI,
12-
enableEffectEventMutationPhase,
13-
}from'shared/ReactFeatureFlags';
10+
import{enableCreateEventHandleAPI}from'shared/ReactFeatureFlags';
1411

1512
exporttypeFlags=number;
1613

@@ -102,11 +99,10 @@ export const BeforeMutationMask: number =
10299
// TODO: Only need to visit Deletions during BeforeMutation phase if an
103100
// element is focused.
104101
Update|ChildDeletion|Visibility
105-
: // useEffectEvent uses the snapshot phase,
106-
// but we're moving it to the mutation phase.
107-
enableEffectEventMutationPhase
108-
? 0
109-
: Update);
102+
: // TODO: The useEffectEvent hook uses the snapshot phase for clean up but it
103+
// really should use the mutation phase for this or at least schedule an
104+
// explicit Snapshot phase flag for this.
105+
Update);
110106

111107
// For View Transition support we use the snapshot phase to scan the tree for potentially
112108
// affected ViewTransition components.

‎packages/react-reconciler/src/__tests__/useEffectEvent-test.js‎

Lines changed: 0 additions & 208 deletions
Original file line numberDiff line numberDiff line change
@@ -595,214 +595,6 @@ describe('useEffectEvent', () => {
595595
assertLog(['Effect value: 2','Event value: 2']);
596596
});
597597

598-
it('updates parent and child event effects before their respective effect lifecycles',async()=>{
599-
functionParent({value}){
600-
constparentEvent=useEffectEvent(()=>{
601-
Scheduler.log('Parent event: '+value);
602-
});
603-
604-
useInsertionEffect(()=>{
605-
Scheduler.log('Parent insertion');
606-
parentEvent();
607-
},[value]);
608-
609-
return<Childvalue={value}/>;
610-
}
611-
612-
functionChild({value}){
613-
constchildEvent=useEffectEvent(()=>{
614-
Scheduler.log('Child event: '+value);
615-
});
616-
617-
useInsertionEffect(()=>{
618-
Scheduler.log('Child insertion');
619-
childEvent();
620-
},[value]);
621-
622-
returnnull;
623-
}
624-
625-
ReactNoop.render(<Parentvalue={1}/>);
626-
awaitwaitForAll([
627-
'Child insertion',
628-
'Child event: 1',
629-
'Parent insertion',
630-
'Parent event: 1',
631-
]);
632-
633-
awaitact(()=>ReactNoop.render(<Parentvalue={2}/>));
634-
// Each component's event is updated before its own insertion effect runs
635-
assertLog([
636-
'Child insertion',
637-
'Child event: 2',
638-
'Parent insertion',
639-
'Parent event: 2',
640-
]);
641-
});
642-
643-
it('fires all insertion effects (interleaved) with useEffectEvent before firing any layout effects',async()=>{
644-
// This test mirrors the 'fires all insertion effects (interleaved) before firing any layout effects'
645-
// test in ReactHooksWithNoopRenderer-test.js, but adds useEffectEvent to verify that
646-
// event payloads are updated before each component's insertion effects run.
647-
// It also includes passive effects to verify the full effect lifecycle.
648-
letcommittedA='(empty)';
649-
letcommittedB='(empty)';
650-
651-
functionCounterA(props){
652-
constonEvent=useEffectEvent(()=>{
653-
return`Event A [A: ${committedA}, B: ${committedB}]`;
654-
});
655-
656-
useInsertionEffect(()=>{
657-
// Call the event function to verify it sees the latest value
658-
Scheduler.log(
659-
`Create Insertion A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
660-
);
661-
committedA=String(props.count);
662-
return()=>{
663-
Scheduler.log(
664-
`Destroy Insertion A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
665-
);
666-
};
667-
});
668-
669-
useLayoutEffect(()=>{
670-
Scheduler.log(
671-
`Create Layout A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
672-
);
673-
return()=>{
674-
Scheduler.log(
675-
`Destroy Layout A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
676-
);
677-
};
678-
});
679-
680-
useEffect(()=>{
681-
Scheduler.log(
682-
`Create Passive A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
683-
);
684-
return()=>{
685-
Scheduler.log(
686-
`Destroy Passive A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
687-
);
688-
};
689-
});
690-
691-
returnnull;
692-
}
693-
694-
functionCounterB(props){
695-
constonEvent=useEffectEvent(()=>{
696-
return`Event B [A: ${committedA}, B: ${committedB}]`;
697-
});
698-
699-
useInsertionEffect(()=>{
700-
// Call the event function to verify it sees the latest value
701-
Scheduler.log(
702-
`Create Insertion B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
703-
);
704-
committedB=String(props.count);
705-
return()=>{
706-
Scheduler.log(
707-
`Destroy Insertion B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
708-
);
709-
};
710-
});
711-
712-
useLayoutEffect(()=>{
713-
Scheduler.log(
714-
`Create Layout B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
715-
);
716-
return()=>{
717-
Scheduler.log(
718-
`Destroy Layout B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
719-
);
720-
};
721-
});
722-
723-
useEffect(()=>{
724-
Scheduler.log(
725-
`Create Passive B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
726-
);
727-
return()=>{
728-
Scheduler.log(
729-
`Destroy Passive B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
730-
);
731-
};
732-
});
733-
734-
returnnull;
735-
}
736-
737-
awaitact(async()=>{
738-
ReactNoop.render(
739-
<React.Fragment>
740-
<CounterAcount={0}/>
741-
<CounterBcount={0}/>
742-
</React.Fragment>,
743-
);
744-
// All insertion effects fire before all layout effects, then passive effects
745-
// Event functions should see the state AT THE TIME they're called
746-
awaitwaitForAll([
747-
// Insertion effects (mutation phase)
748-
'Create Insertion A [A: (empty), B: (empty)], event: Event A [A: (empty), B: (empty)]',
749-
'Create Insertion B [A: 0, B: (empty)], event: Event B [A: 0, B: (empty)]',
750-
// Layout effects
751-
'Create Layout A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
752-
'Create Layout B [A: 0, B: 0], event: Event B [A: 0, B: 0]',
753-
// Passive effects
754-
'Create Passive A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
755-
'Create Passive B [A: 0, B: 0], event: Event B [A: 0, B: 0]',
756-
]);
757-
expect([committedA,committedB]).toEqual(['0','0']);
758-
});
759-
760-
awaitact(async()=>{
761-
ReactNoop.render(
762-
<React.Fragment>
763-
<CounterAcount={1}/>
764-
<CounterBcount={1}/>
765-
</React.Fragment>,
766-
);
767-
awaitwaitForAll([
768-
// Component A: insertion destroy, then create
769-
'Destroy Insertion A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
770-
'Create Insertion A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
771-
// Component A: layout destroy (after insertion updated committedA)
772-
'Destroy Layout A [A: 1, B: 0], event: Event A [A: 1, B: 0]',
773-
// Component B: insertion destroy, then create
774-
'Destroy Insertion B [A: 1, B: 0], event: Event B [A: 1, B: 0]',
775-
'Create Insertion B [A: 1, B: 0], event: Event B [A: 1, B: 0]',
776-
// Component B: layout destroy (after insertion updated committedB)
777-
'Destroy Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
778-
// Layout creates
779-
'Create Layout A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
780-
'Create Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
781-
// Passive destroys then creates
782-
'Destroy Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
783-
'Destroy Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
784-
'Create Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
785-
'Create Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
786-
]);
787-
expect([committedA,committedB]).toEqual(['1','1']);
788-
});
789-
790-
// Unmount everything
791-
awaitact(async()=>{
792-
ReactNoop.render(null);
793-
awaitwaitForAll([
794-
// Insertion and layout destroys (mutation/layout phase)
795-
'Destroy Insertion A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
796-
'Destroy Layout A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
797-
'Destroy Insertion B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
798-
'Destroy Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
799-
// Passive destroys
800-
'Destroy Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
801-
'Destroy Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
802-
]);
803-
});
804-
});
805-
806598
it("doesn't provide a stable identity",async()=>{
807599
functionCounter({shouldRender, value}){
808600
constonClick=useEffectEvent(()=>{

‎packages/shared/ReactFeatureFlags.js‎

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,6 @@ export const enableFizzExternalRuntime = __EXPERIMENTAL__;
125125

126126
exportconstalwaysThrottleRetries: boolean=true;
127127

128-
// Gate whether useEffectEvent uses the mutation phase (true) or before-mutation
129-
// phase (false) for updating event function references.
130-
exportconstenableEffectEventMutationPhase: boolean=false;
131-
132128
exportconstpassChildrenWhenCloningPersistedNodes: boolean=false;
133129

134130
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;

‎packages/shared/forks/ReactFeatureFlags.native-fb-dynamic.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,3 @@ export const enableFragmentRefs = __VARIANT__;
2727
exportconstenableFragmentRefsScrollIntoView=__VARIANT__;
2828
exportconstenableFragmentRefsInstanceHandles=__VARIANT__;
2929
exportconstenableComponentPerformanceTrack=__VARIANT__;
30-
exportconstenableEffectEventMutationPhase=__VARIANT__;

‎packages/shared/forks/ReactFeatureFlags.native-fb.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ const dynamicFlags: DynamicExportsType = (dynamicFlagsUntyped: any);
2020
// the exports object every time a flag is read.
2121
exportconst{
2222
alwaysThrottleRetries,
23-
enableEffectEventMutationPhase,
2423
enableHiddenSubtreeInsertionEffectCleanup,
2524
enableObjectFiber,
2625
enableEagerAlternateStateNodeCleanup,

‎packages/shared/forks/ReactFeatureFlags.native-oss.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ export const enableSchedulingProfiler: boolean =
4646
!enableComponentPerformanceTrack&&__PROFILE__;
4747
exportconstenableScopeAPI: boolean=false;
4848
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
49-
exportconstenableEffectEventMutationPhase: boolean=false;
5049
exportconstenableSuspenseAvoidThisFallback: boolean=false;
5150
exportconstenableSuspenseCallback: boolean=false;
5251
exportconstenableTaint: boolean=true;

‎packages/shared/forks/ReactFeatureFlags.test-renderer.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ export const enableInfiniteRenderLoopDetection: boolean = false;
5858

5959
exportconstrenameElementSymbol: boolean=true;
6060
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
61-
exportconstenableEffectEventMutationPhase: boolean=false;
6261

6362
exportconstenableYieldingBeforePassive: boolean=true;
6463

‎packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ export const enableComponentPerformanceTrack = false;
4343
exportconstenablePerformanceIssueReporting=false;
4444
exportconstenableScopeAPI=false;
4545
exportconstenableEagerAlternateStateNodeCleanup=true;
46-
exportconstenableEffectEventMutationPhase=false;
4746
exportconstenableSuspenseAvoidThisFallback=false;
4847
exportconstenableSuspenseCallback=false;
4948
exportconstenableTaint=true;

‎packages/shared/forks/ReactFeatureFlags.test-renderer.www.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ export const renameElementSymbol: boolean = false;
6464

6565
exportconstenableObjectFiber: boolean=false;
6666
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
67-
exportconstenableEffectEventMutationPhase: boolean=false;
6867

6968
exportconstenableHydrationLaneScheduling: boolean=true;
7069

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); [internal] revert change merged accidentally (#35546) · react/react@be3fb29 · GitHub
Skip to content

Commit be3fb29

Browse files
authored
[internal] revert change merged accidentally (#35546)
I accidentally pushed this to new flag to #35541 and then merged it. Reverting it so I can submit a review.
1 parent 23e5edd commit be3fb29

12 files changed

Lines changed: 6 additions & 245 deletions

‎packages/react-reconciler/src/ReactFiberCommitWork.js‎

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ import type {ViewTransitionState} from './ReactFiberViewTransitionComponent';
4747
import{
4848
alwaysThrottleRetries,
4949
enableCreateEventHandleAPI,
50-
enableEffectEventMutationPhase,
5150
enableHiddenSubtreeInsertionEffectCleanup,
5251
enableProfilerTimer,
5352
enableProfilerCommitHooks,
@@ -500,7 +499,7 @@ function commitBeforeMutationEffectsOnFiber(
500499
caseFunctionComponent:
501500
caseForwardRef:
502501
caseSimpleMemoComponent: {
503-
if(!enableEffectEventMutationPhase&&(flags&Update)!==NoFlags){
502+
if((flags&Update)!==NoFlags){
504503
constupdateQueue: FunctionComponentUpdateQueue|null=
505504
(finishedWork.updateQueue: any);
506505
consteventPayloads=updateQueue!==null ? updateQueue.events : null;
@@ -2047,19 +2046,6 @@ function commitMutationEffectsOnFiber(
20472046
commitReconciliationEffects(finishedWork,lanes);
20482047

20492048
if(flags&Update){
2050-
// Mutate event effect callbacks before insertion effects.
2051-
if(enableEffectEventMutationPhase){
2052-
constupdateQueue: FunctionComponentUpdateQueue|null=
2053-
(finishedWork.updateQueue: any);
2054-
consteventPayloads=
2055-
updateQueue!==null ? updateQueue.events : null;
2056-
if(eventPayloads!==null){
2057-
for(letii=0;ii<eventPayloads.length;ii++){
2058-
const{ref, nextImpl}=eventPayloads[ii];
2059-
ref.impl=nextImpl;
2060-
}
2061-
}
2062-
}
20632049
commitHookEffectListUnmount(
20642050
HookInsertion|HookHasEffect,
20652051
finishedWork,

‎packages/react-reconciler/src/ReactFiberFlags.js‎

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@
77
* @flow
88
*/
99

10-
import{
11-
enableCreateEventHandleAPI,
12-
enableEffectEventMutationPhase,
13-
}from'shared/ReactFeatureFlags';
10+
import{enableCreateEventHandleAPI}from'shared/ReactFeatureFlags';
1411

1512
exporttypeFlags=number;
1613

@@ -102,11 +99,10 @@ export const BeforeMutationMask: number =
10299
// TODO: Only need to visit Deletions during BeforeMutation phase if an
103100
// element is focused.
104101
Update|ChildDeletion|Visibility
105-
: // useEffectEvent uses the snapshot phase,
106-
// but we're moving it to the mutation phase.
107-
enableEffectEventMutationPhase
108-
? 0
109-
: Update);
102+
: // TODO: The useEffectEvent hook uses the snapshot phase for clean up but it
103+
// really should use the mutation phase for this or at least schedule an
104+
// explicit Snapshot phase flag for this.
105+
Update);
110106

111107
// For View Transition support we use the snapshot phase to scan the tree for potentially
112108
// affected ViewTransition components.

‎packages/react-reconciler/src/__tests__/useEffectEvent-test.js‎

Lines changed: 0 additions & 208 deletions
Original file line numberDiff line numberDiff line change
@@ -595,214 +595,6 @@ describe('useEffectEvent', () => {
595595
assertLog(['Effect value: 2','Event value: 2']);
596596
});
597597

598-
it('updates parent and child event effects before their respective effect lifecycles',async()=>{
599-
functionParent({value}){
600-
constparentEvent=useEffectEvent(()=>{
601-
Scheduler.log('Parent event: '+value);
602-
});
603-
604-
useInsertionEffect(()=>{
605-
Scheduler.log('Parent insertion');
606-
parentEvent();
607-
},[value]);
608-
609-
return<Childvalue={value}/>;
610-
}
611-
612-
functionChild({value}){
613-
constchildEvent=useEffectEvent(()=>{
614-
Scheduler.log('Child event: '+value);
615-
});
616-
617-
useInsertionEffect(()=>{
618-
Scheduler.log('Child insertion');
619-
childEvent();
620-
},[value]);
621-
622-
returnnull;
623-
}
624-
625-
ReactNoop.render(<Parentvalue={1}/>);
626-
awaitwaitForAll([
627-
'Child insertion',
628-
'Child event: 1',
629-
'Parent insertion',
630-
'Parent event: 1',
631-
]);
632-
633-
awaitact(()=>ReactNoop.render(<Parentvalue={2}/>));
634-
// Each component's event is updated before its own insertion effect runs
635-
assertLog([
636-
'Child insertion',
637-
'Child event: 2',
638-
'Parent insertion',
639-
'Parent event: 2',
640-
]);
641-
});
642-
643-
it('fires all insertion effects (interleaved) with useEffectEvent before firing any layout effects',async()=>{
644-
// This test mirrors the 'fires all insertion effects (interleaved) before firing any layout effects'
645-
// test in ReactHooksWithNoopRenderer-test.js, but adds useEffectEvent to verify that
646-
// event payloads are updated before each component's insertion effects run.
647-
// It also includes passive effects to verify the full effect lifecycle.
648-
letcommittedA='(empty)';
649-
letcommittedB='(empty)';
650-
651-
functionCounterA(props){
652-
constonEvent=useEffectEvent(()=>{
653-
return`Event A [A: ${committedA}, B: ${committedB}]`;
654-
});
655-
656-
useInsertionEffect(()=>{
657-
// Call the event function to verify it sees the latest value
658-
Scheduler.log(
659-
`Create Insertion A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
660-
);
661-
committedA=String(props.count);
662-
return()=>{
663-
Scheduler.log(
664-
`Destroy Insertion A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
665-
);
666-
};
667-
});
668-
669-
useLayoutEffect(()=>{
670-
Scheduler.log(
671-
`Create Layout A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
672-
);
673-
return()=>{
674-
Scheduler.log(
675-
`Destroy Layout A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
676-
);
677-
};
678-
});
679-
680-
useEffect(()=>{
681-
Scheduler.log(
682-
`Create Passive A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
683-
);
684-
return()=>{
685-
Scheduler.log(
686-
`Destroy Passive A [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
687-
);
688-
};
689-
});
690-
691-
returnnull;
692-
}
693-
694-
functionCounterB(props){
695-
constonEvent=useEffectEvent(()=>{
696-
return`Event B [A: ${committedA}, B: ${committedB}]`;
697-
});
698-
699-
useInsertionEffect(()=>{
700-
// Call the event function to verify it sees the latest value
701-
Scheduler.log(
702-
`Create Insertion B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
703-
);
704-
committedB=String(props.count);
705-
return()=>{
706-
Scheduler.log(
707-
`Destroy Insertion B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
708-
);
709-
};
710-
});
711-
712-
useLayoutEffect(()=>{
713-
Scheduler.log(
714-
`Create Layout B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
715-
);
716-
return()=>{
717-
Scheduler.log(
718-
`Destroy Layout B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
719-
);
720-
};
721-
});
722-
723-
useEffect(()=>{
724-
Scheduler.log(
725-
`Create Passive B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
726-
);
727-
return()=>{
728-
Scheduler.log(
729-
`Destroy Passive B [A: ${committedA}, B: ${committedB}], event: ${onEvent()}`,
730-
);
731-
};
732-
});
733-
734-
returnnull;
735-
}
736-
737-
awaitact(async()=>{
738-
ReactNoop.render(
739-
<React.Fragment>
740-
<CounterAcount={0}/>
741-
<CounterBcount={0}/>
742-
</React.Fragment>,
743-
);
744-
// All insertion effects fire before all layout effects, then passive effects
745-
// Event functions should see the state AT THE TIME they're called
746-
awaitwaitForAll([
747-
// Insertion effects (mutation phase)
748-
'Create Insertion A [A: (empty), B: (empty)], event: Event A [A: (empty), B: (empty)]',
749-
'Create Insertion B [A: 0, B: (empty)], event: Event B [A: 0, B: (empty)]',
750-
// Layout effects
751-
'Create Layout A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
752-
'Create Layout B [A: 0, B: 0], event: Event B [A: 0, B: 0]',
753-
// Passive effects
754-
'Create Passive A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
755-
'Create Passive B [A: 0, B: 0], event: Event B [A: 0, B: 0]',
756-
]);
757-
expect([committedA,committedB]).toEqual(['0','0']);
758-
});
759-
760-
awaitact(async()=>{
761-
ReactNoop.render(
762-
<React.Fragment>
763-
<CounterAcount={1}/>
764-
<CounterBcount={1}/>
765-
</React.Fragment>,
766-
);
767-
awaitwaitForAll([
768-
// Component A: insertion destroy, then create
769-
'Destroy Insertion A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
770-
'Create Insertion A [A: 0, B: 0], event: Event A [A: 0, B: 0]',
771-
// Component A: layout destroy (after insertion updated committedA)
772-
'Destroy Layout A [A: 1, B: 0], event: Event A [A: 1, B: 0]',
773-
// Component B: insertion destroy, then create
774-
'Destroy Insertion B [A: 1, B: 0], event: Event B [A: 1, B: 0]',
775-
'Create Insertion B [A: 1, B: 0], event: Event B [A: 1, B: 0]',
776-
// Component B: layout destroy (after insertion updated committedB)
777-
'Destroy Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
778-
// Layout creates
779-
'Create Layout A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
780-
'Create Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
781-
// Passive destroys then creates
782-
'Destroy Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
783-
'Destroy Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
784-
'Create Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
785-
'Create Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
786-
]);
787-
expect([committedA,committedB]).toEqual(['1','1']);
788-
});
789-
790-
// Unmount everything
791-
awaitact(async()=>{
792-
ReactNoop.render(null);
793-
awaitwaitForAll([
794-
// Insertion and layout destroys (mutation/layout phase)
795-
'Destroy Insertion A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
796-
'Destroy Layout A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
797-
'Destroy Insertion B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
798-
'Destroy Layout B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
799-
// Passive destroys
800-
'Destroy Passive A [A: 1, B: 1], event: Event A [A: 1, B: 1]',
801-
'Destroy Passive B [A: 1, B: 1], event: Event B [A: 1, B: 1]',
802-
]);
803-
});
804-
});
805-
806598
it("doesn't provide a stable identity",async()=>{
807599
functionCounter({shouldRender, value}){
808600
constonClick=useEffectEvent(()=>{

‎packages/shared/ReactFeatureFlags.js‎

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,6 @@ export const enableFizzExternalRuntime = __EXPERIMENTAL__;
125125

126126
exportconstalwaysThrottleRetries: boolean=true;
127127

128-
// Gate whether useEffectEvent uses the mutation phase (true) or before-mutation
129-
// phase (false) for updating event function references.
130-
exportconstenableEffectEventMutationPhase: boolean=false;
131-
132128
exportconstpassChildrenWhenCloningPersistedNodes: boolean=false;
133129

134130
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;

‎packages/shared/forks/ReactFeatureFlags.native-fb-dynamic.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,3 @@ export const enableFragmentRefs = __VARIANT__;
2727
exportconstenableFragmentRefsScrollIntoView=__VARIANT__;
2828
exportconstenableFragmentRefsInstanceHandles=__VARIANT__;
2929
exportconstenableComponentPerformanceTrack=__VARIANT__;
30-
exportconstenableEffectEventMutationPhase=__VARIANT__;

‎packages/shared/forks/ReactFeatureFlags.native-fb.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ const dynamicFlags: DynamicExportsType = (dynamicFlagsUntyped: any);
2020
// the exports object every time a flag is read.
2121
exportconst{
2222
alwaysThrottleRetries,
23-
enableEffectEventMutationPhase,
2423
enableHiddenSubtreeInsertionEffectCleanup,
2524
enableObjectFiber,
2625
enableEagerAlternateStateNodeCleanup,

‎packages/shared/forks/ReactFeatureFlags.native-oss.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ export const enableSchedulingProfiler: boolean =
4646
!enableComponentPerformanceTrack&&__PROFILE__;
4747
exportconstenableScopeAPI: boolean=false;
4848
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
49-
exportconstenableEffectEventMutationPhase: boolean=false;
5049
exportconstenableSuspenseAvoidThisFallback: boolean=false;
5150
exportconstenableSuspenseCallback: boolean=false;
5251
exportconstenableTaint: boolean=true;

‎packages/shared/forks/ReactFeatureFlags.test-renderer.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ export const enableInfiniteRenderLoopDetection: boolean = false;
5858

5959
exportconstrenameElementSymbol: boolean=true;
6060
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
61-
exportconstenableEffectEventMutationPhase: boolean=false;
6261

6362
exportconstenableYieldingBeforePassive: boolean=true;
6463

‎packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ export const enableComponentPerformanceTrack = false;
4343
exportconstenablePerformanceIssueReporting=false;
4444
exportconstenableScopeAPI=false;
4545
exportconstenableEagerAlternateStateNodeCleanup=true;
46-
exportconstenableEffectEventMutationPhase=false;
4746
exportconstenableSuspenseAvoidThisFallback=false;
4847
exportconstenableSuspenseCallback=false;
4948
exportconstenableTaint=true;

‎packages/shared/forks/ReactFeatureFlags.test-renderer.www.js‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ export const renameElementSymbol: boolean = false;
6464

6565
exportconstenableObjectFiber: boolean=false;
6666
exportconstenableEagerAlternateStateNodeCleanup: boolean=true;
67-
exportconstenableEffectEventMutationPhase: boolean=false;
6867

6968
exportconstenableHydrationLaneScheduling: boolean=true;
7069

0 commit comments

Comments
 (0)