diff --git a/render/html.c b/render/html.c index 4a5f9c9c5..3bd70ae8d 100644 --- a/render/html.c +++ b/render/html.c @@ -1044,6 +1044,7 @@ bool html_process_style_element(struct content *c, unsigned int *index, char *type, *media, *data; union content_msg_data msg_data; struct nscss_import *stylesheets; + struct nscss_import *sheet; const char *params[] = { 0 }; /* type='text/css', or not present (invalid but common) */ @@ -1074,47 +1075,61 @@ bool html_process_style_element(struct content *c, unsigned int *index, c->data.html.stylesheets = stylesheets; /* create stylesheet */ + sheet = &c->data.html.stylesheets[(*index)]; + /** \todo Reflect specified media */ - c->data.html.stylesheets[(*index)].media = CSS_MEDIA_ALL; - c->data.html.stylesheets[(*index)].c = - content_create(c->data.html.base_url); - if (c->data.html.stylesheets[(*index)].c == NULL) + sheet->media = CSS_MEDIA_ALL; + sheet->c = content_create(c->data.html.base_url); + if (sheet->c == NULL) goto no_memory; - if (content_set_type(c->data.html.stylesheets[(*index)].c, - CONTENT_CSS, "text/css", params, c) == false) + if (content_set_type(sheet->c, + CONTENT_CSS, "text/css", params, c) == false) { /** \todo not necessarily caused by * memory exhaustion */ + sheet->c = NULL; goto no_memory; + } /* can't just use xmlNodeGetContent(style), because that won't * give the content of comments which may be used to 'hide' * the content */ for (child = style->children; child != 0; child = child->next) { data = (char *) xmlNodeGetContent(child); - if (content_process_data(c->data.html.stylesheets[(*index)].c, - data, strlen(data)) == false) { + if (content_process_data(sheet->c, data, strlen(data)) == + false) { xmlFree(data); /** \todo not necessarily caused by * memory exhaustion */ + sheet->c = NULL; goto no_memory; } xmlFree(data); } - /* Convert the content */ - if (nscss_convert(c->data.html.stylesheets[(*index)].c, c->width, - c->height)) { - if (content_add_user(c->data.html.stylesheets[(*index)].c, + /* Convert the content -- manually, as we want the result */ + if (sheet->c->source_allocated != sheet->c->source_size) { + /* Minimise source data block */ + char *data = talloc_realloc(sheet->c, sheet->c->source_data, + char, sheet->c->source_size); + + if (data != NULL) { + sheet->c->source_data = data; + sheet->c->source_allocated = sheet->c->source_size; + } + } + + if (nscss_convert(sheet->c, c->width, c->height)) { + if (content_add_user(sheet->c, html_convert_css_callback, (intptr_t) c, (*index)) == false) { /* no memory */ - c->data.html.stylesheets[(*index)].c = NULL; + sheet->c = NULL; goto no_memory; } } else { /* conversion failed */ - c->data.html.stylesheets[(*index)].c = NULL; + sheet->c = NULL; } /* Update index */