diff options
-rw-r--r-- | include/libcss/select.h | 1 | ||||
-rw-r--r-- | include/libcss/stylesheet.h | 3 | ||||
-rw-r--r-- | src/parse/language.c | 11 | ||||
-rw-r--r-- | src/parse/parse.c | 409 | ||||
-rw-r--r-- | src/parse/parse.h | 3 | ||||
-rw-r--r-- | src/select/select.c | 25 | ||||
-rw-r--r-- | src/stylesheet.c | 29 | ||||
-rw-r--r-- | src/stylesheet.h | 2 | ||||
-rw-r--r-- | test/css21.c | 6 | ||||
-rw-r--r-- | test/parse-auto.c | 6 | ||||
-rw-r--r-- | test/parse2-auto.c | 2 | ||||
-rw-r--r-- | test/select-auto.c | 7 |
12 files changed, 397 insertions, 107 deletions
diff --git a/include/libcss/select.h b/include/libcss/select.h index ea67d25..3cdaf3c 100644 --- a/include/libcss/select.h +++ b/include/libcss/select.h @@ -83,6 +83,7 @@ css_error css_select_ctx_get_sheet(css_select_ctx *ctx, uint32_t index, css_error css_select_style(css_select_ctx *ctx, void *node, uint32_t pseudo_element, uint64_t media, + const css_stylesheet *inline_style, css_computed_style *result, css_select_handler *handler, void *pw); diff --git a/include/libcss/stylesheet.h b/include/libcss/stylesheet.h index 3ce25d5..df95e17 100644 --- a/include/libcss/stylesheet.h +++ b/include/libcss/stylesheet.h @@ -14,7 +14,8 @@ css_error css_stylesheet_create(css_language_level level, const char *charset, const char *url, const char *title, css_origin origin, uint64_t media, bool allow_quirks, - lwc_context *dict, css_allocator_fn alloc, void *alloc_pw, + bool inline_style, lwc_context *dict, + css_allocator_fn alloc, void *alloc_pw, css_stylesheet **stylesheet); css_error css_stylesheet_destroy(css_stylesheet *sheet); diff --git a/src/parse/language.c b/src/parse/language.c index f4ba3ee..7054130 100644 --- a/src/parse/language.c +++ b/src/parse/language.c @@ -287,10 +287,13 @@ css_error handleStartRuleset(css_language *c, const parserutils_vector *vector) if (error != CSS_OK) return error; - error = parseSelectorList(c, vector, rule); - if (error != CSS_OK) { - css_stylesheet_rule_destroy(c->sheet, rule); - return error; + if (vector != NULL) { + /* Parse selectors, if there are any */ + error = parseSelectorList(c, vector, rule); + if (error != CSS_OK) { + css_stylesheet_rule_destroy(c->sheet, rule); + return error; + } } entry.data = rule; diff --git a/src/parse/parse.c b/src/parse/parse.c index d2b9fe6..15e3020 100644 --- a/src/parse/parse.c +++ b/src/parse/parse.c @@ -22,7 +22,7 @@ #include "utils/utils.h" #undef DEBUG_STACK -#undef DEBUG_EVENTS +#define DEBUG_EVENTS /** \todo The CSSOM expects us to preserve unknown rules. We currently discard * all of their content, so the higher levels never see them. */ @@ -67,7 +67,10 @@ enum { sAny = 19, sMalformedDecl = 20, sMalformedSelector = 21, - sMalformedAtRule = 22 + sMalformedAtRule = 22, + sInlineStyle = 23, + sISBody0 = 24, + sISBody = 25 }; /** @@ -112,6 +115,11 @@ struct css_parser void *pw; /**< Client-specific private data */ }; +static css_error css_parser_create_internal(const char *charset, + css_charset_source cs_source, lwc_context *dictionary, + css_allocator_fn alloc, void *pw, parser_state initial, + css_parser **parser); + static inline css_error transition(css_parser *parser, parser_state to, parser_state subsequent); static inline css_error transitionNoRet(css_parser *parser, parser_state to); @@ -144,6 +152,9 @@ static inline css_error parseAny(css_parser *parser); static inline css_error parseMalformedDeclaration(css_parser *parser); static inline css_error parseMalformedSelector(css_parser *parser); static inline css_error parseMalformedAtRule(css_parser *parser); +static inline css_error parseInlineStyle(css_parser *parser); +static inline css_error parseISBody0(css_parser *parser); +static inline css_error parseISBody(css_parser *parser); static inline void unref_interned_strings_in_tokens(css_parser *parser); @@ -173,7 +184,10 @@ static css_error (*parseFuncs[])(css_parser *parser) = { parseAny, parseMalformedDeclaration, parseMalformedSelector, - parseMalformedAtRule + parseMalformedAtRule, + parseInlineStyle, + parseISBody0, + parseISBody }; /** @@ -193,92 +207,33 @@ css_error css_parser_create(const char *charset, css_charset_source cs_source, lwc_context *dictionary, css_allocator_fn alloc, void *pw, css_parser **parser) { - css_parser *p; parser_state initial = { sStart, 0 }; - parserutils_error perror; - css_error error; - - if (alloc == NULL || parser == NULL) - return CSS_BADPARM; - - p = alloc(NULL, sizeof(css_parser), pw); - if (p == NULL) - return CSS_NOMEM; - perror = parserutils_inputstream_create(charset, cs_source, - css_charset_extract, (parserutils_alloc) alloc, pw, - &p->stream); - if (perror != PARSERUTILS_OK) { - alloc(p, 0, pw); - return css_error_from_parserutils_error(perror); - } - - error = css_lexer_create(p->stream, alloc, pw, &p->lexer); - if (error != CSS_OK) { - parserutils_inputstream_destroy(p->stream); - alloc(p, 0, pw); - return error; - } - - perror = parserutils_stack_create(sizeof(parser_state), - STACK_CHUNK, (parserutils_alloc) alloc, pw, - &p->states); - if (perror != PARSERUTILS_OK) { - css_lexer_destroy(p->lexer); - parserutils_inputstream_destroy(p->stream); - alloc(p, 0, pw); - return css_error_from_parserutils_error(perror); - } - - p->dictionary = dictionary; - - perror = parserutils_vector_create(sizeof(css_token), - STACK_CHUNK, (parserutils_alloc) alloc, pw, - &p->tokens); - if (perror != PARSERUTILS_OK) { - parserutils_stack_destroy(p->states); - css_lexer_destroy(p->lexer); - parserutils_inputstream_destroy(p->stream); - alloc(p, 0, pw); - return css_error_from_parserutils_error(perror); - } - - perror = parserutils_stack_create(sizeof(char), - STACK_CHUNK, (parserutils_alloc) alloc, pw, - &p->open_items); - if (perror != PARSERUTILS_OK) { - parserutils_vector_destroy(p->tokens); - parserutils_stack_destroy(p->states); - css_lexer_destroy(p->lexer); - parserutils_inputstream_destroy(p->stream); - alloc(p, 0, pw); - return css_error_from_parserutils_error(perror); - } - - perror = parserutils_stack_push(p->states, (void *) &initial); - if (perror != PARSERUTILS_OK) { - parserutils_stack_destroy(p->open_items); - parserutils_vector_destroy(p->tokens); - parserutils_stack_destroy(p->states); - css_lexer_destroy(p->lexer); - parserutils_inputstream_destroy(p->stream); - alloc(p, 0, pw); - return css_error_from_parserutils_error(perror); - } - - p->quirks = false; - p->pushback = NULL; - p->parseError = false; - p->match_char = 0; - p->event = NULL; - p->last_was_ws = false; - p->event_pw = NULL; - p->alloc = alloc; - p->pw = pw; + return css_parser_create_internal(charset, cs_source, dictionary, + alloc, pw, initial, parser); +} - *parser = p; +/** + * Create a CSS parser for an inline style + * + * \param charset Charset of data, if known, or NULL + * \param cs_source Source of charset information, or CSS_CHARSET_DEFAULT + * \param dictionary Dictionary in which to intern strings (not copied) + * \param alloc Memory (de)allocation function + * \param pw Pointer to client-specific private data + * \param parser Pointer to location to receive parser instance + * \return CSS_OK on success, + * CSS_BADPARM on bad parameters, + * CSS_NOMEM on memory exhaustion + */ +css_error css_parser_create_for_inline_style(const char *charset, + css_charset_source cs_source, lwc_context *dictionary, + css_allocator_fn alloc, void *pw, css_parser **parser) +{ + parser_state initial = { sInlineStyle, 0 }; - return CSS_OK; + return css_parser_create_internal(charset, cs_source, dictionary, + alloc, pw, initial, parser); } /** @@ -427,6 +382,116 @@ bool css_parser_quirks_permitted(css_parser *parser) } /****************************************************************************** + * Parser creation helper * + ******************************************************************************/ + +/** + * Create a CSS parser (internal) + * + * \param charset Charset of data, if known, or NULL + * \param cs_source Source of charset information, or CSS_CHARSET_DEFAULT + * \param dictionary Dictionary in which to intern strings (not copied) + * \param alloc Memory (de)allocation function + * \param pw Pointer to client-specific private data + * \param initial The required initial state of the parser + * \param parser Pointer to location to receive parser instance + * \return CSS_OK on success, + * CSS_BADPARM on bad parameters, + * CSS_NOMEM on memory exhaustion + */ +css_error css_parser_create_internal(const char *charset, + css_charset_source cs_source, lwc_context *dictionary, + css_allocator_fn alloc, void *pw, parser_state initial, + css_parser **parser) +{ + css_parser *p; + parserutils_error perror; + css_error error; + + if (alloc == NULL || parser == NULL) + return CSS_BADPARM; + + p = alloc(NULL, sizeof(css_parser), pw); + if (p == NULL) + return CSS_NOMEM; + + perror = parserutils_inputstream_create(charset, cs_source, + css_charset_extract, (parserutils_alloc) alloc, pw, + &p->stream); + if (perror != PARSERUTILS_OK) { + alloc(p, 0, pw); + return css_error_from_parserutils_error(perror); + } + + error = css_lexer_create(p->stream, alloc, pw, &p->lexer); + if (error != CSS_OK) { + parserutils_inputstream_destroy(p->stream); + alloc(p, 0, pw); + return error; + } + + perror = parserutils_stack_create(sizeof(parser_state), + STACK_CHUNK, (parserutils_alloc) alloc, pw, + &p->states); + if (perror != PARSERUTILS_OK) { + css_lexer_destroy(p->lexer); + parserutils_inputstream_destroy(p->stream); + alloc(p, 0, pw); + return css_error_from_parserutils_error(perror); + } + + p->dictionary = dictionary; + + perror = parserutils_vector_create(sizeof(css_token), + STACK_CHUNK, (parserutils_alloc) alloc, pw, + &p->tokens); + if (perror != PARSERUTILS_OK) { + parserutils_stack_destroy(p->states); + css_lexer_destroy(p->lexer); + parserutils_inputstream_destroy(p->stream); + alloc(p, 0, pw); + return css_error_from_parserutils_error(perror); + } + + perror = parserutils_stack_create(sizeof(char), + STACK_CHUNK, (parserutils_alloc) alloc, pw, + &p->open_items); + if (perror != PARSERUTILS_OK) { + parserutils_vector_destroy(p->tokens); + parserutils_stack_destroy(p->states); + css_lexer_destroy(p->lexer); + parserutils_inputstream_destroy(p->stream); + alloc(p, 0, pw); + return css_error_from_parserutils_error(perror); + } + + perror = parserutils_stack_push(p->states, (void *) &initial); + if (perror != PARSERUTILS_OK) { + parserutils_stack_destroy(p->open_items); + parserutils_vector_destroy(p->tokens); + parserutils_stack_destroy(p->states); + css_lexer_destroy(p->lexer); + parserutils_inputstream_destroy(p->stream); + alloc(p, 0, pw); + return css_error_from_parserutils_error(perror); + } + + p->quirks = false; + p->pushback = NULL; + p->parseError = false; + p->match_char = 0; + p->event = NULL; + p->last_was_ws = false; + p->event_pw = NULL; + p->alloc = alloc; + p->pw = pw; + + *parser = p; + + return CSS_OK; +} + +/****************************************************************************** * Helper functions * ******************************************************************************/ @@ -2318,6 +2383,180 @@ css_error parseMalformedAtRule(css_parser *parser) return done(parser); } +css_error parseInlineStyle(css_parser *parser) +{ + enum { Initial = 0, AfterISBody0 = 1 }; + parser_state *state = parserutils_stack_get_current(parser->states); + css_error error; + + /* inline-style = ws is-body0 */ + + switch (state->substate) { + case Initial: + { + parser_state to = { sISBody0, Initial }; + parser_state subsequent = { sInlineStyle, AfterISBody0 }; + + /* Emit fake events such that the language parser knows + * no different from a normal parse. */ + + if (parser->event != NULL) { + /* 1) begin stylesheet */ + parser->event(CSS_PARSER_START_STYLESHEET, NULL, + parser->event_pw); + + /* 2) begin ruleset */ + parser->event(CSS_PARSER_START_RULESET, NULL, + parser->event_pw); + } + + /* Consume leading whitespace */ + error = eatWS(parser); + if (error != CSS_OK) + return error; + + return transition(parser, to, subsequent); + } + case AfterISBody0: + /* Emit remaining fake events to end the parse */ + + if (parser->event != NULL) { + /* 1) end ruleset */ + parser->event(CSS_PARSER_END_RULESET, NULL, + parser->event_pw); + + /* 2) end stylesheet */ + parser->event(CSS_PARSER_END_STYLESHEET, NULL, + parser->event_pw); + } + + break; + } + + return done(parser); +} + +css_error parseISBody0(css_parser *parser) +{ + enum { Initial = 0, AfterISBody = 1 }; + parser_state *state = parserutils_stack_get_current(parser->states); + const css_token *token; + css_error error; + + /* is-body0 -> is-body is-body0 + * -> + */ + + while (1) { + switch (state->substate) { + case Initial: + { + parser_state to = { sISBody, Initial }; + parser_state subsequent = { sISBody0, AfterISBody }; + + error = getToken(parser, &token); + if (error != CSS_OK) + return error; + + error = pushBack(parser, token); + if (error != CSS_OK) + return error; + + /* EOF is the only way out */ + if (token->type == CSS_TOKEN_EOF) + return done(parser); + + return transition(parser, to, subsequent); + } + case AfterISBody: + /* Unless there's a parse error */ + if (parser->parseError) + return done(parser); + + state->substate = Initial; + + break; + } + } + + return done(parser); +} + +css_error parseISBody(css_parser *parser) +{ + enum { Initial = 0, DeclList = 1, Brace = 2, WS = 3 }; + parser_state *state = parserutils_stack_get_current(parser->states); + const css_token *token; + css_error error; + + /* is-body -> declaration decl-list '}' ws + * -> decl-list '}' ws + * + * Note that this looks suspiciously similar to ruleset-end. + * The difference here, however, is that we never end the ruleset. + */ + + switch (state->substate) { + case Initial: + error = getToken(parser, &token); + if (error != CSS_OK) + return error; + + error = pushBack(parser, token); + if (error != CSS_OK) + return error; + + /* If this can't possibly be the start of a decl-list, then + * attempt to parse a declaration. This will catch any invalid + * input at this point and read to the start of the next + * declaration. FIRST(decl-list) = (';', '}') */ + if (token->type != CSS_TOKEN_CHAR || + lwc_string_length(token->ilower) != 1 || + (lwc_string_data(token->ilower)[0] != '}' && + lwc_string_data(token->ilower)[0] != ';')) { + parser_state to = { sDeclaration, Initial }; + parser_state subsequent = { sISBody, DeclList }; + + return transition(parser, to, subsequent); + } + + state->substate = DeclList; + /* Fall through */ + case DeclList: + { + parser_state to = { sDeclList, Initial }; + parser_state subsequent = { sISBody, Brace }; + + return transition(parser, to, subsequent); + } + case Brace: + error = getToken(parser, &token); + if (error != CSS_OK) + return error; + + if (token->type == CSS_TOKEN_EOF) + break; + + if (token->type != CSS_TOKEN_CHAR || + lwc_string_length(token->ilower) != 1 || + lwc_string_data(token->ilower)[0] != '}') { + /* This should never happen, as FOLLOW(decl-list) + * contains only '}' */ + assert(0 && "Expected }"); + } + + state->substate = WS; + /* Fall through */ + case WS: + error = eatWS(parser); + if (error != CSS_OK) + return error; + + break; + } + + return done(parser); +} /** * Iterate the token vector and unref any interned strings in the tokens. diff --git a/src/parse/parse.h b/src/parse/parse.h index c590858..269ce29 100644 --- a/src/parse/parse.h +++ b/src/parse/parse.h @@ -60,6 +60,9 @@ typedef union css_parser_optparams { css_error css_parser_create(const char *charset, css_charset_source cs_source, lwc_context *dict, css_allocator_fn alloc, void *pw, css_parser **parser); +css_error css_parser_create_for_inline_style(const char *charset, + css_charset_source cs_source, lwc_context *dict, + css_allocator_fn alloc, void *pw, css_parser **parser); css_error css_parser_destroy(css_parser *parser); css_error css_parser_setopt(css_parser *parser, css_parser_opttype type, diff --git a/src/select/select.c b/src/select/select.c index e6e9116..b9dd5ef 100644 --- a/src/select/select.c +++ b/src/select/select.c @@ -137,6 +137,10 @@ css_error css_select_ctx_insert_sheet(css_select_ctx *ctx, if (ctx == NULL || sheet == NULL) return CSS_BADPARM; + /* Inline styles cannot be inserted into a selection context */ + if (sheet->inline_style) + return CSS_INVALID; + /* Index must be in the range [0, n_sheets] * The latter being equivalent to append */ if (index > ctx->n_sheets) @@ -240,6 +244,7 @@ css_error css_select_ctx_get_sheet(css_select_ctx *ctx, uint32_t index, * \param node Node to select style for * \param pseudo_element Pseudo element to select for, instead * \param media Currently active media types + * \param inline_style Corresponding inline style for node, or NULL * \param result Pointer to style to populate (assumed clean) * \param handler Dispatch table of handler functions * \param pw Client-specific private data for handler functions @@ -256,6 +261,7 @@ css_error css_select_ctx_get_sheet(css_select_ctx *ctx, uint32_t index, */ css_error css_select_style(css_select_ctx *ctx, void *node, uint32_t pseudo_element, uint64_t media, + const css_stylesheet *inline_style, css_computed_style *result, css_select_handler *handler, void *pw) { @@ -288,6 +294,25 @@ css_error css_select_style(css_select_ctx *ctx, void *node, } } + /* Consider any inline style for the node */ + if (inline_style != NULL) { + css_rule_selector *sel = + (css_rule_selector *) inline_style->rule_list; + + /* Sanity check style */ + if (inline_style->rule_count != 1 || + inline_style->rule_list->type != CSS_RULE_SELECTOR || + inline_style->rule_list->items != 0 || + sel->style == NULL) { + error = CSS_INVALID; + goto cleanup; + } + + error = cascade_style(sel->style, &state); + if (error != CSS_OK) + goto cleanup; + } + /* Take account of presentational hints */ /** \todo Optimisation: merge this loop and the next together */ for (i = 0; i < CSS_N_PROPERTIES; i++) { diff --git a/src/stylesheet.c b/src/stylesheet.c index c48240a..9afed2b 100644 --- a/src/stylesheet.c +++ b/src/stylesheet.c @@ -27,6 +27,7 @@ static css_error _remove_selectors(css_stylesheet *sheet, css_rule *rule); * \param origin Origin of stylesheet * \param media Media stylesheet applies to * \param allow_quirks Permit quirky parsing of stylesheets + * \param inline_style This stylesheet is an inline style * \param dict Dictionary in which to intern strings * \param alloc Memory (de)allocation function * \param alloc_pw Client private data for alloc @@ -38,7 +39,8 @@ static css_error _remove_selectors(css_stylesheet *sheet, css_rule *rule); css_error css_stylesheet_create(css_language_level level, const char *charset, const char *url, const char *title, css_origin origin, uint64_t media, bool allow_quirks, - lwc_context *dict, css_allocator_fn alloc, void *alloc_pw, + bool inline_style, lwc_context *dict, + css_allocator_fn alloc, void *alloc_pw, css_stylesheet **stylesheet) { css_parser_optparams params; @@ -56,10 +58,18 @@ css_error css_stylesheet_create(css_language_level level, memset(sheet, 0, sizeof(css_stylesheet)); sheet->dictionary = dict; + sheet->inline_style = inline_style; - error = css_parser_create(charset, + if (inline_style) { + error = css_parser_create_for_inline_style(charset, charset ? CSS_CHARSET_DICTATED : CSS_CHARSET_DEFAULT, sheet->dictionary, alloc, alloc_pw, &sheet->parser); + } else { + error = css_parser_create(charset, + charset ? CSS_CHARSET_DICTATED : CSS_CHARSET_DEFAULT, + sheet->dictionary, alloc, alloc_pw, &sheet->parser); + } + if (error != CSS_OK) { alloc(sheet, 0, alloc_pw); return error; @@ -568,11 +578,16 @@ css_error css_stylesheet_selector_create(css_stylesheet *sheet, sel->data.name = lwc_context_string_ref(sheet->dictionary, name); sel->data.value = NULL; - /* Initial specificity -- 1 for an element, 0 for universal */ - if (lwc_string_length(name) != 1 || lwc_string_data(name)[0] != '*') - sel->specificity = CSS_SPECIFICITY_D; - else - sel->specificity = 0; + if (sheet->inline_style) { + sel->specificity = CSS_SPECIFICITY_A; + } else { + /* Initial specificity -- 1 for an element, 0 for universal */ + if (lwc_string_length(name) != 1 || + lwc_string_data(name)[0] != '*') + sel->specificity = CSS_SPECIFICITY_D; + else + sel->specificity = 0; + } sel->data.comb = CSS_COMBINATOR_NONE; diff --git a/src/stylesheet.h b/src/stylesheet.h index 1fab87e..f3b2079 100644 --- a/src/stylesheet.h +++ b/src/stylesheet.h @@ -173,6 +173,8 @@ struct css_stylesheet { bool quirks_allowed; /**< Quirks permitted */ bool quirks_used; /**< Quirks actually used */ + bool inline_style; /**< Is an inline style */ + css_allocator_fn alloc; /**< Allocation function */ void *pw; /**< Private word */ }; diff --git a/test/css21.c b/test/css21.c index 704ed9f..d3bf96d 100644 --- a/test/css21.c +++ b/test/css21.c @@ -47,7 +47,7 @@ int main(int argc, char **argv) assert(css_stylesheet_create(CSS_LEVEL_21, "UTF-8", argv[2], NULL, CSS_ORIGIN_AUTHOR, CSS_MEDIA_ALL, false, - ctx, myrealloc, NULL, &sheet) == CSS_OK); + false, ctx, myrealloc, NULL, &sheet) == CSS_OK); fp = fopen(argv[2], "rb"); if (fp == NULL) { @@ -103,8 +103,8 @@ int main(int argc, char **argv) assert(css_stylesheet_create(CSS_LEVEL_21, "UTF-8", buf, NULL, CSS_ORIGIN_AUTHOR, - media, false, ctx, myrealloc, NULL, - &import) == CSS_OK); + media, false, false, ctx, myrealloc, + NULL, &import) == CSS_OK); assert(css_stylesheet_data_done(import) == CSS_OK); diff --git a/test/parse-auto.c b/test/parse-auto.c index 0bab4c2..ebbc5e7 100644 --- a/test/parse-auto.c +++ b/test/parse-auto.c @@ -312,7 +312,7 @@ void run_test(const uint8_t *data, size_t len, exp_entry *exp, size_t explen) lwc_context_ref(ctx); assert(css_stylesheet_create(CSS_LEVEL_21, "UTF-8", "foo", NULL, - CSS_ORIGIN_AUTHOR, CSS_MEDIA_ALL, false, ctx, + CSS_ORIGIN_AUTHOR, CSS_MEDIA_ALL, false, false, ctx, myrealloc, NULL, &sheet) == CSS_OK); error = css_stylesheet_append_data(sheet, data, len); @@ -342,8 +342,8 @@ void run_test(const uint8_t *data, size_t len, exp_entry *exp, size_t explen) assert(css_stylesheet_create(CSS_LEVEL_21, "UTF-8", buf, NULL, CSS_ORIGIN_AUTHOR, - media, false, ctx, myrealloc, NULL, &import) == - CSS_OK); + media, false, false, ctx, myrealloc, NULL, + &import) == CSS_OK); assert(css_stylesheet_register_import(sheet, import) == CSS_OK); diff --git a/test/parse2-auto.c b/test/parse2-auto.c index c6426be..ace1d6c 100644 --- a/test/parse2-auto.c +++ b/test/parse2-auto.c @@ -176,7 +176,7 @@ void run_test(const uint8_t *data, size_t len, const char *exp, size_t explen) lwc_context_ref(ctx); assert(css_stylesheet_create(CSS_LEVEL_21, "UTF-8", "foo", NULL, - CSS_ORIGIN_AUTHOR, CSS_MEDIA_ALL, false, ctx, + CSS_ORIGIN_AUTHOR, CSS_MEDIA_ALL, false, false, ctx, myrealloc, NULL, &sheet) == CSS_OK); error = css_stylesheet_append_data(sheet, data, len); diff --git a/test/select-auto.c b/test/select-auto.c index c42c82e..3f82433 100644 --- a/test/select-auto.c +++ b/test/select-auto.c @@ -450,8 +450,8 @@ void parse_sheet(line_ctx *ctx, const char *data, size_t len) /** \todo How are we going to handle @import? */ assert(css_stylesheet_create(CSS_LEVEL_21, "UTF-8", "foo", "foo", - origin, media, false, ctx->dict, myrealloc, NULL, - &sheet) == CSS_OK); + origin, media, false, false, ctx->dict, + myrealloc, NULL, &sheet) == CSS_OK); /* Extend array of sheets and append new sheet to it */ temp = realloc(ctx->sheets, @@ -637,7 +637,8 @@ void run_test(line_ctx *ctx, const char *exp, size_t explen) testnum++; assert(css_select_style(select, ctx->target, ctx->pseudo_element, - ctx->media, computed, &select_handler, ctx) == CSS_OK); + ctx->media, NULL, computed, &select_handler, ctx) == + CSS_OK); dump_computed_style(computed, buf, &buflen); |