Skip to content

Commit 25a7eda

Browse files
sammy-SCmeta-codesync[bot]
authored andcommitted
Remove offscreen image request downgrading feature flag (#57226)
Summary: Pull Request resolved: #57226 This removes the experimental `enableImageRequestDowngradingForNonVisibleImages` feature flag and backs out the behavior it gated. When enabled, `ImageShadowNode` downgraded image requests to prefetch priority for images that layout determined did not intersect the viewport — threading an `ImageRequestPriority` through `ImageRequestParams` and the Apple image managers, and propagating per-node viewport frames during Yoga layout via `experimental_layoutOrigin`/`experimental_layoutFrame` on `LayoutContext`. The flag defaulted to off and was never enabled in a release, and the gated behavior did not deliver the expected improvement, so the feature is removed entirely: `<Image>` once again always requests at immediate priority. This deletes the feature flag, the `ImageRequestPriority` enum and the `ImageRequestParams::priority` field, the priority parameter on `RCTImageManager`/`RCTSyncImageManager`/`RCTImageManagerProtocol`, the `experimental_layout*` `LayoutContext` fields and their Yoga propagation, the iOS request-priority debug overlay, and the associated Fantom test scaffolding. The generated feature-flag sources and the C++ API snapshots are regenerated accordingly. Changelog: [Internal] Reviewed By: javache Differential Revision: D108411690
1 parent 723908a commit 25a7eda

53 files changed

Lines changed: 105 additions & 1034 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: 0 additions & 455 deletions
This file was deleted.

packages/react-native/React/Fabric/Mounting/ComponentViews/Image/RCTImageComponentView.mm

Lines changed: 0 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
#import <React/RCTConversions.h>
1212
#import <React/RCTImageBlurUtils.h>
1313
#import <React/RCTImageResponseObserverProxy.h>
14-
#import <react/featureflags/ReactNativeFeatureFlags.h>
1514
#import <react/renderer/components/image/ImageComponentDescriptor.h>
1615
#import <react/renderer/components/image/ImageEventEmitter.h>
1716
#import <react/renderer/components/image/ImageProps.h>
@@ -20,40 +19,9 @@
2019

2120
using namespace facebook::react;
2221

23-
static NSString *const RCTImageRequestPriorityDebugOverlayEnabledEnvironmentVariable =
24-
@"RCT_IMAGE_REQUEST_PRIORITY_DEBUG_OVERLAY";
25-
26-
static BOOL RCTImageRequestPriorityDebugOverlayEnabled()
27-
{
28-
if (ReactNativeFeatureFlags::enableImageRequestDowngradingForNonVisibleImages()) {
29-
static BOOL enabled = NO;
30-
static dispatch_once_t onceToken;
31-
dispatch_once(&onceToken, ^{
32-
NSDictionary<NSString *, NSString *> *environment = [[NSProcessInfo processInfo] environment];
33-
enabled = [environment[RCTImageRequestPriorityDebugOverlayEnabledEnvironmentVariable] boolValue];
34-
});
35-
return enabled;
36-
} else {
37-
return NO;
38-
}
39-
}
40-
41-
static NSString *RCTImageRequestPriorityDebugLabel(ImageRequestPriority priority)
42-
{
43-
switch (priority) {
44-
case ImageRequestPriority::Immediate:
45-
return @"immediate";
46-
case ImageRequestPriority::Prefetch:
47-
return @"offscreen";
48-
default:
49-
return @"unknown";
50-
}
51-
}
52-
5322
@implementation RCTImageComponentView {
5423
ImageShadowNode::ConcreteState::Shared _state;
5524
std::shared_ptr<RCTImageResponseObserverProxy> _imageResponseObserverProxy;
56-
UILabel *_requestPriorityLabel;
5725
}
5826

5927
- (instancetype)initWithFrame:(CGRect)frame
@@ -117,7 +85,6 @@ - (void)updateState:(const State::Shared &)state oldState:(const State::Shared &
11785
auto newImageState = std::static_pointer_cast<const ImageShadowNode::ConcreteState>(state);
11886

11987
[self _setStateAndResubscribeImageResponseObserver:newImageState];
120-
[self _updateRequestPriorityLabelWithState:newImageState];
12188

12289
bool havePreviousData = oldImageState && oldImageState->getData().getImageSource() != ImageSource{};
12390

@@ -148,53 +115,10 @@ - (void)_setStateAndResubscribeImageResponseObserver:(const ImageShadowNode::Con
148115
}
149116
}
150117

151-
- (UILabel *)_requestPriorityLabel
152-
{
153-
if (!_requestPriorityLabel) {
154-
_requestPriorityLabel = [UILabel new];
155-
_requestPriorityLabel.accessibilityElementsHidden = YES;
156-
_requestPriorityLabel.backgroundColor = [UIColor colorWithWhite:0 alpha:0.65];
157-
_requestPriorityLabel.clipsToBounds = YES;
158-
_requestPriorityLabel.font = [UIFont systemFontOfSize:10 weight:UIFontWeightSemibold];
159-
_requestPriorityLabel.hidden = YES;
160-
_requestPriorityLabel.isAccessibilityElement = NO;
161-
_requestPriorityLabel.layer.cornerRadius = 3;
162-
_requestPriorityLabel.textAlignment = NSTextAlignmentCenter;
163-
_requestPriorityLabel.textColor = UIColor.whiteColor;
164-
[_imageView addSubview:_requestPriorityLabel];
165-
}
166-
167-
return _requestPriorityLabel;
168-
}
169-
170-
- (void)_updateRequestPriorityLabelWithState:(const ImageShadowNode::ConcreteState::Shared &)state
171-
{
172-
if (!state || !RCTImageRequestPriorityDebugOverlayEnabled()) {
173-
if (_requestPriorityLabel) {
174-
_requestPriorityLabel.hidden = YES;
175-
_requestPriorityLabel.text = nil;
176-
}
177-
return;
178-
}
179-
180-
UILabel *requestPriorityLabel = [self _requestPriorityLabel];
181-
requestPriorityLabel.text = RCTImageRequestPriorityDebugLabel(state->getData().getImageRequestParams().priority);
182-
[requestPriorityLabel sizeToFit];
183-
184-
CGRect frame = requestPriorityLabel.frame;
185-
frame.origin = CGPointMake(2, 2);
186-
frame.size.width += 8;
187-
frame.size.height += 4;
188-
requestPriorityLabel.frame = frame;
189-
requestPriorityLabel.hidden = NO;
190-
[_imageView bringSubviewToFront:requestPriorityLabel];
191-
}
192-
193118
- (void)prepareForRecycle
194119
{
195120
[super prepareForRecycle];
196121
[self _setStateAndResubscribeImageResponseObserver:nullptr];
197-
[self _updateRequestPriorityLabelWithState:nullptr];
198122
_imageView.image = nil;
199123
}
200124

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

Lines changed: 1 addition & 7 deletions
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<<e5d648cb1649c713cac9ffaac905fc80>>
7+
* @generated SignedSource<<00bb39539f4fc2dc0ad85a346bdee22b>>
88
*/
99

1010
/**
@@ -192,12 +192,6 @@ 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-
201195
/**
202196
* Dispatches state updates for content offset changes synchronously on the main thread.
203197
*/

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

Lines changed: 1 addition & 11 deletions
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<<5bf52aa57fc011858db9f632930bb8fb>>
7+
* @generated SignedSource<<731e92ecac8dbdf0a4b204b763a2c8c7>>
88
*/
99

1010
/**
@@ -47,7 +47,6 @@ 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
5150
private var enableImmediateUpdateModeForContentOffsetChangesCache: Boolean? = null
5251
private var enableImperativeFocusCache: Boolean? = null
5352
private var enableInteropViewManagerClassLookUpOptimizationIOSCache: Boolean? = null
@@ -349,15 +348,6 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
349348
return cached
350349
}
351350

352-
override fun enableImageRequestDowngradingForNonVisibleImages(): Boolean {
353-
var cached = enableImageRequestDowngradingForNonVisibleImagesCache
354-
if (cached == null) {
355-
cached = ReactNativeFeatureFlagsCxxInterop.enableImageRequestDowngradingForNonVisibleImages()
356-
enableImageRequestDowngradingForNonVisibleImagesCache = cached
357-
}
358-
return cached
359-
}
360-
361351
override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean {
362352
var cached = enableImmediateUpdateModeForContentOffsetChangesCache
363353
if (cached == null) {

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

Lines changed: 1 addition & 3 deletions
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<<4c03e1b03360e7703ffd1d7aa0afc277>>
7+
* @generated SignedSource<<4d0952ded695aec4a52b7b581ad19979>>
88
*/
99

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

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

85-
@DoNotStrip @JvmStatic public external fun enableImageRequestDowngradingForNonVisibleImages(): Boolean
86-
8785
@DoNotStrip @JvmStatic public external fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean
8886

8987
@DoNotStrip @JvmStatic public external fun enableImperativeFocus(): Boolean

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

Lines changed: 1 addition & 3 deletions
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<<98ed9f6f027f919cd31cd1e890750684>>
7+
* @generated SignedSource<<4227353cb809dac40fe70d83154ba2bc>>
88
*/
99

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

7878
override fun enableImagePrefetchingAndroid(): Boolean = false
7979

80-
override fun enableImageRequestDowngradingForNonVisibleImages(): Boolean = false
81-
8280
override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean = false
8381

8482
override fun enableImperativeFocus(): Boolean = false

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

Lines changed: 1 addition & 12 deletions
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<<d17ebed58238939efc1b3d4a2d7fd3c7>>
7+
* @generated SignedSource<<156af11c13257170355284118e400435>>
88
*/
99

1010
/**
@@ -51,7 +51,6 @@ 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
5554
private var enableImmediateUpdateModeForContentOffsetChangesCache: Boolean? = null
5655
private var enableImperativeFocusCache: Boolean? = null
5756
private var enableInteropViewManagerClassLookUpOptimizationIOSCache: Boolean? = null
@@ -380,16 +379,6 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
380379
return cached
381380
}
382381

383-
override fun enableImageRequestDowngradingForNonVisibleImages(): Boolean {
384-
var cached = enableImageRequestDowngradingForNonVisibleImagesCache
385-
if (cached == null) {
386-
cached = currentProvider.enableImageRequestDowngradingForNonVisibleImages()
387-
accessedFeatureFlags.add("enableImageRequestDowngradingForNonVisibleImages")
388-
enableImageRequestDowngradingForNonVisibleImagesCache = cached
389-
}
390-
return cached
391-
}
392-
393382
override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean {
394383
var cached = enableImmediateUpdateModeForContentOffsetChangesCache
395384
if (cached == null) {

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

Lines changed: 1 addition & 3 deletions
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<<4f18bde7c0680691cd6fceb63c41ad65>>
7+
* @generated SignedSource<<b1dd783c9075c9a35cbd06aa812e56c9>>
88
*/
99

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

7878
@DoNotStrip public fun enableImagePrefetchingAndroid(): Boolean
7979

80-
@DoNotStrip public fun enableImageRequestDowngradingForNonVisibleImages(): Boolean
81-
8280
@DoNotStrip public fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean
8381

8482
@DoNotStrip public fun enableImperativeFocus(): Boolean

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

Lines changed: 1 addition & 15 deletions
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<<13e7b6ef510a97b4210de914a015ae11>>
7+
* @generated SignedSource<<671da9c60f7c7331ece553327ee3ab33>>
88
*/
99

1010
/**
@@ -201,12 +201,6 @@ 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-
210204
bool enableImmediateUpdateModeForContentOffsetChanges() override {
211205
static const auto method =
212206
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("enableImmediateUpdateModeForContentOffsetChanges");
@@ -688,11 +682,6 @@ bool JReactNativeFeatureFlagsCxxInterop::enableImagePrefetchingAndroid(
688682
return ReactNativeFeatureFlags::enableImagePrefetchingAndroid();
689683
}
690684

691-
bool JReactNativeFeatureFlagsCxxInterop::enableImageRequestDowngradingForNonVisibleImages(
692-
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
693-
return ReactNativeFeatureFlags::enableImageRequestDowngradingForNonVisibleImages();
694-
}
695-
696685
bool JReactNativeFeatureFlagsCxxInterop::enableImmediateUpdateModeForContentOffsetChanges(
697686
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
698687
return ReactNativeFeatureFlags::enableImmediateUpdateModeForContentOffsetChanges();
@@ -1090,9 +1079,6 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() {
10901079
makeNativeMethod(
10911080
"enableImagePrefetchingAndroid",
10921081
JReactNativeFeatureFlagsCxxInterop::enableImagePrefetchingAndroid),
1093-
makeNativeMethod(
1094-
"enableImageRequestDowngradingForNonVisibleImages",
1095-
JReactNativeFeatureFlagsCxxInterop::enableImageRequestDowngradingForNonVisibleImages),
10961082
makeNativeMethod(
10971083
"enableImmediateUpdateModeForContentOffsetChanges",
10981084
JReactNativeFeatureFlagsCxxInterop::enableImmediateUpdateModeForContentOffsetChanges),

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

Lines changed: 1 addition & 4 deletions
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<<4234522fd98acef7836d8050d0e7c82d>>
7+
* @generated SignedSource<<ee7368466ea9e4ede93a0c1b0df005c5>>
88
*/
99

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

114-
static bool enableImageRequestDowngradingForNonVisibleImages(
115-
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
116-
117114
static bool enableImmediateUpdateModeForContentOffsetChanges(
118115
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
119116

0 commit comments

Comments
 (0)