Skip to content

Commit 5fbcc6b

Browse files
sammy-SCmeta-codesync[bot]
authored andcommitted
Downgrade offscreen Fabric image requests to prefetch (#56976)
Summary: Pull Request resolved: #56976 changelog: [internal] Use Fabric layout data to classify image shadow nodes as visible or offscreen on Apple platforms. Offscreen image requests now use `ImageRequestPriority::Prefetch`, which is bridged to the existing `RCTImageLoaderPriorityPrefetch` API, while visible images stay at `Immediate`. The new React Native feature flag defaults to `false` until app-specific gating wires it up. Reviewed By: javache Differential Revision: D106074485 fbshipit-source-id: 80ece75cf0d639be1fdbfdd5f19b838b7b64aba6
1 parent ac81869 commit 5fbcc6b

52 files changed

Lines changed: 961 additions & 108 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

packages/react-native/Libraries/Image/__tests__/Image-requestPriority-itest.js

Lines changed: 455 additions & 0 deletions
Large diffs are not rendered by default.

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<<f930d8c04c79ad156af580f2818fef24>>
7+
* @generated SignedSource<<fa3d35be13801d5991e6bfb2cef2ef43>>
88
*/
99

1010
/**
@@ -192,6 +192,12 @@ public object ReactNativeFeatureFlags {
192192
@JvmStatic
193193
public fun enableImagePrefetchingAndroid(): Boolean = accessor.enableImagePrefetchingAndroid()
194194

195+
/**
196+
* When enabled, ImageShadowNode downgrades image requests to prefetch priority when layout determines that the image does not intersect the viewport.
197+
*/
198+
@JvmStatic
199+
public fun enableImageRequestDowngradingForNonVisibleImages(): Boolean = accessor.enableImageRequestDowngradingForNonVisibleImages()
200+
195201
/**
196202
* Dispatches state updates for content offset changes synchronously on the main thread.
197203
*/

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<<5072b83512e1a86dc1382268f18916f4>>
7+
* @generated SignedSource<<c8e71de4517634933754c6e7a6e8ac92>>
88
*/
99

1010
/**
@@ -47,6 +47,7 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
4747
private var enableIOSTextBaselineOffsetPerLineCache: Boolean? = null
4848
private var enableIOSViewClipToPaddingBoxCache: Boolean? = null
4949
private var enableImagePrefetchingAndroidCache: Boolean? = null
50+
private var enableImageRequestDowngradingForNonVisibleImagesCache: Boolean? = null
5051
private var enableImmediateUpdateModeForContentOffsetChangesCache: Boolean? = null
5152
private var enableImperativeFocusCache: Boolean? = null
5253
private var enableInteropViewManagerClassLookUpOptimizationIOSCache: Boolean? = null
@@ -351,6 +352,15 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
351352
return cached
352353
}
353354

355+
override fun enableImageRequestDowngradingForNonVisibleImages(): Boolean {
356+
var cached = enableImageRequestDowngradingForNonVisibleImagesCache
357+
if (cached == null) {
358+
cached = ReactNativeFeatureFlagsCxxInterop.enableImageRequestDowngradingForNonVisibleImages()
359+
enableImageRequestDowngradingForNonVisibleImagesCache = cached
360+
}
361+
return cached
362+
}
363+
354364
override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean {
355365
var cached = enableImmediateUpdateModeForContentOffsetChangesCache
356366
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<<9110ccc69266f7a51738ca533df3a150>>
7+
* @generated SignedSource<<9d3495c774e4367973974a4f83ea7d16>>
88
*/
99

1010
/**
@@ -82,6 +82,8 @@ public object ReactNativeFeatureFlagsCxxInterop {
8282

8383
@DoNotStrip @JvmStatic public external fun enableImagePrefetchingAndroid(): Boolean
8484

85+
@DoNotStrip @JvmStatic public external fun enableImageRequestDowngradingForNonVisibleImages(): Boolean
86+
8587
@DoNotStrip @JvmStatic public external fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean
8688

8789
@DoNotStrip @JvmStatic public external fun enableImperativeFocus(): 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<<cc3e924846873a6c82f15a81e429a201>>
7+
* @generated SignedSource<<811ccbada43f15c9418e0177041c5747>>
88
*/
99

1010
/**
@@ -77,6 +77,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi
7777

7878
override fun enableImagePrefetchingAndroid(): Boolean = false
7979

80+
override fun enableImageRequestDowngradingForNonVisibleImages(): Boolean = false
81+
8082
override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean = false
8183

8284
override fun enableImperativeFocus(): 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<<135694971d264d19c84eb6aea5fc8425>>
7+
* @generated SignedSource<<69c333993720f22c6db80f3aceae32cd>>
88
*/
99

1010
/**
@@ -51,6 +51,7 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
5151
private var enableIOSTextBaselineOffsetPerLineCache: Boolean? = null
5252
private var enableIOSViewClipToPaddingBoxCache: Boolean? = null
5353
private var enableImagePrefetchingAndroidCache: Boolean? = null
54+
private var enableImageRequestDowngradingForNonVisibleImagesCache: Boolean? = null
5455
private var enableImmediateUpdateModeForContentOffsetChangesCache: Boolean? = null
5556
private var enableImperativeFocusCache: Boolean? = null
5657
private var enableInteropViewManagerClassLookUpOptimizationIOSCache: Boolean? = null
@@ -382,6 +383,16 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
382383
return cached
383384
}
384385

386+
override fun enableImageRequestDowngradingForNonVisibleImages(): Boolean {
387+
var cached = enableImageRequestDowngradingForNonVisibleImagesCache
388+
if (cached == null) {
389+
cached = currentProvider.enableImageRequestDowngradingForNonVisibleImages()
390+
accessedFeatureFlags.add("enableImageRequestDowngradingForNonVisibleImages")
391+
enableImageRequestDowngradingForNonVisibleImagesCache = cached
392+
}
393+
return cached
394+
}
395+
385396
override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean {
386397
var cached = enableImmediateUpdateModeForContentOffsetChangesCache
387398
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<<c578ce107e944645965622c45645ac2d>>
7+
* @generated SignedSource<<cb5de865c68dfd9b7b7b2d86d9fb090b>>
88
*/
99

1010
/**
@@ -77,6 +77,8 @@ public interface ReactNativeFeatureFlagsProvider {
7777

7878
@DoNotStrip public fun enableImagePrefetchingAndroid(): Boolean
7979

80+
@DoNotStrip public fun enableImageRequestDowngradingForNonVisibleImages(): Boolean
81+
8082
@DoNotStrip public fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean
8183

8284
@DoNotStrip public fun enableImperativeFocus(): Boolean

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<<da3ebdd27e001a680c569192712eab7f>>
7+
* @generated SignedSource<<f667d1281347eeacfca65411acdf6dc7>>
88
*/
99

1010
/**
@@ -201,6 +201,12 @@ class ReactNativeFeatureFlagsJavaProvider
201201
return method(javaProvider_);
202202
}
203203

204+
bool enableImageRequestDowngradingForNonVisibleImages() override {
205+
static const auto method =
206+
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("enableImageRequestDowngradingForNonVisibleImages");
207+
return method(javaProvider_);
208+
}
209+
204210
bool enableImmediateUpdateModeForContentOffsetChanges() override {
205211
static const auto method =
206212
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("enableImmediateUpdateModeForContentOffsetChanges");
@@ -700,6 +706,11 @@ bool JReactNativeFeatureFlagsCxxInterop::enableImagePrefetchingAndroid(
700706
return ReactNativeFeatureFlags::enableImagePrefetchingAndroid();
701707
}
702708

709+
bool JReactNativeFeatureFlagsCxxInterop::enableImageRequestDowngradingForNonVisibleImages(
710+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
711+
return ReactNativeFeatureFlags::enableImageRequestDowngradingForNonVisibleImages();
712+
}
713+
703714
bool JReactNativeFeatureFlagsCxxInterop::enableImmediateUpdateModeForContentOffsetChanges(
704715
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
705716
return ReactNativeFeatureFlags::enableImmediateUpdateModeForContentOffsetChanges();
@@ -1112,6 +1123,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() {
11121123
makeNativeMethod(
11131124
"enableImagePrefetchingAndroid",
11141125
JReactNativeFeatureFlagsCxxInterop::enableImagePrefetchingAndroid),
1126+
makeNativeMethod(
1127+
"enableImageRequestDowngradingForNonVisibleImages",
1128+
JReactNativeFeatureFlagsCxxInterop::enableImageRequestDowngradingForNonVisibleImages),
11151129
makeNativeMethod(
11161130
"enableImmediateUpdateModeForContentOffsetChanges",
11171131
JReactNativeFeatureFlagsCxxInterop::enableImmediateUpdateModeForContentOffsetChanges),

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<<1655eb2f217476e64b03c97bce083192>>
7+
* @generated SignedSource<<f2dbc5e247060946295f35a07191c213>>
88
*/
99

1010
/**
@@ -111,6 +111,9 @@ class JReactNativeFeatureFlagsCxxInterop
111111
static bool enableImagePrefetchingAndroid(
112112
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
113113

114+
static bool enableImageRequestDowngradingForNonVisibleImages(
115+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
116+
114117
static bool enableImmediateUpdateModeForContentOffsetChanges(
115118
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
116119

packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp

Lines changed: 5 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<<d3b31e5d51537d44d19f72b2d48f97f4>>
7+
* @generated SignedSource<<177c370caf828494ce42486af0d8c698>>
88
*/
99

1010
/**
@@ -134,6 +134,10 @@ bool ReactNativeFeatureFlags::enableImagePrefetchingAndroid() {
134134
return getAccessor().enableImagePrefetchingAndroid();
135135
}
136136

137+
bool ReactNativeFeatureFlags::enableImageRequestDowngradingForNonVisibleImages() {
138+
return getAccessor().enableImageRequestDowngradingForNonVisibleImages();
139+
}
140+
137141
bool ReactNativeFeatureFlags::enableImmediateUpdateModeForContentOffsetChanges() {
138142
return getAccessor().enableImmediateUpdateModeForContentOffsetChanges();
139143
}

0 commit comments

Comments
 (0)