je crois que ça plante car document.firstChild n'est pas un node, mais le type de document (ici html) car il y a une DTD associée). Du coup, le range.selectNode() fait n'importe quoi, et quand tu essaies de remplacer le contenu du range par un simple "<span></span>", ca fait planter firefox.
Je suis pas du tout un expert de javascript, mais je suppose qu'en vérifiant les retours des différentes fonctions appelées, on pourrait éviter la catastrophe. En tous cas, ceci est au moins un début d'explication...
EDIT: d'ailleurs, si tu enlèves la spécification de la DTD, ça ne plante plus, car dans ce cas le type d'objet renvoyé par firstChild() n'est plus le même
plus de détails sur le DOM de Gecko ici: http://developer.mozilla.org/en/do [...] _Reference