diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorFactory.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorFactory.java index 6769fb488450bd..01699d671bd255 100644 --- a/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorFactory.java +++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorFactory.java @@ -10,6 +10,7 @@ import org.chromium.base.ContextUtils; import org.chromium.blink.mojom.Authenticator; import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; +import org.chromium.content_public.browser.LifecycleState; import org.chromium.content_public.browser.RenderFrameHost; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContentsStatics; @@ -32,7 +33,10 @@ public class AuthenticatorFactory implements InterfaceFactory<@Nullable Authenti @Override public @Nullable Authenticator createImpl() { - if (mRenderFrameHost == null) { + // Avoid creating the service if the RenderFrameHost isn't active, e.g. + // if a request arrives during a navigation or from the BFCache. + if (mRenderFrameHost == null + || mRenderFrameHost.getLifecycleState() != LifecycleState.ACTIVE) { return null; } WebContents webContents = WebContentsStatics.fromRenderFrameHost(mRenderFrameHost); diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index 4370159f6da1fc..97044f84981a1e 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc @@ -15040,6 +15040,12 @@ void RenderFrameHostImpl::CreatePermissionService( void RenderFrameHostImpl::GetWebAuthenticationService( mojo::PendingReceiver receiver) { + // Avoid creating the service if the RenderFrameHost isn't active, e.g. if a + // request arrives during a navigation. Match the early-return inside + // AuthenticatorImpl::Create() so the Android Java path gets the same gate. + if (!IsActive()) { + return; + } #if !BUILDFLAG(IS_ANDROID) AuthenticatorImpl::Create(this, std::move(receiver)); #else