Skip to content

Commit 4591d20

Browse files
Dawid Małeckimeta-codesync[bot]
authored andcommitted
Make renderer View conversions CSS-free
Summary: Move CSS-dependent View conversion implementations for Yoga lengths, value units, transforms, transform origins, and aspect ratios from the exported `conversions.h` header into `conversions.cpp`. Keep the supported conversion declarations public and preserve existing parsing behavior. Update existing conversion tests to exercise the same paths through supported public entry points, and regenerate the C++ API snapshots to remove private helper declarations. Changelog: [Internal] Differential Revision: D119507215
1 parent 52c619a commit 4591d20

12 files changed

Lines changed: 848 additions & 771 deletions

File tree

‎packages/react-native/ReactCommon/react/renderer/components/view/conversions.cpp‎

Lines changed: 779 additions & 0 deletions
Large diffs are not rendered by default.

‎packages/react-native/ReactCommon/react/renderer/components/view/conversions.h‎

Lines changed: 8 additions & 636 deletions
Large diffs are not rendered by default.

‎packages/react-native/ReactCommon/react/renderer/components/view/tests/ConversionsTest.cpp‎

Lines changed: 61 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -379,10 +379,10 @@ TEST_F(NativeCSSConversionsTest, unprocessed_filter_objects_unknown_type) {
379379
EXPECT_TRUE(filters.empty());
380380
}
381381

382-
TEST(ConversionsTest, unprocessed_transform_css_string) {
382+
TEST_F(NativeCSSConversionsTest, unprocessed_transform_css_string) {
383+
RawValue value{folly::dynamic("rotate(45deg) scale(2) translateX(10px)")};
383384
Transform result;
384-
parseUnprocessedTransformString(
385-
"rotate(45deg) scale(2) translateX(10px)", result);
385+
fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result);
386386

387387
EXPECT_EQ(result.operations.size(), 3);
388388

@@ -405,9 +405,10 @@ TEST(ConversionsTest, unprocessed_transform_css_string) {
405405
EXPECT_EQ(result.operations[2].y.value, 0.0f);
406406
}
407407

408-
TEST(ConversionsTest, unprocessed_transform_css_translate_percent) {
408+
TEST_F(NativeCSSConversionsTest, unprocessed_transform_css_translate_percent) {
409+
RawValue value{folly::dynamic("translate(10px, 50%)")};
409410
Transform result;
410-
parseUnprocessedTransformString("translate(10px, 50%)", result);
411+
fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result);
411412

412413
EXPECT_EQ(result.operations.size(), 1);
413414
EXPECT_EQ(result.operations[0].type, TransformOperationType::Translate);
@@ -417,27 +418,28 @@ TEST(ConversionsTest, unprocessed_transform_css_translate_percent) {
417418
EXPECT_EQ(result.operations[0].y.unit, UnitType::Percent);
418419
}
419420

420-
TEST(ConversionsTest, unprocessed_transform_css_perspective) {
421+
TEST_F(NativeCSSConversionsTest, unprocessed_transform_css_perspective) {
422+
RawValue value{folly::dynamic("perspective(500px)")};
421423
Transform result;
422-
parseUnprocessedTransformString("perspective(500px)", result);
424+
fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result);
423425

424426
EXPECT_EQ(result.operations.size(), 1);
425427
EXPECT_EQ(result.operations[0].type, TransformOperationType::Perspective);
426428
EXPECT_EQ(result.operations[0].x.value, 500.0f);
427429
}
428430

429-
TEST(ConversionsTest, unprocessed_transform_css_invalid_string) {
431+
TEST_F(NativeCSSConversionsTest, unprocessed_transform_css_invalid_string) {
432+
RawValue value{folly::dynamic("not-a-transform")};
430433
Transform result;
431-
parseUnprocessedTransformString("not-a-transform", result);
434+
fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result);
432435

433436
EXPECT_TRUE(result.operations.empty());
434437
}
435438

436-
TEST(ConversionsTest, unprocessed_transform_rawvalue_string) {
439+
TEST_F(NativeCSSConversionsTest, unprocessed_transform_rawvalue_string) {
437440
RawValue value{folly::dynamic("rotate(45deg) scale(2)")};
438441
Transform result;
439-
parseUnprocessedTransform(
440-
PropsParserContext{-1, ContextContainer{}}, value, result);
442+
fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result);
441443

442444
EXPECT_EQ(result.operations.size(), 2);
443445
EXPECT_EQ(result.operations[0].type, TransformOperationType::Rotate);
@@ -449,8 +451,7 @@ TEST(ConversionsTest, unprocessed_transform_rawvalue_array) {
449451
folly::dynamic::object("rotate", "45deg"),
450452
folly::dynamic::object("scale", 2))};
451453
Transform result;
452-
parseUnprocessedTransform(
453-
PropsParserContext{-1, ContextContainer{}}, value, result);
454+
fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result);
454455

455456
EXPECT_EQ(result.operations.size(), 2);
456457
EXPECT_EQ(result.operations[0].type, TransformOperationType::Rotate);
@@ -465,8 +466,7 @@ TEST(ConversionsTest, unprocessed_transform_rawvalue_matrix) {
465466
folly::dynamic::array(
466467
1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)))};
467468
Transform result;
468-
parseUnprocessedTransform(
469-
PropsParserContext{-1, ContextContainer{}}, value, result);
469+
fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result);
470470

