Fixed translation of html entities when a textarea has an initial value

svn path=/trunk/netsurf/; revision=2952
This commit is contained in:
Jeffrey Lee 2006-09-11 08:02:13 +00:00
parent 0f26a73976
commit 36278685ff
1 changed files with 19 additions and 2 deletions

View File

@ -20,6 +20,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "libxml/HTMLparser.h" #include "libxml/HTMLparser.h"
#include "libxml/parserInternals.h"
#include "netsurf/utils/config.h" #include "netsurf/utils/config.h"
#include "netsurf/content/content.h" #include "netsurf/content/content.h"
#include "netsurf/css/css.h" #include "netsurf/css/css.h"
@ -2391,7 +2392,7 @@ bool box_textarea(BOX_SPECIAL_PARAMS)
* Consecutive BR may not be present. These constraints are satisfied * Consecutive BR may not be present. These constraints are satisfied
* by using a 0-length TEXT for blank lines. */ * by using a 0-length TEXT for blank lines. */
xmlChar *current; xmlChar *current,*string,*null_string="";
xmlNode *n2; xmlNode *n2;
xmlBufferPtr buf; xmlBufferPtr buf;
struct box *inline_container, *inline_box, *br_box; struct box *inline_container, *inline_box, *br_box;
@ -2427,12 +2428,22 @@ bool box_textarea(BOX_SPECIAL_PARAMS)
} }
n2 = n2->next; n2 = n2->next;
} }
current = buf->content; xmlParserCtxtPtr ctxt = xmlCreateDocParserCtxt(buf->content);
string=0;
if(ctxt)
{
string = current = xmlStringDecodeEntities(ctxt,buf->content,XML_SUBSTITUTE_REF|XML_SUBSTITUTE_PEREF,0,0,0);
xmlFreeParserCtxt(ctxt);
}
if(!string)
string = current = null_string;
while (1) { while (1) {
/* BOX_TEXT */ /* BOX_TEXT */
len = strcspn(current, "\r\n"); len = strcspn(current, "\r\n");
s = talloc_strndup(content, current, len); s = talloc_strndup(content, current, len);
if (!s) { if (!s) {
if(string != null_string)
xmlFree(string);
xmlBufferFree(buf); xmlBufferFree(buf);
return false; return false;
} }
@ -2440,6 +2451,8 @@ bool box_textarea(BOX_SPECIAL_PARAMS)
inline_box = box_create(box->style, 0, 0, box->title, 0, inline_box = box_create(box->style, 0, 0, box->title, 0,
content); content);
if (!inline_box) { if (!inline_box) {
if(string != null_string)
xmlFree(string);
xmlBufferFree(buf); xmlBufferFree(buf);
return false; return false;
} }
@ -2456,6 +2469,8 @@ bool box_textarea(BOX_SPECIAL_PARAMS)
/* BOX_BR */ /* BOX_BR */
br_box = box_create(box->style, 0, 0, box->title, 0, content); br_box = box_create(box->style, 0, 0, box->title, 0, content);
if (!br_box) { if (!br_box) {
if(string != null_string)
xmlFree(string);
xmlBufferFree(buf); xmlBufferFree(buf);
return false; return false;
} }
@ -2467,6 +2482,8 @@ bool box_textarea(BOX_SPECIAL_PARAMS)
else else
current++; current++;
} }
if(string != null_string)
xmlFree(string);
xmlBufferFree(buf); xmlBufferFree(buf);
if (content->data.html.forms) if (content->data.html.forms)