diff --git a/src/document/document.c b/src/document/document.c index e6fbefecd..592aadb59 100644 --- a/src/document/document.c +++ b/src/document/document.c @@ -471,10 +471,12 @@ release_document(struct document *document) assert(document); if_assert_failed return; - if (document->refresh) kill_document_refresh(document->refresh); + if (document->refresh) { + kill_document_refresh(document->refresh); + } #if defined(CONFIG_ECMASCRIPT_SMJS) || defined(CONFIG_QUICKJS) || defined(CONFIG_MUJS) - kill_ecmascript_timeouts(document); - free_list(document->timeouts); +// kill_ecmascript_timeouts(document); +// free_list(document->timeouts); #endif object_unlock(document); move_document_to_top_of_format_cache(document); @@ -569,8 +571,8 @@ get_cached_document(struct cache_entry *cached, struct document_options *options || compare_opt(&document->options, options)) continue; - if (options->no_cache - || cached->cache_id != document->cache_id + if ( + cached->cache_id != document->cache_id || !check_document_css_magic(document)) { if (!is_object_used(document)) { add_to_document_list(&to_remove, document); diff --git a/src/document/libdom/renderer2.c b/src/document/libdom/renderer2.c index 28bd5db93..e76199a00 100644 --- a/src/document/libdom/renderer2.c +++ b/src/document/libdom/renderer2.c @@ -534,7 +534,6 @@ dump_xhtml(struct cache_entry *cached, struct document *document, int parse) return; } doc = document->dom; - in_script = 0; /* Get root element */ exc = dom_document_get_document_element(doc, &root); diff --git a/src/ecmascript/ecmascript-c.c b/src/ecmascript/ecmascript-c.c index 2bebafc49..825329a9e 100644 --- a/src/ecmascript/ecmascript-c.c +++ b/src/ecmascript/ecmascript-c.c @@ -69,29 +69,35 @@ ecmascript_protocol_handler(struct session *ses, struct uri *uri) char *redirect_url, *redirect_abs_url; struct uri *redirect_uri; - if (!doc_view) /* Blank initial document. TODO: Start at about:blank? */ + if (!doc_view) {/* Blank initial document. TODO: Start at about:blank? */ return; + } assert(doc_view->vs); - if (doc_view->vs->ecmascript_fragile) + if (doc_view->vs->ecmascript_fragile) { ecmascript_reset_state(doc_view->vs); - if (!doc_view->vs->ecmascript) + } + if (!doc_view->vs->ecmascript) { return; + } redirect_url = ecmascript_eval_stringback(doc_view->vs->ecmascript, ¤t_url); - if (!redirect_url) + if (!redirect_url) { return; + } /* XXX: This code snippet is duplicated over here, * location_set_property(), html_a() and who knows where else. */ redirect_abs_url = join_urls(doc_view->document->uri, trim_chars(redirect_url, ' ', 0)); mem_free(redirect_url); - if (!redirect_abs_url) + if (!redirect_abs_url) { return; + } redirect_uri = get_uri(redirect_abs_url, URI_NONE); mem_free(redirect_abs_url); - if (!redirect_uri) + if (!redirect_uri) { return; + } /* XXX: Is that safe to do at this point? --pasky */ goto_uri_frame(ses, redirect_uri, doc_view->name, @@ -254,8 +260,10 @@ process_snippets(struct ecmascript_interpreter *interpreter, void check_for_snippets(struct view_state *vs, struct document_options *options, struct document *document) { - if (!vs->ecmascript_fragile) + if (!vs->ecmascript_fragile) { assert(vs->ecmascript); + } + if (!options->dump && !options->gradual_rerendering) { /* We also reset the state if the underlying document changed * from the last time we did the snippets. This may be @@ -274,14 +282,13 @@ check_for_snippets(struct view_state *vs, struct document_options *options, stru * other tab when we press ^L here? */ if (vs->ecmascript_fragile || (vs->ecmascript - && vs->ecmascript->onload_snippets_cache_id - && document->cache_id != vs->ecmascript->onload_snippets_cache_id)) + && vs->ecmascript->onload_snippets_cache_id)) { ecmascript_reset_state(vs); + } /* If ecmascript_reset_state cannot construct a new * ECMAScript interpreter, it sets vs->ecmascript = * NULL and vs->ecmascript_fragile = 1. */ if (vs->ecmascript) { - vs->ecmascript->onload_snippets_cache_id = document->cache_id; /* Passing of the onload_snippets pointers * gives *_snippets() some feeling of @@ -296,6 +303,8 @@ check_for_snippets(struct view_state *vs, struct document_options *options, stru fire_onload(document->dom); check_for_rerender(vs->ecmascript, "process_snippets"); + + vs->ecmascript->onload_snippets_cache_id = 0; } } } @@ -381,18 +390,22 @@ ecmascript_reset_state(struct view_state *vs) * ecmascript_obj pointers are also NULL. However, they might * be non-NULL if the ECMAScript objects have been lazily * created because of scripts running in sibling HTML frames. */ - foreach (fv, vs->forms) + foreach (fv, vs->forms) { ecmascript_detach_form_view(fv); - for (i = 0; i < vs->form_info_len; i++) + } + for (i = 0; i < vs->form_info_len; i++) { ecmascript_detach_form_state(&vs->form_info[i]); + } vs->ecmascript_fragile = 0; - if (vs->ecmascript) + if (vs->ecmascript) { ecmascript_put_interpreter(vs->ecmascript); + } vs->ecmascript = ecmascript_get_interpreter(vs); - if (!vs->ecmascript) + if (!vs->ecmascript) { vs->ecmascript_fragile = 1; + } } int diff --git a/src/ecmascript/spidermonkey/document.cpp b/src/ecmascript/spidermonkey/document.cpp index 445090052..15dc312b3 100644 --- a/src/ecmascript/spidermonkey/document.cpp +++ b/src/ecmascript/spidermonkey/document.cpp @@ -1302,6 +1302,7 @@ document_write_do(JSContext *ctx, unsigned int argc, JS::Value *rval, int newlin } interpreter->changed = 1; interpreter->was_write = 1; + interpreter->onload_snippets_cache_id = 1; debug_dump_xhtml(document->dom); } } @@ -1812,6 +1813,10 @@ document_event_handler(dom_event *event, void *pw) } if (!strcmp("DOMContentLoaded", dom_string_data(typ))) { + if (doc_private->state == COMPLETE) { + dom_string_unref(typ); + return; + } doc_private->state = COMPLETE; } JSObject *obj_ev = getEvent(ctx, event); diff --git a/src/viewer/text/vs.c b/src/viewer/text/vs.c index 18175003b..cec094986 100644 --- a/src/viewer/text/vs.c +++ b/src/viewer/text/vs.c @@ -69,8 +69,9 @@ destroy_vs(struct view_state *vs, int blast_ecmascript) if (vs->uri) done_uri(vs->uri); #if defined(CONFIG_ECMASCRIPT_SMJS) || defined(CONFIG_QUICKJS) || defined(CONFIG_MUJS) - if (blast_ecmascript && vs->ecmascript) + if (blast_ecmascript && vs->ecmascript) { ecmascript_put_interpreter(vs->ecmascript); + } #endif if (vs->doc_view) { vs->doc_view->vs = NULL;