nserror html_css_new_selection_context(html_content *c, css_select_ctx **ret_select_ctx) { uint32_t i; css_error css_ret; css_select_ctx *select_ctx; /* check that the base stylesheet loaded; layout fails without it */ if (c->stylesheets[STYLESHEET_BASE].sheet == NULL) { return NSERROR_CSS_BASE; } /* Create selection context */ css_ret = css_select_ctx_create(&select_ctx); if (css_ret != CSS_OK) { return css_error_to_nserror(css_ret); } /* Add sheets to it */ for (i = STYLESHEET_BASE; i != c->stylesheet_count; i++) { const struct html_stylesheet *hsheet = &c->stylesheets[i]; css_stylesheet *sheet = NULL; css_origin origin = CSS_ORIGIN_AUTHOR; if (i < STYLESHEET_USER) { origin = CSS_ORIGIN_UA; } else if (i < STYLESHEET_START) { origin = CSS_ORIGIN_USER; } if (hsheet->sheet != NULL) { sheet = nscss_get_stylesheet(hsheet->sheet); } if (sheet != NULL) { css_ret = css_select_ctx_append_sheet(select_ctx, sheet, origin, CSS_MEDIA_SCREEN); if (css_ret != CSS_OK) { css_select_ctx_destroy(select_ctx); return css_error_to_nserror(css_ret); } } } /* return new selection context to caller */ *ret_select_ctx = select_ctx; return NSERROR_OK; }
void run_test(line_ctx *ctx, const char *exp, size_t explen) { css_select_ctx *select; css_select_results *results; uint32_t i; char *buf; size_t buflen; static int testnum; UNUSED(exp); buf = malloc(8192); if (buf == NULL) { assert(0 && "No memory for result data"); } buflen = 8192; assert(css_select_ctx_create(&select) == CSS_OK); for (i = 0; i < ctx->n_sheets; i++) { assert(css_select_ctx_append_sheet(select, ctx->sheets[i].sheet, ctx->sheets[i].origin, ctx->sheets[i].media) == CSS_OK); } testnum++; assert(css_select_style(select, ctx->target, ctx->media, NULL, &select_handler, ctx, &results) == CSS_OK); assert(results->styles[ctx->pseudo_element] != NULL); dump_computed_style(results->styles[ctx->pseudo_element], buf, &buflen); if (8192 - buflen != explen || memcmp(buf, exp, explen) != 0) { printf("Expected (%u):\n%.*s\n", (int) explen, (int) explen, exp); printf("Result (%u):\n%.*s\n", (int) (8192 - buflen), (int) (8192 - buflen), buf); assert(0 && "Result doesn't match expected"); } /* Clean up */ css_select_results_destroy(results); css_select_ctx_destroy(select); destroy_tree(ctx->tree); for (i = 0; i < ctx->n_sheets; i++) { css_stylesheet_destroy(ctx->sheets[i].sheet); } ctx->tree = NULL; ctx->current = NULL; ctx->depth = 0; ctx->n_sheets = 0; free(ctx->sheets); ctx->sheets = NULL; ctx->target = NULL; free(buf); printf("Test %d: PASS\n", testnum); }