En nuestra aplicación de Android (Xamarin), abrimos una página web usando una intención de ActionView. El código se ve así:
Intent intent = new Intent((string)Intent.ActionView, Android.Net.Uri.Parse(args.url)); intent.AddFlags(ActivityFlags.NewTask);La página abierta en algún momento hace una redirección JS, con una línea como esta:
window.location = '...'; Probamos muchas variaciones diferentes de esa línea, incluyendo window.location.href = '...' , window.location.assign('...'); y algo más. Todos muestran el mismo comportamiento.
Esto ha funcionado bien durante años, en todos los navegadores, pero ahora nos encontramos con un problema, cuando el navegador en el dispositivo Android es el navegador Edge:
Cuando la intención abre inicialmente la pestaña del navegador, el navegador simplemente ignora la línea window.location = '...' en Javascript. Sin mensaje de error, simplemente ignorado.
Sin embargo, si esa misma pestaña del navegador con exactamente la misma URL se abre manualmente (ya sea recargando o copiando y pegando la URL), la redirección JS se ejecuta correctamente.
¿Cómo solucionamos esto, cómo hacemos que la redirección JS funcione de manera confiable?
Supongo que nos encontramos con una función de seguridad que evita los redireccionamientos de JS en las pestañas del navegador con las que el usuario nunca ha interactuado.
¿Hay algo (¿tal vez un indicador de intención?) para eludir esto? Ya probamos la bandera GrantWriteUriPermission , pero no sirvió de nada.
El redireccionamiento de Facebook del navegador de Android no siempre activa la intención de la URL :
La situación propuesta de establecer la URL en un enlace y simular un clic en él no funcionó.
Microsoft Edge solucionó recientemente un problema relacionado con XSS Targeting Non-Script Elements (24 de junio de 2021).
Dos investigadores encontraron la vulnerabilidad cuando visitaron un sitio web en otro idioma a través del navegador Microsoft Edge e intentaron traducir la página. El objetivo de la corrección reciente de Microsoft es evitar la vulnerabilidad relacionada con el acceso dinámico a un contenido de una aplicación de terceros y específicamente en el caso de la redirección del navegador. Necesitan actuar rápidamente porque la vulnerabilidad es bastante grande.
Para mitigar una gran clase de posibles problemas de secuencias de comandos entre sitios, el sistema Microsoft Edge Extension ha incorporado el concepto general de Política de seguridad de contenido ( CSP )
Tal vez pueda encontrar una solución para resolver su problema aquí , en particular la parte relacionada con <button onclick="..."> .
El código en línea se considera dañino en concepto de CSP y Microsoft recomienda algunas buenas prácticas:
1 - La definición de clickHandler debe moverse a un JavaScript externo
2 - Las definiciones del controlador de eventos en línea deben reescribirse en términos de addEventListener y extraerse en su archivo js externo. Si actualmente está iniciando su programa usando un código como
<body onload="main();">, considere reemplazarlo conectando el evento DOMContentLoaded del documento, o el evento de carga de la ventana, según sus requisitos. Usa el primero, ya que generalmente se activa más rápido.3 - La función dentro de la llamada
onclickdebe reescribirse para evitar convertir la cadena de función en JavaScript para su ejecución.
El ejemplo de código del archivo .js externo citado en la documentación tiene este aspecto:
function awesome() { // Do something awesome! } function totallyAwesome() { // do something TOTALLY awesome! } function awesomeTask() { awesome(); totallyAwesome(); } function clickHandler(e) { setTimeout(awesomeTask, 1000); } function main() { // Initialization work goes here. } // Add event listeners once the DOM has fully loaded by listening for the // `DOMContentLoaded` event on the document, and adding your listeners to // specific elements when it triggers. document.addEventListener('DOMContentLoaded', function () { document.querySelector('button').addEventListener('click', clickHandler); main(); });Espero que sea de ayuda