diff --git a/packages/assets-registry/registry.js b/packages/assets-registry/registry.js index d193d3af1c87..435bd519411f 100644 --- a/packages/assets-registry/registry.js +++ b/packages/assets-registry/registry.js @@ -14,16 +14,16 @@ export type AssetDestPathResolver = 'android' | 'generic'; export type PackagerAsset = { - readonly __packager_asset: boolean, - readonly fileSystemLocation: string, - readonly httpServerLocation: string, - readonly width: ?number, - readonly height: ?number, - readonly scales: Array, - readonly hash: string, - readonly name: string, - readonly type: string, - readonly resolver?: AssetDestPathResolver, + +__packager_asset: boolean, + +fileSystemLocation: string, + +httpServerLocation: string, + +width: ?number, + +height: ?number, + +scales: Array, + +hash: string, + +name: string, + +type: string, + +resolver?: AssetDestPathResolver, ... }; */ diff --git a/packages/dev-middleware/src/inspector-proxy/types.js b/packages/dev-middleware/src/inspector-proxy/types.js index 89838f2d11d0..8d95b8554517 100644 --- a/packages/dev-middleware/src/inspector-proxy/types.js +++ b/packages/dev-middleware/src/inspector-proxy/types.js @@ -162,5 +162,5 @@ export type DeepReadOnly = T extends ReadonlyArray ? ReadonlyArray> : T extends {...} - ? {readonly [K in keyof T]: DeepReadOnly} + ? {+[K in keyof T]: DeepReadOnly} : T; diff --git a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeArrayTurboModule.js b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeArrayTurboModule.js index 71da1584be86..d044949283e3 100644 --- a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeArrayTurboModule.js +++ b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeArrayTurboModule.js @@ -16,12 +16,9 @@ export type ArrayType = string; type AnotherArray = Array; export interface Spec extends TurboModule { - readonly getArray: (a: Array) => Array; - readonly getReadOnlyArray: (a: Array) => ReadonlyArray; - readonly getArrayWithAlias: ( - a: AnotherArray, - b: Array, - ) => AnotherArray; + +getArray: (a: Array) => Array; + +getReadOnlyArray: (a: Array) => ReadonlyArray; + +getArrayWithAlias: (a: AnotherArray, b: Array) => AnotherArray; } export default TurboModuleRegistry.getEnforcing( diff --git a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeBooleanTurboModule.js b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeBooleanTurboModule.js index af8166072de6..7666fe80dd77 100644 --- a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeBooleanTurboModule.js +++ b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeBooleanTurboModule.js @@ -16,8 +16,8 @@ export type Boolean = boolean; type AnotherBoolean = Boolean; export interface Spec extends TurboModule { - readonly getBoolean: (arg: boolean) => boolean; - readonly getBooleanWithAlias: (arg: Boolean) => AnotherBoolean; + +getBoolean: (arg: boolean) => boolean; + +getBooleanWithAlias: (arg: Boolean) => AnotherBoolean; } export default TurboModuleRegistry.getEnforcing( diff --git a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeCallbackTurboModule.js b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeCallbackTurboModule.js index 745966dca775..943cd5d404b3 100644 --- a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeCallbackTurboModule.js +++ b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeCallbackTurboModule.js @@ -16,8 +16,8 @@ export type String = string; type CB = (value: String) => void; export interface Spec extends TurboModule { - readonly getValueWithCallback: (callback: (value: string) => void) => void; - readonly getValueWithCallbackWithAlias: (c: CB) => void; + +getValueWithCallback: (callback: (value: string) => void) => void; + +getValueWithCallbackWithAlias: (c: CB) => void; } export default TurboModuleRegistry.getEnforcing( diff --git a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeEnumTurboModule.js b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeEnumTurboModule.js index bd7370864231..e2918fb7556d 100644 --- a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeEnumTurboModule.js +++ b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeEnumTurboModule.js @@ -49,17 +49,17 @@ export type StateTypeWithEnums = { }; export interface Spec extends TurboModule { - readonly getStatusRegular: (statusProp: StateType) => StatusRegularEnum; - readonly getStatusStr: (statusProp: StateType) => StatusStrEnum; - readonly getStatusNum: (statusProp: StateType) => StatusNumEnum; - readonly getStatusLowerCase: (statusProp: StateType) => StatusLowerCaseEnum; - readonly getStateType: ( + +getStatusRegular: (statusProp: StateType) => StatusRegularEnum; + +getStatusStr: (statusProp: StateType) => StatusStrEnum; + +getStatusNum: (statusProp: StateType) => StatusNumEnum; + +getStatusLowerCase: (statusProp: StateType) => StatusLowerCaseEnum; + +getStateType: ( a: StatusRegularEnum, b: StatusStrEnum, c: StatusNumEnum, d: StatusLowerCaseEnum, ) => StateType; - readonly getStateTypeWithEnums: ( + +getStateTypeWithEnums: ( paramOfTypeWithEnums: StateTypeWithEnums, ) => StateTypeWithEnums; } diff --git a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeNullableTurboModule.js b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeNullableTurboModule.js index d586369ad556..b2a8d69dacb7 100644 --- a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeNullableTurboModule.js +++ b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeNullableTurboModule.js @@ -13,12 +13,12 @@ import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport'; import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; export interface Spec extends TurboModule { - readonly getBool: (a: ?boolean) => ?boolean; - readonly getNumber: (a: ?number) => ?number; - readonly getString: (a: ?number) => ?string; - readonly getArray: (a: ?Array) => ?Array; - readonly getObject: (a: ?Object) => ?Object; - readonly getValueWithPromise: () => ?Promise; + +getBool: (a: ?boolean) => ?boolean; + +getNumber: (a: ?number) => ?number; + +getString: (a: ?number) => ?string; + +getArray: (a: ?Array) => ?Array; + +getObject: (a: ?Object) => ?Object; + +getValueWithPromise: () => ?Promise; } export default TurboModuleRegistry.getEnforcing( diff --git a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeNumberTurboModule.js b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeNumberTurboModule.js index 9754aa73bdd5..ddbf1ef0532e 100644 --- a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeNumberTurboModule.js +++ b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeNumberTurboModule.js @@ -16,8 +16,8 @@ export type Number = number; type AnotherNumber = Number; export interface Spec extends TurboModule { - readonly getNumber: (arg: number) => number; - readonly getNumberWithAlias: (arg: Number) => AnotherNumber; + +getNumber: (arg: number) => number; + +getNumberWithAlias: (arg: Number) => AnotherNumber; } export default TurboModuleRegistry.getEnforcing( diff --git a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeObjectTurboModule.js b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeObjectTurboModule.js index 39b171ee3d37..b0967fea6f34 100644 --- a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeObjectTurboModule.js +++ b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeObjectTurboModule.js @@ -16,12 +16,10 @@ export type GenericObject = Object; type AnotherGenericObject = GenericObject; export interface Spec extends TurboModule { - readonly getGenericObject: (arg: Object) => Object; - readonly getGenericObjectReadOnly: (arg: Object) => Readonly<{a: string}>; - readonly getGenericObjectWithAlias: ( - arg: GenericObject, - ) => AnotherGenericObject; - readonly difficultObject: (A: { + +getGenericObject: (arg: Object) => Object; + +getGenericObjectReadOnly: (arg: Object) => Readonly<{a: string}>; + +getGenericObjectWithAlias: (arg: GenericObject) => AnotherGenericObject; + +difficultObject: (A: { D: boolean, E: { D: boolean, @@ -42,7 +40,7 @@ export interface Spec extends TurboModule { }, F: string, }; - readonly getConstants: () => { + +getConstants: () => { D: boolean, E: { D: boolean, diff --git a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeOptionalObjectTurboModule.js b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeOptionalObjectTurboModule.js index a8c4dd18c4d8..a08851e37d0f 100644 --- a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeOptionalObjectTurboModule.js +++ b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeOptionalObjectTurboModule.js @@ -13,7 +13,7 @@ import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport'; import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; export interface Spec extends TurboModule { - readonly getConstants: () => { + +getConstants: () => { D?: ?boolean, A?: Array, E?: ?{ diff --git a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativePartialAnnotationTurboModule.js b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativePartialAnnotationTurboModule.js index 7e8718733ba0..eadaef861a98 100644 --- a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativePartialAnnotationTurboModule.js +++ b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativePartialAnnotationTurboModule.js @@ -22,10 +22,10 @@ export type SomeObj = { export type PartialSomeObj = Partial; export interface Spec extends TurboModule { - readonly getSomeObj: () => SomeObj; - readonly getPartialSomeObj: () => Partial; - readonly getSomeObjFromPartialSomeObj: (value: Partial) => SomeObj; - readonly getPartialPartial: ( + +getSomeObj: () => SomeObj; + +getPartialSomeObj: () => Partial; + +getSomeObjFromPartialSomeObj: (value: Partial) => SomeObj; + +getPartialPartial: ( value1: Partial, value2: PartialSomeObj, ) => SomeObj; diff --git a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativePromiseTurboModule.js b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativePromiseTurboModule.js index 9eaeb0f2f823..689eccb5cf51 100644 --- a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativePromiseTurboModule.js +++ b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativePromiseTurboModule.js @@ -16,8 +16,8 @@ export type String = string; type AnotherPromise = Promise; export interface Spec extends TurboModule { - readonly getValueWithPromise: (error: boolean) => Promise; - readonly getValueWithPromiseWithAlias: (arg: String) => AnotherPromise; + +getValueWithPromise: (error: boolean) => Promise; + +getValueWithPromiseWithAlias: (arg: String) => AnotherPromise; } export default TurboModuleRegistry.getEnforcing( diff --git a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeSampleTurboModule.js b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeSampleTurboModule.js index a1f7c0b1fd78..958993293524 100644 --- a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeSampleTurboModule.js +++ b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeSampleTurboModule.js @@ -21,23 +21,23 @@ type Animal = { export interface Spec extends TurboModule { // Exported methods. - readonly getConstants: () => { + +getConstants: () => { const1: boolean, const2: number, const3: string, }; - readonly voidFunc: () => void; - readonly getBool: (arg: boolean) => boolean; - readonly getNumber: (arg: number) => number; - readonly getString: (arg: string) => string; - readonly getArray: (arg: Array) => Array; - readonly getObject: (arg: Object) => Object; - readonly getObjectShape: (arg: {prop: number}) => {prop: number}; - readonly getAlias: (arg: Animal) => Animal; - readonly getRootTag: (arg: RootTag) => RootTag; - readonly getValue: (x: number, y: string, z: Object) => Object; - readonly getValueWithCallback: (callback: (value: string) => void) => void; - readonly getValueWithPromise: (error: boolean) => Promise; + +voidFunc: () => void; + +getBool: (arg: boolean) => boolean; + +getNumber: (arg: number) => number; + +getString: (arg: string) => string; + +getArray: (arg: Array) => Array; + +getObject: (arg: Object) => Object; + +getObjectShape: (arg: {prop: number}) => {prop: number}; + +getAlias: (arg: Animal) => Animal; + +getRootTag: (arg: RootTag) => RootTag; + +getValue: (x: number, y: string, z: Object) => Object; + +getValueWithCallback: (callback: (value: string) => void) => void; + +getValueWithPromise: (error: boolean) => Promise; } export default TurboModuleRegistry.getEnforcing( diff --git a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeSampleTurboModuleArrays.js b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeSampleTurboModuleArrays.js index 790a5a4861e3..b187b5c0e38f 100644 --- a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeSampleTurboModuleArrays.js +++ b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeSampleTurboModuleArrays.js @@ -21,34 +21,28 @@ type Animal = { export interface Spec extends TurboModule { // Exported methods. - readonly getConstants: () => { + +getConstants: () => { const1: Array, const2: Array, const3: Array, id?: Array, }; - readonly voidFunc: () => void; - readonly getBool: (id: Array) => Array; - readonly getNumber: (arg: Array) => Array; - readonly getString: (arg: Array) => Array; - readonly getArray: (arg: Array>) => Array>; - readonly getObject: (arg: Array) => Array; - readonly getObjectShape: ( - arg: Array<{prop: number}>, - ) => Array<{prop: number}>; - readonly getAlias: (arg: Array) => Array; - readonly getRootTag: (arg: Array) => Array; - readonly getValue: ( + +voidFunc: () => void; + +getBool: (id: Array) => Array; + +getNumber: (arg: Array) => Array; + +getString: (arg: Array) => Array; + +getArray: (arg: Array>) => Array>; + +getObject: (arg: Array) => Array; + +getObjectShape: (arg: Array<{prop: number}>) => Array<{prop: number}>; + +getAlias: (arg: Array) => Array; + +getRootTag: (arg: Array) => Array; + +getValue: ( x: Array, y: Array, z: Array, ) => Array; - readonly getValueWithCallback: ( - callback: (value: Array) => void, - ) => void; - readonly getValueWithPromise: ( - error: Array, - ) => Promise>; + +getValueWithCallback: (callback: (value: Array) => void) => void; + +getValueWithPromise: (error: Array) => Promise>; } export default TurboModuleRegistry.getEnforcing( diff --git a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeSampleTurboModuleNullable.js b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeSampleTurboModuleNullable.js index d635d0d23e63..a004705148a2 100644 --- a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeSampleTurboModuleNullable.js +++ b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeSampleTurboModuleNullable.js @@ -21,23 +21,23 @@ type Animal = ?{ export interface Spec extends TurboModule { // Exported methods. - readonly getConstants: () => { + +getConstants: () => { const1: ?boolean, const2: ?number, const3: ?string, }; - readonly voidFunc: () => void; - readonly getBool: (arg: ?boolean) => ?boolean; - readonly getNumber: (arg: ?number) => ?number; - readonly getString: (arg: ?string) => ?string; - readonly getArray: (arg: ?Array) => ?Array; - readonly getObject: (arg: ?Object) => ?Object; - readonly getObjectShape: (arg: ?{prop: ?number}) => ?{prop: ?number}; - readonly getAlias: (arg: ?Animal) => ?Animal; - readonly getRootTag: (arg: ?RootTag) => ?RootTag; - readonly getValue: (x: ?number, y: ?string, z: ?Object) => ?Object; - readonly getValueWithCallback: (callback: (value: ?string) => void) => void; - readonly getValueWithPromise: (error: ?boolean) => ?Promise; + +voidFunc: () => void; + +getBool: (arg: ?boolean) => ?boolean; + +getNumber: (arg: ?number) => ?number; + +getString: (arg: ?string) => ?string; + +getArray: (arg: ?Array) => ?Array; + +getObject: (arg: ?Object) => ?Object; + +getObjectShape: (arg: ?{prop: ?number}) => ?{prop: ?number}; + +getAlias: (arg: ?Animal) => ?Animal; + +getRootTag: (arg: ?RootTag) => ?RootTag; + +getValue: (x: ?number, y: ?string, z: ?Object) => ?Object; + +getValueWithCallback: (callback: (value: ?string) => void) => void; + +getValueWithPromise: (error: ?boolean) => ?Promise; } export default TurboModuleRegistry.getEnforcing( diff --git a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeSampleTurboModuleNullableAndOptional.js b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeSampleTurboModuleNullableAndOptional.js index b9fb069bca05..c5ce3699a5bc 100644 --- a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeSampleTurboModuleNullableAndOptional.js +++ b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeSampleTurboModuleNullableAndOptional.js @@ -21,25 +21,23 @@ type Animal = ?{ export interface Spec extends TurboModule { // Exported methods. - readonly getConstants?: () => { + +getConstants?: () => { const1?: ?boolean, const2?: ?number, const3?: ?string, }; - readonly voidFunc?: () => void; - readonly getBool?: (arg?: ?boolean) => ?boolean; - readonly getNumber?: (arg?: ?number) => ?number; - readonly getString?: (arg?: ?string) => ?string; - readonly getArray?: (arg?: ?Array) => ?Array; - readonly getObject?: (arg?: ?Object) => ?Object; - readonly getObjectShape?: (arg?: {prop?: ?number}) => {prop?: ?number}; - readonly getAlias?: (arg?: ?Animal) => ?Animal; - readonly getRootTag?: (arg?: ?RootTag) => ?RootTag; - readonly getValue?: (x?: ?number, y?: ?string, z?: ?Object) => ?Object; - readonly getValueWithCallback?: ( - callback?: ?(value?: ?string) => void, - ) => void; - readonly getValueWithPromise?: (error?: ?boolean) => ?Promise; + +voidFunc?: () => void; + +getBool?: (arg?: ?boolean) => ?boolean; + +getNumber?: (arg?: ?number) => ?number; + +getString?: (arg?: ?string) => ?string; + +getArray?: (arg?: ?Array) => ?Array; + +getObject?: (arg?: ?Object) => ?Object; + +getObjectShape?: (arg?: {prop?: ?number}) => {prop?: ?number}; + +getAlias?: (arg?: ?Animal) => ?Animal; + +getRootTag?: (arg?: ?RootTag) => ?RootTag; + +getValue?: (x?: ?number, y?: ?string, z?: ?Object) => ?Object; + +getValueWithCallback?: (callback?: ?(value?: ?string) => void) => void; + +getValueWithPromise?: (error?: ?boolean) => ?Promise; } export default TurboModuleRegistry.getEnforcing( diff --git a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeSampleTurboModuleOptional.js b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeSampleTurboModuleOptional.js index c5aa1d50eb81..8e070fe6ce34 100644 --- a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeSampleTurboModuleOptional.js +++ b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeSampleTurboModuleOptional.js @@ -21,23 +21,23 @@ type Animal = { export interface Spec extends TurboModule { // Exported methods. - readonly getConstants?: () => { + +getConstants?: () => { const1?: boolean, const2?: number, const3?: string, }; - readonly voidFunc?: () => void; - readonly getBool?: (arg?: boolean) => boolean; - readonly getNumber?: (arg?: number) => number; - readonly getString?: (arg?: string) => string; - readonly getArray?: (arg?: Array) => Array; - readonly getObject?: (arg?: Object) => Object; - readonly getObjectShape?: (arg?: {prop?: number}) => {prop?: number}; - readonly getAlias?: (arg?: Animal) => Animal; - readonly getRootTag?: (arg?: RootTag) => RootTag; - readonly getValue?: (x?: number, y?: string, z?: Object) => Object; - readonly getValueWithCallback?: (callback?: (value?: string) => void) => void; - readonly getValueWithPromise?: (error?: boolean) => Promise; + +voidFunc?: () => void; + +getBool?: (arg?: boolean) => boolean; + +getNumber?: (arg?: number) => number; + +getString?: (arg?: string) => string; + +getArray?: (arg?: Array) => Array; + +getObject?: (arg?: Object) => Object; + +getObjectShape?: (arg?: {prop?: number}) => {prop?: number}; + +getAlias?: (arg?: Animal) => Animal; + +getRootTag?: (arg?: RootTag) => RootTag; + +getValue?: (x?: number, y?: string, z?: Object) => Object; + +getValueWithCallback?: (callback?: (value?: string) => void) => void; + +getValueWithPromise?: (error?: boolean) => Promise; } export default TurboModuleRegistry.getEnforcing( diff --git a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeStringTurboModule.js b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeStringTurboModule.js index 2ae70cf5a62d..76b1964cae54 100644 --- a/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeStringTurboModule.js +++ b/packages/react-native-codegen/e2e/deep_imports/__test_fixtures__/modules/NativeStringTurboModule.js @@ -16,8 +16,8 @@ export type String = string; type AnotherString = String; export interface Spec extends TurboModule { - readonly getString: (arg: string) => string; - readonly getStringWithAlias: (arg: String) => AnotherString; + +getString: (arg: string) => string; + +getStringWithAlias: (arg: String) => AnotherString; } export default TurboModuleRegistry.getEnforcing( diff --git a/packages/react-native/Libraries/Animated/createAnimatedComponent.js b/packages/react-native/Libraries/Animated/createAnimatedComponent.js index b6b3953b429d..435aea045ce6 100644 --- a/packages/react-native/Libraries/Animated/createAnimatedComponent.js +++ b/packages/react-native/Libraries/Animated/createAnimatedComponent.js @@ -51,7 +51,7 @@ export type WithAnimatedValue = T extends Builtin | Nullable : T extends ReadonlyArray ? ReadonlyArray> : T extends {...} - ? {readonly [K in keyof T]: WithAnimatedValue} + ? {+[K in keyof T]: WithAnimatedValue} : T; type NonAnimatedProps = diff --git a/packages/react-native/Libraries/Image/__tests__/Image-requestPriority-itest.js b/packages/react-native/Libraries/Image/__tests__/Image-requestPriority-itest.js deleted file mode 100644 index ae6a64f0977c..000000000000 --- a/packages/react-native/Libraries/Image/__tests__/Image-requestPriority-itest.js +++ /dev/null @@ -1,455 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @fantom_flags enableImageRequestDowngradingForNonVisibleImages:true - * @flow strict-local - * @format - */ - -import '@react-native/fantom/src/setUpDefaultReactNativeEnvironment'; - -import type {RootConfig} from '@react-native/fantom'; - -import * as Fantom from '@react-native/fantom'; -import * as React from 'react'; -import {Image, ScrollView, View} from 'react-native'; -import NativeFantom from 'react-native/src/private/testing/fantom/specs/NativeFantom'; - -const IMAGE_SOURCE = {uri: 'https://reactnative.dev/img/tiny_logo.png'}; -const UPDATED_IMAGE_SOURCE = { - uri: 'https://reactnative.dev/img/header_logo.svg', -}; - -type ImageRequestPriority = 'immediate' | 'prefetch'; - -function expectLatestImageRequestPriority( - element: React.MixedElement, - expectedPriority: ImageRequestPriority, - rootConfig?: RootConfig, -) { - const root = Fantom.createRoot({ - viewportWidth: 100, - viewportHeight: 100, - ...rootConfig, - }); - - Fantom.runTask(() => { - root.render(element); - }); - - expect(NativeFantom.getImageRequestCount(IMAGE_SOURCE.uri)).toBe(1); - expect(NativeFantom.getImageRequestPriority(IMAGE_SOURCE.uri)).toBe( - expectedPriority, - ); -} - -describe(' request priority', () => { - beforeEach(() => { - NativeFantom.clearImageRequests(); - }); - - afterEach(() => { - NativeFantom.clearImageRequests(); - }); - - it('requests visible images at immediate priority', () => { - expectLatestImageRequestPriority( - , - 'immediate', - ); - }); - - it('requests images below the viewport at prefetch priority', () => { - expectLatestImageRequestPriority( - , - 'prefetch', - ); - }); - - it('requests images above the viewport at prefetch priority', () => { - expectLatestImageRequestPriority( - , - 'prefetch', - ); - }); - - it('requests images left of the viewport at prefetch priority', () => { - expectLatestImageRequestPriority( - , - 'prefetch', - ); - }); - - it('requests images right of the viewport at prefetch priority', () => { - expectLatestImageRequestPriority( - , - 'prefetch', - ); - }); - - it('requests edge-touching images at prefetch priority', () => { - expectLatestImageRequestPriority( - , - 'prefetch', - ); - }); - - it('requests one-pixel-overlapping images at immediate priority', () => { - expectLatestImageRequestPriority( - , - 'immediate', - ); - }); - - it('uses nested layout offsets when calculating priority', () => { - expectLatestImageRequestPriority( - - - , - 'prefetch', - ); - }); - - it('uses viewport offsets when calculating priority', () => { - expectLatestImageRequestPriority( - , - 'prefetch', - { - viewportOffsetY: 25, - }, - ); - }); - - it('uses ScrollView content offsets when calculating priority', () => { - expectLatestImageRequestPriority( - - - , - 'immediate', - ); - }); - - it('requests images above the ScrollView viewport at prefetch priority', () => { - expectLatestImageRequestPriority( - - - , - 'prefetch', - ); - }); - - it('requests images below the ScrollView viewport at prefetch priority', () => { - expectLatestImageRequestPriority( - - - , - 'prefetch', - ); - }); - - it('uses smaller ScrollView content offsets when calculating priority', () => { - expectLatestImageRequestPriority( - - - , - 'immediate', - ); - }); - - it('uses horizontal ScrollView content offsets when calculating priority', () => { - expectLatestImageRequestPriority( - - - , - 'immediate', - ); - }); - - it('requests images left of a horizontal ScrollView viewport at prefetch priority', () => { - expectLatestImageRequestPriority( - - - , - 'prefetch', - ); - }); - - it('requests images right of a horizontal ScrollView viewport at prefetch priority', () => { - expectLatestImageRequestPriority( - - - , - 'prefetch', - ); - }); - - it('uses image transforms when calculating priority', () => { - expectLatestImageRequestPriority( - , - 'immediate', - ); - }); - - it('uses image transforms that move images out of the viewport when calculating priority', () => { - expectLatestImageRequestPriority( - , - 'prefetch', - ); - }); - - it('uses image scale transforms when calculating priority', () => { - expectLatestImageRequestPriority( - , - 'immediate', - ); - }); - - it('uses ancestor transforms when calculating priority', () => { - expectLatestImageRequestPriority( - - - , - 'immediate', - ); - }); - - it('uses ancestor transforms that move images out of the viewport when calculating priority', () => { - expectLatestImageRequestPriority( - - - , - 'prefetch', - ); - }); - - it('updates priority when layout moves an image onscreen', () => { - const root = Fantom.createRoot({ - viewportWidth: 100, - viewportHeight: 100, - }); - - Fantom.runTask(() => { - root.render( - , - ); - }); - - expect(NativeFantom.getImageRequestCount(IMAGE_SOURCE.uri)).toBe(1); - expect(NativeFantom.getImageRequestPriority(IMAGE_SOURCE.uri)).toBe( - 'prefetch', - ); - - Fantom.runTask(() => { - root.render( - , - ); - }); - - expect(NativeFantom.getImageRequestCount(IMAGE_SOURCE.uri)).toBe(2); - expect(NativeFantom.getImageRequestPriority(IMAGE_SOURCE.uri)).toBe( - 'immediate', - ); - }); - - it('keeps offscreen priority when the source changes without a layout change', () => { - const root = Fantom.createRoot({ - viewportWidth: 100, - viewportHeight: 100, - }); - - const offscreenStyle = { - height: 50, - left: 0, - position: 'absolute', - top: 150, - width: 50, - } as const; - - Fantom.runTask(() => { - root.render(); - }); - - expect(NativeFantom.getImageRequestCount(IMAGE_SOURCE.uri)).toBe(1); - expect(NativeFantom.getImageRequestPriority(IMAGE_SOURCE.uri)).toBe( - 'prefetch', - ); - - NativeFantom.clearImageRequests(); - - Fantom.runTask(() => { - root.render( - , - ); - }); - - expect(NativeFantom.getImageRequestCount(UPDATED_IMAGE_SOURCE.uri)).toBe(1); - expect(NativeFantom.getImageRequestPriority(UPDATED_IMAGE_SOURCE.uri)).toBe( - 'prefetch', - ); - }); -}); diff --git a/packages/react-native/React/Base/RCTUtils.mm b/packages/react-native/React/Base/RCTUtils.mm index 44ebe7d3260a..ba4e930c731d 100644 --- a/packages/react-native/React/Base/RCTUtils.mm +++ b/packages/react-native/React/Base/RCTUtils.mm @@ -11,6 +11,7 @@ #import #import #import +#import #import #import @@ -311,12 +312,15 @@ void RCTUnsafeExecuteOnMainQueueSync(dispatch_block_t block) } #if !TARGET_OS_TV - unsafeExecuteOnMainThreadSync(block); -#else + if (ReactNativeFeatureFlags::enableMainQueueCoordinatorOnIOS()) { + unsafeExecuteOnMainThreadSync(block); + return; + } +#endif + dispatch_sync(dispatch_get_main_queue(), ^{ block(); }); -#endif } static void RCTUnsafeExecuteOnMainQueueOnceSync(dispatch_once_t *onceToken, dispatch_block_t block) @@ -338,10 +342,13 @@ static void RCTUnsafeExecuteOnMainQueueOnceSync(dispatch_once_t *onceToken, disp } #if !TARGET_OS_TV - unsafeExecuteOnMainThreadSync(block); -#else - dispatch_sync(dispatch_get_main_queue(), executeOnce); + if (ReactNativeFeatureFlags::enableMainQueueCoordinatorOnIOS()) { + unsafeExecuteOnMainThreadSync(block); + return; + } #endif + + dispatch_sync(dispatch_get_main_queue(), executeOnce); } CGFloat RCTScreenScale(void) diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/Image/RCTImageComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/Image/RCTImageComponentView.mm index 8f60235ca3b6..99104f0ec8fc 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/Image/RCTImageComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/Image/RCTImageComponentView.mm @@ -11,7 +11,6 @@ #import #import #import -#import #import #import #import @@ -20,40 +19,9 @@ using namespace facebook::react; -static NSString *const RCTImageRequestPriorityDebugOverlayEnabledEnvironmentVariable = - @"RCT_IMAGE_REQUEST_PRIORITY_DEBUG_OVERLAY"; - -static BOOL RCTImageRequestPriorityDebugOverlayEnabled() -{ - if (ReactNativeFeatureFlags::enableImageRequestDowngradingForNonVisibleImages()) { - static BOOL enabled = NO; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - NSDictionary *environment = [[NSProcessInfo processInfo] environment]; - enabled = [environment[RCTImageRequestPriorityDebugOverlayEnabledEnvironmentVariable] boolValue]; - }); - return enabled; - } else { - return NO; - } -} - -static NSString *RCTImageRequestPriorityDebugLabel(ImageRequestPriority priority) -{ - switch (priority) { - case ImageRequestPriority::Immediate: - return @"immediate"; - case ImageRequestPriority::Prefetch: - return @"offscreen"; - default: - return @"unknown"; - } -} - @implementation RCTImageComponentView { ImageShadowNode::ConcreteState::Shared _state; std::shared_ptr _imageResponseObserverProxy; - UILabel *_requestPriorityLabel; } - (instancetype)initWithFrame:(CGRect)frame @@ -117,7 +85,6 @@ - (void)updateState:(const State::Shared &)state oldState:(const State::Shared & auto newImageState = std::static_pointer_cast(state); [self _setStateAndResubscribeImageResponseObserver:newImageState]; - [self _updateRequestPriorityLabelWithState:newImageState]; bool havePreviousData = oldImageState && oldImageState->getData().getImageSource() != ImageSource{}; @@ -148,53 +115,10 @@ - (void)_setStateAndResubscribeImageResponseObserver:(const ImageShadowNode::Con } } -- (UILabel *)_requestPriorityLabel -{ - if (!_requestPriorityLabel) { - _requestPriorityLabel = [UILabel new]; - _requestPriorityLabel.accessibilityElementsHidden = YES; - _requestPriorityLabel.backgroundColor = [UIColor colorWithWhite:0 alpha:0.65]; - _requestPriorityLabel.clipsToBounds = YES; - _requestPriorityLabel.font = [UIFont systemFontOfSize:10 weight:UIFontWeightSemibold]; - _requestPriorityLabel.hidden = YES; - _requestPriorityLabel.isAccessibilityElement = NO; - _requestPriorityLabel.layer.cornerRadius = 3; - _requestPriorityLabel.textAlignment = NSTextAlignmentCenter; - _requestPriorityLabel.textColor = UIColor.whiteColor; - [_imageView addSubview:_requestPriorityLabel]; - } - - return _requestPriorityLabel; -} - -- (void)_updateRequestPriorityLabelWithState:(const ImageShadowNode::ConcreteState::Shared &)state -{ - if (!state || !RCTImageRequestPriorityDebugOverlayEnabled()) { - if (_requestPriorityLabel) { - _requestPriorityLabel.hidden = YES; - _requestPriorityLabel.text = nil; - } - return; - } - - UILabel *requestPriorityLabel = [self _requestPriorityLabel]; - requestPriorityLabel.text = RCTImageRequestPriorityDebugLabel(state->getData().getImageRequestParams().priority); - [requestPriorityLabel sizeToFit]; - - CGRect frame = requestPriorityLabel.frame; - frame.origin = CGPointMake(2, 2); - frame.size.width += 8; - frame.size.height += 4; - requestPriorityLabel.frame = frame; - requestPriorityLabel.hidden = NO; - [_imageView bringSubviewToFront:requestPriorityLabel]; -} - - (void)prepareForRecycle { [super prepareForRecycle]; [self _setStateAndResubscribeImageResponseObserver:nullptr]; - [self _updateRequestPriorityLabelWithState:nullptr]; _imageView.image = nil; } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt index 79365f7c6447..166a429df92c 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<86c797c19cc585b74714ca3aa75bbd6d>> + * @generated SignedSource<> */ /** @@ -192,12 +192,6 @@ public object ReactNativeFeatureFlags { @JvmStatic public fun enableImagePrefetchingAndroid(): Boolean = accessor.enableImagePrefetchingAndroid() - /** - * When enabled, ImageShadowNode downgrades image requests to prefetch priority when layout determines that the image does not intersect the viewport. - */ - @JvmStatic - public fun enableImageRequestDowngradingForNonVisibleImages(): Boolean = accessor.enableImageRequestDowngradingForNonVisibleImages() - /** * Dispatches state updates for content offset changes synchronously on the main thread. */ @@ -240,6 +234,12 @@ public object ReactNativeFeatureFlags { @JvmStatic public fun enableLayoutAnimationsOnIOS(): Boolean = accessor.enableLayoutAnimationsOnIOS() + /** + * Make RCTUnsafeExecuteOnMainQueueSync less likely to deadlock, when used in conjuction with sync rendering/events. + */ + @JvmStatic + public fun enableMainQueueCoordinatorOnIOS(): Boolean = accessor.enableMainQueueCoordinatorOnIOS() + /** * Enable NSNull conversion when handling module arguments on iOS */ diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt index 305ce615168b..fb4e124a3c26 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<5072b83512e1a86dc1382268f18916f4>> */ /** @@ -47,7 +47,6 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces private var enableIOSTextBaselineOffsetPerLineCache: Boolean? = null private var enableIOSViewClipToPaddingBoxCache: Boolean? = null private var enableImagePrefetchingAndroidCache: Boolean? = null - private var enableImageRequestDowngradingForNonVisibleImagesCache: Boolean? = null private var enableImmediateUpdateModeForContentOffsetChangesCache: Boolean? = null private var enableImperativeFocusCache: Boolean? = null private var enableInteropViewManagerClassLookUpOptimizationIOSCache: Boolean? = null @@ -55,6 +54,7 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces private var enableKeyEventsCache: Boolean? = null private var enableLayoutAnimationsOnAndroidCache: Boolean? = null private var enableLayoutAnimationsOnIOSCache: Boolean? = null + private var enableMainQueueCoordinatorOnIOSCache: Boolean? = null private var enableModuleArgumentNSNullConversionIOSCache: Boolean? = null private var enableMutationObserverByDefaultCache: Boolean? = null private var enableNativeCSSParsingCache: Boolean? = null @@ -351,15 +351,6 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces return cached } - override fun enableImageRequestDowngradingForNonVisibleImages(): Boolean { - var cached = enableImageRequestDowngradingForNonVisibleImagesCache - if (cached == null) { - cached = ReactNativeFeatureFlagsCxxInterop.enableImageRequestDowngradingForNonVisibleImages() - enableImageRequestDowngradingForNonVisibleImagesCache = cached - } - return cached - } - override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean { var cached = enableImmediateUpdateModeForContentOffsetChangesCache if (cached == null) { @@ -423,6 +414,15 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces return cached } + override fun enableMainQueueCoordinatorOnIOS(): Boolean { + var cached = enableMainQueueCoordinatorOnIOSCache + if (cached == null) { + cached = ReactNativeFeatureFlagsCxxInterop.enableMainQueueCoordinatorOnIOS() + enableMainQueueCoordinatorOnIOSCache = cached + } + return cached + } + override fun enableModuleArgumentNSNullConversionIOS(): Boolean { var cached = enableModuleArgumentNSNullConversionIOSCache if (cached == null) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt index dc2b84bde267..e24858b67e2b 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<2ee82b1e1dcae3ea10dbd92549d65a6c>> + * @generated SignedSource<<9110ccc69266f7a51738ca533df3a150>> */ /** @@ -82,8 +82,6 @@ public object ReactNativeFeatureFlagsCxxInterop { @DoNotStrip @JvmStatic public external fun enableImagePrefetchingAndroid(): Boolean - @DoNotStrip @JvmStatic public external fun enableImageRequestDowngradingForNonVisibleImages(): Boolean - @DoNotStrip @JvmStatic public external fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean @DoNotStrip @JvmStatic public external fun enableImperativeFocus(): Boolean @@ -98,6 +96,8 @@ public object ReactNativeFeatureFlagsCxxInterop { @DoNotStrip @JvmStatic public external fun enableLayoutAnimationsOnIOS(): Boolean + @DoNotStrip @JvmStatic public external fun enableMainQueueCoordinatorOnIOS(): Boolean + @DoNotStrip @JvmStatic public external fun enableModuleArgumentNSNullConversionIOS(): Boolean @DoNotStrip @JvmStatic public external fun enableMutationObserverByDefault(): Boolean diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt index f8139daac1e9..fbe4ad98e4d6 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<738a114e73ddb940fb14efd0dff79d1b>> + * @generated SignedSource<> */ /** @@ -77,8 +77,6 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi override fun enableImagePrefetchingAndroid(): Boolean = false - override fun enableImageRequestDowngradingForNonVisibleImages(): Boolean = false - override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean = false override fun enableImperativeFocus(): Boolean = false @@ -93,6 +91,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi override fun enableLayoutAnimationsOnIOS(): Boolean = true + override fun enableMainQueueCoordinatorOnIOS(): Boolean = false + override fun enableModuleArgumentNSNullConversionIOS(): Boolean = false override fun enableMutationObserverByDefault(): Boolean = false diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt index 8f53fbccb447..6bc21fdf7735 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<135694971d264d19c84eb6aea5fc8425>> */ /** @@ -51,7 +51,6 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc private var enableIOSTextBaselineOffsetPerLineCache: Boolean? = null private var enableIOSViewClipToPaddingBoxCache: Boolean? = null private var enableImagePrefetchingAndroidCache: Boolean? = null - private var enableImageRequestDowngradingForNonVisibleImagesCache: Boolean? = null private var enableImmediateUpdateModeForContentOffsetChangesCache: Boolean? = null private var enableImperativeFocusCache: Boolean? = null private var enableInteropViewManagerClassLookUpOptimizationIOSCache: Boolean? = null @@ -59,6 +58,7 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc private var enableKeyEventsCache: Boolean? = null private var enableLayoutAnimationsOnAndroidCache: Boolean? = null private var enableLayoutAnimationsOnIOSCache: Boolean? = null + private var enableMainQueueCoordinatorOnIOSCache: Boolean? = null private var enableModuleArgumentNSNullConversionIOSCache: Boolean? = null private var enableMutationObserverByDefaultCache: Boolean? = null private var enableNativeCSSParsingCache: Boolean? = null @@ -382,16 +382,6 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc return cached } - override fun enableImageRequestDowngradingForNonVisibleImages(): Boolean { - var cached = enableImageRequestDowngradingForNonVisibleImagesCache - if (cached == null) { - cached = currentProvider.enableImageRequestDowngradingForNonVisibleImages() - accessedFeatureFlags.add("enableImageRequestDowngradingForNonVisibleImages") - enableImageRequestDowngradingForNonVisibleImagesCache = cached - } - return cached - } - override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean { var cached = enableImmediateUpdateModeForContentOffsetChangesCache if (cached == null) { @@ -462,6 +452,16 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc return cached } + override fun enableMainQueueCoordinatorOnIOS(): Boolean { + var cached = enableMainQueueCoordinatorOnIOSCache + if (cached == null) { + cached = currentProvider.enableMainQueueCoordinatorOnIOS() + accessedFeatureFlags.add("enableMainQueueCoordinatorOnIOS") + enableMainQueueCoordinatorOnIOSCache = cached + } + return cached + } + override fun enableModuleArgumentNSNullConversionIOS(): Boolean { var cached = enableModuleArgumentNSNullConversionIOSCache if (cached == null) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt index 48cd9d2cfdbd..5869b6b50483 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> */ /** @@ -77,8 +77,6 @@ public interface ReactNativeFeatureFlagsProvider { @DoNotStrip public fun enableImagePrefetchingAndroid(): Boolean - @DoNotStrip public fun enableImageRequestDowngradingForNonVisibleImages(): Boolean - @DoNotStrip public fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean @DoNotStrip public fun enableImperativeFocus(): Boolean @@ -93,6 +91,8 @@ public interface ReactNativeFeatureFlagsProvider { @DoNotStrip public fun enableLayoutAnimationsOnIOS(): Boolean + @DoNotStrip public fun enableMainQueueCoordinatorOnIOS(): Boolean + @DoNotStrip public fun enableModuleArgumentNSNullConversionIOS(): Boolean @DoNotStrip public fun enableMutationObserverByDefault(): Boolean diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp index 6739e6bbd6f0..6d738fea9d7b 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<99f843dd0784f9fe372f943767e2033c>> + * @generated SignedSource<> */ /** @@ -201,12 +201,6 @@ class ReactNativeFeatureFlagsJavaProvider return method(javaProvider_); } - bool enableImageRequestDowngradingForNonVisibleImages() override { - static const auto method = - getReactNativeFeatureFlagsProviderJavaClass()->getMethod("enableImageRequestDowngradingForNonVisibleImages"); - return method(javaProvider_); - } - bool enableImmediateUpdateModeForContentOffsetChanges() override { static const auto method = getReactNativeFeatureFlagsProviderJavaClass()->getMethod("enableImmediateUpdateModeForContentOffsetChanges"); @@ -249,6 +243,12 @@ class ReactNativeFeatureFlagsJavaProvider return method(javaProvider_); } + bool enableMainQueueCoordinatorOnIOS() override { + static const auto method = + getReactNativeFeatureFlagsProviderJavaClass()->getMethod("enableMainQueueCoordinatorOnIOS"); + return method(javaProvider_); + } + bool enableModuleArgumentNSNullConversionIOS() override { static const auto method = getReactNativeFeatureFlagsProviderJavaClass()->getMethod("enableModuleArgumentNSNullConversionIOS"); @@ -700,11 +700,6 @@ bool JReactNativeFeatureFlagsCxxInterop::enableImagePrefetchingAndroid( return ReactNativeFeatureFlags::enableImagePrefetchingAndroid(); } -bool JReactNativeFeatureFlagsCxxInterop::enableImageRequestDowngradingForNonVisibleImages( - facebook::jni::alias_ref /*unused*/) { - return ReactNativeFeatureFlags::enableImageRequestDowngradingForNonVisibleImages(); -} - bool JReactNativeFeatureFlagsCxxInterop::enableImmediateUpdateModeForContentOffsetChanges( facebook::jni::alias_ref /*unused*/) { return ReactNativeFeatureFlags::enableImmediateUpdateModeForContentOffsetChanges(); @@ -740,6 +735,11 @@ bool JReactNativeFeatureFlagsCxxInterop::enableLayoutAnimationsOnIOS( return ReactNativeFeatureFlags::enableLayoutAnimationsOnIOS(); } +bool JReactNativeFeatureFlagsCxxInterop::enableMainQueueCoordinatorOnIOS( + facebook::jni::alias_ref /*unused*/) { + return ReactNativeFeatureFlags::enableMainQueueCoordinatorOnIOS(); +} + bool JReactNativeFeatureFlagsCxxInterop::enableModuleArgumentNSNullConversionIOS( facebook::jni::alias_ref /*unused*/) { return ReactNativeFeatureFlags::enableModuleArgumentNSNullConversionIOS(); @@ -1112,9 +1112,6 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() { makeNativeMethod( "enableImagePrefetchingAndroid", JReactNativeFeatureFlagsCxxInterop::enableImagePrefetchingAndroid), - makeNativeMethod( - "enableImageRequestDowngradingForNonVisibleImages", - JReactNativeFeatureFlagsCxxInterop::enableImageRequestDowngradingForNonVisibleImages), makeNativeMethod( "enableImmediateUpdateModeForContentOffsetChanges", JReactNativeFeatureFlagsCxxInterop::enableImmediateUpdateModeForContentOffsetChanges), @@ -1136,6 +1133,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() { makeNativeMethod( "enableLayoutAnimationsOnIOS", JReactNativeFeatureFlagsCxxInterop::enableLayoutAnimationsOnIOS), + makeNativeMethod( + "enableMainQueueCoordinatorOnIOS", + JReactNativeFeatureFlagsCxxInterop::enableMainQueueCoordinatorOnIOS), makeNativeMethod( "enableModuleArgumentNSNullConversionIOS", JReactNativeFeatureFlagsCxxInterop::enableModuleArgumentNSNullConversionIOS), diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h index dd0b77894e26..9dcca78323bd 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<05716b6ab8139bc31b962f9158acd6b6>> + * @generated SignedSource<<1655eb2f217476e64b03c97bce083192>> */ /** @@ -111,9 +111,6 @@ class JReactNativeFeatureFlagsCxxInterop static bool enableImagePrefetchingAndroid( facebook::jni::alias_ref); - static bool enableImageRequestDowngradingForNonVisibleImages( - facebook::jni::alias_ref); - static bool enableImmediateUpdateModeForContentOffsetChanges( facebook::jni::alias_ref); @@ -135,6 +132,9 @@ class JReactNativeFeatureFlagsCxxInterop static bool enableLayoutAnimationsOnIOS( facebook::jni::alias_ref); + static bool enableMainQueueCoordinatorOnIOS( + facebook::jni::alias_ref); + static bool enableModuleArgumentNSNullConversionIOS( facebook::jni::alias_ref); diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp index 52b1f286fd63..6b774e1d8d9d 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> */ /** @@ -134,10 +134,6 @@ bool ReactNativeFeatureFlags::enableImagePrefetchingAndroid() { return getAccessor().enableImagePrefetchingAndroid(); } -bool ReactNativeFeatureFlags::enableImageRequestDowngradingForNonVisibleImages() { - return getAccessor().enableImageRequestDowngradingForNonVisibleImages(); -} - bool ReactNativeFeatureFlags::enableImmediateUpdateModeForContentOffsetChanges() { return getAccessor().enableImmediateUpdateModeForContentOffsetChanges(); } @@ -166,6 +162,10 @@ bool ReactNativeFeatureFlags::enableLayoutAnimationsOnIOS() { return getAccessor().enableLayoutAnimationsOnIOS(); } +bool ReactNativeFeatureFlags::enableMainQueueCoordinatorOnIOS() { + return getAccessor().enableMainQueueCoordinatorOnIOS(); +} + bool ReactNativeFeatureFlags::enableModuleArgumentNSNullConversionIOS() { return getAccessor().enableModuleArgumentNSNullConversionIOS(); } diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h index ab8a57dd6046..c1a0d8f0b8db 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<7299ac6603eb90d63d6cfb21e7ef3893>> */ /** @@ -174,11 +174,6 @@ class ReactNativeFeatureFlags { */ RN_EXPORT static bool enableImagePrefetchingAndroid(); - /** - * When enabled, ImageShadowNode downgrades image requests to prefetch priority when layout determines that the image does not intersect the viewport. - */ - RN_EXPORT static bool enableImageRequestDowngradingForNonVisibleImages(); - /** * Dispatches state updates for content offset changes synchronously on the main thread. */ @@ -214,6 +209,11 @@ class ReactNativeFeatureFlags { */ RN_EXPORT static bool enableLayoutAnimationsOnIOS(); + /** + * Make RCTUnsafeExecuteOnMainQueueSync less likely to deadlock, when used in conjuction with sync rendering/events. + */ + RN_EXPORT static bool enableMainQueueCoordinatorOnIOS(); + /** * Enable NSNull conversion when handling module arguments on iOS */ diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp index 20cb03981c57..fc51ef901f7a 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<802368c8b05006c737ab106bcb9ecf00>> + * @generated SignedSource<<5ce3ec2efef77ca4cf69fa6c82097f58>> */ /** @@ -515,24 +515,6 @@ bool ReactNativeFeatureFlagsAccessor::enableImagePrefetchingAndroid() { return flagValue.value(); } -bool ReactNativeFeatureFlagsAccessor::enableImageRequestDowngradingForNonVisibleImages() { - auto flagValue = enableImageRequestDowngradingForNonVisibleImages_.load(); - - if (!flagValue.has_value()) { - // This block is not exclusive but it is not necessary. - // If multiple threads try to initialize the feature flag, we would only - // be accessing the provider multiple times but the end state of this - // instance and the returned flag value would be the same. - - markFlagAsAccessed(27, "enableImageRequestDowngradingForNonVisibleImages"); - - flagValue = currentProvider_->enableImageRequestDowngradingForNonVisibleImages(); - enableImageRequestDowngradingForNonVisibleImages_ = flagValue; - } - - return flagValue.value(); -} - bool ReactNativeFeatureFlagsAccessor::enableImmediateUpdateModeForContentOffsetChanges() { auto flagValue = enableImmediateUpdateModeForContentOffsetChanges_.load(); @@ -542,7 +524,7 @@ bool ReactNativeFeatureFlagsAccessor::enableImmediateUpdateModeForContentOffsetC // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(28, "enableImmediateUpdateModeForContentOffsetChanges"); + markFlagAsAccessed(27, "enableImmediateUpdateModeForContentOffsetChanges"); flagValue = currentProvider_->enableImmediateUpdateModeForContentOffsetChanges(); enableImmediateUpdateModeForContentOffsetChanges_ = flagValue; @@ -560,7 +542,7 @@ bool ReactNativeFeatureFlagsAccessor::enableImperativeFocus() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(29, "enableImperativeFocus"); + markFlagAsAccessed(28, "enableImperativeFocus"); flagValue = currentProvider_->enableImperativeFocus(); enableImperativeFocus_ = flagValue; @@ -578,7 +560,7 @@ bool ReactNativeFeatureFlagsAccessor::enableInteropViewManagerClassLookUpOptimiz // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(30, "enableInteropViewManagerClassLookUpOptimizationIOS"); + markFlagAsAccessed(29, "enableInteropViewManagerClassLookUpOptimizationIOS"); flagValue = currentProvider_->enableInteropViewManagerClassLookUpOptimizationIOS(); enableInteropViewManagerClassLookUpOptimizationIOS_ = flagValue; @@ -596,7 +578,7 @@ bool ReactNativeFeatureFlagsAccessor::enableIntersectionObserverByDefault() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(31, "enableIntersectionObserverByDefault"); + markFlagAsAccessed(30, "enableIntersectionObserverByDefault"); flagValue = currentProvider_->enableIntersectionObserverByDefault(); enableIntersectionObserverByDefault_ = flagValue; @@ -614,7 +596,7 @@ bool ReactNativeFeatureFlagsAccessor::enableKeyEvents() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(32, "enableKeyEvents"); + markFlagAsAccessed(31, "enableKeyEvents"); flagValue = currentProvider_->enableKeyEvents(); enableKeyEvents_ = flagValue; @@ -632,7 +614,7 @@ bool ReactNativeFeatureFlagsAccessor::enableLayoutAnimationsOnAndroid() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(33, "enableLayoutAnimationsOnAndroid"); + markFlagAsAccessed(32, "enableLayoutAnimationsOnAndroid"); flagValue = currentProvider_->enableLayoutAnimationsOnAndroid(); enableLayoutAnimationsOnAndroid_ = flagValue; @@ -650,7 +632,7 @@ bool ReactNativeFeatureFlagsAccessor::enableLayoutAnimationsOnIOS() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(34, "enableLayoutAnimationsOnIOS"); + markFlagAsAccessed(33, "enableLayoutAnimationsOnIOS"); flagValue = currentProvider_->enableLayoutAnimationsOnIOS(); enableLayoutAnimationsOnIOS_ = flagValue; @@ -659,6 +641,24 @@ bool ReactNativeFeatureFlagsAccessor::enableLayoutAnimationsOnIOS() { return flagValue.value(); } +bool ReactNativeFeatureFlagsAccessor::enableMainQueueCoordinatorOnIOS() { + auto flagValue = enableMainQueueCoordinatorOnIOS_.load(); + + if (!flagValue.has_value()) { + // This block is not exclusive but it is not necessary. + // If multiple threads try to initialize the feature flag, we would only + // be accessing the provider multiple times but the end state of this + // instance and the returned flag value would be the same. + + markFlagAsAccessed(34, "enableMainQueueCoordinatorOnIOS"); + + flagValue = currentProvider_->enableMainQueueCoordinatorOnIOS(); + enableMainQueueCoordinatorOnIOS_ = flagValue; + } + + return flagValue.value(); +} + bool ReactNativeFeatureFlagsAccessor::enableModuleArgumentNSNullConversionIOS() { auto flagValue = enableModuleArgumentNSNullConversionIOS_.load(); diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h index bab489993007..3a6c47ac2e4b 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<6126d94aaf219c0d4a3ffe84c05b0fb2>> + * @generated SignedSource<<2f027dd5571effd4ee39326db7131eb7>> */ /** @@ -59,7 +59,6 @@ class ReactNativeFeatureFlagsAccessor { bool enableIOSTextBaselineOffsetPerLine(); bool enableIOSViewClipToPaddingBox(); bool enableImagePrefetchingAndroid(); - bool enableImageRequestDowngradingForNonVisibleImages(); bool enableImmediateUpdateModeForContentOffsetChanges(); bool enableImperativeFocus(); bool enableInteropViewManagerClassLookUpOptimizationIOS(); @@ -67,6 +66,7 @@ class ReactNativeFeatureFlagsAccessor { bool enableKeyEvents(); bool enableLayoutAnimationsOnAndroid(); bool enableLayoutAnimationsOnIOS(); + bool enableMainQueueCoordinatorOnIOS(); bool enableModuleArgumentNSNullConversionIOS(); bool enableMutationObserverByDefault(); bool enableNativeCSSParsing(); @@ -159,7 +159,6 @@ class ReactNativeFeatureFlagsAccessor { std::atomic> enableIOSTextBaselineOffsetPerLine_; std::atomic> enableIOSViewClipToPaddingBox_; std::atomic> enableImagePrefetchingAndroid_; - std::atomic> enableImageRequestDowngradingForNonVisibleImages_; std::atomic> enableImmediateUpdateModeForContentOffsetChanges_; std::atomic> enableImperativeFocus_; std::atomic> enableInteropViewManagerClassLookUpOptimizationIOS_; @@ -167,6 +166,7 @@ class ReactNativeFeatureFlagsAccessor { std::atomic> enableKeyEvents_; std::atomic> enableLayoutAnimationsOnAndroid_; std::atomic> enableLayoutAnimationsOnIOS_; + std::atomic> enableMainQueueCoordinatorOnIOS_; std::atomic> enableModuleArgumentNSNullConversionIOS_; std::atomic> enableMutationObserverByDefault_; std::atomic> enableNativeCSSParsing_; diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h index 57e4fb09c82d..2c457f1f516f 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<0dff76292f3f765d95454717d3a61c5f>> */ /** @@ -135,10 +135,6 @@ class ReactNativeFeatureFlagsDefaults : public ReactNativeFeatureFlagsProvider { return false; } - bool enableImageRequestDowngradingForNonVisibleImages() override { - return false; - } - bool enableImmediateUpdateModeForContentOffsetChanges() override { return false; } @@ -167,6 +163,10 @@ class ReactNativeFeatureFlagsDefaults : public ReactNativeFeatureFlagsProvider { return true; } + bool enableMainQueueCoordinatorOnIOS() override { + return false; + } + bool enableModuleArgumentNSNullConversionIOS() override { return false; } diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h index 6a93f2ca138e..146ac1affb60 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<6d7237856953bacb6de35ec63e859d65>> */ /** @@ -288,15 +288,6 @@ class ReactNativeFeatureFlagsDynamicProvider : public ReactNativeFeatureFlagsDef return ReactNativeFeatureFlagsDefaults::enableImagePrefetchingAndroid(); } - bool enableImageRequestDowngradingForNonVisibleImages() override { - auto value = values_["enableImageRequestDowngradingForNonVisibleImages"]; - if (!value.isNull()) { - return value.getBool(); - } - - return ReactNativeFeatureFlagsDefaults::enableImageRequestDowngradingForNonVisibleImages(); - } - bool enableImmediateUpdateModeForContentOffsetChanges() override { auto value = values_["enableImmediateUpdateModeForContentOffsetChanges"]; if (!value.isNull()) { @@ -360,6 +351,15 @@ class ReactNativeFeatureFlagsDynamicProvider : public ReactNativeFeatureFlagsDef return ReactNativeFeatureFlagsDefaults::enableLayoutAnimationsOnIOS(); } + bool enableMainQueueCoordinatorOnIOS() override { + auto value = values_["enableMainQueueCoordinatorOnIOS"]; + if (!value.isNull()) { + return value.getBool(); + } + + return ReactNativeFeatureFlagsDefaults::enableMainQueueCoordinatorOnIOS(); + } + bool enableModuleArgumentNSNullConversionIOS() override { auto value = values_["enableModuleArgumentNSNullConversionIOS"]; if (!value.isNull()) { diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h index 1a9ac2e36714..85b4175d3050 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<8a9430ba71722a75779e2b5fb6564f0e>> + * @generated SignedSource<<07a0d8f1c703685916bce8682f5b4967>> */ /** @@ -52,7 +52,6 @@ class ReactNativeFeatureFlagsProvider { virtual bool enableIOSTextBaselineOffsetPerLine() = 0; virtual bool enableIOSViewClipToPaddingBox() = 0; virtual bool enableImagePrefetchingAndroid() = 0; - virtual bool enableImageRequestDowngradingForNonVisibleImages() = 0; virtual bool enableImmediateUpdateModeForContentOffsetChanges() = 0; virtual bool enableImperativeFocus() = 0; virtual bool enableInteropViewManagerClassLookUpOptimizationIOS() = 0; @@ -60,6 +59,7 @@ class ReactNativeFeatureFlagsProvider { virtual bool enableKeyEvents() = 0; virtual bool enableLayoutAnimationsOnAndroid() = 0; virtual bool enableLayoutAnimationsOnIOS() = 0; + virtual bool enableMainQueueCoordinatorOnIOS() = 0; virtual bool enableModuleArgumentNSNullConversionIOS() = 0; virtual bool enableMutationObserverByDefault() = 0; virtual bool enableNativeCSSParsing() = 0; diff --git a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp index b3d37e663da1..1b115f658d54 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +++ b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<1b1d76d354f735488f8de5c1d0b83cc6>> */ /** @@ -179,11 +179,6 @@ bool NativeReactNativeFeatureFlags::enableImagePrefetchingAndroid( return ReactNativeFeatureFlags::enableImagePrefetchingAndroid(); } -bool NativeReactNativeFeatureFlags::enableImageRequestDowngradingForNonVisibleImages( - jsi::Runtime& /*runtime*/) { - return ReactNativeFeatureFlags::enableImageRequestDowngradingForNonVisibleImages(); -} - bool NativeReactNativeFeatureFlags::enableImmediateUpdateModeForContentOffsetChanges( jsi::Runtime& /*runtime*/) { return ReactNativeFeatureFlags::enableImmediateUpdateModeForContentOffsetChanges(); @@ -219,6 +214,11 @@ bool NativeReactNativeFeatureFlags::enableLayoutAnimationsOnIOS( return ReactNativeFeatureFlags::enableLayoutAnimationsOnIOS(); } +bool NativeReactNativeFeatureFlags::enableMainQueueCoordinatorOnIOS( + jsi::Runtime& /*runtime*/) { + return ReactNativeFeatureFlags::enableMainQueueCoordinatorOnIOS(); +} + bool NativeReactNativeFeatureFlags::enableModuleArgumentNSNullConversionIOS( jsi::Runtime& /*runtime*/) { return ReactNativeFeatureFlags::enableModuleArgumentNSNullConversionIOS(); diff --git a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h index 2fc43feda73e..d010871c92bb 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +++ b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<9a21979a5eeb2f9daf8c061610199596>> + * @generated SignedSource<<95947de110a15ea5c43af6213194058a>> */ /** @@ -90,8 +90,6 @@ class NativeReactNativeFeatureFlags bool enableImagePrefetchingAndroid(jsi::Runtime& runtime); - bool enableImageRequestDowngradingForNonVisibleImages(jsi::Runtime& runtime); - bool enableImmediateUpdateModeForContentOffsetChanges(jsi::Runtime& runtime); bool enableImperativeFocus(jsi::Runtime& runtime); @@ -106,6 +104,8 @@ class NativeReactNativeFeatureFlags bool enableLayoutAnimationsOnIOS(jsi::Runtime& runtime); + bool enableMainQueueCoordinatorOnIOS(jsi::Runtime& runtime); + bool enableModuleArgumentNSNullConversionIOS(jsi::Runtime& runtime); bool enableMutationObserverByDefault(jsi::Runtime& runtime); diff --git a/packages/react-native/ReactCommon/react/renderer/components/image/ImageShadowNode.cpp b/packages/react-native/ReactCommon/react/renderer/components/image/ImageShadowNode.cpp index 1b05a1a4cedd..caea0e5fe5fe 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/ImageShadowNode.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/image/ImageShadowNode.cpp @@ -13,49 +13,12 @@ #include #include #include -#include #include namespace facebook::react { const char ImageComponentName[] = "Image"; -namespace { - -bool isImageVisible( - const LayoutContext& layoutContext, - const LayoutMetrics& layoutMetrics) { - if (layoutContext.viewportSize.width <= 0 || - layoutContext.viewportSize.height <= 0 || - layoutMetrics.frame.size.width <= 0 || - layoutMetrics.frame.size.height <= 0) { - return true; - } - - auto imageFrame = layoutContext.experimental_layoutFrame; - if (imageFrame.size.width <= 0 || imageFrame.size.height <= 0) { - imageFrame = Rect{ - .origin = layoutContext.experimental_layoutOrigin, - .size = layoutMetrics.frame.size}; - } - auto viewportFrame = Rect{ - .origin = layoutContext.viewportOffset, - .size = layoutContext.viewportSize}; - auto visibleFrame = Rect::intersect(imageFrame, viewportFrame); - - return visibleFrame.size.width > 0 && visibleFrame.size.height > 0; -} - -ImageRequestPriority getImageRequestPriority( - const LayoutContext& layoutContext, - const LayoutMetrics& layoutMetrics) { - return isImageVisible(layoutContext, layoutMetrics) - ? ImageRequestPriority::Immediate - : ImageRequestPriority::Prefetch; -} - -} // namespace - void ImageShadowNode::setImageManager( const std::shared_ptr& imageManager) { ensureUnsealed(); @@ -74,16 +37,12 @@ void ImageShadowNode::setImageManager( if (sources.size() <= 1 || (layoutMetric.frame.size.width > 0 && layoutMetric.frame.size.height > 0)) { - auto priority = ReactNativeFeatureFlags:: - enableImageRequestDowngradingForNonVisibleImages() - ? getStateData().getImageRequestParams().priority - : ImageRequestPriority::Immediate; - updateStateIfNeeded(priority); + updateStateIfNeeded(); } } } -void ImageShadowNode::updateStateIfNeeded(ImageRequestPriority priority) { +void ImageShadowNode::updateStateIfNeeded() { ensureUnsealed(); const auto& savedState = getStateData(); @@ -112,9 +71,6 @@ void ImageShadowNode::updateStateIfNeeded(ImageRequestPriority priority) { layoutMetrics_.frame.size.width * layoutMetrics_.pointScaleFactor, .height = layoutMetrics_.frame.size.height * layoutMetrics_.pointScaleFactor} -#else - , - priority #endif ); @@ -199,12 +155,7 @@ ImageSource ImageShadowNode::getImageSource() const { #pragma mark - LayoutableShadowNode void ImageShadowNode::layout(LayoutContext layoutContext) { - auto imageRequestPriority = - ReactNativeFeatureFlags:: - enableImageRequestDowngradingForNonVisibleImages() - ? getImageRequestPriority(layoutContext, getLayoutMetrics()) - : ImageRequestPriority::Immediate; - updateStateIfNeeded(imageRequestPriority); + updateStateIfNeeded(); ConcreteViewShadowNode::layout(layoutContext); } diff --git a/packages/react-native/ReactCommon/react/renderer/components/image/ImageShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/image/ImageShadowNode.h index d5e0f817913d..3ecd4672d12d 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/image/ImageShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/image/ImageShadowNode.h @@ -57,7 +57,7 @@ class ImageShadowNode final std::shared_ptr imageManager_; - void updateStateIfNeeded(ImageRequestPriority priority); + void updateStateIfNeeded(); }; } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp index 2fe7f96c02ab..c630cb420188 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp @@ -671,13 +671,6 @@ void YogaLayoutableShadowNode::layoutTree( yogaNode_.setHasNewLayout(false); } - if (ReactNativeFeatureFlags:: - enableImageRequestDowngradingForNonVisibleImages()) { - layoutContext.experimental_layoutOrigin = layoutContext.viewportOffset; - layoutContext.experimental_layoutFrame = Rect{ - .origin = layoutContext.viewportOffset, - .size = getLayoutMetrics().frame.size}; - } layout(layoutContext); } @@ -736,21 +729,7 @@ void YogaLayoutableShadowNode::layout(LayoutContext layoutContext) { childNode.setLayoutMetrics(newLayoutMetrics); if (newLayoutMetrics.displayType != DisplayType::None) { - auto childLayoutContext = layoutContext; - if (ReactNativeFeatureFlags:: - enableImageRequestDowngradingForNonVisibleImages()) { - auto childFrame = Rect{ - .origin = layoutContext.experimental_layoutOrigin + - newLayoutMetrics.frame.origin + getContentOriginOffset(false), - .size = newLayoutMetrics.frame.size}; - if (!childNode.getTraits().check( - ShadowNodeTraits::Trait::RootNodeKind)) { - childFrame = childFrame * childNode.getTransform(); - } - childLayoutContext.experimental_layoutOrigin = childFrame.origin; - childLayoutContext.experimental_layoutFrame = childFrame; - } - childNode.layout(childLayoutContext); + childNode.layout(layoutContext); } } } diff --git a/packages/react-native/ReactCommon/react/renderer/core/LayoutContext.h b/packages/react-native/ReactCommon/react/renderer/core/LayoutContext.h index 1fce65c8d972..f54f90159d40 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/LayoutContext.h +++ b/packages/react-native/ReactCommon/react/renderer/core/LayoutContext.h @@ -10,7 +10,6 @@ #include #include -#include namespace facebook::react { @@ -65,18 +64,6 @@ struct LayoutContext { * Viewport size is size of the React Native's root view. */ Size viewportSize{}; - - /* - * Experimental: Origin of the shadow node currently being laid out, in viewport - * coordinates. This is populated while walking the layout tree. - */ - Point experimental_layoutOrigin{}; - - /* - * Experimental: Frame of the shadow node currently being laid out, in viewport - * coordinates after layout transforms are applied. - */ - Rect experimental_layoutFrame{}; }; inline bool operator==(const LayoutContext &lhs, const LayoutContext &rhs) diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageRequestParams.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageRequestParams.h index e1008696d1b2..e960e01b5b5c 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageRequestParams.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageRequestParams.h @@ -61,8 +61,6 @@ class ImageRequestParams { ImageSource loadingIndicatorSource{}; std::string analyticTag{}; Size size{}; - // Consumed by Apple image managers for now; Android keeps Immediate. - ImageRequestPriority priority{ImageRequestPriority::Immediate}; bool operator==(const ImageRequestParams &rhs) const = default; }; diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/cxx/react/renderer/imagemanager/ImageRequestParams.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/cxx/react/renderer/imagemanager/ImageRequestParams.h index 01cf22f44f47..a30f0103dda9 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/cxx/react/renderer/imagemanager/ImageRequestParams.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/cxx/react/renderer/imagemanager/ImageRequestParams.h @@ -8,21 +8,15 @@ #pragma once #include -#include namespace facebook::react { class ImageRequestParams { public: ImageRequestParams() = default; - explicit ImageRequestParams(Float blurRadius, ImageRequestPriority priority = ImageRequestPriority::Immediate) - : blurRadius(blurRadius), priority(priority) - { - } + explicit ImageRequestParams(Float blurRadius) : blurRadius(blurRadius) {} Float blurRadius{}; - // Consumed by Apple image managers for now; other platforms keep Immediate. - ImageRequestPriority priority{ImageRequestPriority::Immediate}; bool operator==(const ImageRequestParams &rhs) const = default; }; diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/ImageManager.mm b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/ImageManager.mm index 3b65868977d6..7e15cdf0a4f2 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/ImageManager.mm +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/ImageManager.mm @@ -37,11 +37,11 @@ ImageRequest ImageManager::requestImage( const ImageSource &imageSource, SurfaceId surfaceId, - const ImageRequestParams &imageRequestParams, + const ImageRequestParams & /*imageRequestParams*/, Tag /*tag*/) const { RCTImageManager *imageManager = (__bridge RCTImageManager *)self_; - return [imageManager requestImage:imageSource surfaceId:surfaceId priority:imageRequestParams.priority]; + return [imageManager requestImage:imageSource surfaceId:surfaceId]; } } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/ImageRequestParams.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/ImageRequestParams.h index e9afe1108018..389f950ed317 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/ImageRequestParams.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/ImageRequestParams.h @@ -8,20 +8,15 @@ #pragma once #include -#include namespace facebook::react { class ImageRequestParams { public: ImageRequestParams() {} - ImageRequestParams(Float blurRadius, ImageRequestPriority priority = ImageRequestPriority::Immediate) - : blurRadius(blurRadius), priority(priority) - { - } + ImageRequestParams(Float blurRadius) : blurRadius(blurRadius) {} Float blurRadius{}; - ImageRequestPriority priority{ImageRequestPriority::Immediate}; bool operator==(const ImageRequestParams &rhs) const = default; }; diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManager.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManager.h index 02e8a2f48e0a..da6223a542d2 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManager.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManager.h @@ -21,8 +21,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithImageLoader:(id)imageLoader; - (facebook::react::ImageRequest)requestImage:(facebook::react::ImageSource)imageSource - surfaceId:(facebook::react::SurfaceId)surfaceId - priority:(facebook::react::ImageRequestPriority)priority; + surfaceId:(facebook::react::SurfaceId)surfaceId; @end diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManager.mm b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManager.mm index 40691149f9b0..601dfe45ac38 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManager.mm +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManager.mm @@ -36,9 +36,7 @@ - (instancetype)initWithImageLoader:(id)i return self; } -- (ImageRequest)requestImage:(ImageSource)imageSource - surfaceId:(SurfaceId)surfaceId - priority:(ImageRequestPriority)priority +- (ImageRequest)requestImage:(ImageSource)imageSource surfaceId:(SurfaceId)surfaceId { TraceSection s("RCTImageManager::requestImage"); @@ -98,7 +96,7 @@ - (ImageRequest)requestImage:(ImageSource)imageSource scale:imageSource.scale clipped:NO resizeMode:RCTResizeModeStretch - priority:RCTImageLoaderPriorityFromImageRequestPriority(priority) + priority:RCTImageLoaderPriorityImmediate attribution:{ .surfaceId = surfaceId, } diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManagerProtocol.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManagerProtocol.h index 00ff2227cf28..30bfbf391e35 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManagerProtocol.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImageManagerProtocol.h @@ -12,6 +12,5 @@ @protocol RCTImageManagerProtocol - (facebook::react::ImageRequest)requestImage:(facebook::react::ImageSource)imageSource - surfaceId:(facebook::react::SurfaceId)surfaceId - priority:(facebook::react::ImageRequestPriority)priority; + surfaceId:(facebook::react::SurfaceId)surfaceId; @end diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImagePrimitivesConversions.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImagePrimitivesConversions.h index 1eae15ae4c7a..a13e6fb6d408 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImagePrimitivesConversions.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTImagePrimitivesConversions.h @@ -31,19 +31,6 @@ inline static UIViewContentMode RCTContentModeFromImageResizeMode(facebook::reac } } -inline static RCTImageLoaderPriority RCTImageLoaderPriorityFromImageRequestPriority( - facebook::react::ImageRequestPriority imageRequestPriority) -{ - switch (imageRequestPriority) { - case facebook::react::ImageRequestPriority::Immediate: - return RCTImageLoaderPriorityImmediate; - case facebook::react::ImageRequestPriority::Prefetch: - return RCTImageLoaderPriorityPrefetch; - default: - return RCTImageLoaderPriorityImmediate; - } -} - inline std::string toString(const facebook::react::ImageResizeMode &value) { switch (value) { diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTSyncImageManager.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTSyncImageManager.h index 689956e429ab..395f65b9c6b1 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTSyncImageManager.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTSyncImageManager.h @@ -21,8 +21,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithImageLoader:(id)imageLoader; - (facebook::react::ImageRequest)requestImage:(facebook::react::ImageSource)imageSource - surfaceId:(facebook::react::SurfaceId)surfaceId - priority:(facebook::react::ImageRequestPriority)priority; + surfaceId:(facebook::react::SurfaceId)surfaceId; @end diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTSyncImageManager.mm b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTSyncImageManager.mm index f9fb45fef965..f983c64acfa3 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTSyncImageManager.mm +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTSyncImageManager.mm @@ -34,9 +34,7 @@ - (instancetype)initWithImageLoader:(id)i return self; } -- (ImageRequest)requestImage:(ImageSource)imageSource - surfaceId:(SurfaceId)surfaceId - priority:(ImageRequestPriority)priority +- (ImageRequest)requestImage:(ImageSource)imageSource surfaceId:(SurfaceId)surfaceId { auto telemetry = std::make_shared(surfaceId); auto sharedCancelationFunction = SharedFunction<>(); @@ -84,7 +82,7 @@ - (ImageRequest)requestImage:(ImageSource)imageSource scale:imageSource.scale clipped:YES resizeMode:RCTResizeModeStretch - priority:RCTImageLoaderPriorityFromImageRequestPriority(priority) + priority:RCTImageLoaderPriorityImmediate attribution:{ .surfaceId = surfaceId, } diff --git a/packages/react-native/ReactCommon/react/renderer/imagemanager/primitives.h b/packages/react-native/ReactCommon/react/renderer/imagemanager/primitives.h index 2230b11aaef4..66407cdd6fb1 100644 --- a/packages/react-native/ReactCommon/react/renderer/imagemanager/primitives.h +++ b/packages/react-native/ReactCommon/react/renderer/imagemanager/primitives.h @@ -169,11 +169,6 @@ enum class ImageResizeMode : int8_t { None = 5, }; -enum class ImageRequestPriority : int8_t { - Immediate = 0, - Prefetch = 1, -}; - class ImageErrorInfo { public: std::string error{}; diff --git a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/tests/RuntimeSchedulerTest.cpp b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/tests/RuntimeSchedulerTest.cpp index 574ec8884fcc..840669a68a69 100644 --- a/packages/react-native/ReactCommon/react/renderer/runtimescheduler/tests/RuntimeSchedulerTest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/runtimescheduler/tests/RuntimeSchedulerTest.cpp @@ -957,6 +957,17 @@ TEST_P(RuntimeSchedulerTest, basicSameThreadExecution) { // in `executeSynchronouslyOnSameThread_CAN_DEADLOCK`. The off-main `driver` // thread drives the stub queue ("JS thread") so the main thread can wake up. TEST_P(RuntimeSchedulerTest, basicUIThreadExecution) { + class CoordinatorFeatureFlags : public RuntimeSchedulerTestFeatureFlags { + public: + using RuntimeSchedulerTestFeatureFlags::RuntimeSchedulerTestFeatureFlags; + bool enableMainQueueCoordinatorOnIOS() override { + return true; + } + }; + ReactNativeFeatureFlags::dangerouslyReset(); + ReactNativeFeatureFlags::override( + std::make_unique(GetParam())); + bool didRunSynchronousTask = false; std::thread driver([this]() { diff --git a/packages/react-native/ReactCommon/react/runtime/iostests/MainQueueCoordinatorTests.mm b/packages/react-native/ReactCommon/react/runtime/iostests/MainQueueCoordinatorTests.mm index 7f3183db0060..f0fa55eacdbf 100644 --- a/packages/react-native/ReactCommon/react/runtime/iostests/MainQueueCoordinatorTests.mm +++ b/packages/react-native/ReactCommon/react/runtime/iostests/MainQueueCoordinatorTests.mm @@ -11,17 +11,48 @@ #import #import #import +#import +#import +#import #import #import using namespace facebook::react; +namespace { +class MainQueueCoordinatorOverride : public ReactNativeFeatureFlagsDefaults { + public: + explicit MainQueueCoordinatorOverride(bool enabled) : enabled_(enabled) {} + bool enableMainQueueCoordinatorOnIOS() override + { + return enabled_; + } + + private: + bool enabled_; +}; +} // namespace + @interface MainQueueCoordinatorTests : XCTestCase @end @implementation MainQueueCoordinatorTests -- (void)testRCTUnsafeExecuteOnMainQueueSync_runsBlockOnMainFromBG +- (void)setUp +{ + [super setUp]; + ReactNativeFeatureFlags::dangerouslyReset(); +} + +- (void)tearDown +{ + ReactNativeFeatureFlags::dangerouslyReset(); + [super tearDown]; +} + +#pragma mark - RCTUnsafeExecuteOnMainQueueSync + +- (void)_assertRCTUnsafeExecuteOnMainQueueSyncRunsBlockOnMainFromBackgroundThread { XCTestExpectation *done = [self expectationWithDescription:@"BG-thread call completed"]; __block BOOL ranOnMain = NO; @@ -40,8 +71,25 @@ - (void)testRCTUnsafeExecuteOnMainQueueSync_runsBlockOnMainFromBG XCTAssertTrue(returnedToBG, @"BG thread must resume after sync call returns"); } -- (void)testExecuteSynchronouslyOnSameThread_pumpsUITasksWhileWaitingForJS +- (void)testRCTUnsafeExecuteOnMainQueueSync_flagOff_runsBlockOnMainFromBG { + // Default off — exercises the dispatch_sync(main) branch. + [self _assertRCTUnsafeExecuteOnMainQueueSyncRunsBlockOnMainFromBackgroundThread]; +} + +- (void)testRCTUnsafeExecuteOnMainQueueSync_flagOn_runsBlockOnMainFromBG +{ + ReactNativeFeatureFlags::override(std::make_unique(true)); + // Coordinator branch — `unsafeExecuteOnMainThreadSync` posts a UI task and waits. + [self _assertRCTUnsafeExecuteOnMainQueueSyncRunsBlockOnMainFromBackgroundThread]; +} + +#pragma mark - executeSynchronouslyOnSameThread_CAN_DEADLOCK + +- (void)testExecuteSynchronouslyOnSameThread_flagOn_pumpsUITasksWhileWaitingForJS +{ + ReactNativeFeatureFlags::override(std::make_unique(true)); + // A real runtime — needed only for the reference type. We never call into it. auto runtime = facebook::hermes::makeHermesRuntime(); @@ -56,9 +104,9 @@ - (void)testExecuteSynchronouslyOnSameThread_pumpsUITasksWhileWaitingForJS }).detach(); }; - // Both writes happen on main, so plain ints are race-free. Held in a struct - // so we can capture a pointer from an ObjC block and a reference from a C++ - // lambda without `__block` (which doesn't compose with lambdas). + // Both threads only ever write on main, so plain ints are race-free. Held in + // a struct so we can capture a pointer from an ObjC block and a reference + // from a C++ lambda without `__block` (which doesn't compose with lambdas). struct State { int sequence = 0; int uiTaskOrder = 0; diff --git a/packages/react-native/ReactCommon/runtimeexecutor/platform/ios/ReactCommon/RuntimeExecutorSyncUIThreadUtils.mm b/packages/react-native/ReactCommon/runtimeexecutor/platform/ios/ReactCommon/RuntimeExecutorSyncUIThreadUtils.mm index 77273fdf9475..34b335d7f928 100644 --- a/packages/react-native/ReactCommon/runtimeexecutor/platform/ios/ReactCommon/RuntimeExecutorSyncUIThreadUtils.mm +++ b/packages/react-native/ReactCommon/runtimeexecutor/platform/ios/ReactCommon/RuntimeExecutorSyncUIThreadUtils.mm @@ -9,7 +9,9 @@ #import #import +#import #import +#import #import #import #import @@ -109,8 +111,8 @@ void runUITask(UITask &uiTask) } /** - * Coordinator-style implementation that is resilient to multiple javascript - * threads. This can happen when multiple react instances interleave. + * This method is resilient to multiple javascript threads. + * This can happen when multiple react instances interleave. * * The extension from 1 js thread to n: All js threads race to * get a ticket to post a ui task. The first one to get the ticket @@ -120,13 +122,10 @@ void runUITask(UITask &uiTask) * * For simplicity, we will just use this algorithm for all bg threads. * Not just the js thread. - * - * Requires the caller to be on the main thread, because the wait loop pumps - * UI tasks that are dispatched to the main queue. */ -void coordinatedExecuteSynchronouslyOnSameThread_CAN_DEADLOCK( +void saferExecuteSynchronouslyOnSameThread_CAN_DEADLOCK( const RuntimeExecutor &runtimeExecutor, - std::function &&runtimeWork) + std::function &&runtimeWork) { react_native_assert([[NSThread currentThread] isMainThread] && !g_isRunningUITask); @@ -160,34 +159,52 @@ void coordinatedExecuteSynchronouslyOnSameThread_CAN_DEADLOCK( runtimeWork(*runtime); } -/** +/* * Schedules `runtimeWork` to be executed on the same thread using the - * `RuntimeExecutor`, and blocks on its completion. Used when the caller is - * not on the main thread (the coordinator implementation requires main). + * `RuntimeExecutor`, and blocks on its completion. + * + * Example: + * - [UI thread] Schedule `runtimeCaptureBlock` on js thread + * - [UI thread] Wait for runtime capture: await(runtime) + * - [JS thread] Capture runtime for ui thread: resolve(runtime, &rt); + * - [JS thread] Wait until runtimeWork done: await(runtimeWorkDone) + * - [UI thread] Call runtimeWork: runtimeWork(*runtimePrt); + * - [UI thread] Signal runtimeWork done: resolve(runtimeWorkDone) + * - [UI thread] Wait until runtime capture block finished: + * await(runtimeCaptureBlockDone); + * - [JS thread] Signal runtime capture block is finished: + * resolve(runtimeCaptureBlockDone); */ -void simpleExecuteSynchronouslyOnSameThread_CAN_DEADLOCK( +void legacyExecuteSynchronouslyOnSameThread_CAN_DEADLOCK( const RuntimeExecutor &runtimeExecutor, std::function &&runtimeWork) { std::promise runtime; + std::promise runtimeCaptureBlockDone; std::promise runtimeWorkDone; auto callingThread = std::this_thread::get_id(); - runtimeExecutor([&](jsi::Runtime &rt) { + auto runtimeCaptureBlock = [&](jsi::Runtime &rt) { runtime.set_value(&rt); - if (callingThread != std::this_thread::get_id()) { - // Block the runtime thread on execution of `runtimeWork` on the calling thread. + auto runtimeThread = std::this_thread::get_id(); + if (callingThread != runtimeThread) { + // Block `runtimeThread` on execution of `runtimeWork` on `callingThread`. runtimeWorkDone.get_future().wait(); } - }); - jsi::Runtime *runtimePtr = runtime.get_future().get(); + // TODO(T225331233): This is likely unnecessary. Remove it. + runtimeCaptureBlockDone.set_value(); + }; + runtimeExecutor(std::move(runtimeCaptureBlock)); - OnScopeExit onScopeExit([&]() { runtimeWorkDone.set_value(); }); - // Calls into runtime scheduler, which takes care of error handling + jsi::Runtime *runtimePtr = runtime.get_future().get(); runtimeWork(*runtimePtr); + runtimeWorkDone.set_value(); + + // TODO(T225331233): This is likely unnecessary. Remove it. + runtimeCaptureBlockDone.get_future().wait(); } } // namespace @@ -196,10 +213,10 @@ void executeSynchronouslyOnSameThread_CAN_DEADLOCK( const RuntimeExecutor &runtimeExecutor, std::function &&runtimeWork) { - if ([[NSThread currentThread] isMainThread] && !g_isRunningUITask) { - coordinatedExecuteSynchronouslyOnSameThread_CAN_DEADLOCK(runtimeExecutor, std::move(runtimeWork)); + if (ReactNativeFeatureFlags::enableMainQueueCoordinatorOnIOS()) { + saferExecuteSynchronouslyOnSameThread_CAN_DEADLOCK(runtimeExecutor, std::move(runtimeWork)); } else { - simpleExecuteSynchronouslyOnSameThread_CAN_DEADLOCK(runtimeExecutor, std::move(runtimeWork)); + legacyExecuteSynchronouslyOnSameThread_CAN_DEADLOCK(runtimeExecutor, std::move(runtimeWork)); } } diff --git a/packages/react-native/ReactCommon/yoga/Yoga.podspec b/packages/react-native/ReactCommon/yoga/Yoga.podspec index 64603c4db623..ade85279bfaf 100644 --- a/packages/react-native/ReactCommon/yoga/Yoga.podspec +++ b/packages/react-native/ReactCommon/yoga/Yoga.podspec @@ -61,6 +61,6 @@ Pod::Spec.new do |spec| # Fabric must be able to access private headers (which should not be included in the umbrella header) all_header_files = 'yoga/**/*.h' all_header_files = File.join('ReactCommon/yoga', all_header_files) if ENV['INSTALL_YOGA_WITHOUT_PATH_OPTION'] - spec.private_header_files = Dir.glob(all_header_files) - Dir.glob(public_header_files) + spec.private_header_files = Dir.glob(all_header_files).sort - Dir.glob(public_header_files).sort spec.preserve_paths = [all_header_files] end diff --git a/packages/react-native/ReactCxxPlatform/react/runtime/ReactHost.cpp b/packages/react-native/ReactCxxPlatform/react/runtime/ReactHost.cpp index 32281939c195..8c9e0f4987f5 100644 --- a/packages/react-native/ReactCxxPlatform/react/runtime/ReactHost.cpp +++ b/packages/react-native/ReactCxxPlatform/react/runtime/ReactHost.cpp @@ -314,6 +314,9 @@ void ReactHost::destroyReactInstance() { reactInstanceData_->contextContainer->erase(RuntimeSchedulerKey); reactInstanceData_->mountingManager->setSchedulerTaskExecutor(nullptr); + reactInstanceData_->mountingManager = nullptr; + reactInstanceData_->contextContainer = nullptr; + reactInstanceData_->turboModuleProviders.clear(); reactInstance_ = nullptr; reactInstanceData_->messageQueueThread = nullptr; } diff --git a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js index 0bf9d70039b6..aff2b57424b8 100644 --- a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js +++ b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js @@ -337,17 +337,6 @@ const definitions: FeatureFlagDefinitions = { }, ossReleaseStage: 'none', }, - enableImageRequestDowngradingForNonVisibleImages: { - defaultValue: false, - metadata: { - dateAdded: '2026-05-21', - description: - 'When enabled, ImageShadowNode downgrades image requests to prefetch priority when layout determines that the image does not intersect the viewport.', - expectedReleaseValue: true, - purpose: 'experimentation', - }, - ossReleaseStage: 'none', - }, enableImmediateUpdateModeForContentOffsetChanges: { defaultValue: false, metadata: { @@ -422,6 +411,17 @@ const definitions: FeatureFlagDefinitions = { }, ossReleaseStage: 'none', }, + enableMainQueueCoordinatorOnIOS: { + defaultValue: false, + metadata: { + dateAdded: '2025-05-17', + description: + 'Make RCTUnsafeExecuteOnMainQueueSync less likely to deadlock, when used in conjuction with sync rendering/events.', + expectedReleaseValue: true, + purpose: 'experimentation', + }, + ossReleaseStage: 'none', + }, enableModuleArgumentNSNullConversionIOS: { defaultValue: false, metadata: { diff --git a/packages/react-native/scripts/ios-prebuild/hermes.js b/packages/react-native/scripts/ios-prebuild/hermes.js index eb3df6314352..94f7883b49b1 100644 --- a/packages/react-native/scripts/ios-prebuild/hermes.js +++ b/packages/react-native/scripts/ios-prebuild/hermes.js @@ -133,8 +133,8 @@ type HermesEngineSourceType = */ const HermesEngineSourceTypes /*:{ - readonly DOWNLOAD_PREBUILD_TARBALL: "download_prebuild_tarball", - readonly LOCAL_PREBUILT_TARBALL: "local_prebuilt_tarball" + +DOWNLOAD_PREBUILD_TARBALL: "download_prebuild_tarball", + +LOCAL_PREBUILT_TARBALL: "local_prebuilt_tarball" } */ = { LOCAL_PREBUILT_TARBALL: 'local_prebuilt_tarball', DOWNLOAD_PREBUILD_TARBALL: 'download_prebuild_tarball', diff --git a/packages/react-native/scripts/ios-prebuild/reactNativeDependencies.js b/packages/react-native/scripts/ios-prebuild/reactNativeDependencies.js index f497338bef8b..7bd799d83b8e 100644 --- a/packages/react-native/scripts/ios-prebuild/reactNativeDependencies.js +++ b/packages/react-native/scripts/ios-prebuild/reactNativeDependencies.js @@ -124,8 +124,8 @@ type ReactNativeDependenciesEngineSourceType = */ const ReactNativeDependenciesEngineSourceTypes /*: { - readonly DOWNLOAD_PREBUILD_TARBALL: "download_prebuild_tarball", - readonly DOWNLOAD_PREBUILT_NIGHTLY_TARBALL: "download_prebuilt_nightly_tarball" + +DOWNLOAD_PREBUILD_TARBALL: "download_prebuild_tarball", + +DOWNLOAD_PREBUILT_NIGHTLY_TARBALL: "download_prebuilt_nightly_tarball" } */ = { DOWNLOAD_PREBUILD_TARBALL: 'download_prebuild_tarball', DOWNLOAD_PREBUILT_NIGHTLY_TARBALL: 'download_prebuilt_nightly_tarball', diff --git a/packages/react-native/scripts/react_native_pods_utils/script_phases.sh b/packages/react-native/scripts/react_native_pods_utils/script_phases.sh index 05d7211dc863..4606f35fbe69 100755 --- a/packages/react-native/scripts/react_native_pods_utils/script_phases.sh +++ b/packages/react-native/scripts/react_native_pods_utils/script_phases.sh @@ -16,9 +16,8 @@ cd "$RCT_SCRIPT_RN_DIR" CODEGEN_CLI_PATH="" error () { - message="$*" - echo "$message" - echo "[Codegen] $message" >> "${SCRIPT_OUTPUT_FILE_0}" 2>&1 + echo "$1" + "[Codegen] $1" >> "${SCRIPT_OUTPUT_FILE_0}" 2>&1 exit 1 } diff --git a/packages/react-native/sdks/hermes-engine/hermes-engine.podspec b/packages/react-native/sdks/hermes-engine/hermes-engine.podspec index 6ef12a1f68ae..99be57339a49 100644 --- a/packages/react-native/sdks/hermes-engine/hermes-engine.podspec +++ b/packages/react-native/sdks/hermes-engine/hermes-engine.podspec @@ -70,9 +70,14 @@ Pod::Spec.new do |spec| hermes_compiler_path = File.dirname(Pod::Executable.execute_command('node', ['-p', "require.resolve(\"hermes-compiler\", {paths: [\"#{react_native_path}\"]})", __dir__]).strip ) + hermesc_path = File.join(hermes_compiler_path, 'hermesc', 'osx-bin', 'hermesc') + + require 'pathname' + pods_root = Pod::Config.instance.sandbox.root + relative_hermesc = Pathname.new(hermesc_path).relative_path_from(pods_root) spec.user_target_xcconfig = { - 'HERMES_CLI_PATH' => "#{hermes_compiler_path}/hermesc/osx-bin/hermesc" + 'HERMES_CLI_PATH' => "$(PODS_ROOT)/#{relative_hermesc}" } end diff --git a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js index 8b92e20f338b..dcf70518a3e3 100644 --- a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js +++ b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<7f48f734cd7a098d04cb147980ef364a>> + * @generated SignedSource<> * @flow strict * @noformat */ @@ -73,7 +73,6 @@ export type ReactNativeFeatureFlags = $ReadOnly<{ enableIOSTextBaselineOffsetPerLine: Getter, enableIOSViewClipToPaddingBox: Getter, enableImagePrefetchingAndroid: Getter, - enableImageRequestDowngradingForNonVisibleImages: Getter, enableImmediateUpdateModeForContentOffsetChanges: Getter, enableImperativeFocus: Getter, enableInteropViewManagerClassLookUpOptimizationIOS: Getter, @@ -81,6 +80,7 @@ export type ReactNativeFeatureFlags = $ReadOnly<{ enableKeyEvents: Getter, enableLayoutAnimationsOnAndroid: Getter, enableLayoutAnimationsOnIOS: Getter, + enableMainQueueCoordinatorOnIOS: Getter, enableModuleArgumentNSNullConversionIOS: Getter, enableMutationObserverByDefault: Getter, enableNativeCSSParsing: Getter, @@ -302,10 +302,6 @@ export const enableIOSViewClipToPaddingBox: Getter = createNativeFlagGe * When enabled, Android will build and initiate image prefetch requests on ImageShadowNode::layout */ export const enableImagePrefetchingAndroid: Getter = createNativeFlagGetter('enableImagePrefetchingAndroid', false); -/** - * When enabled, ImageShadowNode downgrades image requests to prefetch priority when layout determines that the image does not intersect the viewport. - */ -export const enableImageRequestDowngradingForNonVisibleImages: Getter = createNativeFlagGetter('enableImageRequestDowngradingForNonVisibleImages', false); /** * Dispatches state updates for content offset changes synchronously on the main thread. */ @@ -334,6 +330,10 @@ export const enableLayoutAnimationsOnAndroid: Getter = createNativeFlag * When enabled, LayoutAnimations API will animate state changes on iOS. */ export const enableLayoutAnimationsOnIOS: Getter = createNativeFlagGetter('enableLayoutAnimationsOnIOS', true); +/** + * Make RCTUnsafeExecuteOnMainQueueSync less likely to deadlock, when used in conjuction with sync rendering/events. + */ +export const enableMainQueueCoordinatorOnIOS: Getter = createNativeFlagGetter('enableMainQueueCoordinatorOnIOS', false); /** * Enable NSNull conversion when handling module arguments on iOS */ diff --git a/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js index a72acea15a4b..6473c1495dd0 100644 --- a/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +++ b/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<869507719729d76403ed47be393cc120>> + * @generated SignedSource<> * @flow strict * @noformat */ @@ -52,7 +52,6 @@ export interface Spec extends TurboModule { +enableIOSTextBaselineOffsetPerLine?: () => boolean; +enableIOSViewClipToPaddingBox?: () => boolean; +enableImagePrefetchingAndroid?: () => boolean; - +enableImageRequestDowngradingForNonVisibleImages?: () => boolean; +enableImmediateUpdateModeForContentOffsetChanges?: () => boolean; +enableImperativeFocus?: () => boolean; +enableInteropViewManagerClassLookUpOptimizationIOS?: () => boolean; @@ -60,6 +59,7 @@ export interface Spec extends TurboModule { +enableKeyEvents?: () => boolean; +enableLayoutAnimationsOnAndroid?: () => boolean; +enableLayoutAnimationsOnIOS?: () => boolean; + +enableMainQueueCoordinatorOnIOS?: () => boolean; +enableModuleArgumentNSNullConversionIOS?: () => boolean; +enableMutationObserverByDefault?: () => boolean; +enableNativeCSSParsing?: () => boolean; diff --git a/packages/react-native/src/private/testing/fantom/specs/NativeFantom.js b/packages/react-native/src/private/testing/fantom/specs/NativeFantom.js index f5ea5136cff0..a47d97b9aacf 100644 --- a/packages/react-native/src/private/testing/fantom/specs/NativeFantom.js +++ b/packages/react-native/src/private/testing/fantom/specs/NativeFantom.js @@ -129,9 +129,6 @@ interface Spec extends TurboModule { setImageResponse(uri: string, imageResponse: ImageResponse): void; clearImage(uri: string): void; clearAllImages(): void; - getImageRequestCount(uri: string): number; - getImageRequestPriority(uri: string): string; - clearImageRequests(): void; } export default TurboModuleRegistry.getEnforcing( diff --git a/private/core-cli-utils/src/private/app.js b/private/core-cli-utils/src/private/app.js index 21e9ea297dcc..afb792541432 100644 --- a/private/core-cli-utils/src/private/app.js +++ b/private/core-cli-utils/src/private/app.js @@ -27,7 +27,7 @@ type BundlerOptions = { config?: string, // Typically index.{ios,android}.js entryFile: string, - readonly platform: 'ios' | 'android' | string, + +platform: 'ios' | 'android' | string, dev: boolean, // Metro built main bundle outputJsBundle: string, @@ -58,12 +58,12 @@ type HermesConfig = { }; type BundlerWatch = { - readonly mode: 'watch', + +mode: 'watch', callback?: (metro: ExecaPromise) => void, }; type BundlerBuild = { - readonly mode: 'bundle', + +mode: 'bundle', }; type Bundler = BundlerWatch | BundlerBuild; diff --git a/private/react-native-fantom/tester/src/FantomImageManager.h b/private/react-native-fantom/tester/src/FantomImageManager.h deleted file mode 100644 index 46c8d2c02ba2..000000000000 --- a/private/react-native-fantom/tester/src/FantomImageManager.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#pragma once - -#include -#include -#include -#include -#include -#include - -namespace facebook::react { - -struct FantomImageRequest { - std::string uri; - ImageRequestPriority priority; -}; - -inline std::string toString(ImageRequestPriority priority) -{ - switch (priority) { - case ImageRequestPriority::Immediate: - return "immediate"; - case ImageRequestPriority::Prefetch: - return "prefetch"; - } -} - -class FantomImageManager final : public ImageManager { - public: - FantomImageManager() : ImageManager(nullptr) {} - - ImageRequest requestImage( - const ImageSource &imageSource, - SurfaceId surfaceId, - const ImageRequestParams &imageRequestParams, - Tag /*tag*/) const override - { - requests_.push_back({imageSource.uri, imageRequestParams.priority}); - return {imageSource, std::make_shared(surfaceId), {}}; - } - - size_t getRequestCount(const std::string &uri) const - { - auto count = size_t{}; - for (const auto &request : requests_) { - if (request.uri == uri) { - ++count; - } - } - return count; - } - - std::string getLatestRequestPriority(const std::string &uri) const - { - for (auto it = requests_.rbegin(); it != requests_.rend(); ++it) { - if (it->uri == uri) { - return toString(it->priority); - } - } - return ""; - } - - void clearRequests() - { - requests_.clear(); - } - - private: - mutable std::vector requests_; -}; - -} // namespace facebook::react diff --git a/private/react-native-fantom/tester/src/NativeFantom.cpp b/private/react-native-fantom/tester/src/NativeFantom.cpp index ff1bcd3725d6..5b18de491450 100644 --- a/private/react-native-fantom/tester/src/NativeFantom.cpp +++ b/private/react-native-fantom/tester/src/NativeFantom.cpp @@ -317,22 +317,4 @@ void NativeFantom::clearAllImages(jsi::Runtime& /*rt*/) { appDelegate_.mountingManager_->imageLoader_->clearAllImages(); } -double NativeFantom::getImageRequestCount( - jsi::Runtime& /*rt*/, - const std::string& uri) { - return static_cast( - appDelegate_.mountingManager_->imageManager_->getRequestCount(uri)); -} - -std::string NativeFantom::getImageRequestPriority( - jsi::Runtime& /*rt*/, - const std::string& uri) { - return appDelegate_.mountingManager_->imageManager_->getLatestRequestPriority( - uri); -} - -void NativeFantom::clearImageRequests(jsi::Runtime& /*rt*/) { - appDelegate_.mountingManager_->imageManager_->clearRequests(); -} - } // namespace facebook::react diff --git a/private/react-native-fantom/tester/src/NativeFantom.h b/private/react-native-fantom/tester/src/NativeFantom.h index 1a69d456dcd7..2c0a19a20fb7 100644 --- a/private/react-native-fantom/tester/src/NativeFantom.h +++ b/private/react-native-fantom/tester/src/NativeFantom.h @@ -140,9 +140,6 @@ class NativeFantom : public NativeFantomCxxSpec { const NativeFantomSetImageResponseImageResponse &imageResponse); void clearImage(jsi::Runtime &rt, const std::string &uri); void clearAllImages(jsi::Runtime &rt); - double getImageRequestCount(jsi::Runtime &rt, const std::string &uri); - std::string getImageRequestPriority(jsi::Runtime &rt, const std::string &uri); - void clearImageRequests(jsi::Runtime &rt); private: TesterAppDelegate &appDelegate_; diff --git a/private/react-native-fantom/tester/src/TesterAppDelegate.cpp b/private/react-native-fantom/tester/src/TesterAppDelegate.cpp index 1ebdaee96470..1fad3777e2f1 100644 --- a/private/react-native-fantom/tester/src/TesterAppDelegate.cpp +++ b/private/react-native-fantom/tester/src/TesterAppDelegate.cpp @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -87,7 +86,6 @@ TesterAppDelegate::TesterAppDelegate( DevToolsHttpClientFactoryKey, getHttpClientFactory()); contextContainer->insert( DevToolsWebSocketClientFactoryKey, getWebSocketClientFactory()); - contextContainer->insert(ImageManagerKey, mountingManager_->imageManager_); runLoopObserverManager_ = std::make_shared(); @@ -193,7 +191,6 @@ void TesterAppDelegate::startSurface( LayoutContext layoutContext{ .pointScaleFactor = pointScaleFactor, .viewportOffset = {.x = offsetX, .y = offsetY}, - .viewportSize = extentsDp, }; reactHost_->startSurface( @@ -229,7 +226,6 @@ void TesterAppDelegate::updateSurfaceConstraints( LayoutContext layoutContext{ .pointScaleFactor = pointScaleFactor, - .viewportSize = extentsDp, }; reactHost_->setSurfaceConstraints( diff --git a/private/react-native-fantom/tester/src/TesterMountingManager.cpp b/private/react-native-fantom/tester/src/TesterMountingManager.cpp index 4fd1765bd33e..4526eace7d21 100644 --- a/private/react-native-fantom/tester/src/TesterMountingManager.cpp +++ b/private/react-native-fantom/tester/src/TesterMountingManager.cpp @@ -21,7 +21,6 @@ TesterMountingManager::TesterMountingManager( std::function&& onAfterMount) : onAfterMount_(onAfterMount), renderer_(std::make_unique()) { imageLoader_ = std::make_shared(); - imageManager_ = std::make_shared(); } void TesterMountingManager::executeMount( diff --git a/private/react-native-fantom/tester/src/TesterMountingManager.h b/private/react-native-fantom/tester/src/TesterMountingManager.h index c14a8a7e9334..cdfdf96d584d 100644 --- a/private/react-native-fantom/tester/src/TesterMountingManager.h +++ b/private/react-native-fantom/tester/src/TesterMountingManager.h @@ -8,7 +8,6 @@ #pragma once #include "FantomImageLoader.h" -#include "FantomImageManager.h" #include #include @@ -48,7 +47,6 @@ class TesterMountingManager : public IMountingManager { } std::shared_ptr imageLoader_; - std::shared_ptr imageManager_; std::shared_ptr getImageLoader() noexcept override { diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api index 2b4fbb3a4986..9a10db992942 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api @@ -2597,7 +2597,6 @@ class facebook::react::ImageRequestParams { public facebook::react::Float blurRadius; public facebook::react::Float fadeDuration; public facebook::react::Float resizeMultiplier; - public facebook::react::ImageRequestPriority priority; public facebook::react::ImageResizeMode resizeMode; public facebook::react::ImageSource defaultSource; public facebook::react::ImageSource loadingIndicatorSource; @@ -6221,11 +6220,6 @@ enum facebook::react::HyphenationFrequency { Normal, } -enum facebook::react::ImageRequestPriority : int8_t { - Immediate, - Prefetch, -} - enum facebook::react::ImageResizeMode : int8_t { Center, Contain, diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api index 06d8694b4b82..9d8211cbf16b 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api @@ -2579,7 +2579,6 @@ class facebook::react::ImageRequestParams { public facebook::react::Float blurRadius; public facebook::react::Float fadeDuration; public facebook::react::Float resizeMultiplier; - public facebook::react::ImageRequestPriority priority; public facebook::react::ImageResizeMode resizeMode; public facebook::react::ImageSource defaultSource; public facebook::react::ImageSource loadingIndicatorSource; @@ -6047,11 +6046,6 @@ enum facebook::react::HyphenationFrequency { Normal, } -enum facebook::react::ImageRequestPriority : int8_t { - Immediate, - Prefetch, -} - enum facebook::react::ImageResizeMode : int8_t { Center, Contain, diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api index 1f7567f39773..93f507c31385 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api @@ -2594,7 +2594,6 @@ class facebook::react::ImageRequestParams { public facebook::react::Float blurRadius; public facebook::react::Float fadeDuration; public facebook::react::Float resizeMultiplier; - public facebook::react::ImageRequestPriority priority; public facebook::react::ImageResizeMode resizeMode; public facebook::react::ImageSource defaultSource; public facebook::react::ImageSource loadingIndicatorSource; @@ -6212,11 +6211,6 @@ enum facebook::react::HyphenationFrequency { Normal, } -enum facebook::react::ImageRequestPriority : int8_t { - Immediate, - Prefetch, -} - enum facebook::react::ImageResizeMode : int8_t { Center, Contain, diff --git a/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api index d4f7c124a3cb..a2b9bb40e125 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api @@ -1273,7 +1273,7 @@ interface RCTImageLoader : public NSObject { - public virtual facebook::react::ImageRequest requestImage:surfaceId:priority:(facebook::react::ImageSource imageSource, facebook::react::SurfaceId surfaceId, facebook::react::ImageRequestPriority priority); + public virtual facebook::react::ImageRequest requestImage:surfaceId:(facebook::react::ImageSource imageSource, facebook::react::SurfaceId surfaceId); public virtual instancetype initWithImageLoader:(id imageLoader); } @@ -2187,7 +2187,7 @@ interface RCTSwitchManager : public RCTViewManager { } interface RCTSyncImageManager : public NSObject { - public virtual facebook::react::ImageRequest requestImage:surfaceId:priority:(facebook::react::ImageSource imageSource, facebook::react::SurfaceId surfaceId, facebook::react::ImageRequestPriority priority); + public virtual facebook::react::ImageRequest requestImage:surfaceId:(facebook::react::ImageSource imageSource, facebook::react::SurfaceId surfaceId); public virtual instancetype initWithImageLoader:(id imageLoader); } @@ -3235,7 +3235,7 @@ protocol RCTImageLoaderWithAttributionProtocol : public RCTImageLoaderProtocol, } protocol RCTImageManagerProtocol : public NSObject { - public virtual facebook::react::ImageRequest requestImage:surfaceId:priority:(facebook::react::ImageSource imageSource, facebook::react::SurfaceId surfaceId, facebook::react::ImageRequestPriority priority); + public virtual facebook::react::ImageRequest requestImage:surfaceId:(facebook::react::ImageSource imageSource, facebook::react::SurfaceId surfaceId); } protocol RCTImageRedirectProtocol { @@ -5382,10 +5382,9 @@ class facebook::react::ImageRequest { class facebook::react::ImageRequestParams { public ImageRequestParams(); - public ImageRequestParams(facebook::react::Float blurRadius, facebook::react::ImageRequestPriority priority = facebook::react::ImageRequestPriority::Immediate); + public ImageRequestParams(facebook::react::Float blurRadius); public bool operator==(const facebook::react::ImageRequestParams& rhs) const = default; public facebook::react::Float blurRadius; - public facebook::react::ImageRequestPriority priority; } class facebook::react::ImageResponse { @@ -8766,11 +8765,6 @@ enum facebook::react::HyphenationFrequency { Normal, } -enum facebook::react::ImageRequestPriority : int8_t { - Immediate, - Prefetch, -} - enum facebook::react::ImageResizeMode : int8_t { Center, Contain, diff --git a/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api index cd89d347ccfa..66dd85e4cb8c 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api @@ -1198,7 +1198,7 @@ interface RCTImageLoader : public NSObject { - public virtual facebook::react::ImageRequest requestImage:surfaceId:priority:(facebook::react::ImageSource imageSource, facebook::react::SurfaceId surfaceId, facebook::react::ImageRequestPriority priority); + public virtual facebook::react::ImageRequest requestImage:surfaceId:(facebook::react::ImageSource imageSource, facebook::react::SurfaceId surfaceId); public virtual instancetype initWithImageLoader:(id imageLoader); } @@ -1936,7 +1936,7 @@ interface RCTSwitchComponentView : public RCTViewComponentView { } interface RCTSyncImageManager : public NSObject { - public virtual facebook::react::ImageRequest requestImage:surfaceId:priority:(facebook::react::ImageSource imageSource, facebook::react::SurfaceId surfaceId, facebook::react::ImageRequestPriority priority); + public virtual facebook::react::ImageRequest requestImage:surfaceId:(facebook::react::ImageSource imageSource, facebook::react::SurfaceId surfaceId); public virtual instancetype initWithImageLoader:(id imageLoader); } @@ -2878,7 +2878,7 @@ protocol RCTImageLoaderWithAttributionProtocol : public RCTImageLoaderProtocol, } protocol RCTImageManagerProtocol : public NSObject { - public virtual facebook::react::ImageRequest requestImage:surfaceId:priority:(facebook::react::ImageSource imageSource, facebook::react::SurfaceId surfaceId, facebook::react::ImageRequestPriority priority); + public virtual facebook::react::ImageRequest requestImage:surfaceId:(facebook::react::ImageSource imageSource, facebook::react::SurfaceId surfaceId); } protocol RCTImageRedirectProtocol { @@ -4989,10 +4989,9 @@ class facebook::react::ImageRequest { class facebook::react::ImageRequestParams { public ImageRequestParams(); - public ImageRequestParams(facebook::react::Float blurRadius, facebook::react::ImageRequestPriority priority = facebook::react::ImageRequestPriority::Immediate); + public ImageRequestParams(facebook::react::Float blurRadius); public bool operator==(const facebook::react::ImageRequestParams& rhs) const = default; public facebook::react::Float blurRadius; - public facebook::react::ImageRequestPriority priority; } class facebook::react::ImageResponse { @@ -8241,11 +8240,6 @@ enum facebook::react::HyphenationFrequency { Normal, } -enum facebook::react::ImageRequestPriority : int8_t { - Immediate, - Prefetch, -} - enum facebook::react::ImageResizeMode : int8_t { Center, Contain, diff --git a/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api index 8219222a7c4d..84098faa3185 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api @@ -1273,7 +1273,7 @@ interface RCTImageLoader : public NSObject { - public virtual facebook::react::ImageRequest requestImage:surfaceId:priority:(facebook::react::ImageSource imageSource, facebook::react::SurfaceId surfaceId, facebook::react::ImageRequestPriority priority); + public virtual facebook::react::ImageRequest requestImage:surfaceId:(facebook::react::ImageSource imageSource, facebook::react::SurfaceId surfaceId); public virtual instancetype initWithImageLoader:(id imageLoader); } @@ -2187,7 +2187,7 @@ interface RCTSwitchManager : public RCTViewManager { } interface RCTSyncImageManager : public NSObject { - public virtual facebook::react::ImageRequest requestImage:surfaceId:priority:(facebook::react::ImageSource imageSource, facebook::react::SurfaceId surfaceId, facebook::react::ImageRequestPriority priority); + public virtual facebook::react::ImageRequest requestImage:surfaceId:(facebook::react::ImageSource imageSource, facebook::react::SurfaceId surfaceId); public virtual instancetype initWithImageLoader:(id imageLoader); } @@ -3235,7 +3235,7 @@ protocol RCTImageLoaderWithAttributionProtocol : public RCTImageLoaderProtocol, } protocol RCTImageManagerProtocol : public NSObject { - public virtual facebook::react::ImageRequest requestImage:surfaceId:priority:(facebook::react::ImageSource imageSource, facebook::react::SurfaceId surfaceId, facebook::react::ImageRequestPriority priority); + public virtual facebook::react::ImageRequest requestImage:surfaceId:(facebook::react::ImageSource imageSource, facebook::react::SurfaceId surfaceId); } protocol RCTImageRedirectProtocol { @@ -5379,10 +5379,9 @@ class facebook::react::ImageRequest { class facebook::react::ImageRequestParams { public ImageRequestParams(); - public ImageRequestParams(facebook::react::Float blurRadius, facebook::react::ImageRequestPriority priority = facebook::react::ImageRequestPriority::Immediate); + public ImageRequestParams(facebook::react::Float blurRadius); public bool operator==(const facebook::react::ImageRequestParams& rhs) const = default; public facebook::react::Float blurRadius; - public facebook::react::ImageRequestPriority priority; } class facebook::react::ImageResponse { @@ -8757,11 +8756,6 @@ enum facebook::react::HyphenationFrequency { Normal, } -enum facebook::react::ImageRequestPriority : int8_t { - Immediate, - Prefetch, -} - enum facebook::react::ImageResizeMode : int8_t { Center, Contain, diff --git a/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api index 5f68b22fb882..3a7473351c4b 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api @@ -4583,11 +4583,6 @@ enum facebook::react::HyphenationFrequency { Normal, } -enum facebook::react::ImageRequestPriority : int8_t { - Immediate, - Prefetch, -} - enum facebook::react::ImageResizeMode : int8_t { Center, Contain, diff --git a/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api index 81705abe51bd..5a5fc19d0af6 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api @@ -4449,11 +4449,6 @@ enum facebook::react::HyphenationFrequency { Normal, } -enum facebook::react::ImageRequestPriority : int8_t { - Immediate, - Prefetch, -} - enum facebook::react::ImageResizeMode : int8_t { Center, Contain, diff --git a/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api index 29810fb16f09..f64fbd2790a4 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api @@ -4574,11 +4574,6 @@ enum facebook::react::HyphenationFrequency { Normal, } -enum facebook::react::ImageRequestPriority : int8_t { - Immediate, - Prefetch, -} - enum facebook::react::ImageResizeMode : int8_t { Center, Contain,