Skip to content

Commit 4def45c

Browse files
author
Sebastian Silbermann
committed
Add support of onBeforeToggle and onToggle
1 parent 9336bf3 commit 4def45c

8 files changed

Lines changed: 59 additions & 5 deletions

File tree

packages/react-dom-bindings/src/client/ReactDOMComponent.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -796,6 +796,11 @@ function setProp(
796796
}
797797
break;
798798
}
799+
case 'popover':
800+
listenToNonDelegatedEvent('beforetoggle', domElement);
801+
listenToNonDelegatedEvent('toggle', domElement);
802+
setValueForAttribute(domElement, 'popover', value);
803+
break;
799804
case 'xlinkActuate':
800805
setValueForNamespacedAttribute(
801806
domElement,
@@ -2835,6 +2840,13 @@ export function diffHydratedProperties(
28352840
}
28362841
}
28372842

2843+
if (props.popover != null) {
2844+
// We listen to this event in case to ensure emulated bubble
2845+
// listeners still fire for the toggle event.
2846+
listenToNonDelegatedEvent('beforetoggle', domElement);
2847+
listenToNonDelegatedEvent('toggle', domElement);
2848+
}
2849+
28382850
if (props.onScroll != null) {
28392851
listenToNonDelegatedEvent('scroll', domElement);
28402852
}

packages/react-dom-bindings/src/events/DOMEventNames.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export type DOMEventName =
1818
// 'animationstart' |
1919
| 'beforeblur' // Not a real event. This is used by event experiments.
2020
| 'beforeinput'
21+
| 'beforetoggle'
2122
| 'blur'
2223
| 'canplay'
2324
| 'canplaythrough'

packages/react-dom-bindings/src/events/DOMEventProperties.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export const topLevelEventsToReactNames: Map<DOMEventName, string | null> =
3434
const simpleEventPluginEvents = [
3535
'abort',
3636
'auxClick',
37+
'beforeToggle',
3738
'cancel',
3839
'canPlay',
3940
'canPlayThrough',

packages/react-dom-bindings/src/events/DOMPluginEventSystem.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ export const mediaEventTypes: Array<DOMEventName> = [
220220
// set them on the actual target element itself. This is primarily
221221
// because these events do not consistently bubble in the DOM.
222222
export const nonDelegatedEvents: Set<DOMEventName> = new Set([
223+
'beforetoggle',
223224
'cancel',
224225
'close',
225226
'invalid',

packages/react-dom-bindings/src/events/ReactDOMEventListener.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@ export function getEventPriority(domEventName: DOMEventName): EventPriority {
345345
case 'select':
346346
case 'selectstart':
347347
return DiscreteEventPriority;
348+
case 'beforetoggle':
348349
case 'drag':
349350
case 'dragenter':
350351
case 'dragexit':

packages/react-dom/src/__tests__/ReactDOMEventPropagation-test.js

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1217,6 +1217,40 @@ describe('ReactDOMEventListener', () => {
12171217
});
12181218
});
12191219

1220+
it('onBeforeToggle Popover API', async () => {
1221+
await testEmulatedBubblingEvent({
1222+
type: 'div',
1223+
targetProps: {popover: 'any'},
1224+
reactEvent: 'onBeforeToggle',
1225+
reactEventType: 'beforetoggle',
1226+
nativeEvent: 'beforetoggle',
1227+
dispatch(node) {
1228+
const e = new Event('beforetoggle', {
1229+
bubbles: false,
1230+
cancelable: true,
1231+
});
1232+
node.dispatchEvent(e);
1233+
},
1234+
});
1235+
});
1236+
1237+
it('onToggle Popover API', async () => {
1238+
await testEmulatedBubblingEvent({
1239+
type: 'div',
1240+
targetProps: {popover: 'any'},
1241+
reactEvent: 'onToggle',
1242+
reactEventType: 'toggle',
1243+
nativeEvent: 'toggle',
1244+
dispatch(node) {
1245+
const e = new Event('toggle', {
1246+
bubbles: false,
1247+
cancelable: true,
1248+
});
1249+
node.dispatchEvent(e);
1250+
},
1251+
});
1252+
});
1253+
12201254
it('onVolumeChange', async () => {
12211255
await testEmulatedBubblingEvent({
12221256
type: 'video',
@@ -1918,6 +1952,7 @@ describe('ReactDOMEventListener', () => {
19181952
type={eventConfig.type}
19191953
targetRef={targetRef}
19201954
targetProps={{
1955+
...eventConfig.targetProps,
19211956
[eventConfig.reactEvent]: e => {
19221957
log.push('---- inner');
19231958
},
@@ -2084,11 +2119,10 @@ describe('ReactDOMEventListener', () => {
20842119
<Fixture
20852120
type={eventConfig.type}
20862121
targetRef={targetRef}
2087-
targetProps={
2088-
{
2089-
// No listener on the target itself.
2090-
}
2091-
}
2122+
targetProps={{
2123+
...eventConfig.targetProps,
2124+
// No listener on the target itself.
2125+
}}
20922126
parentProps={{
20932127
[eventConfig.reactEvent]: e => {
20942128
log.push('--- inner parent');
@@ -2317,6 +2351,7 @@ describe('ReactDOMEventListener', () => {
23172351
type={eventConfig.type}
23182352
targetRef={targetRef}
23192353
targetProps={{
2354+
...eventConfig.targetProps,
23202355
[eventConfig.reactEvent]: e => {
23212356
e.stopPropagation(); // <---------
23222357
log.push('---- inner');
@@ -2654,6 +2689,7 @@ describe('ReactDOMEventListener', () => {
26542689
}
26552690
}}
26562691
targetProps={{
2692+
...eventConfig.targetProps,
26572693
[eventConfig.reactEvent]: e => {
26582694
log.push('---- inner');
26592695
},

packages/react-dom/src/__tests__/__snapshots__/ReactTestUtils-test.js.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ exports[`ReactTestUtils Simulate should have locally attached media events 1`] =
88
"animationStart",
99
"auxClick",
1010
"beforeInput",
11+
"beforeToggle",
1112
"blur",
1213
"canPlay",
1314
"canPlayThrough",

packages/react-dom/src/test-utils/ReactTestUtils.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,7 @@ function makeSimulator(eventType) {
627627

628628
// A one-time snapshot with no plans to update. We'll probably want to deprecate Simulate API.
629629
const simulatedEventTypes = [
630+
'beforeToggle',
630631
'blur',
631632
'cancel',
632633
'click',

0 commit comments

Comments
 (0)