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 {