summaryrefslogtreecommitdiff
path: root/css
diff options
context:
space:
mode:
authorVincent Sanders <vince@netsurf-browser.org>2012-03-24 21:35:02 +0000
committerVincent Sanders <vince@netsurf-browser.org>2012-03-24 21:35:02 +0000
commit6a62b3a561fa50020883ed0a29d0ecfb517b1bb2 (patch)
tree143d2112b50e2b0aa54fcaeb3b92486ad939d5c5 /css
parentfd04db85664a03ee6512e75d10a528c44efb2d1a (diff)
downloadnetsurf-6a62b3a561fa50020883ed0a29d0ecfb517b1bb2.tar.gz
netsurf-6a62b3a561fa50020883ed0a29d0ecfb517b1bb2.tar.bz2
three more callbacks fixed up
svn path=/trunk/netsurf/; revision=13629
Diffstat (limited to 'css')
-rw-r--r--css/select.c155
1 files changed, 102 insertions, 53 deletions
diff --git a/css/select.c b/css/select.c
index 0ce6f77a9..f52bb4dfc 100644
--- a/css/select.c
+++ b/css/select.c
@@ -1055,25 +1055,37 @@ css_error node_has_attribute_equal(void *pw, void *node,
const css_qname *qname, lwc_string *value,
bool *match)
{
- xmlNode *n = node;
- xmlChar *attr;
+ dom_node *n = node;
+ dom_string *name;
+ dom_string *atr_val;
+ dom_exception err;
+
size_t vlen = lwc_string_length(value);
- *match = false;
+ if (vlen == 0) {
+ *match = false;
+ return CSS_OK;
+ }
- if (vlen != 0) {
- attr = xmlGetProp(n,
- (const xmlChar *) lwc_string_data(qname->name));
- if (attr != NULL) {
- *match = strlen((const char *) attr) ==
- lwc_string_length(value) &&
- strncasecmp((const char *) attr,
- lwc_string_data(value),
- lwc_string_length(value)) == 0;
- xmlFree(attr);
- }
+ err = dom_string_create_interned(
+ (const uint8_t *) lwc_string_data(qname->name),
+ lwc_string_length(qname->name), &name);
+ if (err != DOM_NO_ERR)
+ return CSS_NOMEM;
+
+ err = dom_element_get_attribute(n, name, &atr_val);
+ if ((err != DOM_NO_ERR) && (atr_val != NULL)) {
+ dom_string_unref(name);
+ *match = false;
+ return CSS_OK;
}
+ dom_string_unref(name);
+
+ *match = dom_string_caseless_lwc_isequal(atr_val, value);
+
+ dom_string_unref(atr_val);
+
return CSS_OK;
}
@@ -1095,30 +1107,50 @@ css_error node_has_attribute_dashmatch(void *pw, void *node,
const css_qname *qname, lwc_string *value,
bool *match)
{
- xmlNode *n = node;
- xmlChar *attr;
+ dom_node *n = node;
+ dom_string *name;
+ dom_string *atr_val;
+ dom_exception err;
+
size_t vlen = lwc_string_length(value);
- *match = false;
+ if (vlen == 0) {
+ *match = false;
+ return CSS_OK;
+ }
- if (vlen != 0) {
- attr = xmlGetProp(n,
- (const xmlChar *) lwc_string_data(qname->name));
- if (attr != NULL) {
- const char *vdata = lwc_string_data(value);
- const char *data = (const char *) attr;
- size_t len = strlen(data);
+ err = dom_string_create_interned(
+ (const uint8_t *) lwc_string_data(qname->name),
+ lwc_string_length(qname->name), &name);
+ if (err != DOM_NO_ERR)
+ return CSS_NOMEM;
- if (len == vlen && strcasecmp(data, vdata) == 0)
- *match = true;
- else if (len > vlen && data[vlen] == '-' &&
- strncasecmp(data, vdata, vlen) == 0)
- *match = true;
+ err = dom_element_get_attribute(n, name, &atr_val);
+ if ((err != DOM_NO_ERR) && (atr_val != NULL)) {
+ dom_string_unref(name);
+ *match = false;
+ return CSS_OK;
+ }
- xmlFree(attr);
+ dom_string_unref(name);
+
+ /* check for exact match */
+ *match = dom_string_caseless_lwc_isequal(atr_val, value);
+
+ /* check for dashmatch */
+ if (*match == false) {
+ const char *vdata = lwc_string_data(value);
+ const char *data = (const char *) dom_string_data(atr_val);
+ size_t len = dom_string_byte_length(atr_val);
+
+ if (len > vlen && data[vlen] == '-' &&
+ strncasecmp(data, vdata, vlen) == 0) {
+ *match = true;
}
}
+ dom_string_unref(atr_val);
+
return CSS_OK;
}
@@ -1140,38 +1172,55 @@ css_error node_has_attribute_includes(void *pw, void *node,
const css_qname *qname, lwc_string *value,
bool *match)
{
- xmlNode *n = node;
- xmlChar *attr;
+ dom_node *n = node;
+ dom_string *name;
+ dom_string *atr_val;
+ dom_exception err;
size_t vlen = lwc_string_length(value);
+ const char *p;
+ const char *start;
+ const char *end;
- *match = false;
+ if (vlen == 0) {
+ *match = false;
+ return CSS_OK;
+ }
- if (vlen != 0) {
- attr = xmlGetProp(n,
- (const xmlChar *) lwc_string_data(qname->name));
- if (attr != NULL) {
- const char *p;
- const char *start = (const char *) attr;
- const char *end = start + strlen(start);
-
- for (p = start; p <= end; p++) {
- if (*p == ' ' || *p == '\0') {
- if ((size_t) (p - start) == vlen &&
- strncasecmp(start,
- lwc_string_data(value),
- vlen) == 0) {
- *match = true;
- break;
- }
+ err = dom_string_create_interned(
+ (const uint8_t *) lwc_string_data(qname->name),
+ lwc_string_length(qname->name), &name);
+ if (err != DOM_NO_ERR)
+ return CSS_NOMEM;
- start = p + 1;
- }
+ err = dom_element_get_attribute(n, name, &atr_val);
+ if ((err != DOM_NO_ERR) && (atr_val != NULL)) {
+ dom_string_unref(name);
+ *match = false;
+ return CSS_OK;
+ }
+
+ dom_string_unref(name);
+
+ /* check for match */
+ start = (const char *) dom_string_data(atr_val);
+ end = start + dom_string_byte_length(atr_val);
+
+ for (p = start; p <= end; p++) {
+ if (*p == ' ' || *p == '\0') {
+ if ((size_t) (p - start) == vlen &&
+ strncasecmp(start,
+ lwc_string_data(value),
+ vlen) == 0) {
+ *match = true;
+ break;
}
- xmlFree(attr);
+ start = p + 1;
}
}
+ dom_string_unref(atr_val);
+
return CSS_OK;
}