diff options
Diffstat (limited to 'src/select/select.c')
-rw-r--r-- | src/select/select.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/src/select/select.c b/src/select/select.c index f7dc098..da0aa61 100644 --- a/src/select/select.c +++ b/src/select/select.c @@ -53,6 +53,8 @@ struct css_select_ctx { void *pw; /**< Client's private selection context */ + bool uses_revert; /**< A sheet used revert property value */ + css_select_strings str; /* Interned default style */ @@ -355,6 +357,8 @@ css_error css_select_ctx_insert_sheet(css_select_ctx *ctx, ctx->sheets[index].origin = origin; ctx->sheets[index].media = mq; + ctx->uses_revert |= sheet->uses_revert; + ctx->n_sheets++; return CSS_OK; @@ -1157,6 +1161,14 @@ static css_error css__select_revert_property_to_origin( { css_error error; + if (select_state->results->styles[pseudo] == NULL) { + return CSS_OK; + } + + if (select_state->revert[origin].style[pseudo] == NULL) { + return prop_dispatch[property].initial(select_state); + } + error = prop_dispatch[property].copy( select_state->revert[origin].style[pseudo], select_state->results->styles[pseudo]); @@ -1289,10 +1301,14 @@ css_error css_select_style(css_select_ctx *ctx, void *node, #endif /* Not sharing; need to select. */ - state.revert = calloc(CSS_ORIGIN_AUTHOR, sizeof(*state.revert)); - if (state.revert == NULL) { - error = CSS_NOMEM; - goto cleanup; + if (ctx->uses_revert || + (inline_style != NULL && inline_style->uses_revert)) { + /* Need to track UA and USER origin styles for revert. */ + state.revert = calloc(CSS_ORIGIN_AUTHOR, sizeof(*state.revert)); + if (state.revert == NULL) { + error = CSS_NOMEM; + goto cleanup; + } } /* Base element style is guaranteed to exist @@ -1326,7 +1342,7 @@ css_error css_select_style(css_select_ctx *ctx, void *node, for (i = 0; i < ctx->n_sheets; i++) { const css_select_sheet s = ctx->sheets[i]; - if (s.origin != origin) { + if (state.revert != NULL && s.origin != origin) { for (j = 0; j < CSS_PSEUDO_ELEMENT_COUNT; j++) { if (state.results->styles[j] == NULL) { continue; |