diff --git a/content/handlers/html/html.c b/content/handlers/html/html.c index 6e389abe3..c7a9afebd 100644 --- a/content/handlers/html/html.c +++ b/content/handlers/html/html.c @@ -268,13 +268,31 @@ static void html_box_convert_done(html_content *c, bool success) content_set_ready(&c->base); - if (c->base.active == 0) { - content_set_done(&c->base); - } + html_proceed_to_done(c); dom_node_unref(html); } +/* Documented in html_internal.h */ +nserror +html_proceed_to_done(html_content *html) +{ + switch (content__get_status(&html->base)) { + case CONTENT_STATUS_READY: + if (html->base.active == 0) { + content_set_done(&html->base); + return NSERROR_OK; + } + break; + case CONTENT_STATUS_DONE: + return NSERROR_OK; + default: + NSLOG(netsurf, ERROR, "Content status unexpectedly not READY/DONE"); + break; + } + return NSERROR_UNKNOWN; +} + /** process link node */ static bool html_process_link(html_content *c, dom_node *node) diff --git a/content/handlers/html/html_internal.h b/content/handlers/html/html_internal.h index 2ff341038..9b363dc8b 100644 --- a/content/handlers/html/html_internal.h +++ b/content/handlers/html/html_internal.h @@ -396,6 +396,12 @@ nserror html_object_close_objects(html_content *html); nserror html_object_open_objects(html_content *html, struct browser_window *bw); nserror html_object_abort_objects(html_content *html); +/** + * Complete the HTML content state machine *iff* all scripts are finished + */ +nserror html_proceed_to_done(html_content *html); + + /* Events */ /** * Construct an event and fire it at the DOM diff --git a/content/handlers/html/html_script.c b/content/handlers/html/html_script.c index e11e47c56..ed73f50d8 100644 --- a/content/handlers/html/html_script.c +++ b/content/handlers/html/html_script.c @@ -108,7 +108,7 @@ nserror html_script_exec(html_content *c, bool allow_defer) } } - return NSERROR_OK; + return html_proceed_to_done(c); } /* create new html script entry */ @@ -208,7 +208,7 @@ convert_script_async_cb(hlcache_handle *script, * scripts as they come in. */ else if (parent->conversion_begun) { - html_script_exec(parent, false); + return html_script_exec(parent, false); } return NSERROR_OK;