From f307ac7c5e3adb9b4c0f8b2e4b8cdc2f980c7733 Mon Sep 17 00:00:00 2001 From: dchersey Date: Thu, 7 Feb 2019 02:10:28 -0800 Subject: [PATCH] Fixes capitalized I's when emojiis are present after the text being edited. (#21951) Summary: Fixes #21243. Fixes #20908. Credit goes to superandrew213 who provided the patch based on 0.56; this commit merges and resolved the conflict introduced in 0.57. Pull Request resolved: https://github.com/facebook/react-native/pull/21951 Differential Revision: D13980799 Pulled By: cpojer fbshipit-source-id: 6b9f1a1ae54ad9dba043005d683d6a221472c729 --- Libraries/Text/TextInput/RCTBaseTextInputView.m | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Libraries/Text/TextInput/RCTBaseTextInputView.m b/Libraries/Text/TextInput/RCTBaseTextInputView.m index 21af44009184f1..231680750dcd9a 100644 --- a/Libraries/Text/TextInput/RCTBaseTextInputView.m +++ b/Libraries/Text/TextInput/RCTBaseTextInputView.m @@ -105,12 +105,22 @@ - (BOOL)textOf:(NSAttributedString*)newText equals:(NSAttributedString*)oldText{ // Similarly, when the user is in the middle of inputting some text in Japanese/Chinese, there will be styling on the // text that we should disregard. See https://developer.apple.com/documentation/uikit/uitextinput/1614489-markedtextrange?language=objc // for more info. + // If the user added an emoji, the sytem adds a font attribute for the emoji and stores the original font in NSOriginalFont. // Lastly, when entering a password, etc., there will be additional styling on the field as the native text view // handles showing the last character for a split second. + __block BOOL fontHasBeenUpdatedBySystem = false; + [oldText enumerateAttribute:@"NSOriginalFont" inRange:NSMakeRange(0, oldText.length) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { + if (value){ + fontHasBeenUpdatedBySystem = true; + } + }]; + BOOL shouldFallbackToBareTextComparison = [self.backedTextInputView.textInputMode.primaryLanguage isEqualToString:@"dictation"] || self.backedTextInputView.markedTextRange || - self.backedTextInputView.isSecureTextEntry; + self.backedTextInputView.isSecureTextEntry || + fontHasBeenUpdatedBySystem; + if (shouldFallbackToBareTextComparison) { return ([newText.string isEqualToString:oldText.string]); } else {