[libxml2] Fix html serialization error and htmlSetMetaEncoding()



commit 39d027cdb74371d64f68dc488556be41e1d14546
Author: Daniel Veillard <veillard redhat com>
Date:   Fri May 11 12:38:23 2012 +0800

    Fix html serialization error and htmlSetMetaEncoding()
    
    For https://bugzilla.gnome.org/show_bug.cgi?id=630682
    The python tests were reporting errors, some of it was due to
    a small change in case encoding, but the main one was about
    htmlSetMetaEncoding(doc, NULL) being broken by not removing
    the associated meta tag anymore

 HTMLtree.c                |   12 +++++++++---
 python/tests/serialize.py |    4 ++--
 tree.c                    |    4 ++--
 3 files changed, 13 insertions(+), 7 deletions(-)
---
diff --git a/HTMLtree.c b/HTMLtree.c
index f23ae02..5d0893b 100644
--- a/HTMLtree.c
+++ b/HTMLtree.c
@@ -151,7 +151,7 @@ found_content:
  * htmlSetMetaEncoding:
  * @doc:  the document
  * @encoding:  the encoding string
- * 
+ *
  * Sets the current encoding in the Meta tags
  * NOTE: this will not change the document content encoding, just
  * the META flag associated.
@@ -164,6 +164,7 @@ htmlSetMetaEncoding(htmlDocPtr doc, const xmlChar *encoding) {
     const xmlChar *content = NULL;
     char newcontent[100];
 
+    newcontent[0] = 0;
 
     if (doc == NULL)
 	return(-1);
@@ -244,7 +245,7 @@ found_meta:
 			    http = 1;
 			else
                         {
-                           if ((value != NULL) && 
+                           if ((value != NULL) &&
                                (!xmlStrcasecmp(attr->name, BAD_CAST"content")))
 			       content = value;
                         }
@@ -278,8 +279,13 @@ create:
             xmlNewProp(meta, BAD_CAST"content", BAD_CAST newcontent);
         }
     } else {
+        /* remove the meta tag if NULL is passed */
+        if (encoding == NULL) {
+            xmlUnlinkNode(meta);
+            xmlFreeNode(meta);
+        }
         /* change the document only if there is a real encoding change */
-        if (xmlStrcasestr(content, encoding) == NULL) {
+        else if (xmlStrcasestr(content, encoding) == NULL) {
             xmlSetProp(meta, BAD_CAST"content", BAD_CAST newcontent);
         }
     }
diff --git a/python/tests/serialize.py b/python/tests/serialize.py
index 5b969a9..91753e7 100755
--- a/python/tests/serialize.py
+++ b/python/tests/serialize.py
@@ -96,7 +96,7 @@ str = doc.serialize("iso-8859-1", 1)
 if str != """<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd";>
 <html>
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Hello</title>
 </head>
 <body><p>hello</p></body>
@@ -131,7 +131,7 @@ if str != """<html>
 str = root.serialize("iso-8859-1", 1)
 if str != """<html>
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Hello</title>
 </head>
 <body><p>hello</p></body>
diff --git a/tree.c b/tree.c
index a2fdcbf..71fbd1d 100644
--- a/tree.c
+++ b/tree.c
@@ -3732,8 +3732,8 @@ xmlFreeNode(xmlNodePtr cur) {
  * @cur:  the node
  *
  * Unlink a node from it's current context, the node is not freed
- * If one need to free the node, use xmlNodeFree() routine after the
- * unlink.
+ * If one need to free the node, use xmlFreeNode() routine after the
+ * unlink to discard it.
  */
 void
 xmlUnlinkNode(xmlNodePtr cur) {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]