@@ -17,6 +17,8 @@ import android.text.InputFilter
1717import android.text.InputFilter.AllCaps
1818import android.text.InputType
1919import android.text.Layout
20+ import android.text.SpannableString
21+ import android.text.Spanned
2022import android.util.DisplayMetrics
2123import android.view.Gravity
2224import android.view.View
@@ -32,6 +34,7 @@ import com.facebook.react.uimanager.DisplayMetricsHolder
3234import com.facebook.react.uimanager.ReactStylesDiffMap
3335import com.facebook.react.uimanager.ThemedReactContext
3436import com.facebook.react.views.text.DefaultStyleValuesUtil.getDefaultTextColorHint
37+ import com.facebook.react.views.text.ReactTextUpdate
3538import org.assertj.core.api.Assertions.assertThat
3639import org.junit.Before
3740import org.junit.Test
@@ -481,7 +484,34 @@ class ReactTextInputPropertyTest {
481484 assertThat(view.filters).isEqualTo(filters)
482485 }
483486
487+ @Test
488+ fun testSecureTextDoesNotReplaceSameTextFromJS () {
489+ val markerSpan = MarkerSpan ()
490+ val textUpdate =
491+ SpannableString (" secret" ).apply {
492+ setSpan(markerSpan, 0 , length, Spanned .SPAN_INCLUSIVE_INCLUSIVE )
493+ }
494+
495+ manager.updateProperties(view, buildStyles(" secureTextEntry" , true ))
496+ view.setText(" secret" )
497+
498+ view.maybeSetTextFromJS(
499+ ReactTextUpdate (
500+ textUpdate,
501+ 0 ,
502+ view.gravity and Gravity .HORIZONTAL_GRAVITY_MASK ,
503+ Layout .BREAK_STRATEGY_HIGH_QUALITY ,
504+ 0 ,
505+ )
506+ )
507+
508+ assertThat(checkNotNull(view.text).getSpans(0 , view.length(), MarkerSpan ::class .java))
509+ .isEmpty()
510+ }
511+
484512 private fun buildStyles (vararg keysAndValues : Any? ): ReactStylesDiffMap {
485513 return ReactStylesDiffMap (JavaOnlyMap .of(* keysAndValues))
486514 }
515+
516+ private class MarkerSpan
487517}
0 commit comments