From 729b34fa3b6b08e3386b60f9f2e2d681533c9b99 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sun, 25 Mar 2012 14:51:37 +0000 Subject: Fix up node_presentational_hint_vertical_align svn path=/trunk/netsurf/; revision=13690 --- css/css.c | 7 ++++- css/internal.h | 3 +++ css/select.c | 80 +++++++++++++++++++++++++++++++++++----------------------- 3 files changed, 57 insertions(+), 33 deletions(-) (limited to 'css') diff --git a/css/css.c b/css/css.c index 99c752a8d..a9c401df5 100644 --- a/css/css.c +++ b/css/css.c @@ -85,6 +85,8 @@ static css_stylesheet *blank_import; dom_string *nscss_dom_string_a; dom_string *nscss_dom_string_href; +dom_string *nscss_dom_string_align; +dom_string *nscss_dom_string_valign; /** * Initialise a CSS content @@ -779,6 +781,8 @@ static void nscss_fini(void) } \ } while (0) \ + CSS_DOM_STRING_UNREF(valign); + CSS_DOM_STRING_UNREF(align); CSS_DOM_STRING_UNREF(href); CSS_DOM_STRING_UNREF(a); @@ -833,7 +837,8 @@ nserror nscss_init(void) CSS_DOM_STRING_INTERN(a); CSS_DOM_STRING_INTERN(href); - + CSS_DOM_STRING_INTERN(align); + CSS_DOM_STRING_INTERN(valign); #undef CSS_DOM_STRING_INTERN diff --git a/css/internal.h b/css/internal.h index c1777fe58..ab26fdd00 100644 --- a/css/internal.h +++ b/css/internal.h @@ -26,5 +26,8 @@ css_error nscss_resolve_url(void *pw, const char *base, extern struct dom_string *nscss_dom_string_a; extern struct dom_string *nscss_dom_string_href; +extern struct dom_string *nscss_dom_string_align; +extern struct dom_string *nscss_dom_string_valign; + #endif diff --git a/css/select.c b/css/select.c index a98d4a07a..0c548049d 100644 --- a/css/select.c +++ b/css/select.c @@ -1872,75 +1872,91 @@ node_presentational_hint_vertical_align(nscss_select_ctx *ctx, dom_node *node, css_hint *hint) { - xmlChar *valign = NULL; + dom_string *name; + dom_string *valign = NULL; + dom_exception err; - if (strcmp((const char *) n->name, "col") == 0 || - strcmp((const char *) n->name, "thead") == 0 || - strcmp((const char *) n->name, "tbody") == 0 || - strcmp((const char *) n->name, "tfoot") == 0 || - strcmp((const char *) n->name, "tr") == 0 || - strcmp((const char *) n->name, "td") == 0 || - strcmp((const char *) n->name, "th") == 0) { - valign = xmlGetProp(n, (const xmlChar *) "valign"); + err = dom_node_get_node_name(node, &name); + if (err != DOM_NO_ERR) + return CSS_PROPERTY_NOT_SET; - if (valign == NULL) + if (strcmp(dom_string_data(name), "col") == 0 || + strcmp(dom_string_data(name), "thead") == 0 || + strcmp(dom_string_data(name), "tbody") == 0 || + strcmp(dom_string_data(name), "tfoot") == 0 || + strcmp(dom_string_data(name), "tr") == 0 || + strcmp(dom_string_data(name), "td") == 0 || + strcmp(dom_string_data(name), "th") == 0) { + err = dom_element_get_attribute(node, + nscss_dom_string_valign, &valign); + if (err != DOM_NO_ERR || valign == NULL) { + dom_string_unref(name); return CSS_PROPERTY_NOT_SET; + } - if (strcasecmp((const char *) valign, "top") == 0) { + if (strcasecmp(dom_string_data(valign), "top") == 0) { hint->status = CSS_VERTICAL_ALIGN_TOP; - } else if (strcasecmp((const char *) valign, + } else if (strcasecmp(dom_string_data(valign), "middle") == 0) { hint->status = CSS_VERTICAL_ALIGN_MIDDLE; - } else if (strcasecmp((const char *) valign, + } else if (strcasecmp(dom_string_data(valign), "bottom") == 0) { hint->status = CSS_VERTICAL_ALIGN_BOTTOM; - } else if (strcasecmp((const char *) valign, + } else if (strcasecmp(dom_string_data(valign), "baseline") == 0) { hint->status = CSS_VERTICAL_ALIGN_BASELINE; } else { - xmlFree(valign); + dom_string_unref(valign); + dom_string_unref(name); return CSS_PROPERTY_NOT_SET; } - xmlFree(valign); + dom_string_unref(valign); + dom_string_unref(name); return CSS_OK; - } else if (strcmp((const char *) n->name, "applet") == 0 || - strcmp((const char *) n->name, "embed") == 0 || - strcmp((const char *) n->name, "iframe") == 0 || - strcmp((const char *) n->name, "img") == 0 || - strcmp((const char *) n->name, "object") == 0) { + } else if (strcmp(dom_string_data(name), "applet") == 0 || + strcmp(dom_string_data(name), "embed") == 0 || + strcmp(dom_string_data(name), "iframe") == 0 || + strcmp(dom_string_data(name), "img") == 0 || + strcmp(dom_string_data(name), "object") == 0) { /** \todo input[type=image][align=*] - $11.3.3 */ - valign = xmlGetProp(n, (const xmlChar *) "align"); - - if (valign == NULL) + err = dom_element_get_attribute(node, + nscss_dom_string_align, &valign); + if (err != DOM_NO_ERR || valign == NULL) { + dom_string_unref(name); return CSS_PROPERTY_NOT_SET; + } - if (strcasecmp((const char *) valign, "top") == 0) { + if (strcasecmp(dom_string_data(valign), "top") == 0) { hint->status = CSS_VERTICAL_ALIGN_TOP; - } else if (strcasecmp((const char *) valign, + } else if (strcasecmp(dom_string_data(valign), "bottom") == 0 || - strcasecmp((const char *) valign, + strcasecmp(dom_string_data(valign), "baseline") == 0) { hint->status = CSS_VERTICAL_ALIGN_BASELINE; - } else if (strcasecmp((const char *) valign, + } else if (strcasecmp(dom_string_data(valign), "texttop") == 0) { hint->status = CSS_VERTICAL_ALIGN_TEXT_TOP; - } else if (strcasecmp((const char *) valign, + } else if (strcasecmp(dom_string_data(valign), "absmiddle") == 0 || - strcasecmp((const char *) valign, + strcasecmp(dom_string_data(valign), "abscenter") == 0) { hint->status = CSS_VERTICAL_ALIGN_MIDDLE; } else { - xmlFree(valign); + dom_string_unref(valign); + dom_string_unref(name); return CSS_PROPERTY_NOT_SET; } - xmlFree(valign); + dom_string_unref(valign); + dom_string_unref(name); return CSS_OK; } + dom_string_unref(name); + return CSS_PROPERTY_NOT_SET; } static css_error -- cgit v1.2.3