summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Silverstone <dsilvers@digital-scurf.org>2019-12-19 20:50:33 +0000
committerDaniel Silverstone <dsilvers@digital-scurf.org>2019-12-19 20:50:33 +0000
commiteba05b0d389a83d09798099e8894e297c973ac6e (patch)
treed63710bcda3d008347c6746aac9b19d41f647991
parent918b1d0fed158fdb48a61536ff7aec7495916298 (diff)
downloadnetsurf-eba05b0d389a83d09798099e8894e297c973ac6e.tar.gz
netsurf-eba05b0d389a83d09798099e8894e297c973ac6e.tar.bz2
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 <dsilvers@digital-scurf.org>
-rw-r--r--content/handlers/html/html_script.c13
1 files 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);