diff --git a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridge.java b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridge.java index 3ad743bc4c4187..3e9272553b4111 100644 --- a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridge.java +++ b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridge.java @@ -25,7 +25,7 @@ import java.util.List; @JNINamespace("autofill") @NullMarked public class AuthenticatorSelectionDialogBridge implements AuthenticatorSelectionDialog.Listener { - private final long mNativeCardUnmaskAuthenticationSelectionDialogView; + private long mNativeCardUnmaskAuthenticationSelectionDialogView; private final AuthenticatorSelectionDialog mAuthenticatorSelectionDialog; public AuthenticatorSelectionDialogBridge( @@ -129,6 +129,7 @@ public class AuthenticatorSelectionDialogBridge implements AuthenticatorSelectio */ @Override public void onOptionSelected(String authenticatorOptionIdentifier) { + if (mNativeCardUnmaskAuthenticationSelectionDialogView == 0) return; AuthenticatorSelectionDialogBridgeJni.get() .onOptionSelected( mNativeCardUnmaskAuthenticationSelectionDialogView, @@ -138,8 +139,10 @@ public class AuthenticatorSelectionDialogBridge implements AuthenticatorSelectio /** Notify that the dialog was dismissed. */ @Override public void onDialogDismissed() { + if (mNativeCardUnmaskAuthenticationSelectionDialogView == 0) return; AuthenticatorSelectionDialogBridgeJni.get() .onDismissed(mNativeCardUnmaskAuthenticationSelectionDialogView); + mNativeCardUnmaskAuthenticationSelectionDialogView = 0; } @NativeMethods diff --git a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridgeTest.java b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridgeTest.java index 0194ba0d956774..c004f2e7b0d07f 100644 --- a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridgeTest.java +++ b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridgeTest.java @@ -4,6 +4,9 @@ package org.chromium.chrome.browser.ui.autofill; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -102,4 +105,19 @@ public class AuthenticatorSelectionDialogBridgeTest { verify(mNativeMock, times(1)).onDismissed(NATIVE_AUTHENTICATOR_SELECTION_DIALOG_VIEW); } + + @Test + @SmallTest + public void testNativeCallsDoNotOccurAfterDismissed() throws Exception { + mAuthenticatorSelectionDialogBridge.onDialogDismissed(); + + verify(mNativeMock, times(1)).onDismissed(NATIVE_AUTHENTICATOR_SELECTION_DIALOG_VIEW); + + // Subsequent calls should not reach native. + mAuthenticatorSelectionDialogBridge.onOptionSelected(OPTION_1.getIdentifier()); + mAuthenticatorSelectionDialogBridge.onDialogDismissed(); + + verify(mNativeMock, never()).onOptionSelected(anyLong(), anyString()); + verify(mNativeMock, times(1)).onDismissed(anyLong()); + } }