messageTray: improve bad-markup handling

_fixMarkup() was supposed to be ensuring that the markup we passed to
clutter was correct, but it was validating the syntax incorrectly, and
wasn't checking that the markup was valid (or even well-formed). This
is bad because if you pass bad pango markup to
clutter_text_set_markup(), it will g_warn and drop the string on the
floor.

Fix by fixing up the regexps, and then calling Pango.parse_markup() on
the result, and just xml-escaping everything if parse_markup() fails.

https://bugzilla.gnome.org/show_bug.cgi?id=650298
This commit is contained in:
Dan Winship 2011-05-04 11:15:45 -04:00
parent 9003a34285
commit 7542e68b6f

View File

@ -68,14 +68,19 @@ function _fixMarkup(text, allowMarkup) {
// Support &, ", ', < and >, escape all other // Support &, ", ', < and >, escape all other
// occurrences of '&'. // occurrences of '&'.
let _text = text.replace(/&(?!amp;|quot;|apos;|lt;|gt;)/g, '&'); let _text = text.replace(/&(?!amp;|quot;|apos;|lt;|gt;)/g, '&');
// Support <b>, <i>, and <u>, escape anything else // Support <b>, <i>, and <u>, escape anything else
// so it displays as raw markup. // so it displays as raw markup.
return _text.replace(/<(\/?[^biu]>|[^>\/][^>])/g, '&lt;$1'); _text = _text.replace(/<(?!\/?[biu]>)/g, '&lt;');
} else {
// Escape everything try {
let _text = text.replace(/&/g, '&amp;'); Pango.parse_markup(_text, -1, '');
return _text.replace(/</g, '&lt;'); return _text;
} catch (e) {}
} }
// !allowMarkup, or invalid markup
return GLib.markup_escape_text(text, -1);
} }
function URLHighlighter(text, lineWrap, allowMarkup) { function URLHighlighter(text, lineWrap, allowMarkup) {