diff --git a/packages/react-native/Libraries/Components/ScrollView/__tests__/ScrollView-itest.js b/packages/react-native/Libraries/Components/ScrollView/__tests__/ScrollView-itest.js index 2357a7b29ebb..04135f43326f 100644 --- a/packages/react-native/Libraries/Components/ScrollView/__tests__/ScrollView-itest.js +++ b/packages/react-native/Libraries/Components/ScrollView/__tests__/ScrollView-itest.js @@ -41,6 +41,34 @@ describe('', () => { , ); }); + + it('returns persistentScrollbar to its default once the prop is removed', () => { + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render(); + }); + + expect( + root.getRenderedOutput({props: ['persistentScrollbar']}).toJSX(), + ).toEqual( + + + , + ); + + Fantom.runTask(() => { + root.render(); + }); + + expect( + root.getRenderedOutput({props: ['persistentScrollbar']}).toJSX(), + ).toEqual( + + + , + ); + }); }); describe('ref', () => { diff --git a/packages/react-native/Package.swift b/packages/react-native/Package.swift index da76a10ac812..649cdc0e6c74 100644 --- a/packages/react-native/Package.swift +++ b/packages/react-native/Package.swift @@ -562,7 +562,7 @@ let reactFabricText = RNTarget( let reactFabricTextInput = RNTarget( name: .reactFabricTextInput, path: "ReactCommon/react/renderer/components/textinput", - excludedPaths: ["platform/android", "platform/macos"], + excludedPaths: ["tests", "platform/android", "platform/macos"], dependencies: [.reactNativeDependencies, .reactCore, .reactJsiExecutor, .reactTurboModuleCore, .jsi, .logger, .reactDebug, .reactFeatureFlags, .reactUtils, .reactRuntimeScheduler, .reactCxxReact, .yoga, .reactRendererDebug, .reactGraphics, .reactFabric, .reactTurboModuleBridging, .reactFabricTextLayoutManager, .reactImageManagerApple], sources: [".", "platform/ios"] ) diff --git a/packages/react-native/ReactCommon/react/renderer/components/scrollview/BaseScrollViewProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/scrollview/BaseScrollViewProps.cpp index 238fa494c142..cb5407ea853e 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/scrollview/BaseScrollViewProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/scrollview/BaseScrollViewProps.cpp @@ -164,7 +164,7 @@ BaseScrollViewProps::BaseScrollViewProps( rawProps, "persistentScrollbar", sourceProps.persistentScrollbar, - true)), + false)), horizontal(convertRawProp( context, rawProps, diff --git a/packages/react-native/ReactCommon/react/renderer/components/scrollview/platform/android/react/renderer/components/scrollview/HostPlatformScrollViewProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/scrollview/platform/android/react/renderer/components/scrollview/HostPlatformScrollViewProps.cpp index d8812796d475..a9a83ef67db1 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/scrollview/platform/android/react/renderer/components/scrollview/HostPlatformScrollViewProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/scrollview/platform/android/react/renderer/components/scrollview/HostPlatformScrollViewProps.cpp @@ -25,13 +25,13 @@ HostPlatformScrollViewProps::HostPlatformScrollViewProps( rawProps, "sendMomentumEvents", sourceProps.sendMomentumEvents, - true)), + false)), nestedScrollEnabled(convertRawProp( context, rawProps, "nestedScrollEnabled", sourceProps.nestedScrollEnabled, - true)), + false)), fadingEdgeLength(convertRawProp( context, rawProps, diff --git a/packages/react-native/ReactCommon/react/renderer/components/textinput/BaseTextInputProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/textinput/BaseTextInputProps.cpp index c1ae0758f3c7..5ce5172499bd 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/textinput/BaseTextInputProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/textinput/BaseTextInputProps.cpp @@ -104,7 +104,7 @@ BaseTextInputProps::BaseTextInputProps( rawProps, "editable", sourceProps.editable, - {})), + true)), readOnly(convertRawProp( context, rawProps, diff --git a/packages/react-native/ReactCommon/react/renderer/components/textinput/tests/BaseTextInputPropsTest.cpp b/packages/react-native/ReactCommon/react/renderer/components/textinput/tests/BaseTextInputPropsTest.cpp new file mode 100644 index 000000000000..91dc138cb281 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/components/textinput/tests/BaseTextInputPropsTest.cpp @@ -0,0 +1,43 @@ +/* + * 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. + */ + +#include + +#include +#include +#include + +namespace facebook::react { + +namespace { + +BaseTextInputProps parse( + const folly::dynamic& rawPropsValue, + const BaseTextInputProps& sourceProps = BaseTextInputProps()) { + ContextContainer contextContainer{}; + PropsParserContext parserContext{-1, contextContainer}; + + auto raw = RawProps(rawPropsValue); + auto parser = RawPropsParser(); + parser.prepare(); + raw.parse(parser); + + return {parserContext, sourceProps, raw}; +} + +} // namespace + +TEST(BaseTextInputPropsTest, removed_editable_returns_to_its_default) { + auto readOnly = parse(folly::dynamic::object("editable", false)); + ASSERT_FALSE(readOnly.editable); + + auto removed = parse(folly::dynamic::object("editable", nullptr), readOnly); + + EXPECT_EQ(removed.editable, BaseTextInputProps().editable); +} + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/BaseViewProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/BaseViewProps.cpp index 713ab1470fd0..e5611b65bb49 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/BaseViewProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/BaseViewProps.cpp @@ -180,7 +180,7 @@ BaseViewProps::BaseViewProps( rawProps, "shadowOffset", sourceProps.shadowOffset, - {})), + Size{0, -3})), shadowOpacity(convertRawProp( context, rawProps, @@ -192,7 +192,7 @@ BaseViewProps::BaseViewProps( rawProps, "shadowRadius", sourceProps.shadowRadius, - {})), + (Float)3)), cursor( convertRawProp(context, rawProps, "cursor", sourceProps.cursor, {})), boxShadow(convertRawProp( diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/tests/ViewPropsTest.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/tests/ViewPropsTest.cpp new file mode 100644 index 000000000000..1fa0864ba637 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/components/view/tests/ViewPropsTest.cpp @@ -0,0 +1,58 @@ +/* + * 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. + */ + +#include + +#include +#include +#include + +namespace facebook::react { + +namespace { + +ViewProps parse( + const folly::dynamic& rawPropsValue, + const ViewProps& sourceProps = ViewProps()) { + ContextContainer contextContainer{}; + PropsParserContext parserContext{-1, contextContainer}; + + auto raw = RawProps(rawPropsValue); + auto parser = RawPropsParser(); + parser.prepare(); + raw.parse(parser); + + return {parserContext, sourceProps, raw}; +} + +} // namespace + +TEST(ViewPropsTest, removed_shadow_radius_returns_to_its_default) { + auto withShadowRadius = parse(folly::dynamic::object("shadowRadius", 8)); + ASSERT_EQ(withShadowRadius.shadowRadius, 8); + + auto removed = + parse(folly::dynamic::object("shadowRadius", nullptr), withShadowRadius); + + EXPECT_EQ(removed.shadowRadius, ViewProps().shadowRadius); +} + +TEST(ViewPropsTest, removed_shadow_offset_returns_to_its_default) { + auto withShadowOffset = parse( + folly::dynamic::object( + "shadowOffset", folly::dynamic::object("width", 2)("height", 4))); + ASSERT_EQ(withShadowOffset.shadowOffset, (Size{.width = 2, .height = 4})); + + auto removed = + parse(folly::dynamic::object("shadowOffset", nullptr), withShadowOffset); + + const auto defaultShadowOffset = ViewProps().shadowOffset; + EXPECT_EQ(removed.shadowOffset.width, defaultShadowOffset.width); + EXPECT_EQ(removed.shadowOffset.height, defaultShadowOffset.height); +} + +} // namespace facebook::react