Skip to content

Commit b8d3dbb

Browse files
committed
Wire pointer capture event props through the Fabric view config
Fabric declared onGotPointerCapture / onLostPointerCapture and the capture-phase pointer handlers in its view config, but never parsed them. Fill in both prop parsing paths (convertRawProp and the iterator setProp), add the two missing capture phase offsets, and register the got/lost-capture bubbling event types and validAttributes on iOS and Android. Android was also missing the bubble-phase onPointerDown, onPointerUp and onPointerCancel attributes.
1 parent 27e83d0 commit b8d3dbb

15 files changed

Lines changed: 78 additions & 5 deletions

File tree

packages/react-native/Libraries/NativeComponent/BaseViewConfig.android.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,8 +427,14 @@ const validAttributesForEventProps = {
427427
// Pointer events
428428
onClick: true,
429429
onClickCapture: true,
430+
onPointerCancel: true,
431+
onPointerCancelCapture: true,
432+
onPointerDown: true,
433+
onPointerDownCapture: true,
430434
onPointerEnter: true,
431435
onPointerEnterCapture: true,
436+
onPointerUp: true,
437+
onPointerUpCapture: true,
432438
onPointerLeave: true,
433439
onPointerLeaveCapture: true,
434440
onPointerMove: true,

packages/react-native/Libraries/NativeComponent/BaseViewConfig.ios.js

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -411,16 +411,26 @@ const validAttributesForEventProps = ConditionallyIgnoredEventHandlers({
411411
// Pointer events
412412
onClick: true,
413413
onClickCapture: true,
414-
onPointerUp: true,
415-
onPointerDown: true,
416414
onPointerCancel: true,
415+
onPointerCancelCapture: true,
416+
onPointerDown: true,
417+
onPointerDownCapture: true,
417418
onPointerEnter: true,
418-
onPointerMove: true,
419+
onPointerEnterCapture: true,
420+
onPointerUp: true,
421+
onPointerUpCapture: true,
419422
onPointerLeave: true,
420-
onPointerOver: true,
423+
onPointerLeaveCapture: true,
424+
onPointerMove: true,
425+
onPointerMoveCapture: true,
421426
onPointerOut: true,
427+
onPointerOutCapture: true,
428+
onPointerOver: true,
429+
onPointerOverCapture: true,
422430
onGotPointerCapture: true,
431+
onGotPointerCaptureCapture: true,
423432
onLostPointerCapture: true,
433+
onLostPointerCaptureCapture: true,
424434
});
425435

426436
/**

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,18 @@ protected void onAfterUpdateTransaction(@NonNull T view) {
779779
MapBuilder.of(
780780
"phasedRegistrationNames",
781781
MapBuilder.of("bubbled", "onPointerOver", "captured", "onPointerOverCapture")))
782+
.put(
783+
"topGotPointerCapture",
784+
MapBuilder.of(
785+
"phasedRegistrationNames",
786+
MapBuilder.of(
787+
"bubbled", "onGotPointerCapture", "captured", "onGotPointerCaptureCapture")))
788+
.put(
789+
"topLostPointerCapture",
790+
MapBuilder.of(
791+
"phasedRegistrationNames",
792+
MapBuilder.of(
793+
"bubbled", "onLostPointerCapture", "captured", "onLostPointerCaptureCapture")))
782794
.put(
783795
"topClick",
784796
MapBuilder.of(

packages/react-native/ReactCommon/react/renderer/components/view/BaseViewProps.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,9 @@ void BaseViewProps::setProp(
455455
VIEW_EVENT_CASE(PointerUp);
456456
VIEW_EVENT_CASE(PointerUpCapture);
457457
VIEW_EVENT_CASE(GotPointerCapture);
458+
VIEW_EVENT_CASE(GotPointerCaptureCapture);
458459
VIEW_EVENT_CASE(LostPointerCapture);
460+
VIEW_EVENT_CASE(LostPointerCaptureCapture);
459461
VIEW_EVENT_CASE(MoveShouldSetResponder);
460462
VIEW_EVENT_CASE(MoveShouldSetResponderCapture);
461463
VIEW_EVENT_CASE(StartShouldSetResponder);

packages/react-native/ReactCommon/react/renderer/components/view/primitives.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ struct ViewEvents {
6767
PointerDownCapture = 35,
6868
PointerUp = 36,
6969
PointerUpCapture = 37,
70+
GotPointerCaptureCapture = 38,
71+
LostPointerCaptureCapture = 39,
7072
};
7173

7274
constexpr bool operator[](const Offset offset) const

packages/react-native/ReactCommon/react/renderer/components/view/propsConversions.h

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,30 @@ static inline ViewEvents convertRawProp(
517517
"onPointerUpCapture",
518518
sourceValue[Offset::PointerUpCapture],
519519
defaultValue[Offset::PointerUpCapture]);
520-
// TODO: gotPointerCapture & lostPointerCapture
520+
result[Offset::GotPointerCapture] = convertRawProp(
521+
context,
522+
rawProps,
523+
"onGotPointerCapture",
524+
sourceValue[Offset::GotPointerCapture],
525+
defaultValue[Offset::GotPointerCapture]);
526+
result[Offset::GotPointerCaptureCapture] = convertRawProp(
527+
context,
528+
rawProps,
529+
"onGotPointerCaptureCapture",
530+
sourceValue[Offset::GotPointerCaptureCapture],
531+
defaultValue[Offset::GotPointerCaptureCapture]);
532+
result[Offset::LostPointerCapture] = convertRawProp(
533+
context,
534+
rawProps,
535+
"onLostPointerCapture",
536+
sourceValue[Offset::LostPointerCapture],
537+
defaultValue[Offset::LostPointerCapture]);
538+
result[Offset::LostPointerCaptureCapture] = convertRawProp(
539+
context,
540+
rawProps,
541+
"onLostPointerCaptureCapture",
542+
sourceValue[Offset::LostPointerCaptureCapture],
543+
defaultValue[Offset::LostPointerCaptureCapture]);
521544

522545
// PanResponder callbacks
523546
result[Offset::MoveShouldSetResponder] = convertRawProp(

scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8060,7 +8060,9 @@ enum facebook::react::ViewEvents::Offset : std::size_t {
80608060
Click,
80618061
ClickCapture,
80628062
GotPointerCapture,
8063+
GotPointerCaptureCapture,
80638064
LostPointerCapture,
8065+
LostPointerCaptureCapture,
80648066
MoveShouldSetResponder,
80658067
MoveShouldSetResponderCapture,
80668068
PointerDown,

scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7824,7 +7824,9 @@ enum facebook::react::ViewEvents::Offset : std::size_t {
78247824
Click,
78257825
ClickCapture,
78267826
GotPointerCapture,
7827+
GotPointerCaptureCapture,
78277828
LostPointerCapture,
7829+
LostPointerCaptureCapture,
78287830
MoveShouldSetResponder,
78297831
MoveShouldSetResponderCapture,
78307832
PointerDown,

scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8051,7 +8051,9 @@ enum facebook::react::ViewEvents::Offset : std::size_t {
80518051
Click,
80528052
ClickCapture,
80538053
GotPointerCapture,
8054+
GotPointerCaptureCapture,
80548055
LostPointerCapture,
8056+
LostPointerCaptureCapture,
80558057
MoveShouldSetResponder,
80568058
MoveShouldSetResponderCapture,
80578059
PointerDown,

scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10083,7 +10083,9 @@ enum facebook::react::ViewEvents::Offset : std::size_t {
1008310083
Click,
1008410084
ClickCapture,
1008510085
GotPointerCapture,
10086+
GotPointerCaptureCapture,
1008610087
LostPointerCapture,
10088+
LostPointerCaptureCapture,
1008710089
MoveShouldSetResponder,
1008810090
MoveShouldSetResponderCapture,
1008910091
PointerDown,

0 commit comments

Comments
 (0)