Skip to content

Commit 6aceb05

Browse files
sammy-SCmeta-codesync[bot]
authored andcommitted
Downgrade offscreen Fabric image requests to prefetch
Summary: 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. Differential Revision: D106074485
1 parent d7b5314 commit 6aceb05

48 files changed

Lines changed: 953 additions & 111 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<<3e8cc4e23730f3171824faaf2053bbd9>>
7+
* @generated SignedSource<<241257b5f79da6fd8eebc8f118eafa97>>
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<<1b877147588a851daaee1a2b4494312a>>
7+
* @generated SignedSource<<3c6786932862e2393d4b506b7dd1cffa>>
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
@@ -352,6 +353,15 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
352353
return cached
353354
}
354355

356+
override fun enableImageRequestDowngradingForNonVisibleImages(): Boolean {
357+
var cached = enableImageRequestDowngradingForNonVisibleImagesCache
358+
if (cached == null) {
359+
cached = ReactNativeFeatureFlagsCxxInterop.enableImageRequestDowngradingForNonVisibleImages()
360+
enableImageRequestDowngradingForNonVisibleImagesCache = cached
361+
}
362+
return cached
363+
}
364+
355365
override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean {
356366
var cached = enableImmediateUpdateModeForContentOffsetChangesCache
357367
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<<a09de0b0d4b342796ff3fcc1b52fc53a>>
7+
* @generated SignedSource<<fe72a9ffcc45f0e441c9ea147519d40b>>
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<<b08dd880f47d31353cd29e4bcc63090d>>
7+
* @generated SignedSource<<b261466deb2e4102a609f003b13d7c8c>>
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<<c3cb6a890e22fe2ac279c3a9aa65b096>>
7+
* @generated SignedSource<<df25fed323ff3282b4c91e78c4a7404f>>
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
@@ -383,6 +384,16 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
383384
return cached
384385
}
385386

387+
override fun enableImageRequestDowngradingForNonVisibleImages(): Boolean {
388+
var cached = enableImageRequestDowngradingForNonVisibleImagesCache
389+
if (cached == null) {
390+
cached = currentProvider.enableImageRequestDowngradingForNonVisibleImages()
391+
accessedFeatureFlags.add("enableImageRequestDowngradingForNonVisibleImages")
392+
enableImageRequestDowngradingForNonVisibleImagesCache = cached
393+
}
394+
return cached
395+
}
396+
386397
override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean {
387398
var cached = enableImmediateUpdateModeForContentOffsetChangesCache
388399
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<<1348346948cf4212dd312c48b5bfe917>>
7+
* @generated SignedSource<<3a517b4509c8763d1a3c3a8e951440e2>>
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<<ed750080bd0e891a1a11887afb7d7c01>>
7+
* @generated SignedSource<<364dd0bf0d99ac2baa8514973bba39c7>>
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");
@@ -706,6 +712,11 @@ bool JReactNativeFeatureFlagsCxxInterop::enableImagePrefetchingAndroid(
706712
return ReactNativeFeatureFlags::enableImagePrefetchingAndroid();
707713
}
708714

715+
bool JReactNativeFeatureFlagsCxxInterop::enableImageRequestDowngradingForNonVisibleImages(
716+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
717+
return ReactNativeFeatureFlags::enableImageRequestDowngradingForNonVisibleImages();
718+
}
719+
709720
bool JReactNativeFeatureFlagsCxxInterop::enableImmediateUpdateModeForContentOffsetChanges(
710721
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
711722
return ReactNativeFeatureFlags::enableImmediateUpdateModeForContentOffsetChanges();
@@ -1123,6 +1134,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() {
11231134
makeNativeMethod(
11241135
"enableImagePrefetchingAndroid",
11251136
JReactNativeFeatureFlagsCxxInterop::enableImagePrefetchingAndroid),
1137+
makeNativeMethod(
1138+
"enableImageRequestDowngradingForNonVisibleImages",
1139+
JReactNativeFeatureFlagsCxxInterop::enableImageRequestDowngradingForNonVisibleImages),
11261140
makeNativeMethod(
11271141
"enableImmediateUpdateModeForContentOffsetChanges",
11281142
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<<21e508305ffc719768389f668485e57f>>
7+
* @generated SignedSource<<11902f6eb4bc51ee2aefb9941fa32dfe>>
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<<a65763987ba462f3c46cd84dc8d75713>>
7+
* @generated SignedSource<<30a22d91d198b823214ed8919f519d16>>
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)