1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-12-04 14:46:47 -05:00

[ecmascript] Try to not put_interpreter when page is modified

This commit is contained in:
Witold Filipczyk 2024-06-08 14:08:28 +02:00
parent b3f6f44eaf
commit 761752239f
5 changed files with 41 additions and 21 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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,
&current_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

View File

@ -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);

View File

@ -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;