static void run_test_select_tree(css_select_ctx *select, node *node, line_ctx *ctx, char *buf, size_t *buflen) { css_select_results *sr; struct node *n = NULL; assert(css_select_style(select, node, ctx->media, NULL, &select_handler, ctx, &sr) == CSS_OK); if (node->parent != NULL) { css_computed_style *composed; assert(css_computed_style_compose( node->parent->sr->styles[ctx->pseudo_element], sr->styles[ctx->pseudo_element], compute_font_size, NULL, &composed) == CSS_OK); css_computed_style_destroy(sr->styles[ctx->pseudo_element]); sr->styles[ctx->pseudo_element] = composed; } node->sr = sr; if (node == ctx->target) { dump_computed_style(sr->styles[ctx->pseudo_element], buf, buflen); } for (n = node->children; n != NULL; n = n->next) { run_test_select_tree(select, n, ctx, buf, buflen); } }
/** * Get a blank style * * \param ctx CSS selection context * \param parent Parent style to cascade inherited properties from * \return Pointer to blank style, or NULL on failure */ css_computed_style *nscss_get_blank_style(nscss_select_ctx *ctx, const css_computed_style *parent) { css_computed_style *partial, *composed; css_error error; error = css_select_default_style(ctx->ctx, &selection_handler, ctx, &partial); if (error != CSS_OK) { return NULL; } /* TODO: Do we really need to compose? Initial style shouldn't * have any inherited properties. */ error = css_computed_style_compose(parent, partial, nscss_compute_font_size, ctx, &composed); css_computed_style_destroy(partial); if (error != CSS_OK) { css_computed_style_destroy(composed); return NULL; } return composed; }
/** * Get style selection results for an element * * \param ctx CSS selection context * \param n Element to select for * \param media Permitted media types * \param inline_style Inline style associated with element, or NULL * \return Pointer to selection results (containing computed styles), * or NULL on failure */ css_select_results *nscss_get_style(nscss_select_ctx *ctx, dom_node *n, uint64_t media, const css_stylesheet *inline_style) { css_computed_style *composed; css_select_results *styles; int pseudo_element; css_error error; /* Select style for node */ error = css_select_style(ctx->ctx, n, media, inline_style, &selection_handler, ctx, &styles); if (error != CSS_OK || styles == NULL) { /* Failed selecting partial style -- bail out */ return NULL; } /* If there's a parent style, compose with partial to obtain * complete computed style for element */ if (ctx->parent_style != NULL) { /* Complete the computed style, by composing with the parent * element's style */ error = css_computed_style_compose(ctx->parent_style, styles->styles[CSS_PSEUDO_ELEMENT_NONE], nscss_compute_font_size, ctx, &composed); if (error != CSS_OK) { css_select_results_destroy(styles); return NULL; } /* Replace select_results style with composed style */ css_computed_style_destroy( styles->styles[CSS_PSEUDO_ELEMENT_NONE]); styles->styles[CSS_PSEUDO_ELEMENT_NONE] = composed; } for (pseudo_element = CSS_PSEUDO_ELEMENT_NONE + 1; pseudo_element < CSS_PSEUDO_ELEMENT_COUNT; pseudo_element++) { if (pseudo_element == CSS_PSEUDO_ELEMENT_FIRST_LETTER || pseudo_element == CSS_PSEUDO_ELEMENT_FIRST_LINE) /* TODO: Handle first-line and first-letter pseudo * element computed style completion */ continue; if (styles->styles[pseudo_element] == NULL) /* There were no rules concerning this pseudo element */ continue; /* Complete the pseudo element's computed style, by composing * with the base element's style */ error = css_computed_style_compose( styles->styles[CSS_PSEUDO_ELEMENT_NONE], styles->styles[pseudo_element], nscss_compute_font_size, ctx, &composed); if (error != CSS_OK) { /* TODO: perhaps this shouldn't be quite so * catastrophic? */ css_select_results_destroy(styles); return NULL; } /* Replace select_results style with composed style */ css_computed_style_destroy(styles->styles[pseudo_element]); styles->styles[pseudo_element] = composed; } return styles; }