summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2013-12-07 15:08:21 +0000
committerMichael Drake <tlsa@netsurf-browser.org>2013-12-07 15:08:21 +0000
commite3372335ec1628e1d6ef1a4fd63b11bb47f2e0e6 (patch)
tree288253f6dc28adca29b197dd450be4ba7b1631bc
parent8af91a420df85e25f2b80c489154cb3df448e2e4 (diff)
downloadlibcss-e3372335ec1628e1d6ef1a4fd63b11bb47f2e0e6.tar.gz
libcss-e3372335ec1628e1d6ef1a4fd63b11bb47f2e0e6.tar.bz2
Just match against universal string intern instead of checking strings length/data.
-rw-r--r--src/select/hash.c17
-rw-r--r--src/select/hash.h3
-rw-r--r--src/select/select.c1
3 files changed, 13 insertions, 8 deletions
diff --git a/src/select/hash.c b/src/select/hash.c
index ee91fc2..79c324b 100644
--- a/src/select/hash.c
+++ b/src/select/hash.c
@@ -95,10 +95,9 @@ static css_error _iterate_universal(
* \return true iff chain head doesn't fail to match element name
*/
static inline bool _chain_good_for_element_name(const css_selector *selector,
- const css_qname *qname)
+ const css_qname *qname, const lwc_string *uni)
{
- if (lwc_string_length(selector->data.qname.name) != 1 ||
- lwc_string_data(selector->data.qname.name)[0] != '*') {
+ if (selector->data.qname.name != uni) {
bool match;
if (lwc_string_caseless_isequal(
selector->data.qname.name, qname->name,
@@ -486,7 +485,8 @@ css_error css__selector_hash_find_by_class(css_selector_hash *hash,
req->node_bloom) &&
_chain_good_for_element_name(
head->sel,
- &(req->qname)) &&
+ &(req->qname),
+ req->uni) &&
_rule_good_for_media(
head->sel->rule,
req->media)) {
@@ -565,7 +565,8 @@ css_error css__selector_hash_find_by_id(css_selector_hash *hash,
req->node_bloom) &&
_chain_good_for_element_name(
head->sel,
- &req->qname) &&
+ &req->qname,
+ req->uni) &&
_rule_good_for_media(
head->sel->rule,
req->media)) {
@@ -1018,7 +1019,8 @@ css_error _iterate_classes(
req->node_bloom) &&
_chain_good_for_element_name(
head->sel,
- &(req->qname)) &&
+ &(req->qname),
+ req->uni) &&
_rule_good_for_media(
head->sel->rule,
req->media)) {
@@ -1078,7 +1080,8 @@ css_error _iterate_ids(
req->node_bloom) &&
_chain_good_for_element_name(
head->sel,
- &req->qname) &&
+ &req->qname,
+ req->uni) &&
_rule_good_for_media(
head->sel->rule,
req->media)) {
diff --git a/src/select/hash.h b/src/select/hash.h
index 2217cbd..f572048 100644
--- a/src/select/hash.h
+++ b/src/select/hash.h
@@ -20,9 +20,10 @@ struct css_selector;
typedef struct css_selector_hash css_selector_hash;
struct css_hash_selection_requirments {
- css_qname qname; /* Element name, or universal '*' */
+ css_qname qname; /* Element name, or universal "*" */
lwc_string *class; /* Name of class, or NULL */
lwc_string *id; /* Name of id, or NULL */
+ lwc_string *uni; /* Universal element string "*" */
uint64_t media; /* Media type(s) we're selecting for */
const css_bloom *node_bloom; /* Node's bloom filter */
};
diff --git a/src/select/select.c b/src/select/select.c
index cfafe32..c8567f8 100644
--- a/src/select/select.c
+++ b/src/select/select.c
@@ -1355,6 +1355,7 @@ css_error match_selectors_in_sheet(css_select_ctx *ctx,
/* Set up general selector chain requirments */
req.media = state->media;
req.node_bloom = state->bloom;
+ req.uni = ctx->universal;
/* Find hash chain that applies to current node */
req.qname = state->element;