changeset 28383:2a6f0c2460ae

Fix a bug in our outgoing yahoo message formatting where messages with variations in text color and font size/face could have incorrect coloring
author Mark Doliner <mark@kingant.net>
date Thu, 20 Aug 2009 20:04:50 +0000
parents 6b446431b2b0
children b779173fd19e
files libpurple/protocols/yahoo/util.c libpurple/tests/test_yahoo_util.c
diffstat 2 files changed, 25 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/libpurple/protocols/yahoo/util.c	Thu Aug 20 18:13:41 2009 +0000
+++ b/libpurple/protocols/yahoo/util.c	Thu Aug 20 20:04:50 2009 +0000
@@ -712,6 +712,14 @@
 		g_string_append_printf(dest, "\033[%sm", attribute);
 		*colors = g_slist_prepend(*colors,
 				g_strdup_printf("\033[%sm", attribute));
+	} else {
+		/* We need to add a value to the colors stack even if we're not
+		 * setting a color because we ALWAYS pop exactly 1 element from
+		 * this stack for every </font> tag.  If we don't add anything
+		 * then we'll pop something that we shouldn't when we hit this
+		 * corresponding </font>. */
+		*colors = g_slist_prepend(*colors,
+				*colors ? g_strdup((*colors)->data) : g_strdup("\033[#000000m"));
 	}
 
 	attribute = g_datalist_get_data(&attributes, "face");
@@ -868,11 +876,9 @@
 						char *etag = tags->data;
 						tags = g_slist_delete_link(tags, tags);
 						g_string_append(dest, etag);
-						if (g_str_equal(etag, "</font>")) {
-							if (colors != NULL) {
-								g_free(colors->data);
-								colors = g_slist_delete_link(colors, colors);
-							}
+						if (colors != NULL) {
+							g_free(colors->data);
+							colors = g_slist_delete_link(colors, colors);
 						}
 						g_free(etag);
 					}
--- a/libpurple/tests/test_yahoo_util.c	Thu Aug 20 18:13:41 2009 +0000
+++ b/libpurple/tests/test_yahoo_util.c	Thu Aug 20 20:04:50 2009 +0000
@@ -149,7 +149,7 @@
 	assert_string_equal_free("mark@example.com",
 			yahoo_html_to_codes("<A HREF=\"mailto:mark@example.com\">mark@example.com</A>"));
 #if 0
-	assert_string_equal_free("http://pidgin.im/",
+	assert_string_equal_free("Pidgin (http://pidgin.im/)",
 			yahoo_html_to_codes("<A HREF=\"http://pidgin.im/\">Pidgin</A>"));
 #endif
 
@@ -160,12 +160,25 @@
 	/* font color */
 	assert_string_equal_free("\x1B[#E71414mred\x1B[#000000m",
 			yahoo_html_to_codes("<font color=\"#E71414\">red</font>"));
+	assert_string_equal_free("\x1B[#FF0000mred\x1B[#000000m \x1B[#0000FFmblue\x1B[#000000m black",
+			yahoo_html_to_codes("<font color=\"#FF0000\">red</font> <font color=\"#0000FF\">blue</font> black"));
 
 	/* font size */
 	assert_string_equal_free("<font size=\"10\">test</font>",
 			yahoo_html_to_codes("<font size=\"2\">test</font>"));
 	assert_string_equal_free("<font size=\"30\">test</font>",
 			yahoo_html_to_codes("<font size=\"6\">test</font>"));
+
+	/* combinations */
+	assert_string_equal_free("\x1B[#FF0000m<font size=\"8\">redsmall</font> rednormal\x1B[#000000m",
+			yahoo_html_to_codes("<font color=\"#FF0000\"><font size=\"1\">redsmall</font> rednormal</font>"));
+
+	assert_string_equal_free("\x1B[#FF0000m<font size=\"8\">redsmall</font> \x1B[#00FF00mgreennormal\x1B[#FF0000m rednormal\x1B[#000000m",
+			yahoo_html_to_codes("<font color=\"#FF0000\"><font size=\"1\">redsmall</font> <font color=\"#00FF00\">greennormal</font> rednormal</font>"));
+
+	/* This test case isn't correct, and so it's commented out */
+	assert_string_equal_free("\x1B[1mbold \x1B[#FF0000mred <font face=\"Comic Sans MS\" size=\"20\">larger \x1B[#000000mbacktoblack <font size=\"12\">normalsize</font>\x1B[#FF0000m</font>\x1B[#000000m\x1B[x1m",
+			yahoo_html_to_codes("<b>bold <font color=\"#FF0000\">red <font face=\"Comic Sans MS\" size=\"5\">larger <font color=\"#000000\">backtoblack <font size=\"3\">normalsize</font></font></font></font></b>"));
 }
 END_TEST