From ec47acf377d3a5836630ba011baa8067e4d3cc56 Mon Sep 17 00:00:00 2001 From: Greg Price Date: Sun, 10 Jun 2018 22:37:32 -0700 Subject: [PATCH] Fix extreme TextInput slowness on Android Because NaN is special, the `!=` version of this condition will always be true -- even if `mLetterSpacing` is also `Float.NaN`, which is its default value. It should instead be `!Float.isNaN(...)`. The effect of the broken condition is that every text shadow node will create a `CustomLetterSpacingSpan` around its contents, even when the `letterSpacing` prop was never set. Empirically, that in turn causes #19126: in a controlled TextInput after some text is first added, then deleted, further interaction with the TextInput becomes extremely slow. Perhaps we're somehow ending up with large numbers of these shadow nodes (that sounds like a bug in itself, but I guess it's normally low-impact); then this code would have caused them each to generate more work to do. In any case, fixing this condition causes that issue to disappear. The affected logic was introduced between v0.54 and v0.55, in #17398 aka 5898817fc "Implement letterSpacing on Android >= 5.0". Fixes #19126. --- .../com/facebook/react/views/text/ReactBaseTextShadowNode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactBaseTextShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactBaseTextShadowNode.java index 075c5be23edf3c..f6a8885d12f204 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactBaseTextShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactBaseTextShadowNode.java @@ -119,7 +119,7 @@ private static void buildSpannedFromShadowNode( start, end, new BackgroundColorSpan(textShadowNode.mBackgroundColor))); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - if (textShadowNode.mLetterSpacing != Float.NaN) { + if (!Float.isNaN(textShadowNode.mLetterSpacing)) { ops.add(new SetSpanOperation( start, end,