Tengo problemas con un fragmento de código que ha funcionado durante años, pero parece haber dejado de funcionar ahora.
Estoy abriendo una ventana con un formulario de inicio de sesión y estoy escuchando a través de un WebSocket los eventos relacionados con ese inicio de sesión. Después de que el inicio de sesión fue exitoso, quiero cerrar la ventana (que mi script abrió y mantuvo la referencia) después de un breve momento. Estoy usando el siguiente código:
const windowManager = { window: null, eventType: null, } function openWindow({ url, eventType }) { windowManager.window = window.open(url) windowManager.eventType = eventType } function closeWindow({ eventType }) { if (windowManager.window && windowManager.eventType == eventType) { setTimeout(() => { windowManager.window && windowManager.window.close() windowManager.window = null }, 100) } } He confirmado que se llama windowManager.window.close() y no arroja un error. También extraje el código de la aplicación y lo probé por separado y todavía no cierra la ventana. Como dije, este fragmento de código ha funcionado antes y no se modificó en los últimos dos años más o menos.
Estoy usando los siguientes navegadores:
Estoy agradecido por cualquier sugerencia que pueda ayudar a resolver este problema. ¡Muchas gracias!
Después de darme cuenta de que el código anterior funcionaba perfectamente con otros sitios como Google o GitHub, descubrí que el encabezado Cross-Origin-Opener-Policy en nuestro backend de autenticación (que era el sitio que se abrió con el código) es el culpable. Acabábamos de actualizar Helmet a la versión 5, que agregó el encabezado de forma predeterminada.
Nuestra solución fue establecer Cross-Origin-Opener-Policy en el same-origin-allow-popups tanto en la ventana de origen como en la de destino (que están alojadas en el mismo origen, pero atendidas por diferentes servidores). También funcionó al configurarlo como unsafe-none para la ventana de destino sin configurarlo en absoluto en la ventana de origen.