Escribir una determinada secuencia de caracteres en modo XML da como resultado una pérdida de memoria / bucle infinito que finalmente bloquea la página. Reproducir:
<A><![CDATA[</A>
Este error está presente en la versión actual de Ace, y al menos desde Ace 1.2.3.
Se bloquea en Windows 7 y 10, en Chrome.
Identifiqué el problema como esta línea: https://github.com/ajaxorg/ace/blob/dbdf8aaad697e2ded8fd69249b72a7e898583afa/lib/ace/mode/xml/sax.js#L479
end
es igual a -1 porque la cadena "]]>" no existe. Esto hace que el valor de retorno sea 2, provocando un bucle infinito. No estoy familiarizado con el editor Ace. Encontré una solución simple:
var end = source.indexOf(']]>',start+9);
if (end < 0) {
return -1;
}
Un pequeño problema es que el documento dejará de tokenizarse después de la cadena CDATA [rota, por lo que perdemos el resaltado de sintaxis. Sería bueno si de alguna manera pudiéramos mantener el resaltado de sintaxis.
sax.js es una biblioteca de terceros que se utiliza para linting, no debería afectar el resaltado de sintaxis.
Teniendo en cuenta la cantidad de errores que encontró en él, me pregunto si deberíamos cambiar a otra cosa, por ejemplo, https://www.npmjs.com/package/xmlchecker o http://syssgx.github.io/xml.js/
Otra alternativa podría ser https://github.com/lddubeau/saxes
Parece que podría solucionar una serie de errores de xml abiertos
Un problema para mí es que el modo xml actual se está validando para un fragmento xml, no para un documento xml.
P.ej
just some text
y
<foo/><foo/>
se consideran xml válidos. ¿Es esto por diseño?
Creé una página de respuesta para mostrar saxes
en acción
https://repl.it/@apb2006/xml -parser-saxes-test
Solo para que conste, hay otro contenido que desencadena la misma pérdida de memoria. Vaya a https://ace.c9.io/build/kitchen-sink.html y cambie al modo XML. En algún lugar del medio, escriba <?p
. Después de un par de segundos, el navegador se bloquea. Safari, Chrome, FF, todos iguales.
Comentario más útil
Solo para que conste, hay otro contenido que desencadena la misma pérdida de memoria. Vaya a https://ace.c9.io/build/kitchen-sink.html y cambie al modo XML. En algún lugar del medio, escriba
<?p
. Después de un par de segundos, el navegador se bloquea. Safari, Chrome, FF, todos iguales.