From eba05b0d389a83d09798099e8894e297c973ac6e Mon Sep 17 00:00:00 2001 From: Daniel Silverstone Date: Thu, 19 Dec 2019 20:50:33 +0000 Subject: html_script: Count sync scripts to prevent unpausing early If there is more than one incomplete sync script then it's important that we don't unpause hubbub too early. This commit adds a counter so that if there're unfinished sync scripts in the set, we don't unpause until the last one completes. Signed-off-by: Daniel Silverstone --- content/handlers/html/html_script.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/content/handlers/html/html_script.c b/content/handlers/html/html_script.c index f4754fe8a..e11e47c56 100644 --- a/content/handlers/html/html_script.c +++ b/content/handlers/html/html_script.c @@ -284,6 +284,15 @@ convert_script_sync_cb(hlcache_handle *script, struct html_script *s; script_handler_t *script_handler; dom_hubbub_error err; + unsigned int active_sync_scripts = 0; + + /* Count sync scripts which have yet to complete (other than us) */ + for (i = 0, s = parent->scripts; i != parent->scripts_count; i++, s++) { + if (s->type == HTML_SCRIPT_SYNC && + s->data.handle != script && s->already_started == false) { + active_sync_scripts++; + } + } /* Find script */ for (i = 0, s = parent->scripts; i != parent->scripts_count; i++, s++) { @@ -314,7 +323,7 @@ convert_script_sync_cb(hlcache_handle *script, } /* continue parse */ - if (parent->parser != NULL) { + if (parent->parser != NULL && active_sync_scripts == 0) { err = dom_hubbub_parser_pause(parent->parser, false); if (err != DOM_HUBBUB_OK) { NSLOG(netsurf, INFO, "unpause returned 0x%x", err); @@ -338,7 +347,7 @@ convert_script_sync_cb(hlcache_handle *script, s->already_started = true; /* continue parse */ - if (parent->parser != NULL) { + if (parent->parser != NULL && active_sync_scripts == 0) { err = dom_hubbub_parser_pause(parent->parser, false); if (err != DOM_HUBBUB_OK) { NSLOG(netsurf, INFO, "unpause returned 0x%x", err); -- cgit v1.2.3