Author: jmb
Date: Tue Jun 30 18:31:28 2009
New Revision: 8211
URL:
http://source.netsurf-browser.org?rev=8211&view=rev
Log:
Copy specified URL to ensure it's NUL terminated.
Correctly handle sheets we failed to fetch (replace them with a blank one)
Modified:
branches/jmb/ns-libcss/css/css.c
branches/jmb/ns-libcss/css/css.h
Modified: branches/jmb/ns-libcss/css/css.c
URL:
http://source.netsurf-browser.org/branches/jmb/ns-libcss/css/css.c?rev=82...
==============================================================================
--- branches/jmb/ns-libcss/css/css.c (original)
+++ branches/jmb/ns-libcss/css/css.c Tue Jun 30 18:31:28 2009
@@ -44,6 +44,7 @@
c->data.css.import_count = 0;
c->data.css.imports = NULL;
+ c->data.css.blank = NULL;
return true;
}
@@ -69,7 +70,7 @@
uint32_t i;
lwc_string *uri;
uint64_t media;
- char *abs_url, *norm_url;
+ char *rel_url, *abs_url, *norm_url;
url_func_result res;
error = css_stylesheet_next_pending_import(c->data.css.sheet,
@@ -95,12 +96,24 @@
}
c->data.css.imports = imports;
+ /* Copy specified URL and ensure it's NUL terminated */
+ rel_url = malloc(lwc_string_length(uri) + 1);
+ if (rel_url == NULL) {
+ c->status = CONTENT_STATUS_ERROR;
+ return false;
+ }
+ memcpy(rel_url, lwc_string_data(uri), lwc_string_length(uri));
+ rel_url[lwc_string_length(uri)] = '\0';
+
/* Resolve URI */
- res = url_join(lwc_string_data(uri), c->url, &abs_url);
+ res = url_join(rel_url, c->url, &abs_url);
if (res != URL_FUNC_OK) {
- c->status = CONTENT_STATUS_ERROR;
- return false;
- }
+ free(rel_url);
+ c->status = CONTENT_STATUS_ERROR;
+ return false;
+ }
+
+ free(rel_url);
/* Normalise it */
res = url_normalize(abs_url, &norm_url);
@@ -139,8 +152,29 @@
gui_multitask();
}
- error = css_stylesheet_register_import(c->data.css.sheet,
- c->data.css.imports[i]->data.css.sheet);
+ if (c->data.css.imports[i] != NULL) {
+ error = css_stylesheet_register_import(
+ c->data.css.sheet,
+ c->data.css.imports[i]->data.css.sheet);
+ } else {
+ if (c->data.css.blank == NULL) {
+ error = css_stylesheet_create(CSS_LEVEL_DEFAULT,
+ NULL, "", "", CSS_ORIGIN_AUTHOR,
+ media, false, false, dict,
+ myrealloc, NULL, &c->data.css.blank);
+ if (error != CSS_OK) {
+ c->status = CONTENT_STATUS_ERROR;
+ return false;
+ }
+ }
+
+ c->data.css.imports[i] =
+ (struct content *) c->data.css.blank;
+
+ error = css_stylesheet_register_import(
+ c->data.css.sheet,
+ (css_stylesheet *) c->data.css.imports[i]);
+ }
if (error != CSS_OK) {
c->status = CONTENT_STATUS_ERROR;
return false;
@@ -156,6 +190,22 @@
void css_destroy(struct content *c)
{
+ uint32_t i;
+
+ for (i = 0; i < c->data.css.import_count; i++) {
+ if (c->data.css.imports[i] !=
+ (struct content *) c->data.css.blank) {
+ content_remove_user(c->data.css.imports[i],
+ css_import, (uintptr_t) c, i);
+ }
+ c->data.css.imports[i] = NULL;
+ }
+
+ free(c->data.css.imports);
+
+ if (c->data.css.blank != NULL)
+ css_stylesheet_destroy(c->data.css.blank);
+
css_stylesheet_destroy(c->data.css.sheet);
}
Modified: branches/jmb/ns-libcss/css/css.h
URL:
http://source.netsurf-browser.org/branches/jmb/ns-libcss/css/css.h?rev=82...
==============================================================================
--- branches/jmb/ns-libcss/css/css.h (original)
+++ branches/jmb/ns-libcss/css/css.h Tue Jun 30 18:31:28 2009
@@ -11,6 +11,8 @@
uint32_t import_count;
struct content **imports;
+
+ css_stylesheet *blank;
};
/** \todo This needs moving somewhere more sane */