Skip to content

Commit 025e0e4

Browse files
lunaleapsmeta-codesync[bot]
authored andcommitted
Remove clipping check on scrollview (#54357)
Summary: Pull Request resolved: #54357 Changelog: [Internal] - Ignore whether ScrollView enables subview clipping and just use the drawing rect for forwarding a clippingRect for VirtualView Reviewed By: yungsters Differential Revision: D85817030 fbshipit-source-id: e89298d106ec993ce1ca63131da002e0685c34dd
1 parent 1558948 commit 025e0e4

22 files changed

Lines changed: 204 additions & 65 deletions

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<bac9e360daa589cba476d208f75ef2ca>>
7+
* @generated SignedSource<<d8dc8c3a2efe8b7e870546e5749ef5ad>>
88
*/
99

1010
/**
@@ -312,6 +312,12 @@ public object ReactNativeFeatureFlags {
312312
@JvmStatic
313313
public fun enableViewRecyclingForView(): Boolean = accessor.enableViewRecyclingForView()
314314

315+
/**
316+
* Set clipping to drawingRect of ScrollView.
317+
*/
318+
@JvmStatic
319+
public fun enableVirtualViewClippingWithoutScrollViewClipping(): Boolean = accessor.enableVirtualViewClippingWithoutScrollViewClipping()
320+
315321
/**
316322
* Enables the experimental version of `VirtualViewContainerState`.
317323
*/

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<2003ae7fc2c782b997d21938cc7b2380>>
7+
* @generated SignedSource<<447ccc7271b71b0208a2297b7eba5995>>
88
*/
99

1010
/**
@@ -67,6 +67,7 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
6767
private var enableViewRecyclingForScrollViewCache: Boolean? = null
6868
private var enableViewRecyclingForTextCache: Boolean? = null
6969
private var enableViewRecyclingForViewCache: Boolean? = null
70+
private var enableVirtualViewClippingWithoutScrollViewClippingCache: Boolean? = null
7071
private var enableVirtualViewContainerStateExperimentalCache: Boolean? = null
7172
private var enableVirtualViewDebugFeaturesCache: Boolean? = null
7273
private var enableVirtualViewRenderStateCache: Boolean? = null
@@ -526,6 +527,15 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
526527
return cached
527528
}
528529

530+
override fun enableVirtualViewClippingWithoutScrollViewClipping(): Boolean {
531+
var cached = enableVirtualViewClippingWithoutScrollViewClippingCache
532+
if (cached == null) {
533+
cached = ReactNativeFeatureFlagsCxxInterop.enableVirtualViewClippingWithoutScrollViewClipping()
534+
enableVirtualViewClippingWithoutScrollViewClippingCache = cached
535+
}
536+
return cached
537+
}
538+
529539
override fun enableVirtualViewContainerStateExperimental(): Boolean {
530540
var cached = enableVirtualViewContainerStateExperimentalCache
531541
if (cached == null) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<986b35ba4f323ab1a65dd70a559889e9>>
7+
* @generated SignedSource<<d6403b67e269ad80ef3e2389ac923c8a>>
88
*/
99

1010
/**
@@ -122,6 +122,8 @@ public object ReactNativeFeatureFlagsCxxInterop {
122122

123123
@DoNotStrip @JvmStatic public external fun enableViewRecyclingForView(): Boolean
124124

125+
@DoNotStrip @JvmStatic public external fun enableVirtualViewClippingWithoutScrollViewClipping(): Boolean
126+
125127
@DoNotStrip @JvmStatic public external fun enableVirtualViewContainerStateExperimental(): Boolean
126128

127129
@DoNotStrip @JvmStatic public external fun enableVirtualViewDebugFeatures(): Boolean

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<43f629e3be734826b241d7e596daf6f4>>
7+
* @generated SignedSource<<ab48ba86a7cf3cd35ec530a216aea774>>
88
*/
99

1010
/**
@@ -117,6 +117,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi
117117

118118
override fun enableViewRecyclingForView(): Boolean = true
119119

120+
override fun enableVirtualViewClippingWithoutScrollViewClipping(): Boolean = true
121+
120122
override fun enableVirtualViewContainerStateExperimental(): Boolean = false
121123

122124
override fun enableVirtualViewDebugFeatures(): Boolean = false

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<806741418f4ff7e3b6dcac3d78fa27dd>>
7+
* @generated SignedSource<<6f6b5abe79764b88cf3ed62fe0230786>>
88
*/
99

1010
/**
@@ -71,6 +71,7 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
7171
private var enableViewRecyclingForScrollViewCache: Boolean? = null
7272
private var enableViewRecyclingForTextCache: Boolean? = null
7373
private var enableViewRecyclingForViewCache: Boolean? = null
74+
private var enableVirtualViewClippingWithoutScrollViewClippingCache: Boolean? = null
7475
private var enableVirtualViewContainerStateExperimentalCache: Boolean? = null
7576
private var enableVirtualViewDebugFeaturesCache: Boolean? = null
7677
private var enableVirtualViewRenderStateCache: Boolean? = null
@@ -577,6 +578,16 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
577578
return cached
578579
}
579580

581+
override fun enableVirtualViewClippingWithoutScrollViewClipping(): Boolean {
582+
var cached = enableVirtualViewClippingWithoutScrollViewClippingCache
583+
if (cached == null) {
584+
cached = currentProvider.enableVirtualViewClippingWithoutScrollViewClipping()
585+
accessedFeatureFlags.add("enableVirtualViewClippingWithoutScrollViewClipping")
586+
enableVirtualViewClippingWithoutScrollViewClippingCache = cached
587+
}
588+
return cached
589+
}
590+
580591
override fun enableVirtualViewContainerStateExperimental(): Boolean {
581592
var cached = enableVirtualViewContainerStateExperimentalCache
582593
if (cached == null) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<1a08578b36cb91a183a435b881ca272f>>
7+
* @generated SignedSource<<6b61490a8d6b1df1d6264016455382f8>>
88
*/
99

1010
/**
@@ -117,6 +117,8 @@ public interface ReactNativeFeatureFlagsProvider {
117117

118118
@DoNotStrip public fun enableViewRecyclingForView(): Boolean
119119

120+
@DoNotStrip public fun enableVirtualViewClippingWithoutScrollViewClipping(): Boolean
121+
120122
@DoNotStrip public fun enableVirtualViewContainerStateExperimental(): Boolean
121123

122124
@DoNotStrip public fun enableVirtualViewDebugFeatures(): Boolean

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/virtual/view/ReactVirtualView.kt

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,17 +187,28 @@ public class ReactVirtualView(context: Context) :
187187
}
188188

189189
// If no ScrollView, or ScrollView has disabled removeClippedSubviews, use default behavior
190-
if (
191-
parentScrollView == null ||
192-
!((parentScrollView as ReactClippingViewGroup).removeClippedSubviews ?: false)
193-
) {
190+
if (parentScrollView == null) {
194191
super.updateClippingRect(excludedViews)
195192
return
196193
}
197194

198195
val clippingRect = checkNotNull(clippingRect)
196+
val parentScrollView = checkNotNull(parentScrollView) as ReactClippingViewGroup
197+
198+
if (ReactNativeFeatureFlags.enableVirtualViewClippingWithoutScrollViewClipping()) {
199+
if (parentScrollView.removeClippedSubviews) {
200+
parentScrollView.getClippingRect(clippingRect)
201+
} else {
202+
(parentScrollView as View).getDrawingRect(clippingRect)
203+
}
204+
} else {
205+
if (!(parentScrollView.removeClippedSubviews ?: false)) {
206+
super.updateClippingRect(excludedViews)
207+
return
208+
}
209+
parentScrollView.getClippingRect(clippingRect)
210+
}
199211

200-
(parentScrollView as ReactClippingViewGroup).getClippingRect(clippingRect)
201212
clippingRect.intersect(targetRect)
202213
clippingRect.offset(-targetRect.left, -targetRect.top)
203214

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/virtual/viewexperimental/ReactVirtualViewExperimental.kt

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -208,17 +208,29 @@ public class ReactVirtualViewExperimental(context: Context) :
208208
}
209209

210210
// If no ScrollView, or ScrollView has disabled removeClippedSubviews, use default behavior
211-
if (
212-
scrollView == null ||
213-
!((scrollView as ReactClippingViewGroup).removeClippedSubviews ?: false)
214-
) {
211+
if (scrollView == null) {
215212
super.updateClippingRect(excludedViews)
216213
return
217214
}
218215

219216
val clippingRect = checkNotNull(clippingRect)
217+
val scrollView = checkNotNull(scrollView) as ReactClippingViewGroup
218+
219+
if (ReactNativeFeatureFlags.enableVirtualViewClippingWithoutScrollViewClipping()) {
220+
if (scrollView.removeClippedSubviews) {
221+
scrollView.getClippingRect(clippingRect)
222+
} else {
223+
(scrollView as View).getDrawingRect(clippingRect)
224+
}
225+
} else {
226+
if (!(scrollView.removeClippedSubviews ?: false)) {
227+
super.updateClippingRect(excludedViews)
228+
return
229+
}
230+
231+
scrollView.getClippingRect(clippingRect)
232+
}
220233

221-
(scrollView as ReactClippingViewGroup).getClippingRect(clippingRect)
222234
clippingRect.intersect(containerRelativeRect)
223235
clippingRect.offset(-containerRelativeRect.left, -containerRelativeRect.top)
224236

packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<4c22217e5a773fd97f4041ef6e052ebc>>
7+
* @generated SignedSource<<13ed11b5c260fae79048ea80745d22fe>>
88
*/
99

1010
/**
@@ -321,6 +321,12 @@ class ReactNativeFeatureFlagsJavaProvider
321321
return method(javaProvider_);
322322
}
323323

324+
bool enableVirtualViewClippingWithoutScrollViewClipping() override {
325+
static const auto method =
326+
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("enableVirtualViewClippingWithoutScrollViewClipping");
327+
return method(javaProvider_);
328+
}
329+
324330
bool enableVirtualViewContainerStateExperimental() override {
325331
static const auto method =
326332
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("enableVirtualViewContainerStateExperimental");
@@ -770,6 +776,11 @@ bool JReactNativeFeatureFlagsCxxInterop::enableViewRecyclingForView(
770776
return ReactNativeFeatureFlags::enableViewRecyclingForView();
771777
}
772778

779+
bool JReactNativeFeatureFlagsCxxInterop::enableVirtualViewClippingWithoutScrollViewClipping(
780+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
781+
return ReactNativeFeatureFlags::enableVirtualViewClippingWithoutScrollViewClipping();
782+
}
783+
773784
bool JReactNativeFeatureFlagsCxxInterop::enableVirtualViewContainerStateExperimental(
774785
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
775786
return ReactNativeFeatureFlags::enableVirtualViewContainerStateExperimental();
@@ -1117,6 +1128,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() {
11171128
makeNativeMethod(
11181129
"enableViewRecyclingForView",
11191130
JReactNativeFeatureFlagsCxxInterop::enableViewRecyclingForView),
1131+
makeNativeMethod(
1132+
"enableVirtualViewClippingWithoutScrollViewClipping",
1133+
JReactNativeFeatureFlagsCxxInterop::enableVirtualViewClippingWithoutScrollViewClipping),
11201134
makeNativeMethod(
11211135
"enableVirtualViewContainerStateExperimental",
11221136
JReactNativeFeatureFlagsCxxInterop::enableVirtualViewContainerStateExperimental),

packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<91f5bbbab5f34321687c6f6d31ca49d8>>
7+
* @generated SignedSource<<1e57bf8252c16fc10bbfcae08710af85>>
88
*/
99

1010
/**
@@ -171,6 +171,9 @@ class JReactNativeFeatureFlagsCxxInterop
171171
static bool enableViewRecyclingForView(
172172
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
173173

174+
static bool enableVirtualViewClippingWithoutScrollViewClipping(
175+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
176+
174177
static bool enableVirtualViewContainerStateExperimental(
175178
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
176179

0 commit comments

Comments
 (0)