From ae7df2df2295edb347fb044e02148d77742d5b31 Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Tue, 26 May 2020 13:13:21 -0700 Subject: [PATCH] LayoutAnimations: fail silently instead of redboxing if there's a misconfigured LayoutAnimation Summary: property and type are optional params according to Flow, so we should treat as such. Changelog: [Internal] Reviewed By: mdvacca Differential Revision: D21725746 fbshipit-source-id: 3c48a8cef8fa5911c195f582556de6dad871c4f1 --- .../LayoutAnimationKeyFrameManager.cpp | 44 +++++++++++++------ 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/ReactCommon/fabric/animations/LayoutAnimationKeyFrameManager.cpp b/ReactCommon/fabric/animations/LayoutAnimationKeyFrameManager.cpp index 12478e15569..77b589a8696 100644 --- a/ReactCommon/fabric/animations/LayoutAnimationKeyFrameManager.cpp +++ b/ReactCommon/fabric/animations/LayoutAnimationKeyFrameManager.cpp @@ -73,7 +73,8 @@ static better::optional parseAnimationProperty( static better::optional parseAnimationConfig( folly::dynamic const &config, - double defaultDuration) { + double defaultDuration, + bool parsePropertyType) { if (config.empty() || !config.isObject()) { return better::optional( AnimationConfig{AnimationType::Linear, @@ -84,7 +85,11 @@ static better::optional parseAnimationConfig( 0}); } - folly::dynamic const &animationTypeParam = config["type"]; + auto const typeIt = config.find("type"); + if (typeIt == config.items().end()) { + return {}; + } + auto const animationTypeParam = typeIt->second; if (animationTypeParam.empty() || !animationTypeParam.isString()) { return {}; } @@ -93,14 +98,22 @@ static better::optional parseAnimationConfig( return {}; } - folly::dynamic const &animationPropertyParam = config["property"]; - if (animationPropertyParam.empty() || !animationPropertyParam.isString()) { - return {}; - } - const auto animationProperty = - parseAnimationProperty(animationPropertyParam.asString()); - if (!animationProperty) { - return {}; + AnimationProperty animationProperty = AnimationProperty::NotApplicable; + if (parsePropertyType) { + auto const propertyIt = config.find("property"); + if (propertyIt == config.items().end()) { + return {}; + } + auto const animationPropertyParam = propertyIt->second; + if (animationPropertyParam.empty() || !animationPropertyParam.isString()) { + return {}; + } + const auto animationPropertyParsed = + parseAnimationProperty(animationPropertyParam.asString()); + if (!animationPropertyParsed) { + return {}; + } + animationProperty = *animationPropertyParsed; } double duration = defaultDuration; @@ -146,7 +159,7 @@ static better::optional parseAnimationConfig( } return better::optional(AnimationConfig{*animationType, - *animationProperty, + animationProperty, duration, delay, springDamping, @@ -166,17 +179,20 @@ static better::optional parseLayoutAnimationConfig( } const double duration = durationIt->second.asDouble(); - const auto createConfig = parseAnimationConfig(config["create"], duration); + const auto createConfig = + parseAnimationConfig(config["create"], duration, true); if (!createConfig) { return {}; } - const auto updateConfig = parseAnimationConfig(config["update"], duration); + const auto updateConfig = + parseAnimationConfig(config["update"], duration, false); if (!updateConfig) { return {}; } - const auto deleteConfig = parseAnimationConfig(config["delete"], duration); + const auto deleteConfig = + parseAnimationConfig(config["delete"], duration, true); if (!deleteConfig) { return {}; }