summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn-Mark Bell <jmb@netsurf-browser.org>2014-01-05 14:34:04 +0000
committerJohn-Mark Bell <jmb@netsurf-browser.org>2014-01-05 14:34:49 +0000
commit32468516e31ee16f6d63923aeb2af8714dfe1a1a (patch)
treee229e7d4a103fced9cd0f501316c2b3f4ff6ead6
parentb80da8bf0b6662062881214bc19bbe8cbe1ec2f4 (diff)
downloadnetsurf-32468516e31ee16f6d63923aeb2af8714dfe1a1a.tar.gz
netsurf-32468516e31ee16f6d63923aeb2af8714dfe1a1a.tar.bz2
Speculatively start image fetches as we parse the document.
-rw-r--r--desktop/save_complete.c2
-rw-r--r--render/html.c35
-rw-r--r--render/html_object.c26
3 files changed, 53 insertions, 10 deletions
diff --git a/desktop/save_complete.c b/desktop/save_complete.c
index 0c67654a6..efe223747 100644
--- a/desktop/save_complete.c
+++ b/desktop/save_complete.c
@@ -435,7 +435,7 @@ static bool save_complete_save_html_objects(save_complete_ctx *ctx,
object = html_get_objects(c, &count);
for (; object != NULL; object = object->next) {
- if (object->content != NULL) {
+ if (object->content != NULL || object->box != NULL) {
if (save_complete_save_html_object(ctx,
object->content) == false)
return false;
diff --git a/render/html.c b/render/html.c
index 49bb019dd..04b2fda18 100644
--- a/render/html.c
+++ b/render/html.c
@@ -507,6 +507,37 @@ static nserror html_meta_refresh_process_element(html_content *c, dom_node *n)
return error;
}
+static bool html_process_img(html_content *c, dom_node *node)
+{
+ dom_string *src;
+ nsurl *url;
+ nserror err;
+ dom_exception exc;
+ bool success;
+
+ /* Do nothing if foreground images are disabled */
+ if (nsoption_bool(foreground_images) == false) {
+ return true;
+ }
+
+ exc = dom_element_get_attribute(node, corestring_dom_src, &src);
+ if (exc != DOM_NO_ERR || src == NULL) {
+ return true;
+ }
+
+ err = nsurl_join(c->base_url, dom_string_data(src), &url);
+ if (err != NSERROR_OK) {
+ dom_string_unref(src);
+ return false;
+ }
+ dom_string_unref(src);
+
+ /* Speculatively fetch the image */
+ success = html_fetch_object(c, url, NULL, CONTENT_IMAGE, 0, 0, false);
+ nsurl_unref(url);
+
+ return success;
+}
/**
* Complete conversion of an HTML document
@@ -608,6 +639,10 @@ dom_default_action_DOMNodeInserted_cb(struct dom_event *evt, void *pw)
name, corestring_lwc_title) &&
htmlc->title == NULL) {
htmlc->title = dom_node_ref(node);
+ } else if (dom_string_caseless_lwc_isequal(
+ name, corestring_lwc_img)) {
+ html_process_img(htmlc,
+ (dom_node *) node);
}
dom_string_unref(name);
diff --git a/render/html_object.c b/render/html_object.c
index f4975e9ba..6cd08c1ef 100644
--- a/render/html_object.c
+++ b/render/html_object.c
@@ -123,6 +123,9 @@ html_object_callback(hlcache_handle *object,
assert(c->base.status != CONTENT_STATUS_ERROR);
box = o->box;
+ if (box == NULL && event->type != CONTENT_MSG_ERROR) {
+ return NSERROR_OK;
+ }
switch (event->type) {
case CONTENT_MSG_LOADING:
@@ -181,11 +184,13 @@ html_object_callback(hlcache_handle *object,
o->content = NULL;
- c->base.active--;
- LOG(("%d fetches active", c->base.active));
+ if (box != NULL) {
+ c->base.active--;
+ LOG(("%d fetches active", c->base.active));
- content_add_error(&c->base, "?", 0);
- html_object_failed(box, c, o->background);
+ content_add_error(&c->base, "?", 0);
+ html_object_failed(box, c, o->background);
+ }
break;
case CONTENT_MSG_STATUS:
@@ -464,7 +469,7 @@ html_object_callback(hlcache_handle *object,
* then reformat the page to display newly fetched objects */
else if (nsoption_bool(incremental_reflow) &&
event->type == CONTENT_MSG_DONE &&
- !(box->flags & REPLACE_DIM) &&
+ box != NULL && !(box->flags & REPLACE_DIM) &&
(c->base.status == CONTENT_STATUS_READY ||
c->base.status == CONTENT_STATUS_DONE) &&
(wallclock() > c->base.reformat_time)) {
@@ -491,6 +496,7 @@ static bool html_replace_object(struct content_html_object *object, nsurl *url)
nserror error;
assert(object != NULL);
+ assert(object->box != NULL);
c = (html_content *) object->parent;
@@ -562,7 +568,7 @@ nserror html_object_open_objects(html_content *html, struct browser_window *bw)
for (object = html->object_list; object != NULL; object = next) {
next = object->next;
- if (object->content == NULL)
+ if (object->content == NULL || object->box == NULL)
continue;
if (content_get_type(object->content) == CONTENT_NONE)
@@ -621,7 +627,7 @@ nserror html_object_close_objects(html_content *html)
for (object = html->object_list; object != NULL; object = next) {
next = object->next;
- if (object->content == NULL)
+ if (object->content == NULL || object->box == NULL)
continue;
if (content_get_type(object->content) == CONTENT_NONE)
@@ -701,8 +707,10 @@ bool html_fetch_object(html_content *c, nsurl *url, struct box *box,
c->object_list = object;
c->num_objects++;
- c->base.active++;
- LOG(("%d fetches active", c->base.active));
+ if (box != NULL) {
+ c->base.active++;
+ LOG(("%d fetches active", c->base.active));
+ }
return true;
}