summaryrefslogtreecommitdiff
path: root/src/select
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2011-03-12 17:16:31 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2011-03-12 17:16:31 +0000
commitbcb95bf5fa2c5cfd2e7c80f211f7fd6db6ce2f9a (patch)
tree74dbe0550203d2267ffab4641d834b435c420353 /src/select
parentfeb0de14741e709472952abf5f7101a28a377c07 (diff)
downloadlibcss-bcb95bf5fa2c5cfd2e7c80f211f7fd6db6ce2f9a.tar.gz
libcss-bcb95bf5fa2c5cfd2e7c80f211f7fd6db6ce2f9a.tar.bz2
CSS3 Namespaces
svn path=/trunk/libcss/; revision=11972
Diffstat (limited to 'src/select')
-rw-r--r--src/select/hash.c31
-rw-r--r--src/select/hash.h2
-rw-r--r--src/select/select.c104
3 files changed, 70 insertions, 67 deletions
diff --git a/src/select/hash.c b/src/select/hash.c
index 43a696f..e6c6cf8 100644
--- a/src/select/hash.c
+++ b/src/select/hash.c
@@ -202,11 +202,11 @@ css_error css__selector_hash_insert(css_selector_hash *hash,
return CSS_BADPARM;
/* Work out which hash to insert into */
- if (lwc_string_length(selector->data.name) != 1 ||
- lwc_string_data(selector->data.name)[0] != '*') {
+ if (lwc_string_length(selector->data.qname.name) != 1 ||
+ lwc_string_data(selector->data.qname.name)[0] != '*') {
/* Named element */
mask = hash->elements.n_slots - 1;
- index = _hash_name(selector->data.name) & mask;
+ index = _hash_name(selector->data.qname.name) & mask;
error = _insert_into_chain(hash, &hash->elements.slots[index],
selector);
@@ -250,11 +250,11 @@ css_error css__selector_hash_remove(css_selector_hash *hash,
return CSS_BADPARM;
/* Work out which hash to insert into */
- if (lwc_string_length(selector->data.name) != 1 ||
- lwc_string_data(selector->data.name)[0] != '*') {
+ if (lwc_string_length(selector->data.qname.name) != 1 ||
+ lwc_string_data(selector->data.qname.name)[0] != '*') {
/* Named element */
mask = hash->elements.n_slots - 1;
- index = _hash_name(selector->data.name) & mask;
+ index = _hash_name(selector->data.qname.name) & mask;
error = _remove_from_chain(hash, &hash->elements.slots[index],
selector);
@@ -284,7 +284,7 @@ css_error css__selector_hash_remove(css_selector_hash *hash,
* Find the first selector that matches name
*
* \param hash Hash to search
- * \param name Name to match
+ * \param qname Qualified name to match
* \param iterator Pointer to location to receive iterator function
* \param matched Pointer to location to receive selector
* \return CSS_OK on success, appropriate error otherwise
@@ -292,19 +292,19 @@ css_error css__selector_hash_remove(css_selector_hash *hash,
* If nothing matches, CSS_OK will be returned and **matched == NULL
*/
css_error css__selector_hash_find(css_selector_hash *hash,
- lwc_string *name,
+ css_qname *qname,
css_selector_hash_iterator *iterator,
const css_selector ***matched)
{
uint32_t index, mask;
hash_entry *head;
- if (hash == NULL || name == NULL || iterator == NULL || matched == NULL)
+ if (hash == NULL || qname == NULL || iterator == NULL || matched == NULL)
return CSS_BADPARM;
/* Find index */
mask = hash->elements.n_slots - 1;
- index = _hash_name(name) & mask;
+ index = _hash_name(qname->name) & mask;
head = &hash->elements.slots[index];
@@ -315,7 +315,8 @@ css_error css__selector_hash_find(css_selector_hash *hash,
bool match = false;
lerror = lwc_string_caseless_isequal(
- name, head->sel->data.name, &match);
+ qname->name, head->sel->data.qname.name,
+ &match);
if (lerror != lwc_error_ok)
return css_error_from_lwc_error(lerror);
@@ -538,7 +539,7 @@ lwc_string *_class_name(const css_selector *selector)
do {
/* Ignore :not(.class) */
if (detail->type == CSS_SELECTOR_CLASS && detail->negate == 0) {
- name = detail->name;
+ name = detail->qname.name;
break;
}
@@ -565,7 +566,7 @@ lwc_string *_id_name(const css_selector *selector)
do {
/* Ignore :not(#id) */
if (detail->type == CSS_SELECTOR_ID && detail->negate == 0) {
- name = detail->name;
+ name = detail->qname.name;
break;
}
@@ -701,7 +702,7 @@ css_error _iterate_elements(css_selector_hash *hash,
if (hash == NULL || current == NULL || next == NULL)
return CSS_BADPARM;
- name = head->sel->data.name;
+ name = head->sel->data.qname.name;
/* Look for the next selector that matches the key */
for (head = head->next; head != NULL; head = head->next) {
@@ -709,7 +710,7 @@ css_error _iterate_elements(css_selector_hash *hash,
bool match = false;
lerror = lwc_string_caseless_isequal(
- name, head->sel->data.name, &match);
+ name, head->sel->data.qname.name, &match);
if (lerror != lwc_error_ok)
return css_error_from_lwc_error(lerror);
diff --git a/src/select/hash.h b/src/select/hash.h
index c8a3d36..6b55950 100644
--- a/src/select/hash.h
+++ b/src/select/hash.h
@@ -32,7 +32,7 @@ css_error css__selector_hash_remove(css_selector_hash *hash,
const struct css_selector *selector);
css_error css__selector_hash_find(css_selector_hash *hash,
- lwc_string *name,
+ css_qname *qname,
css_selector_hash_iterator *iterator,
const struct css_selector ***matched);
css_error css__selector_hash_find_by_class(css_selector_hash *hash,
diff --git a/src/select/select.c b/src/select/select.c
index ee1ad47..e2b55ee 100644
--- a/src/select/select.c
+++ b/src/select/select.c
@@ -929,7 +929,7 @@ css_error match_selectors_in_sheet(css_select_ctx *ctx,
const css_stylesheet *sheet, css_select_state *state)
{
static const css_selector *empty_selector = NULL;
- lwc_string *element = NULL;
+ css_qname element = { NULL, NULL };
lwc_string *id = NULL;
lwc_string **classes = NULL;
uint32_t n_classes = 0, i = 0;
@@ -965,7 +965,7 @@ css_error match_selectors_in_sheet(css_select_ctx *ctx,
goto cleanup;
/* Find hash chain that applies to current node */
- error = css__selector_hash_find(sheet->selectors, element,
+ error = css__selector_hash_find(sheet->selectors, &element,
&node_iterator, &node_selectors);
if (error != CSS_OK)
goto cleanup;
@@ -1081,7 +1081,10 @@ cleanup:
if (id != NULL)
lwc_string_unref(id);
- lwc_string_unref(element);
+ if (element.ns != NULL)
+ lwc_string_unref(element.ns);
+ lwc_string_unref(element.name);
+
return error;
}
@@ -1122,7 +1125,8 @@ css_error match_selector_chain(css_select_ctx *ctx,
/* Consider any combinator on this selector */
if (s->data.comb != CSS_COMBINATOR_NONE &&
- s->combinator->data.name != state->universal) {
+ s->combinator->data.qname.name !=
+ state->universal) {
/* Named combinator */
error = match_named_combinator(ctx, s->data.comb,
s->combinator, state, node, &next_node);
@@ -1133,7 +1137,8 @@ css_error match_selector_chain(css_select_ctx *ctx,
if (next_node == NULL)
return CSS_OK;
} else if (s->data.comb != CSS_COMBINATOR_NONE &&
- s->combinator->data.name == state->universal) {
+ s->combinator->data.qname.name ==
+ state->universal) {
/* Universal combinator */
error = match_universal_combinator(ctx, s->data.comb,
s->combinator, state, node, &next_node);
@@ -1187,25 +1192,26 @@ css_error match_named_combinator(css_select_ctx *ctx, css_combinator type,
switch (type) {
case CSS_COMBINATOR_ANCESTOR:
error = state->handler->named_ancestor_node(state->pw,
- n, selector->data.name, &n);
+ n, &selector->data.qname, &n);
if (error != CSS_OK)
return error;
break;
case CSS_COMBINATOR_PARENT:
error = state->handler->named_parent_node(state->pw,
- n, selector->data.name, &n);
+ n, &selector->data.qname, &n);
if (error != CSS_OK)
return error;
break;
case CSS_COMBINATOR_SIBLING:
error = state->handler->named_sibling_node(state->pw,
- n, selector->data.name, &n);
+ n, &selector->data.qname, &n);
if (error != CSS_OK)
return error;
break;
case CSS_COMBINATOR_GENERIC_SIBLING:
error = state->handler->named_generic_sibling_node(
- state->pw, n, selector->data.name, &n);
+ state->pw, n, &selector->data.qname,
+ &n);
if (error != CSS_OK)
return error;
case CSS_COMBINATOR_NONE:
@@ -1358,28 +1364,24 @@ css_error match_detail(css_select_ctx *ctx, void *node,
switch (detail->type) {
case CSS_SELECTOR_ELEMENT:
- if (lwc_string_length(detail->name) == 1 &&
- lwc_string_data(detail->name)[0] == '*') {
- *match = true;
- } else {
- error = state->handler->node_has_name(state->pw, node,
- detail->name, match);
- }
+ error = state->handler->node_has_name(state->pw, node,
+ &detail->qname, match);
break;
case CSS_SELECTOR_CLASS:
error = state->handler->node_has_class(state->pw, node,
- detail->name, match);
+ detail->qname.name, match);
break;
case CSS_SELECTOR_ID:
error = state->handler->node_has_id(state->pw, node,
- detail->name, match);
+ detail->qname.name, match);
break;
case CSS_SELECTOR_PSEUDO_CLASS:
error = state->handler->node_is_root(state->pw, node, &is_root);
if (error != CSS_OK)
return error;
- if (is_root == false && detail->name == state->first_child) {
+ if (is_root == false &&
+ detail->qname.name == state->first_child) {
int32_t num_before = 0;
error = state->handler->node_count_siblings(state->pw,
@@ -1387,7 +1389,7 @@ css_error match_detail(css_select_ctx *ctx, void *node,
if (error == CSS_OK)
*match = (num_before == 0);
} else if (is_root == false &&
- detail->name == state->nth_child) {
+ detail->qname.name == state->nth_child) {
int32_t num_before = 0;
error = state->handler->node_count_siblings(state->pw,
@@ -1399,7 +1401,7 @@ css_error match_detail(css_select_ctx *ctx, void *node,
*match = match_nth(a, b, num_before + 1);
}
} else if (is_root == false &&
- detail->name == state->nth_last_child) {
+ detail->qname.name == state->nth_last_child) {
int32_t num_after = 0;
error = state->handler->node_count_siblings(state->pw,
@@ -1411,7 +1413,7 @@ css_error match_detail(css_select_ctx *ctx, void *node,
*match = match_nth(a, b, num_after + 1);
}
} else if (is_root == false &&
- detail->name == state->nth_of_type) {
+ detail->qname.name == state->nth_of_type) {
int32_t num_before = 0;
error = state->handler->node_count_siblings(state->pw,
@@ -1423,7 +1425,7 @@ css_error match_detail(css_select_ctx *ctx, void *node,
*match = match_nth(a, b, num_before + 1);
}
} else if (is_root == false &&
- detail->name == state->nth_last_of_type) {
+ detail->qname.name == state->nth_last_of_type) {
int32_t num_after = 0;
error = state->handler->node_count_siblings(state->pw,
@@ -1435,7 +1437,7 @@ css_error match_detail(css_select_ctx *ctx, void *node,
*match = match_nth(a, b, num_after + 1);
}
} else if (is_root == false &&
- detail->name == state->last_child) {
+ detail->qname.name == state->last_child) {
int32_t num_after = 0;
error = state->handler->node_count_siblings(state->pw,
@@ -1443,7 +1445,7 @@ css_error match_detail(css_select_ctx *ctx, void *node,
if (error == CSS_OK)
*match = (num_after == 0);
} else if (is_root == false &&
- detail->name == state->first_of_type) {
+ detail->qname.name == state->first_of_type) {
int32_t num_before = 0;
error = state->handler->node_count_siblings(state->pw,
@@ -1451,7 +1453,7 @@ css_error match_detail(css_select_ctx *ctx, void *node,
if (error == CSS_OK)
*match = (num_before == 0);
} else if (is_root == false &&
- detail->name == state->last_of_type) {
+ detail->qname.name == state->last_of_type) {
int32_t num_after = 0;
error = state->handler->node_count_siblings(state->pw,
@@ -1459,7 +1461,7 @@ css_error match_detail(css_select_ctx *ctx, void *node,
if (error == CSS_OK)
*match = (num_after == 0);
} else if (is_root == false &&
- detail->name == state->only_child) {
+ detail->qname.name == state->only_child) {
int32_t num_before = 0, num_after = 0;
error = state->handler->node_count_siblings(state->pw,
@@ -1473,7 +1475,7 @@ css_error match_detail(css_select_ctx *ctx, void *node,
(num_after == 0);
}
} else if (is_root == false &&
- detail->name == state->only_of_type) {
+ detail->qname.name == state->only_of_type) {
int32_t num_before = 0, num_after = 0;
error = state->handler->node_count_siblings(state->pw,
@@ -1486,39 +1488,39 @@ css_error match_detail(css_select_ctx *ctx, void *node,
*match = (num_before == 0) &&
(num_after == 0);
}
- } else if (detail->name == state->root) {
+ } else if (detail->qname.name == state->root) {
*match = is_root;
- } else if (detail->name == state->empty) {
+ } else if (detail->qname.name == state->empty) {
error = state->handler->node_is_empty(state->pw,
node, match);
- } else if (detail->name == state->link) {
+ } else if (detail->qname.name == state->link) {
error = state->handler->node_is_link(state->pw,
node, match);
- } else if (detail->name == state->visited) {
+ } else if (detail->qname.name == state->visited) {
error = state->handler->node_is_visited(state->pw,
node, match);
- } else if (detail->name == state->hover) {
+ } else if (detail->qname.name == state->hover) {
error = state->handler->node_is_hover(state->pw,
node, match);
- } else if (detail->name == state->active) {
+ } else if (detail->qname.name == state->active) {
error = state->handler->node_is_active(state->pw,
node, match);
- } else if (detail->name == state->focus) {
+ } else if (detail->qname.name == state->focus) {
error = state->handler->node_is_focus(state->pw,
node, match);
- } else if (detail->name == state->target) {
+ } else if (detail->qname.name == state->target) {
error = state->handler->node_is_target(state->pw,
node, match);
- } else if (detail->name == state->lang) {
+ } else if (detail->qname.name == state->lang) {
error = state->handler->node_is_lang(state->pw,
node, detail->value.string, match);
- } else if (detail->name == state->enabled) {
+ } else if (detail->qname.name == state->enabled) {
error = state->handler->node_is_enabled(state->pw,
node, match);
- } else if (detail->name == state->disabled) {
+ } else if (detail->qname.name == state->disabled) {
error = state->handler->node_is_disabled(state->pw,
node, match);
- } else if (detail->name == state->checked) {
+ } else if (detail->qname.name == state->checked) {
error = state->handler->node_is_checked(state->pw,
node, match);
} else
@@ -1527,49 +1529,49 @@ css_error match_detail(css_select_ctx *ctx, void *node,
case CSS_SELECTOR_PSEUDO_ELEMENT:
*match = true;
- if (detail->name == state->first_line) {
+ if (detail->qname.name == state->first_line) {
*pseudo_element = CSS_PSEUDO_ELEMENT_FIRST_LINE;
- } else if (detail->name == state->first_letter) {
+ } else if (detail->qname.name == state->first_letter) {
*pseudo_element = CSS_PSEUDO_ELEMENT_FIRST_LETTER;
- } else if (detail->name == state->before) {
+ } else if (detail->qname.name == state->before) {
*pseudo_element = CSS_PSEUDO_ELEMENT_BEFORE;
- } else if (detail->name == state->after) {
+ } else if (detail->qname.name == state->after) {
*pseudo_element = CSS_PSEUDO_ELEMENT_AFTER;
} else
*match = false;
break;
case CSS_SELECTOR_ATTRIBUTE:
error = state->handler->node_has_attribute(state->pw, node,
- detail->name, match);
+ &detail->qname, match);
break;
case CSS_SELECTOR_ATTRIBUTE_EQUAL:
error = state->handler->node_has_attribute_equal(state->pw,
- node, detail->name, detail->value.string,
+ node, &detail->qname, detail->value.string,
match);
break;
case CSS_SELECTOR_ATTRIBUTE_DASHMATCH:
error = state->handler->node_has_attribute_dashmatch(state->pw,
- node, detail->name, detail->value.string,
+ node, &detail->qname, detail->value.string,
match);
break;
case CSS_SELECTOR_ATTRIBUTE_INCLUDES:
error = state->handler->node_has_attribute_includes(state->pw,
- node, detail->name, detail->value.string,
+ node, &detail->qname, detail->value.string,
match);
break;
case CSS_SELECTOR_ATTRIBUTE_PREFIX:
error = state->handler->node_has_attribute_prefix(state->pw,
- node, detail->name, detail->value.string,
+ node, &detail->qname, detail->value.string,
match);
break;
case CSS_SELECTOR_ATTRIBUTE_SUFFIX:
error = state->handler->node_has_attribute_suffix(state->pw,
- node, detail->name, detail->value.string,
+ node, &detail->qname, detail->value.string,
match);
break;
case CSS_SELECTOR_ATTRIBUTE_SUBSTRING:
error = state->handler->node_has_attribute_substring(state->pw,
- node, detail->name, detail->value.string,
+ node, &detail->qname, detail->value.string,
match);
break;
}