Author: jmb
Date: Tue Jun 30 14:00:05 2009
New Revision: 8207
URL:
http://source.netsurf-browser.org?rev=8207&view=rev
Log:
Process @import list. This approach may well have a negative impact on page load times.
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 14:00:05 2009
@@ -1,9 +1,18 @@
+#include <assert.h>
+
#include <libwapcaplet/libwapcaplet.h>
#include "content/content.h"
+#include "content/fetch.h"
+#include "content/fetchcache.h"
#include "css/css.h"
+#include "desktop/gui.h"
+#include "utils/url.h"
static lwc_context *dict;
+
+static void css_import(content_msg msg, struct content *c,
+ intptr_t p1, intptr_t p2, union content_msg_data data);
static void *myrealloc(void *ptr, size_t size, void *pw)
{
@@ -33,6 +42,9 @@
if (error != CSS_OK)
return false;
+ c->data.css.import_count = 0;
+ c->data.css.imports = NULL;
+
return true;
}
@@ -52,9 +64,89 @@
error = css_stylesheet_data_done(c->data.css.sheet);
- if (error == CSS_IMPORTS_PENDING) {
- /** \todo process pending imports */
- error = CSS_OK;
+ while (error == CSS_IMPORTS_PENDING) {
+ struct content **imports;
+ uint32_t i;
+ lwc_string *uri;
+ uint64_t media;
+ char *abs_url, *norm_url;
+ url_func_result res;
+
+ error = css_stylesheet_next_pending_import(c->data.css.sheet,
+ &uri, &media);
+ if (error != CSS_OK && error != CSS_INVALID) {
+ c->status = CONTENT_STATUS_ERROR;
+ return false;
+ }
+
+ /* Give up if there are no more imports */
+ if (error == CSS_INVALID) {
+ error = CSS_OK;
+ break;
+ }
+
+ /* Increase space in table */
+ imports = realloc(c->data.css.imports,
+ (c->data.css.import_count + 1) *
+ sizeof(struct content *));
+ if (imports == NULL) {
+ c->status = CONTENT_STATUS_ERROR;
+ return false;
+ }
+ c->data.css.imports = imports;
+
+ /* Resolve URI */
+ res = url_join(lwc_string_data(uri), c->url, &abs_url);
+ if (res != URL_FUNC_OK) {
+ c->status = CONTENT_STATUS_ERROR;
+ return false;
+ }
+
+ /* Normalise it */
+ res = url_normalize(abs_url, &norm_url);
+ if (res != URL_FUNC_OK) {
+ free(abs_url);
+ c->status = CONTENT_STATUS_ERROR;
+ return false;
+ }
+
+ free(abs_url);
+
+ /* Create content */
+ i = c->data.css.import_count;
+ c->data.css.imports[c->data.css.import_count++] =
+ fetchcache(norm_url,
+ css_import, (intptr_t) c, i,
+ c->width, c->height, true, NULL, NULL,
+ false, false);
+ if (c->data.css.imports[i] == NULL) {
+ free(norm_url);
+ c->status = CONTENT_STATUS_ERROR;
+ return false;
+ }
+
+ /* Fetch content */
+ c->active++;
+ fetchcache_go(c->data.css.imports[i], c->url,
+ css_import, (intptr_t) c, i,
+ c->width, c->height, NULL, NULL, false, c->url);
+
+ free(norm_url);
+
+ /* Wait for import to fetch + convert */
+ while (c->active > 0) {
+ fetch_poll();
+ gui_multitask();
+ }
+
+ error = css_stylesheet_register_import(c->data.css.sheet,
+ c->data.css.imports[i]->data.css.sheet);
+ if (error != CSS_OK) {
+ c->status = CONTENT_STATUS_ERROR;
+ return false;
+ }
+
+ error = CSS_IMPORTS_PENDING;
}
c->status = CONTENT_STATUS_DONE;
@@ -67,3 +159,48 @@
css_stylesheet_destroy(c->data.css.sheet);
}
+void css_import(content_msg msg, struct content *c,
+ intptr_t p1, intptr_t p2, union content_msg_data data)
+{
+ struct content *parent = (struct content *) p1;
+ uint32_t i = (uint32_t) p2;
+
+ switch (msg) {
+ case CONTENT_MSG_LOADING:
+ if (c->type != CONTENT_CSS) {
+ content_remove_user(c, css_import, p1, p2);
+ if (c->user_list->next == NULL) {
+ fetch_abort(c->fetch);
+ c->fetch = NULL;
+ c->status = CONTENT_STATUS_ERROR;
+ }
+
+ parent->data.css.imports[i] = NULL;
+ parent->active--;
+ content_add_error(parent, "NotCSS", 0);
+ }
+ break;
+ case CONTENT_MSG_READY:
+ break;
+ case CONTENT_MSG_DONE:
+ parent->active--;
+ break;
+ case CONTENT_MSG_AUTH:
+ case CONTENT_MSG_SSL:
+ case CONTENT_MSG_LAUNCH:
+ case CONTENT_MSG_ERROR:
+ if (parent->data.css.imports[i] == c) {
+ parent->data.css.imports[i] = NULL;
+ parent->active--;
+ }
+ break;
+ case CONTENT_MSG_STATUS:
+ break;
+ case CONTENT_MSG_NEWPTR:
+ parent->data.css.imports[i] = c;
+ break;
+ default:
+ assert(0);
+ }
+}
+
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 14:00:05 2009
@@ -8,6 +8,9 @@
struct content_css_data
{
css_stylesheet *sheet;
+
+ uint32_t import_count;
+ struct content **imports;
};
/** \todo This needs moving somewhere more sane */