Skip to content

Commit c62f78e

Browse files
sammy-SCmeta-codesync[bot]
authored andcommitted
Remove offscreen image request downgrading feature flag
Summary: 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 097dbc2 commit c62f78e

53 files changed

Lines changed: 107 additions & 1036 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<<7e91da9df64ce42424101d7d72356c4a>>
7+
* @generated SignedSource<<1f2bdc9c3ac11542f6b3706a2c127ad5>>
88
*/
99

1010
/**
@@ -198,12 +198,6 @@ public object ReactNativeFeatureFlags {
198198
@JvmStatic
199199
public fun enableImagePrefetchingAndroid(): Boolean = accessor.enableImagePrefetchingAndroid()
200200

201-
/**
202-
* When enabled, ImageShadowNode downgrades image requests to prefetch priority when layout determines that the image does not intersect the viewport.
203-
*/
204-
@JvmStatic
205-
public fun enableImageRequestDowngradingForNonVisibleImages(): Boolean = accessor.enableImageRequestDowngradingForNonVisibleImages()
206-
207201
/**
208202
* Dispatches state updates for content offset changes synchronously on the main thread.
209203
*/

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<<3c0e10dee93b76f3e66ca79d26f2b4f2>>
7+
* @generated SignedSource<<6ac7fe12c6d62482105fa7a4ea339644>>
88
*/
99

1010
/**
@@ -48,7 +48,6 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
4848
private var enableIOSTextBaselineOffsetPerLineCache: Boolean? = null
4949
private var enableIOSViewClipToPaddingBoxCache: Boolean? = null
5050
private var enableImagePrefetchingAndroidCache: Boolean? = null
51-
private var enableImageRequestDowngradingForNonVisibleImagesCache: Boolean? = null
5251
private var enableImmediateUpdateModeForContentOffsetChangesCache: Boolean? = null
5352
private var enableImperativeFocusCache: Boolean? = null
5453
private var enableInteropViewManagerClassLookUpOptimizationIOSCache: Boolean? = null
@@ -361,15 +360,6 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
361360
return cached
362361
}
363362

364-
override fun enableImageRequestDowngradingForNonVisibleImages(): Boolean {
365-
var cached = enableImageRequestDowngradingForNonVisibleImagesCache
366-
if (cached == null) {
367-
cached = ReactNativeFeatureFlagsCxxInterop.enableImageRequestDowngradingForNonVisibleImages()
368-
enableImageRequestDowngradingForNonVisibleImagesCache = cached
369-
}
370-
return cached
371-
}
372-
373363
override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean {
374364
var cached = enableImmediateUpdateModeForContentOffsetChangesCache
375365
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<<e9cc7d01ac1884710f131fbf375f3502>>
7+
* @generated SignedSource<<ba5c3520edac14c94c4d597e6e89ffad>>
88
*/
99

1010
/**
@@ -84,8 +84,6 @@ public object ReactNativeFeatureFlagsCxxInterop {
8484

8585
@DoNotStrip @JvmStatic public external fun enableImagePrefetchingAndroid(): Boolean
8686

87-
@DoNotStrip @JvmStatic public external fun enableImageRequestDowngradingForNonVisibleImages(): Boolean
88-
8987
@DoNotStrip @JvmStatic public external fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean
9088

9189
@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<<061d668cf04041f4d3d2f48f11dc739f>>
7+
* @generated SignedSource<<af07c64554801942d9ca0675e900ee30>>
88
*/
99

1010
/**
@@ -79,8 +79,6 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi
7979

8080
override fun enableImagePrefetchingAndroid(): Boolean = false
8181

82-
override fun enableImageRequestDowngradingForNonVisibleImages(): Boolean = false
83-
8482
override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean = false
8583

8684
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<<fa85d53197cbdce6b1373fbadf3cf2b9>>
7+
* @generated SignedSource<<f48bcb93fbe5979cc6cc9ca5fa7cdb13>>
88
*/
99

