summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2010-01-12 20:56:08 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2010-01-12 20:56:08 +0000
commit46e3a946d7b2f7d68f3753a37c6f68a732a36f01 (patch)
tree7fb3b470499776274246cb261b13785ecd254e6e
parent41d14d090b1ce6b34865c12b3d1c980bd0fa36e8 (diff)
downloadlibcss-46e3a946d7b2f7d68f3753a37c6f68a732a36f01.tar.gz
libcss-46e3a946d7b2f7d68f3753a37c6f68a732a36f01.tar.bz2
Origin and media are not properties of the stylesheet.
They are properties of the context in which the stylesheet is used. Therefore, for top-level sheets, this information must be provided at selection time. For child sheets, the origin is inherited from their parent and the applicable media types are specified on the linking mechanism. svn path=/trunk/libcss/; revision=9802
-rw-r--r--include/libcss/select.h6
-rw-r--r--include/libcss/stylesheet.h5
-rw-r--r--src/select/select.c118
-rw-r--r--src/stylesheet.c42
-rw-r--r--src/stylesheet.h3
-rw-r--r--test/css21.c8
-rw-r--r--test/parse-auto.c10
-rw-r--r--test/parse2-auto.c4
-rw-r--r--test/select-auto.c43
9 files changed, 116 insertions, 123 deletions
diff --git a/include/libcss/select.h b/include/libcss/select.h
index 76bdcf5..931dcf1 100644
--- a/include/libcss/select.h
+++ b/include/libcss/select.h
@@ -84,9 +84,11 @@ css_error css_select_ctx_create(css_allocator_fn alloc, void *pw,
css_error css_select_ctx_destroy(css_select_ctx *ctx);
css_error css_select_ctx_append_sheet(css_select_ctx *ctx,
- const css_stylesheet *sheet);
+ const css_stylesheet *sheet,
+ css_origin origin, uint64_t media);
css_error css_select_ctx_insert_sheet(css_select_ctx *ctx,
- const css_stylesheet *sheet, uint32_t index);
+ const css_stylesheet *sheet, uint32_t index,
+ css_origin origin, uint64_t media);
css_error css_select_ctx_remove_sheet(css_select_ctx *ctx,
const css_stylesheet *sheet);
diff --git a/include/libcss/stylesheet.h b/include/libcss/stylesheet.h
index 940e9b7..e70214d 100644
--- a/include/libcss/stylesheet.h
+++ b/include/libcss/stylesheet.h
@@ -26,8 +26,7 @@ typedef css_error (*css_url_resolution_fn)(void *pw, lwc_context *dict,
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,
- bool inline_style, lwc_context *dict,
+ bool allow_quirks, bool inline_style, lwc_context *dict,
css_allocator_fn alloc, void *alloc_pw,
css_url_resolution_fn resolve, void *resolve_pw,
css_stylesheet **stylesheet);
@@ -46,8 +45,6 @@ css_error css_stylesheet_get_language_level(css_stylesheet *sheet,
css_language_level *level);
css_error css_stylesheet_get_url(css_stylesheet *sheet, const char **url);
css_error css_stylesheet_get_title(css_stylesheet *sheet, const char **title);
-css_error css_stylesheet_get_origin(css_stylesheet *sheet, css_origin *origin);
-css_error css_stylesheet_get_media(css_stylesheet *sheet, uint64_t *media);
css_error css_stylesheet_quirks_allowed(css_stylesheet *sheet, bool *allowed);
css_error css_stylesheet_used_quirks(css_stylesheet *sheet, bool *quirks);
diff --git a/src/select/select.c b/src/select/select.c
index 8224d86..7898d60 100644
--- a/src/select/select.c
+++ b/src/select/select.c
@@ -25,12 +25,21 @@
#undef DEBUG_CHAIN_MATCHING
/**
+ * Container for stylesheet selection info
+ */
+typedef struct css_select_sheet {
+ const css_stylesheet *sheet; /**< Stylesheet */
+ css_origin origin; /**< Stylesheet origin */
+ uint64_t media; /**< Applicable media */
+} css_select_sheet;
+
+/**
* CSS selection context
*/
struct css_select_ctx {
uint32_t n_sheets; /**< Number of sheets */
- const css_stylesheet **sheets; /**< Array of sheets */
+ css_select_sheet *sheets; /**< Array of sheets */
css_allocator_fn alloc; /**< Allocation routine */
void *pw; /**< Client-specific private data */
@@ -40,7 +49,8 @@ static css_error set_hint(css_select_state *state, uint32_t i);
static css_error set_initial(css_select_state *state, uint32_t i, void *parent);
static css_error select_from_sheet(css_select_ctx *ctx,
- const css_stylesheet *sheet, css_select_state *state);
+ const css_stylesheet *sheet, css_origin origin,
+ css_select_state *state);
static css_error intern_strings_for_sheet(css_select_ctx *ctx,
const css_stylesheet *sheet, css_select_state *state);
static css_error match_selectors_in_sheet(css_select_ctx *ctx,
@@ -119,17 +129,21 @@ css_error css_select_ctx_destroy(css_select_ctx *ctx)
/**
* Append a stylesheet to a selection context
*
- * \param ctx The context to append to
- * \param sheet The sheet to append
+ * \param ctx The context to append to
+ * \param sheet The sheet to append
+ * \param origin Origin of the sheet
+ * \param media Media types to which the sheet applies
* \return CSS_OK on success, appropriate error otherwise
*/
css_error css_select_ctx_append_sheet(css_select_ctx *ctx,
- const css_stylesheet *sheet)
+ const css_stylesheet *sheet, css_origin origin,
+ uint64_t media)
{
if (ctx == NULL || sheet == NULL)
return CSS_BADPARM;
- return css_select_ctx_insert_sheet(ctx, sheet, ctx->n_sheets);
+ return css_select_ctx_insert_sheet(ctx, sheet, ctx->n_sheets,
+ origin, media);
}
/**
@@ -138,12 +152,15 @@ css_error css_select_ctx_append_sheet(css_select_ctx *ctx,
* \param ctx The context to insert into
* \param sheet Sheet to insert
* \param index Index in context to insert sheet
+ * \param origin Origin of the sheet
+ * \param media Media types to which the sheet applies
* \return CSS_OK on success, appropriate error otherwise
*/
css_error css_select_ctx_insert_sheet(css_select_ctx *ctx,
- const css_stylesheet *sheet, uint32_t index)
+ const css_stylesheet *sheet, uint32_t index,
+ css_origin origin, uint64_t media)
{
- const css_stylesheet **temp;
+ css_select_sheet *temp;
if (ctx == NULL || sheet == NULL)
return CSS_BADPARM;
@@ -158,7 +175,7 @@ css_error css_select_ctx_insert_sheet(css_select_ctx *ctx,
return CSS_INVALID;
temp = ctx->alloc(ctx->sheets,
- (ctx->n_sheets + 1) * sizeof(css_stylesheet *),
+ (ctx->n_sheets + 1) * sizeof(css_select_sheet),
ctx->pw);
if (temp == NULL)
return CSS_NOMEM;
@@ -167,10 +184,12 @@ css_error css_select_ctx_insert_sheet(css_select_ctx *ctx,
if (index < ctx->n_sheets) {
memmove(&ctx->sheets[index + 1], &ctx->sheets[index],
- (ctx->n_sheets - index) * sizeof(css_stylesheet *));
+ (ctx->n_sheets - index) * sizeof(css_select_sheet));
}
- ctx->sheets[index] = sheet;
+ ctx->sheets[index].sheet = sheet;
+ ctx->sheets[index].origin = origin;
+ ctx->sheets[index].media = media;
ctx->n_sheets++;
@@ -193,7 +212,7 @@ css_error css_select_ctx_remove_sheet(css_select_ctx *ctx,
return CSS_BADPARM;
for (index = 0; index < ctx->n_sheets; index++) {
- if (ctx->sheets[index] == sheet)
+ if (ctx->sheets[index].sheet == sheet)
break;
}
@@ -201,7 +220,7 @@ css_error css_select_ctx_remove_sheet(css_select_ctx *ctx,
return CSS_INVALID;
memmove(&ctx->sheets[index], &ctx->sheets[index + 1],
- (ctx->n_sheets - index) * sizeof(css_stylesheet *));
+ (ctx->n_sheets - index) * sizeof(css_select_sheet));
ctx->n_sheets--;
@@ -243,7 +262,7 @@ css_error css_select_ctx_get_sheet(css_select_ctx *ctx, uint32_t index,
if (index > ctx->n_sheets)
return CSS_INVALID;
- *sheet = ctx->sheets[index];
+ *sheet = ctx->sheets[index].sheet;
return CSS_OK;
}
@@ -301,9 +320,10 @@ css_error css_select_style(css_select_ctx *ctx, void *node,
* from those which apply to our current media requirements and
* are not disabled */
for (i = 0; i < ctx->n_sheets; i++) {
- if ((ctx->sheets[i]->media & media) != 0 &&
- ctx->sheets[i]->disabled == false) {
- error = select_from_sheet(ctx, ctx->sheets[i], &state);
+ if ((ctx->sheets[i].media & media) != 0 &&
+ ctx->sheets[i].sheet->disabled == false) {
+ error = select_from_sheet(ctx, ctx->sheets[i].sheet,
+ ctx->sheets[i].origin, &state);
if (error != CSS_OK)
goto cleanup;
}
@@ -367,40 +387,51 @@ css_error css_select_style(css_select_ctx *ctx, void *node,
error = CSS_OK;
cleanup:
- if (ctx->sheets[0] != NULL) {
+ if (ctx->n_sheets > 0 && ctx->sheets[0].sheet != NULL) {
if (state.universal != NULL)
- lwc_context_string_unref(ctx->sheets[0]->dictionary,
- state.universal);
+ lwc_context_string_unref(
+ ctx->sheets[0].sheet->dictionary,
+ state.universal);
if (state.first_child != NULL)
- lwc_context_string_unref(ctx->sheets[0]->dictionary,
- state.first_child);
+ lwc_context_string_unref(
+ ctx->sheets[0].sheet->dictionary,
+ state.first_child);
if (state.link != NULL)
- lwc_context_string_unref(ctx->sheets[0]->dictionary,
- state.link);
+ lwc_context_string_unref(
+ ctx->sheets[0].sheet->dictionary,
+ state.link);
if (state.visited != NULL)
- lwc_context_string_unref(ctx->sheets[0]->dictionary,
- state.visited);
+ lwc_context_string_unref(
+ ctx->sheets[0].sheet->dictionary,
+ state.visited);
if (state.hover != NULL)
- lwc_context_string_unref(ctx->sheets[0]->dictionary,
- state.hover);
+ lwc_context_string_unref(
+ ctx->sheets[0].sheet->dictionary,
+ state.hover);
if (state.active != NULL)
- lwc_context_string_unref(ctx->sheets[0]->dictionary,
- state.active);
+ lwc_context_string_unref(
+ ctx->sheets[0].sheet->dictionary,
+ state.active);
if (state.focus != NULL)
- lwc_context_string_unref(ctx->sheets[0]->dictionary,
- state.focus);
+ lwc_context_string_unref(
+ ctx->sheets[0].sheet->dictionary,
+ state.focus);
if (state.first_line != NULL)
- lwc_context_string_unref(ctx->sheets[0]->dictionary,
- state.first_line);
+ lwc_context_string_unref(
+ ctx->sheets[0].sheet->dictionary,
+ state.first_line);
if (state.first_letter != NULL)
- lwc_context_string_unref(ctx->sheets[0]->dictionary,
- state.first_letter);
+ lwc_context_string_unref(
+ ctx->sheets[0].sheet->dictionary,
+ state.first_letter);
if (state.before != NULL)
- lwc_context_string_unref(ctx->sheets[0]->dictionary,
- state.before);
+ lwc_context_string_unref(
+ ctx->sheets[0].sheet->dictionary,
+ state.before);
if (state.after != NULL)
- lwc_context_string_unref(ctx->sheets[0]->dictionary,
- state.after);
+ lwc_context_string_unref(
+ ctx->sheets[0].sheet->dictionary,
+ state.after);
}
return error;
}
@@ -480,7 +511,7 @@ css_error set_initial(css_select_state *state, uint32_t i, void *parent)
}
css_error select_from_sheet(css_select_ctx *ctx, const css_stylesheet *sheet,
- css_select_state *state)
+ css_origin origin, css_select_state *state)
{
const css_stylesheet *s = sheet;
const css_rule *rule = s->rule_list;
@@ -500,8 +531,7 @@ css_error select_from_sheet(css_select_ctx *ctx, const css_stylesheet *sheet,
(const css_rule_import *) rule;
if (import->sheet != NULL &&
- (import->sheet->media &
- state->media) != 0) {
+ (import->media & state->media) != 0) {
/* It's applicable, so process it */
s = import->sheet;
rule = s->rule_list;
@@ -515,7 +545,7 @@ css_error select_from_sheet(css_select_ctx *ctx, const css_stylesheet *sheet,
/* Process this sheet */
state->sheet = s;
- state->current_origin = s->origin;
+ state->current_origin = origin;
error = intern_strings_for_sheet(ctx, s, state);
if (error != CSS_OK)
diff --git a/src/stylesheet.c b/src/stylesheet.c
index e6d8ea7..a20ec14 100644
--- a/src/stylesheet.c
+++ b/src/stylesheet.c
@@ -25,8 +25,6 @@ static size_t _rule_size(const css_rule *rule);
* \param charset The charset of the stylesheet data, or NULL to detect
* \param url URL of stylesheet
* \param title Title of stylesheet
- * \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
@@ -41,8 +39,7 @@ static size_t _rule_size(const 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,
- bool inline_style, lwc_context *dict,
+ bool allow_quirks, bool inline_style, lwc_context *dict,
css_allocator_fn alloc, void *alloc_pw,
css_url_resolution_fn resolve, void *resolve_pw,
css_stylesheet **stylesheet)
@@ -136,9 +133,6 @@ css_error css_stylesheet_create(css_language_level level,
memcpy(sheet->title, title, len);
}
- sheet->origin = origin;
- sheet->media = media;
-
sheet->resolve = resolve;
sheet->resolve_pw = resolve_pw;
@@ -431,40 +425,6 @@ css_error css_stylesheet_get_title(css_stylesheet *sheet, const char **title)
}
/**
- * Retrieve the origin of a stylesheet
- *
- * \param sheet The stylesheet to retrieve the origin of
- * \param origin Pointer to location to receive origin
- * \return CSS_OK on success, appropriate error otherwise
- */
-css_error css_stylesheet_get_origin(css_stylesheet *sheet, css_origin *origin)
-{
- if (sheet == NULL || origin == NULL)
- return CSS_BADPARM;
-
- *origin = sheet->origin;
-
- return CSS_OK;
-}
-
-/**
- * Retrieve the media types associated with a stylesheet
- *
- * \param sheet The stylesheet to retrieve the media types for
- * \param media Pointer to location to receive media types
- * \return CSS_OK on success, appropriate error otherwise
- */
-css_error css_stylesheet_get_media(css_stylesheet *sheet, uint64_t *media)
-{
- if (sheet == NULL || media == NULL)
- return CSS_BADPARM;
-
- *media = sheet->media;
-
- return CSS_OK;
-}
-
-/**
* Determine whether quirky parsing was permitted on a stylesheet
*
* \param sheet The stylesheet to consider
diff --git a/src/stylesheet.h b/src/stylesheet.h
index df095d9..10a9827 100644
--- a/src/stylesheet.h
+++ b/src/stylesheet.h
@@ -157,9 +157,6 @@ struct css_stylesheet {
char *url; /**< URL of this sheet */
char *title; /**< Title of this sheet */
- css_origin origin; /**< Origin of stylesheet */
- uint64_t media; /**< Bitfield of media types */
-
void *ownerNode; /**< Owning node in document */
css_rule *ownerRule; /**< Owning rule in parent */
diff --git a/test/css21.c b/test/css21.c
index f288720..5e6c71a 100644
--- a/test/css21.c
+++ b/test/css21.c
@@ -58,8 +58,7 @@ int main(int argc, char **argv)
for (count = 0; count < ITERATIONS; count++) {
assert(css_stylesheet_create(CSS_LEVEL_21, "UTF-8", argv[2],
- NULL, CSS_ORIGIN_AUTHOR, CSS_MEDIA_ALL, false,
- false, ctx, myrealloc, NULL,
+ NULL, false, false, ctx, myrealloc, NULL,
resolve_url, NULL, &sheet) == CSS_OK);
fp = fopen(argv[2], "rb");
@@ -115,9 +114,8 @@ int main(int argc, char **argv)
buf[lwc_string_length(url)] = '\0';
assert(css_stylesheet_create(CSS_LEVEL_21,
- "UTF-8", buf, NULL, CSS_ORIGIN_AUTHOR,
- media, false, false, ctx, myrealloc,
- NULL, resolve_url, NULL,
+ "UTF-8", buf, NULL, false, false, ctx,
+ myrealloc, NULL, resolve_url, NULL,
&import) == CSS_OK);
assert(css_stylesheet_data_done(import) ==
diff --git a/test/parse-auto.c b/test/parse-auto.c
index 135696b..070f8db 100644
--- a/test/parse-auto.c
+++ b/test/parse-auto.c
@@ -324,8 +324,8 @@ 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, false, ctx,
- myrealloc, NULL, resolve_url, NULL, &sheet) == CSS_OK);
+ false, false, ctx, myrealloc, NULL, resolve_url, NULL,
+ &sheet) == CSS_OK);
error = css_stylesheet_append_data(sheet, data, len);
if (error != CSS_OK && error != CSS_NEEDDATA) {
@@ -353,9 +353,9 @@ void run_test(const uint8_t *data, size_t len, exp_entry *exp, size_t explen)
buf[lwc_string_length(url)] = '\0';
assert(css_stylesheet_create(CSS_LEVEL_21,
- "UTF-8", buf, NULL, CSS_ORIGIN_AUTHOR,
- media, false, false, ctx, myrealloc, NULL,
- resolve_url, NULL, &import) == CSS_OK);
+ "UTF-8", buf, NULL, false, false, ctx,
+ myrealloc, NULL, resolve_url, 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 57b1688..2a89ef4 100644
--- a/test/parse2-auto.c
+++ b/test/parse2-auto.c
@@ -188,8 +188,8 @@ 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, false, ctx,
- myrealloc, NULL, resolve_url, NULL, &sheet) == CSS_OK);
+ false, false, ctx, myrealloc, NULL, resolve_url, NULL,
+ &sheet) == CSS_OK);
error = css_stylesheet_append_data(sheet, data, len);
if (error != CSS_OK && error != CSS_NEEDDATA) {
diff --git a/test/select-auto.c b/test/select-auto.c
index 2f3e028..b0d2594 100644
--- a/test/select-auto.c
+++ b/test/select-auto.c
@@ -33,6 +33,12 @@ typedef struct node {
struct node *last_child;
} node;
+typedef struct sheet_ctx {
+ css_stylesheet *sheet;
+ css_origin origin;
+ uint64_t media;
+} sheet_ctx;
+
typedef struct line_ctx {
size_t explen;
size_t expused;
@@ -48,7 +54,7 @@ typedef struct line_ctx {
uint32_t depth;
uint32_t n_sheets;
- css_stylesheet **sheets;
+ sheet_ctx *sheets;
uint64_t media;
uint32_t pseudo_element;
@@ -235,8 +241,8 @@ bool handle_line(const char *data, size_t datalen, void *pw)
} else if (ctx->insheet) {
if (strncasecmp(data+1, "errors", 6) == 0) {
assert(css_stylesheet_data_done(
- ctx->sheets[ctx->n_sheets - 1])
- == CSS_OK);
+ ctx->sheets[ctx->n_sheets - 1].sheet)
+ == CSS_OK);
ctx->intree = false;
ctx->insheet = false;
@@ -246,15 +252,15 @@ bool handle_line(const char *data, size_t datalen, void *pw)
strncasecmp(data+1, "user", 4) == 0 ||
strncasecmp(data+1, "author", 6) == 0) {
assert(css_stylesheet_data_done(
- ctx->sheets[ctx->n_sheets - 1])
- == CSS_OK);
+ ctx->sheets[ctx->n_sheets - 1].sheet)
+ == CSS_OK);
parse_sheet(ctx, data + 1, datalen - 1);
} else {
error = css_stylesheet_append_data(
- ctx->sheets[ctx->n_sheets - 1],
- (const uint8_t *) data,
- datalen);
+ ctx->sheets[ctx->n_sheets - 1].sheet,
+ (const uint8_t *) data,
+ datalen);
assert(error == CSS_OK ||
error == CSS_NEEDDATA);
}
@@ -290,7 +296,7 @@ bool handle_line(const char *data, size_t datalen, void *pw)
parse_tree_data(ctx, data + 1, datalen - 1);
} else if (ctx->insheet) {
error = css_stylesheet_append_data(
- ctx->sheets[ctx->n_sheets - 1],
+ ctx->sheets[ctx->n_sheets - 1].sheet,
(const uint8_t *) data, datalen);
assert(error == CSS_OK || error == CSS_NEEDDATA);
} else if (ctx->inexp) {
@@ -447,7 +453,7 @@ void parse_sheet(line_ctx *ctx, const char *data, size_t len)
css_origin origin = CSS_ORIGIN_AUTHOR;
uint64_t media = CSS_MEDIA_ALL;
css_stylesheet *sheet;
- css_stylesheet **temp;
+ sheet_ctx *temp;
/* <origin> <media_list>? */
@@ -478,17 +484,19 @@ 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, false, ctx->dict,
- myrealloc, NULL, resolve_url, NULL, &sheet) == CSS_OK);
+ false, false, ctx->dict, myrealloc, NULL,
+ resolve_url, NULL, &sheet) == CSS_OK);
/* Extend array of sheets and append new sheet to it */
temp = realloc(ctx->sheets,
- (ctx->n_sheets + 1) * sizeof(css_stylesheet *));
+ (ctx->n_sheets + 1) * sizeof(sheet_ctx));
assert(temp != NULL);
ctx->sheets = temp;
- ctx->sheets[ctx->n_sheets] = sheet;
+ ctx->sheets[ctx->n_sheets].sheet = sheet;
+ ctx->sheets[ctx->n_sheets].origin = origin;
+ ctx->sheets[ctx->n_sheets].media = media;
ctx->n_sheets++;
}
@@ -656,8 +664,9 @@ void run_test(line_ctx *ctx, const char *exp, size_t explen)
assert(css_select_ctx_create(myrealloc, NULL, &select) == CSS_OK);
for (i = 0; i < ctx->n_sheets; i++) {
- assert(css_select_ctx_append_sheet(select, ctx->sheets[i]) ==
- CSS_OK);
+ assert(css_select_ctx_append_sheet(select,
+ ctx->sheets[i].sheet, ctx->sheets[i].origin,
+ ctx->sheets[i].media) == CSS_OK);
}
assert(css_computed_style_create(myrealloc, NULL, &computed) == CSS_OK);
@@ -685,7 +694,7 @@ void run_test(line_ctx *ctx, const char *exp, size_t explen)
destroy_tree(ctx->tree);
for (i = 0; i < ctx->n_sheets; i++) {
- css_stylesheet_destroy(ctx->sheets[i]);
+ css_stylesheet_destroy(ctx->sheets[i].sheet);
}
ctx->tree = NULL;