471471
EXPECT_EQ(result.operations.size(), 1);
472472
EXPECT_EQ(result.operations[0].type, TransformOperationType::Arbitrary);
@@ -476,18 +476,18 @@ TEST(ConversionsTest, unprocessed_transform_rawvalue_translate_percent) {
476476
RawValue value{
477477
folly::dynamic::array(folly::dynamic::object("translateX", "50%"))};
478478
Transform result;
479-
parseUnprocessedTransform(
480-
PropsParserContext{-1, ContextContainer{}}, value, result);
479+
fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result);
481480

482481
EXPECT_EQ(result.operations.size(), 1);
483482
EXPECT_EQ(result.operations[0].type, TransformOperationType::Translate);
484483
EXPECT_EQ(result.operations[0].x.value, 50.0f);
485484
EXPECT_EQ(result.operations[0].x.unit, UnitType::Percent);
486485
}
487486

488-
TEST(ConversionsTest, unprocessed_transform_origin_css_top_left) {
487+
TEST_F(NativeCSSConversionsTest, unprocessed_transform_origin_css_top_left) {
488+
RawValue value{folly::dynamic("top left")};
489489
TransformOrigin result;
490-
parseUnprocessedTransformOriginString("top left", result);
490+
fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result);
491491

492492
EXPECT_EQ(result.xy[0].value, 0.0f);
493493
EXPECT_EQ(result.xy[0].unit, UnitType::Percent);
@@ -496,9 +496,10 @@ TEST(ConversionsTest, unprocessed_transform_origin_css_top_left) {
496496
EXPECT_EQ(result.z, 0.0f);
497497
}
498498

499-
TEST(ConversionsTest, unprocessed_transform_origin_css_center) {
499+
TEST_F(NativeCSSConversionsTest, unprocessed_transform_origin_css_center) {
500+
RawValue value{folly::dynamic("center")};
500501
TransformOrigin result;
501-
parseUnprocessedTransformOriginString("center", result);
502+
fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result);
502503

503504
EXPECT_EQ(result.xy[0].value, 50.0f);
504505
EXPECT_EQ(result.xy[0].unit, UnitType::Percent);
@@ -507,9 +508,12 @@ TEST(ConversionsTest, unprocessed_transform_origin_css_center) {
507508
EXPECT_EQ(result.z, 0.0f);
508509
}
509510

510-
TEST(ConversionsTest, unprocessed_transform_origin_css_right_bottom) {
511+
TEST_F(
512+
NativeCSSConversionsTest,
513+
unprocessed_transform_origin_css_right_bottom) {
514+
RawValue value{folly::dynamic("right bottom")};
511515
TransformOrigin result;
512-
parseUnprocessedTransformOriginString("right bottom", result);
516+
fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result);
513517

514518
EXPECT_EQ(result.xy[0].value, 100.0f);
515519
EXPECT_EQ(result.xy[0].unit, UnitType::Percent);
@@ -518,9 +522,12 @@ TEST(ConversionsTest, unprocessed_transform_origin_css_right_bottom) {
518522
EXPECT_EQ(result.z, 0.0f);
519523
}
520524

521-
TEST(ConversionsTest, unprocessed_transform_origin_css_length_percent) {
525+
TEST_F(
526+
NativeCSSConversionsTest,
527+
unprocessed_transform_origin_css_length_percent) {
528+
RawValue value{folly::dynamic("10px 50%")};
522529
TransformOrigin result;
523-
parseUnprocessedTransformOriginString("10px 50%", result);
530+
fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result);
524531

525532
EXPECT_EQ(result.xy[0].value, 10.0f);
526533
EXPECT_EQ(result.xy[0].unit, UnitType::Point);
@@ -533,8 +540,7 @@ TEST(ConversionsTest, unprocessed_transform_origin_processed_array) {
533540
RawValue value{folly::dynamic::array("50%", "50%", 0)};
534541

535542
TransformOrigin result;
536-
parseProcessedTransformOrigin(
537-
PropsParserContext{-1, ContextContainer{}}, value, result);
543+
fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result);
538544

539545
EXPECT_EQ(result.xy[0].value, 50.0f);
540546
EXPECT_EQ(result.xy[0].unit, UnitType::Percent);
@@ -543,11 +549,10 @@ TEST(ConversionsTest, unprocessed_transform_origin_processed_array) {
543549
EXPECT_EQ(result.z, 0.0f);
544550
}
545551

546-
TEST(ConversionsTest, unprocessed_transform_origin_rawvalue_string) {
552+
TEST_F(NativeCSSConversionsTest, unprocessed_transform_origin_rawvalue_string) {
547553
RawValue value{folly::dynamic("top left")};
548554
TransformOrigin result;
549-
parseUnprocessedTransformOrigin(
550-
PropsParserContext{-1, ContextContainer{}}, value, result);
555+
fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result);
551556

552557
EXPECT_EQ(result.xy[0].value, 0.0f);
553558
EXPECT_EQ(result.xy[0].unit, UnitType::Percent);
@@ -559,8 +564,7 @@ TEST(ConversionsTest, unprocessed_transform_origin_rawvalue_string) {
559564
TEST(ConversionsTest, unprocessed_transform_origin_rawvalue_array) {
560565
RawValue value{folly::dynamic::array(10, "50%", 5)};
561566
TransformOrigin result;
562-
parseUnprocessedTransformOrigin(
563-
PropsParserContext{-1, ContextContainer{}}, value, result);
567+
fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result);
564568

565569
EXPECT_EQ(result.xy[0].value, 10.0f);
566570
EXPECT_EQ(result.xy[0].unit, UnitType::Point);
@@ -569,11 +573,12 @@ TEST(ConversionsTest, unprocessed_transform_origin_rawvalue_array) {
569573
EXPECT_EQ(result.z, 5.0f);
570574
}
571575

572-
TEST(ConversionsTest, unprocessed_transform_origin_rawvalue_string_with_z) {
576+
TEST_F(
577+
NativeCSSConversionsTest,
578+
unprocessed_transform_origin_rawvalue_string_with_z) {
573579
RawValue value{folly::dynamic("center center 15px")};
574580
TransformOrigin result;
575-
parseUnprocessedTransformOrigin(
576-
PropsParserContext{-1, ContextContainer{}}, value, result);
581+
fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result);
577582

578583
EXPECT_EQ(result.xy[0].value, 50.0f);
579584
EXPECT_EQ(result.xy[0].unit, UnitType::Percent);
@@ -616,28 +621,30 @@ TEST(ConversionsTest, convert_aspect_ratio_float) {
616621
EXPECT_EQ(result.unwrap(), 1.5f);
617622
}
618623

619-
TEST(ConversionsTest, convert_aspect_ratio_ratio_string) {
620-
// CSSRatio parses "16/9" as {numerator: 16, denominator: 9}
621-
auto ratio = parseCSSProperty<CSSRatio>("16/9");
622-
ASSERT_TRUE(std::holds_alternative<CSSRatio>(ratio));
623-
auto r = std::get<CSSRatio>(ratio);
624-
EXPECT_FALSE(r.isDegenerate());
625-
EXPECT_NEAR(r.numerator / r.denominator, 16.0f / 9.0f, 0.001f);
624+
TEST_F(NativeCSSConversionsTest, convert_aspect_ratio_ratio_string) {
625+
RawValue value{folly::dynamic("16/9")};
626+
auto result =
627+
convertAspectRatio(PropsParserContext{-1, ContextContainer{}}, value);
628+
629+
ASSERT_FALSE(result.isUndefined());
630+
EXPECT_NEAR(result.unwrap(), 16.0f / 9.0f, 0.001f);
626631
}
627632

628-
TEST(ConversionsTest, convert_aspect_ratio_number_string) {
629-
// CSSRatio parses "1.5" as {numerator: 1.5, denominator: 1.0}
630-
auto ratio = parseCSSProperty<CSSRatio>("1.5");
631-
ASSERT_TRUE(std::holds_alternative<CSSRatio>(ratio));
632-
auto r = std::get<CSSRatio>(ratio);
633-
EXPECT_FALSE(r.isDegenerate());
634-
EXPECT_EQ(r.numerator / r.denominator, 1.5f);
633+
TEST_F(NativeCSSConversionsTest, convert_aspect_ratio_number_string) {
634+
RawValue value{folly::dynamic("1.5")};
635+
auto result =
636+
convertAspectRatio(PropsParserContext{-1, ContextContainer{}}, value);
637+
638+
ASSERT_FALSE(result.isUndefined());
639+
EXPECT_EQ(result.unwrap(), 1.5f);
635640
}
636641

637-
TEST(ConversionsTest, convert_aspect_ratio_degenerate) {
638-
auto ratio = parseCSSProperty<CSSRatio>("0/0");
639-
ASSERT_TRUE(std::holds_alternative<CSSRatio>(ratio));
640-
EXPECT_TRUE(std::get<CSSRatio>(ratio).isDegenerate());
642+
TEST_F(NativeCSSConversionsTest, convert_aspect_ratio_degenerate) {
643+
RawValue value{folly::dynamic("0/0")};
644+
auto result =
645+
convertAspectRatio(PropsParserContext{-1, ContextContainer{}}, value);
646+
647+
EXPECT_TRUE(result.isUndefined());
641648
}
642649

643650
TEST(ConversionsTest, float_optional_from_rawvalue_float) {

‎scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api‎

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -900,7 +900,6 @@ facebook::react::Size facebook::react::ModalHostViewScreenSize(void);
900900
facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value);
901901
facebook::react::SurfaceId facebook::react::getNextRootViewTag() noexcept;
902902
facebook::react::TurboModuleMethodValueKind facebook::react::getTurboModuleMethodValueKind(facebook::jsi::Runtime& rt, const facebook::jsi::Value* value);
903-
facebook::react::ValueUnit facebook::react::cssLengthPercentageToValueUnit(const std::variant<facebook::react::CSSLength, facebook::react::CSSPercentage>& value);
904903
facebook::react::ValueUnit facebook::react::toValueUnit(const facebook::react::RawValue& value);
905904
facebook::yoga::FloatOptional facebook::react::convertAspectRatio(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value);
906905
facebook::yoga::FloatOptional facebook::react::yogaOptionalFloatFromFloat(facebook::react::Float value);
@@ -948,10 +947,8 @@ std::optional<facebook::react::BlendMode> facebook::react::blendModeFromString(s
948947
std::optional<facebook::react::FilterType> facebook::react::filterTypeFromString(std::string_view filterName);
949948
std::optional<facebook::react::Float> facebook::react::coerceLength(const facebook::react::RawValue& value);
950949
std::optional<facebook::react::Float> facebook::react::optionalFloatFromYogaValue(const facebook::yoga::Style::Length& length, std::optional<facebook::react::Float> base = {});
951-
std::optional<facebook::react::Float> facebook::react::toRadians(const facebook::react::RawValue& value);
952950
std::optional<facebook::react::FontVariant> facebook::react::fontVariantFromCSSFontVariant(facebook::react::CSSFontVariant cssVariant);
953951
std::optional<facebook::react::Isolation> facebook::react::isolationFromString(std::string_view isolationSetting);
954-
std::optional<facebook::react::TransformOperation> facebook::react::fromCSSTransformFunction(const facebook::react::CSSTransformFunction& cssTransform);
955952
std::pair<facebook::react::Float, facebook::react::Float> facebook::react::calculateAnimationProgress(uint64_t now, const facebook::react::LayoutAnimation& animation, const facebook::react::AnimationConfig& mutationConfig);
956953
std::string facebook::react::base64Encode(const std::string_view s);
957954
std::string facebook::react::componentNameByReactViewName(std::string viewName);
@@ -1144,16 +1141,10 @@ void facebook::react::g_setNativeAnimatedNowTimestampFunction(facebook::react::T
11441141
void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const facebook::jsi::JSError& error, bool isFatal);
11451142
void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector<facebook::react::BackgroundImage>& result);
11461143
void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result);
1147-
void facebook::react::parseProcessedTransform(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Transform& result);
1148-
void facebook::react::parseProcessedTransformOrigin(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result);
11491144
void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector<facebook::react::RawValue>& value, std::vector<facebook::react::BackgroundImage>& result);
11501145
void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector<facebook::react::BackgroundImage>& result);
11511146
void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result);
11521147
void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result);
1153-
void facebook::react::parseUnprocessedTransform(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::Transform& result);
1154-
void facebook::react::parseUnprocessedTransformOrigin(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result);
1155-
void facebook::react::parseUnprocessedTransformOriginString(const std::string& value, facebook::react::TransformOrigin& result);
1156-
void facebook::react::parseUnprocessedTransformString(const std::string& value, facebook::react::Transform& result);
11571148
void facebook::react::reactAndroidLoggingHook(const std::string& message, unsigned int logLevel);
11581149
void facebook::react::registerCxxModuleToGlobalModuleMap(std::string name, std::function<std::shared_ptr<facebook::react::TurboModule>(std::shared_ptr<facebook::react::CallInvoker> jsInvoker)> moduleProviderFunc);
11591150
void facebook::react::serializeTransformAxis(const facebook::react::TransformOperation& operation, const std::string& operationName, float defaultValue, folly::dynamic& resultTranslateArray);

0 commit comments

Comments
 (0)