1010
/**
@@ -52,7 +52,6 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
5252
private var enableIOSTextBaselineOffsetPerLineCache: Boolean? = null
5353
private var enableIOSViewClipToPaddingBoxCache: Boolean? = null
5454
private var enableImagePrefetchingAndroidCache: Boolean? = null
55-
private var enableImageRequestDowngradingForNonVisibleImagesCache: Boolean? = null
5655
private var enableImmediateUpdateModeForContentOffsetChangesCache: Boolean? = null
5756
private var enableImperativeFocusCache: Boolean? = null
5857
private var enableInteropViewManagerClassLookUpOptimizationIOSCache: Boolean? = null
@@ -393,16 +392,6 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
393392
return cached
394393
}
395394

396-
override fun enableImageRequestDowngradingForNonVisibleImages(): Boolean {
397-
var cached = enableImageRequestDowngradingForNonVisibleImagesCache
398-
if (cached == null) {
399-
cached = currentProvider.enableImageRequestDowngradingForNonVisibleImages()
400-
accessedFeatureFlags.add("enableImageRequestDowngradingForNonVisibleImages")
401-
enableImageRequestDowngradingForNonVisibleImagesCache = cached
402-
}
403-
return cached
404-
}
405-
406395
override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean {
407396
var cached = enableImmediateUpdateModeForContentOffsetChangesCache
408397
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<<a460b28871fc3f928dcc2d1a3bf66422>>
7+
* @generated SignedSource<<381bd118eb7d55dfb119c5355f15ea3e>>
88
*/
99

1010
/**
@@ -79,8 +79,6 @@ public interface ReactNativeFeatureFlagsProvider {
7979

8080
@DoNotStrip public fun enableImagePrefetchingAndroid(): Boolean
8181

82-
@DoNotStrip public fun enableImageRequestDowngradingForNonVisibleImages(): Boolean
83-
8482
@DoNotStrip public fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean
8583

8684
@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<<ea8284ad906ae89281a3fbd849e88c19>>
7+
* @generated SignedSource<<9fa7e2df31a376da415f3a5346340de2>>
88
*/
99

1010
/**
@@ -207,12 +207,6 @@ class ReactNativeFeatureFlagsJavaProvider
207207
return method(javaProvider_);
208208
}
209209

210-
bool enableImageRequestDowngradingForNonVisibleImages() override {
211-
static const auto method =
212-
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("enableImageRequestDowngradingForNonVisibleImages");
213-
return method(javaProvider_);
214-
}
215-
216210
bool enableImmediateUpdateModeForContentOffsetChanges() override {
217211
static const auto method =
218212
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("enableImmediateUpdateModeForContentOffsetChanges");
@@ -711,11 +705,6 @@ bool JReactNativeFeatureFlagsCxxInterop::enableImagePrefetchingAndroid(
711705
return ReactNativeFeatureFlags::enableImagePrefetchingAndroid();
712706
}
713707

714-
bool JReactNativeFeatureFlagsCxxInterop::enableImageRequestDowngradingForNonVisibleImages(
715-
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
716-
return ReactNativeFeatureFlags::enableImageRequestDowngradingForNonVisibleImages();
717-
}
718-
719708
bool JReactNativeFeatureFlagsCxxInterop::enableImmediateUpdateModeForContentOffsetChanges(
720709
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
721710
return ReactNativeFeatureFlags::enableImmediateUpdateModeForContentOffsetChanges();
@@ -1126,9 +1115,6 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() {
11261115
makeNativeMethod(
11271116
"enableImagePrefetchingAndroid",
11281117
JReactNativeFeatureFlagsCxxInterop::enableImagePrefetchingAndroid),
1129-
makeNativeMethod(
1130-
"enableImageRequestDowngradingForNonVisibleImages",
1131-
JReactNativeFeatureFlagsCxxInterop::enableImageRequestDowngradingForNonVisibleImages),
11321118
makeNativeMethod(
11331119
"enableImmediateUpdateModeForContentOffsetChanges",
11341120
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<<746da63dcbec1bb165731e7380993659>>
7+
* @generated SignedSource<<edf865a650f41768bccd7a851bb4e6c9>>
88
*/
99

1010
/**
@@ -114,9 +114,6 @@ class JReactNativeFeatureFlagsCxxInterop
114114
static bool enableImagePrefetchingAndroid(
115115
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
116116

117-
static bool enableImageRequestDowngradingForNonVisibleImages(
118-
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
119-
120117
static bool enableImmediateUpdateModeForContentOffsetChanges(
121118
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
122119

0 commit comments

Comments
 (0)