From 7149746eb13e2a4f4db86d54abfd98fdaebef3a0 Mon Sep 17 00:00:00 2001 From: Witold Filipczyk Date: Mon, 22 Jul 2024 18:33:56 +0200 Subject: [PATCH] [quickjs] Workaround for memory leak in anchors Check if refcnt is positive before unref node in element_finalizer. refcnt was -1. Likely it is a bug in elinks code, but it is hard to locate it. Also commented out ref|unref in element and document. Collection code also changed. Array is not prototype for collection object. --- src/ecmascript/quickjs/collection.c | 35 +- src/ecmascript/quickjs/document.c | 146 ++++---- src/ecmascript/quickjs/element.c | 495 ++++++++++++++-------------- 3 files changed, 342 insertions(+), 334 deletions(-) diff --git a/src/ecmascript/quickjs/collection.c b/src/ecmascript/quickjs/collection.c index d850f8352..6b086f3a5 100644 --- a/src/ecmascript/quickjs/collection.c +++ b/src/ecmascript/quickjs/collection.c @@ -34,7 +34,9 @@ js_htmlCollection_GetOpaque(JSValueConst this_val) { REF_JS(this_val); - return attr_find_in_map_rev(map_rev_collections, this_val); + return JS_GetOpaque(this_val, js_htmlCollection_class_id); + +// return attr_find_in_map_rev(map_rev_collections, this_val); } static void @@ -42,11 +44,14 @@ js_htmlCollection_SetOpaque(JSValueConst this_val, void *node) { REF_JS(this_val); + JS_SetOpaque(this_val, node); +#if 0 if (!node) { attr_erase_from_map_rev(map_rev_collections, this_val); } else { attr_save_in_map_rev(map_rev_collections, this_val, node); } +#endif } static @@ -59,7 +64,7 @@ void js_htmlColection_finalizer(JSRuntime *rt, JSValue val) dom_html_collection *ns = (dom_html_collection *)(js_htmlCollection_GetOpaque(val)); if (ns) { - attr_erase_from_map_str(map_collections, ns); + //attr_erase_from_map_str(map_collections, ns); dom_html_collection_unref(ns); } } @@ -321,30 +326,30 @@ getCollection(JSContext *ctx, void *node) fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); #endif static int initialized; - JSValue second; +// JSValue second; if (!initialized) { + /* collection class */ + JS_NewClassID(&js_htmlCollection_class_id); + JS_NewClass(JS_GetRuntime(ctx), js_htmlCollection_class_id, &js_htmlCollection_class); initialized = 1; } - second = attr_find_in_map(map_collections, node); +// second = attr_find_in_map(map_collections, node); - if (!JS_IsNull(second)) { - JSValue r = JS_DupValue(ctx, second); - - RETURN_JS(r); - } - /* nodelist class */ - JS_NewClassID(&js_htmlCollection_class_id); - JS_NewClass(JS_GetRuntime(ctx), js_htmlCollection_class_id, &js_htmlCollection_class); - JSValue proto = JS_NewArray(ctx); +// if (!JS_IsNull(second)) { +// JSValue r = JS_DupValue(ctx, second); +// +// RETURN_JS(r); +// } + JSValue proto = JS_NewObjectClass(ctx, js_htmlCollection_class_id); REF_JS(proto); JS_SetPropertyFunctionList(ctx, proto, js_htmlCollection_proto_funcs, countof(js_htmlCollection_proto_funcs)); JS_SetClassProto(ctx, js_htmlCollection_class_id, proto); js_htmlCollection_SetOpaque(proto, node); - js_htmlCollection_set_items(ctx, proto, node); - attr_save_in_map(map_collections, node, proto); +// js_htmlCollection_set_items(ctx, proto, node); +// attr_save_in_map(map_collections, node, proto); JSValue rr = JS_DupValue(ctx, proto); RETURN_JS(rr); diff --git a/src/ecmascript/quickjs/document.c b/src/ecmascript/quickjs/document.c index 5039fce13..9dddad1b7 100644 --- a/src/ecmascript/quickjs/document.c +++ b/src/ecmascript/quickjs/document.c @@ -114,16 +114,16 @@ js_document_get_property_anchors(JSContext *ctx, JSValueConst this_val) if (!doc) { return JS_NULL; } - dom_node_ref(doc); + //dom_node_ref(doc); dom_html_collection *anchors = NULL; dom_exception exc = dom_html_document_get_anchors(doc, &anchors); if (exc != DOM_NO_ERR || !anchors) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } JSValue rr = getCollection(ctx, anchors); - dom_node_unref(doc); + //dom_node_unref(doc); RETURN_JS(rr); } @@ -175,16 +175,16 @@ js_document_get_property_body(JSContext *ctx, JSValueConst this_val) if (!doc) { return JS_NULL; } - dom_node_ref(doc); + //dom_node_ref(doc); dom_html_element *body = NULL; dom_exception exc = dom_html_document_get_body(doc, &body); if (exc != DOM_NO_ERR || !body) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } - dom_node_unref(doc); + //dom_node_unref(doc); return getElement(ctx, body); } @@ -305,13 +305,13 @@ js_document_get_property_childNodes(JSContext *ctx, JSValueConst this_val) if (!doc) { return JS_NULL; } - dom_node_ref(doc); + //dom_node_ref(doc); dom_element *root = NULL; dom_exception exc = dom_document_get_document_element(doc, &root); if (exc != DOM_NO_ERR || !root) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } dom_nodelist *nodes = NULL; @@ -319,10 +319,10 @@ js_document_get_property_childNodes(JSContext *ctx, JSValueConst this_val) dom_node_unref(root); if (exc != DOM_NO_ERR || !nodes) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } - dom_node_unref(doc); + //dom_node_unref(doc); return getNodeList(ctx, nodes); } @@ -352,11 +352,11 @@ js_document_get_property_doctype(JSContext *ctx, JSValueConst this_val) if (!doc) { return JS_NULL; } - dom_node_ref(doc); + //dom_node_ref(doc); dom_document_type *dtd; dom_document_get_doctype(doc, &dtd); - dom_node_unref(doc); + //dom_node_unref(doc); return getDoctype(ctx, dtd); } @@ -374,16 +374,16 @@ js_document_get_property_documentElement(JSContext *ctx, JSValueConst this_val) if (!doc) { return JS_NULL; } - dom_node_ref(doc); + //dom_node_ref(doc); dom_html_element *root = NULL; dom_exception exc = dom_document_get_document_element(doc, &root); if (exc != DOM_NO_ERR || !root) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } - dom_node_unref(doc); + //dom_node_unref(doc); return getElement(ctx, root); } @@ -466,18 +466,18 @@ js_document_get_property_forms(JSContext *ctx, JSValueConst this_val) if (!doc) { return JS_NULL; } - dom_node_ref(doc); + //dom_node_ref(doc); dom_html_collection *forms = NULL; dom_exception exc = dom_html_document_get_forms(doc, &forms); if (exc != DOM_NO_ERR || !forms) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } JSValue rr = getForms(ctx, forms); JS_FreeValue(ctx, rr); - dom_node_unref(doc); + //dom_node_unref(doc); RETURN_JS(rr); } @@ -509,17 +509,17 @@ js_document_get_property_images(JSContext *ctx, JSValueConst this_val) if (!doc) { return JS_NULL; } - dom_node_ref(doc); + //dom_node_ref(doc); dom_html_collection *images = NULL; dom_exception exc = dom_html_document_get_images(doc, &images); if (exc != DOM_NO_ERR || !images) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } JSValue rr = getCollection(ctx, images); - dom_node_unref(doc); + //dom_node_unref(doc); RETURN_JS(rr); } @@ -548,16 +548,16 @@ js_document_get_property_links(JSContext *ctx, JSValueConst this_val) if (!doc) { return JS_NULL; } - dom_node_ref(doc); + //dom_node_ref(doc); dom_html_collection *links = NULL; dom_exception exc = dom_html_document_get_links(doc, &links); if (exc != DOM_NO_ERR || !links) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } JSValue rr = getCollection(ctx, links); - dom_node_unref(doc); + //dom_node_unref(doc); RETURN_JS(rr); } @@ -1131,10 +1131,10 @@ js_document_dispatchEvent(JSContext *ctx, JSValueConst this_val, int argc, JSVal if (!doc) { return JS_FALSE; } - dom_node_ref(doc); + //dom_node_ref(doc); if (argc < 1) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_FALSE; } JSValue eve = argv[0]; @@ -1149,7 +1149,7 @@ js_document_dispatchEvent(JSContext *ctx, JSValueConst this_val, int argc, JSVal if (event) { dom_event_unref(event); } - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NewBool(ctx, result); } @@ -1168,10 +1168,10 @@ js_document_removeEventListener(JSContext *ctx, JSValueConst this_val, int argc, return JS_NULL; } dom_html_document *doc = (dom_html_document *)doc_private->node; - dom_node_ref(doc); + //dom_node_ref(doc); if (argc < 2) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_UNDEFINED; } const char *str; @@ -1179,14 +1179,14 @@ js_document_removeEventListener(JSContext *ctx, JSValueConst this_val, int argc, str = JS_ToCStringLen(ctx, &len, argv[0]); if (!str) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_EXCEPTION; } char *method = stracpy(str); JS_FreeCString(ctx, str); if (!method) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_EXCEPTION; } JSValue fun = argv[1]; @@ -1211,13 +1211,13 @@ js_document_removeEventListener(JSContext *ctx, JSValueConst this_val, int argc, mem_free_set(&l->typ, NULL); mem_free(l); mem_free(method); - dom_node_unref(doc); + //dom_node_unref(doc); return JS_UNDEFINED; } } mem_free(method); - dom_node_unref(doc); + //dom_node_unref(doc); return JS_UNDEFINED; } @@ -1238,7 +1238,7 @@ js_document_createComment(JSContext *ctx, JSValueConst this_val, int argc, JSVal if (!doc) { return JS_NULL; } - dom_node_ref(doc); + //dom_node_ref(doc); dom_string *data = NULL; dom_exception exc; @@ -1248,14 +1248,14 @@ js_document_createComment(JSContext *ctx, JSValueConst this_val, int argc, JSVal str = JS_ToCStringLen(ctx, &len, argv[0]); if (!str) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_EXCEPTION; } exc = dom_string_create((const uint8_t *)str, len, &data); JS_FreeCString(ctx, str); if (exc != DOM_NO_ERR || !data) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } dom_comment *comment = NULL; @@ -1263,10 +1263,10 @@ js_document_createComment(JSContext *ctx, JSValueConst this_val, int argc, JSVal dom_string_unref(data); if (exc != DOM_NO_ERR || !comment) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } - dom_node_unref(doc); + //dom_node_unref(doc); return getElement(ctx, comment); } @@ -1287,16 +1287,16 @@ js_document_createDocumentFragment(JSContext *ctx, JSValueConst this_val, int ar if (!doc) { return JS_NULL; } - dom_node_ref(doc); + //dom_node_ref(doc); dom_document_fragment *fragment = NULL; dom_exception exc = dom_document_create_document_fragment(doc, &fragment); if (exc != DOM_NO_ERR || !fragment) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } - dom_node_unref(doc); + //dom_node_unref(doc); return getElement(ctx, fragment); } @@ -1317,7 +1317,7 @@ js_document_createElement(JSContext *ctx, JSValueConst this_val, int argc, JSVal if (!doc) { return JS_NULL; } - dom_node_ref(doc); + //dom_node_ref(doc); dom_string *tag_name = NULL; dom_exception exc; @@ -1327,14 +1327,14 @@ js_document_createElement(JSContext *ctx, JSValueConst this_val, int argc, JSVal str = JS_ToCStringLen(ctx, &len, argv[0]); if (!str) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_EXCEPTION; } exc = dom_string_create((const uint8_t *)str, len, &tag_name); JS_FreeCString(ctx, str); if (exc != DOM_NO_ERR || !tag_name) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } dom_element *element = NULL; @@ -1342,10 +1342,10 @@ js_document_createElement(JSContext *ctx, JSValueConst this_val, int argc, JSVal dom_string_unref(tag_name); if (exc != DOM_NO_ERR || !element) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } - dom_node_unref(doc); + //dom_node_unref(doc); return getElement(ctx, element); } @@ -1366,7 +1366,7 @@ js_document_createTextNode(JSContext *ctx, JSValueConst this_val, int argc, JSVa if (!doc) { return JS_NULL; } - dom_node_ref(doc); + //dom_node_ref(doc); dom_string *data = NULL; dom_exception exc; @@ -1376,14 +1376,14 @@ js_document_createTextNode(JSContext *ctx, JSValueConst this_val, int argc, JSVa str = JS_ToCStringLen(ctx, &len, argv[0]); if (!str) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_EXCEPTION; } exc = dom_string_create((const uint8_t *)str, len, &data); JS_FreeCString(ctx, str); if (exc != DOM_NO_ERR || !data) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } dom_text *text_node = NULL; @@ -1391,10 +1391,10 @@ js_document_createTextNode(JSContext *ctx, JSValueConst this_val, int argc, JSVa dom_string_unref(data); if (exc != DOM_NO_ERR || !text_node) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } - dom_node_unref(doc); + //dom_node_unref(doc); return getElement(ctx, text_node); } @@ -1415,7 +1415,7 @@ js_document_getElementById(JSContext *ctx, JSValueConst this_val, int argc, JSVa if (!doc) { return JS_NULL; } - dom_node_ref(doc); + //dom_node_ref(doc); dom_string *id = NULL; dom_exception exc; @@ -1425,14 +1425,14 @@ js_document_getElementById(JSContext *ctx, JSValueConst this_val, int argc, JSVa str = JS_ToCStringLen(ctx, &len, argv[0]); if (!str) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_EXCEPTION; } exc = dom_string_create((const uint8_t *)str, len, &id); JS_FreeCString(ctx, str); if (exc != DOM_NO_ERR || !id) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } dom_element *element = NULL; @@ -1440,10 +1440,10 @@ js_document_getElementById(JSContext *ctx, JSValueConst this_val, int argc, JSVa dom_string_unref(id); if (exc != DOM_NO_ERR || !element) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } - dom_node_unref(doc); + //dom_node_unref(doc); return getElement(ctx, element); } @@ -1543,7 +1543,7 @@ js_document_getElementsByTagName(JSContext *ctx, JSValueConst this_val, int argc if (!doc) { return JS_NULL; } - dom_node_ref(doc); + //dom_node_ref(doc); dom_string *tagname = NULL; dom_exception exc; @@ -1553,14 +1553,14 @@ js_document_getElementsByTagName(JSContext *ctx, JSValueConst this_val, int argc str = JS_ToCStringLen(ctx, &len, argv[0]); if (!str) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_EXCEPTION; } exc = dom_string_create((const uint8_t *)str, len, &tagname); JS_FreeCString(ctx, str); if (exc != DOM_NO_ERR || !tagname) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } dom_nodelist *nodes = NULL; @@ -1568,11 +1568,11 @@ js_document_getElementsByTagName(JSContext *ctx, JSValueConst this_val, int argc dom_string_unref(tagname); if (exc != DOM_NO_ERR || !nodes) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } JSValue rr = getNodeList(ctx, nodes); - dom_node_unref(doc); + //dom_node_unref(doc); RETURN_JS(rr); } @@ -1593,21 +1593,21 @@ js_document_querySelector(JSContext *ctx, JSValueConst this_val, int argc, JSVal if (!doc) { return JS_NULL; } - dom_node_ref(doc); + //dom_node_ref(doc); dom_node *root = NULL; /* root element of document */ /* Get root element */ dom_exception exc = dom_document_get_document_element(doc, &root); if (exc != DOM_NO_ERR) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } size_t len; const char *selector = JS_ToCStringLen(ctx, &len, argv[0]); if (!selector) { - dom_node_unref(doc); + //dom_node_unref(doc); dom_node_unref(root); return JS_NULL; } @@ -1616,10 +1616,10 @@ js_document_querySelector(JSContext *ctx, JSValueConst this_val, int argc, JSVal dom_node_unref(root); if (!ret) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } - dom_node_unref(doc); + //dom_node_unref(doc); return getElement(ctx, ret); } @@ -1640,20 +1640,20 @@ js_document_querySelectorAll(JSContext *ctx, JSValueConst this_val, int argc, JS if (!doc) { return JS_NULL; } - dom_node_ref(doc); + //dom_node_ref(doc); dom_node *doc_root = NULL; /* root element of document */ /* Get root element */ dom_exception exc = dom_document_get_document_element(doc, &doc_root); if (exc != DOM_NO_ERR) { - dom_node_unref(doc); + //dom_node_unref(doc); return JS_NULL; } size_t len; const char *selector = JS_ToCStringLen(ctx, &len, argv[0]); if (!selector) { - dom_node_unref(doc); + //dom_node_unref(doc); dom_node_unref(doc_root); return JS_NULL; } @@ -1662,7 +1662,7 @@ js_document_querySelectorAll(JSContext *ctx, JSValueConst this_val, int argc, JS exc = dom_string_create((const uint8_t *)"B", 1, &tag_name); if (exc != DOM_NO_ERR || !tag_name) { - dom_node_unref(doc); + //dom_node_unref(doc); dom_node_unref(doc_root); JS_FreeCString(ctx, selector); return JS_NULL; @@ -1672,7 +1672,7 @@ js_document_querySelectorAll(JSContext *ctx, JSValueConst this_val, int argc, JS dom_string_unref(tag_name); if (exc != DOM_NO_ERR || !element) { - dom_node_unref(doc); + //dom_node_unref(doc); dom_node_unref(doc_root); JS_FreeCString(ctx, selector); return JS_NULL; @@ -1680,7 +1680,7 @@ js_document_querySelectorAll(JSContext *ctx, JSValueConst this_val, int argc, JS LIST_OF(struct selector_node) *result_list = (LIST_OF(struct selector_node) *)mem_calloc(1, sizeof(*result_list)); if (!result_list) { - dom_node_unref(doc); + //dom_node_unref(doc); dom_node_unref(doc_root); JS_FreeCString(ctx, selector); return JS_NULL; @@ -1690,7 +1690,7 @@ js_document_querySelectorAll(JSContext *ctx, JSValueConst this_val, int argc, JS walk_tree_query_append((dom_node *)element, doc_root, selector, 0, result_list); dom_node_unref(doc_root); JS_FreeCString(ctx, selector); - dom_node_unref(doc); + //dom_node_unref(doc); return getNodeList2(ctx, result_list); } diff --git a/src/ecmascript/quickjs/element.c b/src/ecmascript/quickjs/element.c index 3ed225ee4..df0755b79 100644 --- a/src/ecmascript/quickjs/element.c +++ b/src/ecmascript/quickjs/element.c @@ -104,16 +104,16 @@ js_element_get_property_attributes(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_node_get_attributes(el, &attrs); if (exc != DOM_NO_ERR || !attrs) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } JSValue rr = getAttributes(ctx, attrs); JS_FreeValue(ctx, rr); - dom_node_unref(el); + //dom_node_unref(el); RETURN_JS(rr); } @@ -149,18 +149,18 @@ js_element_get_property_checked(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_UNDEFINED; } - dom_node_ref(el); + //dom_node_ref(el); offset = find_offset(doc->element_map_rev, el); if (offset < 0) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } linknum = get_link_number_by_offset(doc, offset); if (linknum < 0) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -168,7 +168,7 @@ js_element_get_property_checked(JSContext *ctx, JSValueConst this_val) fc = get_link_form_control(link); if (!fc) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } fs = find_form_state(doc_view, fc); @@ -177,10 +177,10 @@ js_element_get_property_checked(JSContext *ctx, JSValueConst this_val) #ifdef ECMASCRIPT_DEBUG fprintf(stderr, "%s:%s %d\n", __FILE__, __FUNCTION__, __LINE__); #endif - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; /* detached */ } - dom_node_unref(el); + //dom_node_unref(el); return JS_NewBool(ctx, fs->state); } @@ -216,18 +216,18 @@ js_element_set_property_checked(JSContext *ctx, JSValueConst this_val, JSValue v if (!el) { return JS_UNDEFINED; } - dom_node_ref(el); + //dom_node_ref(el); offset = find_offset(doc->element_map_rev, el); if (offset < 0) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } linknum = get_link_number_by_offset(doc, offset); if (linknum < 0) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -235,22 +235,22 @@ js_element_set_property_checked(JSContext *ctx, JSValueConst this_val, JSValue v fc = get_link_form_control(link); if (!fc) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } fs = find_form_state(doc_view, fc); if (!fs) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } if (fc->type != FC_CHECKBOX && fc->type != FC_RADIO) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } fs->state = JS_ToBool(ctx, val); - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -270,15 +270,15 @@ js_element_get_property_children(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_node_get_child_nodes(el, &nodes); if (exc != DOM_NO_ERR || !nodes) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } JSValue rr = getNodeList(ctx, nodes); - dom_node_unref(el); + //dom_node_unref(el); RETURN_JS(rr); } @@ -299,16 +299,16 @@ js_element_get_property_childElementCount(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_node_get_child_nodes(el, &nodes); if (exc != DOM_NO_ERR || !nodes) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } exc = dom_nodelist_get_length(nodes, &res); dom_nodelist_unref(nodes); - dom_node_unref(el); + //dom_node_unref(el); return JS_NewUint32(ctx, res); } @@ -328,15 +328,15 @@ js_element_get_property_childNodes(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_node_get_child_nodes(el, &nodes); if (exc != DOM_NO_ERR || !nodes) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } JSValue rr = getNodeList(ctx, nodes); - dom_node_unref(el); + //dom_node_unref(el); RETURN_JS(rr); } @@ -354,10 +354,10 @@ js_element_get_property_classList(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); dom_tokenlist *tl = NULL; dom_exception exc = dom_tokenlist_create(el, corestring_dom_class, &tl); - dom_node_unref(el); + //dom_node_unref(el); if (exc != DOM_NO_ERR || !tl) { return JS_NULL; @@ -382,12 +382,12 @@ js_element_get_property_className(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_html_element_get_class_name(el, &classstr); if (exc != DOM_NO_ERR) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } if (!classstr) { @@ -396,7 +396,7 @@ js_element_get_property_className(JSContext *ctx, JSValueConst this_val) r = JS_NewStringLen(ctx, dom_string_data(classstr), dom_string_length(classstr)); dom_string_unref(classstr); } - dom_node_unref(el); + //dom_node_unref(el); RETURN_JS(r); } @@ -564,11 +564,11 @@ js_element_get_property_dir(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_element_get_attribute(el, corestring_dom_dir, &dir); if (exc != DOM_NO_ERR) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } if (!dir) { @@ -581,7 +581,7 @@ js_element_get_property_dir(JSContext *ctx, JSValueConst this_val) } dom_string_unref(dir); } - dom_node_unref(el); + //dom_node_unref(el); RETURN_JS(r); } @@ -601,14 +601,14 @@ js_element_get_property_firstChild(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_node_get_first_child(el, &node); if (exc != DOM_NO_ERR || !node) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } - dom_node_unref(el); + //dom_node_unref(el); return getElement(ctx, node); } @@ -630,18 +630,18 @@ js_element_get_property_firstElementChild(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_node_get_child_nodes(el, &nodes); if (exc != DOM_NO_ERR || !nodes) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } exc = dom_nodelist_get_length(nodes, &size); if (exc != DOM_NO_ERR || !size) { dom_nodelist_unref(nodes); - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } @@ -658,13 +658,13 @@ js_element_get_property_firstElementChild(JSContext *ctx, JSValueConst this_val) if (exc == DOM_NO_ERR && type == DOM_ELEMENT_NODE) { dom_nodelist_unref(nodes); - dom_node_unref(el); + //dom_node_unref(el); return getElement(ctx, child); } dom_node_unref(child); } dom_nodelist_unref(nodes); - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } @@ -685,11 +685,11 @@ js_element_get_property_href(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_element_get_attribute(el, corestring_dom_href, &href); if (exc != DOM_NO_ERR) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } if (!href) { @@ -698,7 +698,7 @@ js_element_get_property_href(JSContext *ctx, JSValueConst this_val) r = JS_NewStringLen(ctx, dom_string_data(href), dom_string_length(href)); dom_string_unref(href); } - dom_node_unref(el); + //dom_node_unref(el); RETURN_JS(r); } @@ -719,11 +719,11 @@ js_element_get_property_id(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_element_get_attribute(el, corestring_dom_id, &id); if (exc != DOM_NO_ERR) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } if (!id) { @@ -732,7 +732,7 @@ js_element_get_property_id(JSContext *ctx, JSValueConst this_val) r = JS_NewStringLen(ctx, dom_string_data(id), dom_string_length(id)); dom_string_unref(id); } - dom_node_unref(el); + //dom_node_unref(el); RETURN_JS(r); } @@ -753,11 +753,11 @@ js_element_get_property_lang(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_element_get_attribute(el, corestring_dom_lang, &lang); if (exc != DOM_NO_ERR) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } if (!lang) { @@ -766,7 +766,7 @@ js_element_get_property_lang(JSContext *ctx, JSValueConst this_val) r = JS_NewStringLen(ctx, dom_string_data(lang), dom_string_length(lang)); dom_string_unref(lang); } - dom_node_unref(el); + //dom_node_unref(el); RETURN_JS(r); } @@ -786,14 +786,14 @@ js_element_get_property_lastChild(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_node_get_last_child(el, &last_child); if (exc != DOM_NO_ERR || !last_child) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } - dom_node_unref(el); + //dom_node_unref(el); return getElement(ctx, last_child); } @@ -815,18 +815,18 @@ js_element_get_property_lastElementChild(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_node_get_child_nodes(el, &nodes); if (exc != DOM_NO_ERR || !nodes) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } exc = dom_nodelist_get_length(nodes, &size); if (exc != DOM_NO_ERR || !size) { dom_nodelist_unref(nodes); - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } @@ -842,13 +842,13 @@ js_element_get_property_lastElementChild(JSContext *ctx, JSValueConst this_val) if (exc == DOM_NO_ERR && type == DOM_ELEMENT_NODE) { dom_nodelist_unref(nodes); - dom_node_unref(el); + //dom_node_unref(el); return getElement(ctx, child); } dom_node_unref(child); } dom_nodelist_unref(nodes); - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } @@ -868,7 +868,7 @@ js_element_get_property_nextElementSibling(JSContext *ctx, JSValueConst this_val if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); node = el; while (true) { @@ -886,7 +886,7 @@ js_element_get_property_nextElementSibling(JSContext *ctx, JSValueConst this_val exc = dom_node_get_node_type(next, &type); if (exc == DOM_NO_ERR && type == DOM_ELEMENT_NODE) { - dom_node_unref(el); + //dom_node_unref(el); return getElement(ctx, next); } prev_next = next; @@ -913,18 +913,18 @@ js_element_get_property_nodeName(JSContext *ctx, JSValueConst this_val) r = JS_NewStringLen(ctx, "", 0); RETURN_JS(r); } - dom_node_ref(node); + //dom_node_ref(node); exc = dom_node_get_node_name(node, &name); if (exc != DOM_NO_ERR || !name) { r = JS_NewStringLen(ctx, "", 0); - dom_node_unref(node); + //dom_node_unref(node); RETURN_JS(r); } r = JS_NewStringLen(ctx, dom_string_data(name), dom_string_length(name)); dom_string_unref(name); - dom_node_unref(node); + //dom_node_unref(node); RETURN_JS(r); } @@ -944,14 +944,14 @@ js_element_get_property_nodeType(JSContext *ctx, JSValueConst this_val) if (!node) { return JS_NULL; } - dom_node_ref(node); + //dom_node_ref(node); exc = dom_node_get_node_type(node, &type); if (exc == DOM_NO_ERR) { - dom_node_unref(node); + //dom_node_unref(node); return JS_NewUint32(ctx, type); } - dom_node_unref(node); + //dom_node_unref(node); return JS_NULL; } @@ -972,16 +972,16 @@ js_element_get_property_nodeValue(JSContext *ctx, JSValueConst this_val) if (!node) { return JS_NULL; } - dom_node_ref(node); + //dom_node_ref(node); exc = dom_node_get_node_value(node, &content); if (exc != DOM_NO_ERR || !content) { - dom_node_unref(node); + //dom_node_unref(node); return JS_NULL; } r = JS_NewStringLen(ctx, dom_string_data(content), dom_string_length(content)); dom_string_unref(content); - dom_node_unref(node); + //dom_node_unref(node); RETURN_JS(r); } @@ -1001,14 +1001,14 @@ js_element_get_property_nextSibling(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_node_get_next_sibling(el, &node); if (exc != DOM_NO_ERR || !node) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } - dom_node_unref(el); + //dom_node_unref(el); return getElement(ctx, node); } @@ -1095,14 +1095,14 @@ js_element_get_property_offsetParent(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_node_get_parent_node(el, &node); if (exc != DOM_NO_ERR || !node) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } - dom_node_unref(el); + //dom_node_unref(el); return getElement(ctx, node); } @@ -1204,14 +1204,14 @@ js_element_get_property_parentElement(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_node_get_parent_node(el, &node); if (exc != DOM_NO_ERR || !node) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } - dom_node_unref(el); + //dom_node_unref(el); return getElement(ctx, node); } @@ -1230,14 +1230,14 @@ js_element_get_property_parentNode(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_node_get_parent_node(el, &node); if (exc != DOM_NO_ERR || !node) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } - dom_node_unref(el); + //dom_node_unref(el); return getElement(ctx, node); } @@ -1257,7 +1257,7 @@ js_element_get_property_previousElementSibling(JSContext *ctx, JSValueConst this if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); node = el; while (true) { @@ -1275,13 +1275,13 @@ js_element_get_property_previousElementSibling(JSContext *ctx, JSValueConst this exc = dom_node_get_node_type(prev, &type); if (exc == DOM_NO_ERR && type == DOM_ELEMENT_NODE) { - dom_node_unref(el); + //dom_node_unref(el); return getElement(ctx, prev); } prev_prev = prev; node = prev; } - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } @@ -1300,14 +1300,14 @@ js_element_get_property_previousSibling(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_node_get_previous_sibling(el, &node); if (exc != DOM_NO_ERR || !node) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } - dom_node_unref(el); + //dom_node_unref(el); return getElement(ctx, node); } @@ -1343,17 +1343,17 @@ js_element_get_property_tagName(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); dom_string *tag_name = NULL; dom_exception exc = dom_node_get_node_name(el, &tag_name); if (exc != DOM_NO_ERR || !tag_name) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } r = JS_NewStringLen(ctx, dom_string_data(tag_name), dom_string_length(tag_name)); dom_string_unref(tag_name); - dom_node_unref(el); + //dom_node_unref(el); RETURN_JS(r); } @@ -1374,11 +1374,11 @@ js_element_get_property_title(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_element_get_attribute(el, corestring_dom_title, &title); if (exc != DOM_NO_ERR) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } if (!title) { @@ -1387,7 +1387,7 @@ js_element_get_property_title(JSContext *ctx, JSValueConst this_val) r = JS_NewStringLen(ctx, dom_string_data(title), dom_string_length(title)); dom_string_unref(title); } - dom_node_unref(el); + //dom_node_unref(el); RETURN_JS(r); } @@ -1424,17 +1424,17 @@ js_element_get_property_value(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_UNDEFINED; } - dom_node_ref(el); + //dom_node_ref(el); offset = find_offset(doc->element_map_rev, el); if (offset < 0) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } linknum = get_link_number_by_offset(doc, offset); if (linknum < 0) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -1442,17 +1442,17 @@ js_element_get_property_value(JSContext *ctx, JSValueConst this_val) fc = get_link_form_control(link); if (!fc) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } fs = find_form_state(doc_view, fc); if (!fs) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } r = JS_NewString(ctx, fs->value); - dom_node_unref(el); + //dom_node_unref(el); RETURN_JS(r); } @@ -1470,17 +1470,17 @@ js_element_get_property_innerHtml(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); struct string buf; if (!init_string(&buf)) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } ecmascript_walk_tree(&buf, el, true, false); JSValue ret = JS_NewStringLen(ctx, buf.source, buf.length); done_string(&buf); - dom_node_unref(el); + //dom_node_unref(el); RETURN_JS(ret); } @@ -1498,17 +1498,17 @@ js_element_get_property_outerHtml(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); struct string buf; if (!init_string(&buf)) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } ecmascript_walk_tree(&buf, el, false, false); JSValue ret = JS_NewStringLen(ctx, buf.source, buf.length); done_string(&buf); - dom_node_unref(el); + //dom_node_unref(el); RETURN_JS(ret); } @@ -1526,17 +1526,17 @@ js_element_get_property_textContent(JSContext *ctx, JSValueConst this_val) if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); dom_string *content = NULL; dom_exception exc = dom_node_get_text_content(el, &content); if (exc != DOM_NO_ERR || !content) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } JSValue ret = JS_NewStringLen(ctx, dom_string_data(content), dom_string_length(content)); dom_string_unref(content); - dom_node_unref(el); + //dom_node_unref(el); RETURN_JS(ret); } @@ -1558,12 +1558,12 @@ js_element_set_property_className(JSContext *ctx, JSValueConst this_val, JSValue if (!el) { return JS_UNDEFINED; } - dom_node_ref(el); + //dom_node_ref(el); size_t len; const char *str = JS_ToCStringLen(ctx, &len, val); if (!str) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } exc = dom_string_create((const uint8_t *)str, len, &classstr); @@ -1574,7 +1574,7 @@ js_element_set_property_className(JSContext *ctx, JSValueConst this_val, JSValue dom_string_unref(classstr); } JS_FreeCString(ctx, str); - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -1595,12 +1595,12 @@ js_element_set_property_dir(JSContext *ctx, JSValueConst this_val, JSValue val) if (!el) { return JS_UNDEFINED; } - dom_node_ref(el); + //dom_node_ref(el); size_t len; const char *str = JS_ToCStringLen(ctx, &len, val); if (!str) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } if (!strcmp(str, "ltr") || !strcmp(str, "rtl") || !strcmp(str, "auto")) { @@ -1614,7 +1614,7 @@ js_element_set_property_dir(JSContext *ctx, JSValueConst this_val, JSValue val) } } JS_FreeCString(ctx, str); - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -1636,12 +1636,12 @@ js_element_set_property_href(JSContext *ctx, JSValueConst this_val, JSValue val) if (!el) { return JS_UNDEFINED; } - dom_node_ref(el); + //dom_node_ref(el); size_t len; const char *str = JS_ToCStringLen(ctx, &len, val); if (!str) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } exc = dom_string_create((const uint8_t *)str, len, &hrefstr); @@ -1652,7 +1652,7 @@ js_element_set_property_href(JSContext *ctx, JSValueConst this_val, JSValue val) dom_string_unref(hrefstr); } JS_FreeCString(ctx, str); - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -1674,12 +1674,12 @@ js_element_set_property_id(JSContext *ctx, JSValueConst this_val, JSValue val) if (!el) { return JS_UNDEFINED; } - dom_node_ref(el); + //dom_node_ref(el); size_t len; const char *str = JS_ToCStringLen(ctx, &len, val); if (!str) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } exc = dom_string_create((const uint8_t *)str, len, &idstr); @@ -1690,7 +1690,7 @@ js_element_set_property_id(JSContext *ctx, JSValueConst this_val, JSValue val) dom_string_unref(idstr); } JS_FreeCString(ctx, str); - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -1710,13 +1710,13 @@ js_element_set_property_innerHtml(JSContext *ctx, JSValueConst this_val, JSValue if (!el) { return JS_UNDEFINED; } - dom_node_ref(el); + //dom_node_ref(el); size_t size; const char *s = JS_ToCStringLen(ctx, &size, val); if (!s) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } dom_hubbub_parser_params parse_params; @@ -1831,7 +1831,7 @@ out: } JS_FreeCString(ctx, s); interpreter->changed = 1; - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -1862,13 +1862,13 @@ js_element_set_property_lang(JSContext *ctx, JSValueConst this_val, JSValue val) if (!el) { return JS_UNDEFINED; } - dom_node_ref(el); + //dom_node_ref(el); size_t len; const char *str = JS_ToCStringLen(ctx, &len, val); if (!str) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } exc = dom_string_create((const uint8_t *)str, len, &langstr); @@ -1879,7 +1879,7 @@ js_element_set_property_lang(JSContext *ctx, JSValueConst this_val, JSValue val) dom_string_unref(langstr); } JS_FreeCString(ctx, str); - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -1902,19 +1902,19 @@ js_element_set_property_outerHtml(JSContext *ctx, JSValueConst this_val, JSValue if (!el) { return JS_UNDEFINED; } - dom_node_ref(el); + //dom_node_ref(el); dom_node *parent = NULL; dom_exception exc = dom_node_get_parent_node(el, &parent); if (exc != DOM_NO_ERR) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } size_t size; const char *s = JS_ToCStringLen(ctx, &size, val); if (!s) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } struct dom_node *cref = NULL; @@ -2024,7 +2024,7 @@ out: dom_node_unref(parent); JS_FreeCString(ctx, s); interpreter->changed = 1; - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -2043,12 +2043,12 @@ js_element_set_property_textContent(JSContext *ctx, JSValueConst this_val, JSVal if (!el) { return JS_UNDEFINED; } - dom_node_ref(el); + //dom_node_ref(el); size_t len; const char *str = JS_ToCStringLen(ctx, &len, val); if (!str) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } dom_string *content = NULL; @@ -2056,12 +2056,12 @@ js_element_set_property_textContent(JSContext *ctx, JSValueConst this_val, JSVal JS_FreeCString(ctx, str); if (exc != DOM_NO_ERR || !content) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } exc = dom_node_set_text_content(el, content); dom_string_unref(content); - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -2083,12 +2083,12 @@ js_element_set_property_title(JSContext *ctx, JSValueConst this_val, JSValue val if (!el) { return JS_UNDEFINED; } - dom_node_ref(el); + //dom_node_ref(el); size_t len; const char *str = JS_ToCStringLen(ctx, &len, val); if (!str) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } exc = dom_string_create((const uint8_t *)str, len, &titlestr); @@ -2099,7 +2099,7 @@ js_element_set_property_title(JSContext *ctx, JSValueConst this_val, JSValue val dom_string_unref(titlestr); } JS_FreeCString(ctx, str); - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -2135,17 +2135,17 @@ js_element_set_property_value(JSContext *ctx, JSValueConst this_val, JSValue val if (!el) { return JS_UNDEFINED; } - dom_node_ref(el); + //dom_node_ref(el); offset = find_offset(doc->element_map_rev, el); if (offset < 0) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } linknum = get_link_number_by_offset(doc, offset); if (linknum < 0) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -2153,13 +2153,13 @@ js_element_set_property_value(JSContext *ctx, JSValueConst this_val, JSValue val fc = get_link_form_control(link); if (!fc) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } fs = find_form_state(doc_view, fc); if (!fs) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -2171,7 +2171,7 @@ js_element_set_property_value(JSContext *ctx, JSValueConst this_val, JSValue val str = JS_ToCStringLen(ctx, &len, val); if (!str) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } @@ -2184,7 +2184,7 @@ js_element_set_property_value(JSContext *ctx, JSValueConst this_val, JSValue val fs->state = strlen(fs->value); } } - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -2222,10 +2222,10 @@ js_element_dispatchEvent(JSContext *ctx, JSValueConst this_val, int argc, JSValu if (!el) { return JS_FALSE; } - dom_node_ref(el); + //dom_node_ref(el); if (argc < 1) { - dom_node_unref(el); + //dom_node_unref(el); return JS_FALSE; } JSValue eve = argv[0]; @@ -2241,7 +2241,7 @@ js_element_dispatchEvent(JSContext *ctx, JSValueConst this_val, int argc, JSValu if (event) { dom_event_unref(event); } - dom_node_unref(el); + //dom_node_unref(el); return JS_NewBool(ctx, result); } @@ -2264,10 +2264,10 @@ js_element_addEventListener(JSContext *ctx, JSValueConst this_val, int argc, JSV if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); if (argc < 2) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } const char *str; @@ -2275,14 +2275,14 @@ js_element_addEventListener(JSContext *ctx, JSValueConst this_val, int argc, JSV str = JS_ToCStringLen(ctx, &len, argv[0]); if (!str) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } char *method = stracpy(str); JS_FreeCString(ctx, str); if (!method) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } JSValue fun = argv[1]; @@ -2301,7 +2301,7 @@ js_element_addEventListener(JSContext *ctx, JSValueConst this_val, int argc, JSV struct element_listener *n = (struct element_listener *)mem_calloc(1, sizeof(*n)); if (!n) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } n->fun = JS_DupValue(ctx, fun); @@ -2315,7 +2315,7 @@ js_element_addEventListener(JSContext *ctx, JSValueConst this_val, int argc, JSV exc = dom_event_listener_create(element_event_handler, el_private, &el_private->listener); if (exc != DOM_NO_ERR || !el_private->listener) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } } @@ -2336,7 +2336,7 @@ ex: dom_string_unref(typ); } dom_event_listener_unref(el_private->listener); - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -2359,10 +2359,10 @@ js_element_removeEventListener(JSContext *ctx, JSValueConst this_val, int argc, if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); if (argc < 2) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } const char *str; @@ -2370,14 +2370,14 @@ js_element_removeEventListener(JSContext *ctx, JSValueConst this_val, int argc, str = JS_ToCStringLen(ctx, &len, argv[0]); if (!str) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } char *method = stracpy(str); JS_FreeCString(ctx, str); if (!method) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } JSValue fun = argv[1]; @@ -2404,13 +2404,13 @@ js_element_removeEventListener(JSContext *ctx, JSValueConst this_val, int argc, mem_free_set(&l->typ, NULL); mem_free(l); mem_free(method); - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } } mem_free(method); - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -2435,22 +2435,22 @@ js_element_appendChild(JSContext *ctx, JSValueConst this_val, int argc, JSValueC if (!el) { return JS_EXCEPTION; } - dom_node_ref(el); + //dom_node_ref(el); dom_node *el2 = (dom_node *)(js_getopaque(argv[0], js_element_class_id)); if (!el2) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } exc = dom_node_append_child(el, el2, &res); if (exc == DOM_NO_ERR && res) { interpreter->changed = 1; - dom_node_unref(el); + //dom_node_unref(el); return getElement(ctx, res); } - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } @@ -2498,17 +2498,17 @@ js_element_click(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst * if (!el) { return JS_UNDEFINED; } - dom_node_ref(el); + //dom_node_ref(el); offset = find_offset(doc->element_map_rev, el); if (offset < 0) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } linknum = get_link_number_by_offset(doc, offset); if (linknum < 0) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } ses = doc_view->session; @@ -2519,7 +2519,7 @@ js_element_click(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst * } else { print_screen_status(ses); } - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -2543,7 +2543,7 @@ js_element_cloneNode(JSContext *ctx, JSValueConst this_val, int argc, JSValueCon if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); dom_exception exc; bool deep = JS_ToBool(ctx, argv[0]); @@ -2551,10 +2551,10 @@ js_element_cloneNode(JSContext *ctx, JSValueConst this_val, int argc, JSValueCon exc = dom_node_clone_node(el, deep, &clone); if (exc != DOM_NO_ERR || !clone) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } - dom_node_unref(el); + //dom_node_unref(el); return getElement(ctx, clone); } @@ -2675,18 +2675,18 @@ js_element_contains(JSContext *ctx, JSValueConst this_val, int argc, JSValueCons if (!el) { return JS_FALSE; } - dom_node_ref(el); + //dom_node_ref(el); dom_node *el2 = (dom_node *)(js_getopaque(argv[0], js_element_class_id)); if (!el2) { - dom_node_unref(el); + //dom_node_unref(el); return JS_FALSE; } dom_node_ref(el2); while (1) { if (el == el2) { - dom_node_unref(el); + //dom_node_unref(el); dom_node_unref(el2); return JS_TRUE; } @@ -2694,7 +2694,7 @@ js_element_contains(JSContext *ctx, JSValueConst this_val, int argc, JSValueCons dom_exception exc = dom_node_get_parent_node(el2, &node); if (exc != DOM_NO_ERR || !node) { - dom_node_unref(el); + //dom_node_unref(el); dom_node_unref(el2); return JS_FALSE; } @@ -2731,21 +2731,21 @@ js_element_focus(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst * if (!el) { return JS_UNDEFINED; } - dom_node_ref(el); + //dom_node_ref(el); offset = find_offset(doc->element_map_rev, el); if (offset < 0) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } linknum = get_link_number_by_offset(doc, offset); if (linknum < 0) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } jump_to_link_number(doc_view->session, doc_view, linknum); - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -2773,12 +2773,12 @@ js_element_getAttribute(JSContext *ctx, JSValueConst this_val, int argc, JSValue if (!el) { return JS_FALSE; } - dom_node_ref(el); + //dom_node_ref(el); size_t len; const char *str = JS_ToCStringLen(ctx, &len, argv[0]); if (!str) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } @@ -2786,7 +2786,7 @@ js_element_getAttribute(JSContext *ctx, JSValueConst this_val, int argc, JSValue JS_FreeCString(ctx, str); if (exc != DOM_NO_ERR || !attr_name) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } @@ -2794,12 +2794,12 @@ js_element_getAttribute(JSContext *ctx, JSValueConst this_val, int argc, JSValue dom_string_unref(attr_name); if (exc != DOM_NO_ERR || !attr_value) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } r = JS_NewStringLen(ctx, dom_string_data(attr_value), dom_string_length(attr_value)); dom_string_unref(attr_value); - dom_node_unref(el); + //dom_node_unref(el); RETURN_JS(r); } @@ -2826,28 +2826,28 @@ js_element_getAttributeNode(JSContext *ctx, JSValueConst this_val, int argc, JSV if (!el) { return JS_UNDEFINED; } - dom_node_ref(el); + //dom_node_ref(el); size_t len; const char *str = JS_ToCStringLen(ctx, &len, argv[0]); if (!str) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } exc = dom_string_create((const uint8_t *)str, len, &attr_name); JS_FreeCString(ctx, str); if (exc != DOM_NO_ERR || !attr_name) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } exc = dom_element_get_attribute_node(el, attr_name, &attr); if (exc != DOM_NO_ERR || !attr) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } - dom_node_unref(el); + //dom_node_unref(el); return getAttr(ctx, attr); } @@ -2881,14 +2881,14 @@ js_element_getElementsByTagName(JSContext *ctx, JSValueConst this_val, int argc, if (!el) { return JS_UNDEFINED; } - dom_node_ref(el); + //dom_node_ref(el); const char *str; size_t len; str = JS_ToCStringLen(ctx, &len, argv[0]); if (!str) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } dom_nodelist *nlist = NULL; @@ -2899,7 +2899,7 @@ js_element_getElementsByTagName(JSContext *ctx, JSValueConst this_val, int argc, JS_FreeCString(ctx, str); if (exc != DOM_NO_ERR || !tagname) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } @@ -2907,11 +2907,11 @@ js_element_getElementsByTagName(JSContext *ctx, JSValueConst this_val, int argc, dom_string_unref(tagname); if (exc != DOM_NO_ERR || !nlist) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } JSValue rr = getNodeList(ctx, nlist); - dom_node_unref(el); + //dom_node_unref(el); RETURN_JS(rr); } @@ -2935,12 +2935,12 @@ js_element_hasAttribute(JSContext *ctx, JSValueConst this_val, int argc, JSValue if (!el) { return JS_FALSE; } - dom_node_ref(el); + //dom_node_ref(el); size_t slen; const char *s = JS_ToCStringLen(ctx, &slen, argv[0]); if (!s) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } dom_string *attr_name = NULL; @@ -2950,7 +2950,7 @@ js_element_hasAttribute(JSContext *ctx, JSValueConst this_val, int argc, JSValue JS_FreeCString(ctx, s); if (exc != DOM_NO_ERR) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } @@ -2958,10 +2958,10 @@ js_element_hasAttribute(JSContext *ctx, JSValueConst this_val, int argc, JSValue dom_string_unref(attr_name); if (exc != DOM_NO_ERR) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } - dom_node_unref(el); + //dom_node_unref(el); return JS_NewBool(ctx, res); } @@ -2987,14 +2987,14 @@ js_element_hasAttributes(JSContext *ctx, JSValueConst this_val, int argc, JSValu if (!el) { return JS_FALSE; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_node_has_attributes(el, &res); if (exc != DOM_NO_ERR) { - dom_node_unref(el); + //dom_node_unref(el); return JS_FALSE; } - dom_node_unref(el); + //dom_node_unref(el); return JS_NewBool(ctx, res); } @@ -3020,14 +3020,14 @@ js_element_hasChildNodes(JSContext *ctx, JSValueConst this_val, int argc, JSValu if (!el) { return JS_FALSE; } - dom_node_ref(el); + //dom_node_ref(el); exc = dom_node_has_child_nodes(el, &res); if (exc != DOM_NO_ERR) { - dom_node_unref(el); + //dom_node_unref(el); return JS_FALSE; } - dom_node_unref(el); + //dom_node_unref(el); return JS_NewBool(ctx, res); } @@ -3052,7 +3052,7 @@ js_element_insertBefore(JSContext *ctx, JSValueConst this_val, int argc, JSValue if (!el) { return JS_UNDEFINED; } - dom_node_ref(el); + //dom_node_ref(el); JSValue next_sibling1 = argv[1]; JSValue child1 = argv[0]; @@ -3060,7 +3060,7 @@ js_element_insertBefore(JSContext *ctx, JSValueConst this_val, int argc, JSValue dom_node *next_sibling = (dom_node *)(js_getopaque(next_sibling1, js_element_class_id)); if (!next_sibling) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } @@ -3071,11 +3071,11 @@ js_element_insertBefore(JSContext *ctx, JSValueConst this_val, int argc, JSValue err = dom_node_insert_before(el, child, next_sibling, &spare); if (err != DOM_NO_ERR) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } interpreter->changed = 1; - dom_node_unref(el); + //dom_node_unref(el); return getElement(ctx, spare); } @@ -3099,7 +3099,7 @@ js_element_isEqualNode(JSContext *ctx, JSValueConst this_val, int argc, JSValueC if (!el) { return JS_FALSE; } - dom_node_ref(el); + //dom_node_ref(el); JSValue node = argv[0]; dom_node *el2 = (dom_node *)(js_getopaque(node, js_element_class_id)); @@ -3108,11 +3108,11 @@ js_element_isEqualNode(JSContext *ctx, JSValueConst this_val, int argc, JSValueC struct string second; if (!init_string(&first)) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } if (!init_string(&second)) { - dom_node_unref(el); + //dom_node_unref(el); done_string(&first); return JS_EXCEPTION; } @@ -3124,7 +3124,7 @@ js_element_isEqualNode(JSContext *ctx, JSValueConst this_val, int argc, JSValueC done_string(&first); done_string(&second); - dom_node_unref(el); + //dom_node_unref(el); return JS_NewBool(ctx, ret); } @@ -3148,11 +3148,11 @@ js_element_isSameNode(JSContext *ctx, JSValueConst this_val, int argc, JSValueCo if (!el) { return JS_FALSE; } - dom_node_ref(el); + //dom_node_ref(el); JSValue node = argv[0]; dom_node *el2 = (dom_node *)(js_getopaque(node, js_element_class_id)); bool res = (el == el2); - dom_node_unref(el); + //dom_node_unref(el); return JS_NewBool(ctx, res); } @@ -3172,18 +3172,18 @@ js_element_matches(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst if (!el) { return JS_FALSE; } - dom_node_ref(el); + //dom_node_ref(el); const char *selector; size_t len; selector = JS_ToCStringLen(ctx, &len, argv[0]); if (!selector) { - dom_node_unref(el); + //dom_node_unref(el); return JS_FALSE; } void *res = el_match_selector(selector, el); JS_FreeCString(ctx, selector); - dom_node_unref(el); + //dom_node_unref(el); return JS_NewBool(ctx, res != NULL); } @@ -3207,22 +3207,22 @@ js_element_querySelector(JSContext *ctx, JSValueConst this_val, int argc, JSValu if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); size_t len; const char *selector = JS_ToCStringLen(ctx, &len, argv[0]); if (!selector) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } void *ret = walk_tree_query(el, selector, 0); JS_FreeCString(ctx, selector); if (!ret) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } - dom_node_unref(el); + //dom_node_unref(el); return getElement(ctx, ret); } @@ -3250,13 +3250,13 @@ js_element_querySelectorAll(JSContext *ctx, JSValueConst this_val, int argc, JSV if (!el) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); size_t len; const char *selector = JS_ToCStringLen(ctx, &len, argv[0]); if (!selector) { - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } dom_string *tag_name = NULL; @@ -3264,7 +3264,7 @@ js_element_querySelectorAll(JSContext *ctx, JSValueConst this_val, int argc, JSV if (exc != DOM_NO_ERR || !tag_name) { JS_FreeCString(ctx, selector); - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } dom_element *element = NULL; @@ -3273,20 +3273,20 @@ js_element_querySelectorAll(JSContext *ctx, JSValueConst this_val, int argc, JSV if (exc != DOM_NO_ERR || !element) { JS_FreeCString(ctx, selector); - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } LIST_OF(struct selector_node) *result_list = (LIST_OF(struct selector_node) *)mem_calloc(1, sizeof(*result_list)); if (!result_list) { JS_FreeCString(ctx, selector); - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } init_list(*result_list); walk_tree_query_append((dom_node *)element, el, selector, 0, result_list); JS_FreeCString(ctx, selector); - dom_node_unref(el); + //dom_node_unref(el); return getNodeList2(ctx, result_list); } @@ -3344,19 +3344,19 @@ js_element_removeAttribute(JSContext *ctx, JSValueConst this_val, int argc, JSVa if (!el) { return JS_UNDEFINED; } - dom_node_ref(el); + //dom_node_ref(el); size_t len; const char *str = JS_ToCStringLen(ctx, &len, argv[0]); if (!str) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } exc = dom_string_create((const uint8_t *)str, len, &attr_name); JS_FreeCString(ctx, str); if (exc != DOM_NO_ERR || !attr_name) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } dom_element_remove_attribute(el, attr_name); @@ -3385,7 +3385,7 @@ js_element_removeChild(JSContext *ctx, JSValueConst this_val, int argc, JSValueC if (!el || !JS_IsObject(argv[0])) { return JS_NULL; } - dom_node_ref(el); + //dom_node_ref(el); JSValue node = argv[0]; dom_node *el2 = (dom_node *)(js_getopaque(node, js_element_class_id)); dom_exception exc; @@ -3394,11 +3394,11 @@ js_element_removeChild(JSContext *ctx, JSValueConst this_val, int argc, JSValueC if (exc == DOM_NO_ERR && spare) { interpreter->changed = 1; - dom_node_unref(el); + //dom_node_unref(el); return getElement(ctx, spare); } - dom_node_unref(el); + //dom_node_unref(el); return JS_NULL; } @@ -3457,7 +3457,7 @@ js_element_setAttribute(JSContext *ctx, JSValueConst this_val, int argc, JSValue if (!el) { return JS_UNDEFINED; } - dom_node_ref(el); + //dom_node_ref(el); const char *attr; const char *value; @@ -3465,14 +3465,14 @@ js_element_setAttribute(JSContext *ctx, JSValueConst this_val, int argc, JSValue attr = JS_ToCStringLen(ctx, &attr_len, argv[0]); if (!attr) { - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } value = JS_ToCStringLen(ctx, &value_len, argv[1]); if (!value) { JS_FreeCString(ctx, attr); - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } @@ -3484,7 +3484,7 @@ js_element_setAttribute(JSContext *ctx, JSValueConst this_val, int argc, JSValue if (exc != DOM_NO_ERR || !attr_str) { JS_FreeCString(ctx, value); - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } exc = dom_string_create((const uint8_t *)value, value_len, &value_str); @@ -3492,7 +3492,7 @@ js_element_setAttribute(JSContext *ctx, JSValueConst this_val, int argc, JSValue if (exc != DOM_NO_ERR) { dom_string_unref(attr_str); - dom_node_unref(el); + //dom_node_unref(el); return JS_EXCEPTION; } @@ -3502,11 +3502,11 @@ js_element_setAttribute(JSContext *ctx, JSValueConst this_val, int argc, JSValue dom_string_unref(value_str); if (exc != DOM_NO_ERR) { - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } interpreter->changed = 1; - dom_node_unref(el); + //dom_node_unref(el); return JS_UNDEFINED; } @@ -3623,7 +3623,10 @@ void js_element_finalizer(JSRuntime *rt, JSValue val) void *old_node_data = NULL; dom_node_set_user_data(el, corestring_dom___ns_key_html_content_data, NULL, js_html_document_user_data_handler, (void *) &old_node_data); - dom_node_unref(el); + + if (el->refcnt > 0) { + dom_node_unref(el); + } } foreach(l, el_private->listeners) { @@ -3791,18 +3794,18 @@ element_event_handler(dom_event *event, void *pw) struct js_element_private *el_private = (struct js_element_private *)pw; struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)el_private->interpreter; JSContext *ctx = (JSContext *)interpreter->backend_data; - dom_node *el = (dom_node *)el_private->node; + //dom_node *el = (dom_node *)el_private->node; if (!event) { return; } - dom_node_ref(el); + //dom_node_ref(el); dom_string *typ = NULL; dom_exception exc = dom_event_get_type(event, &typ); if (exc != DOM_NO_ERR || !typ) { - dom_node_unref(el); + //dom_node_unref(el); return; } // interpreter->heartbeat = add_heartbeat(interpreter); @@ -3823,5 +3826,5 @@ element_event_handler(dom_event *event, void *pw) // done_heartbeat(interpreter->heartbeat); check_for_rerender(interpreter, dom_string_data(typ)); dom_string_unref(typ); - dom_node_unref(el); + //dom_node_unref(el); }