From 4872ecbd5286051b1d3f8a3760d564f4c6f0371a Mon Sep 17 00:00:00 2001 From: Witold Filipczyk Date: Fri, 15 Nov 2024 18:20:01 +0100 Subject: [PATCH] [mujs] DocumentFragment constructor --- src/js/ecmascript.h | 1 + src/js/mujs.c | 2 + src/js/mujs/document.c | 4 +- src/js/mujs/fragment.c | 86 ++++++++++++++++++++++++++++++++++++++++-- src/js/mujs/fragment.h | 1 + 5 files changed, 88 insertions(+), 6 deletions(-) diff --git a/src/js/ecmascript.h b/src/js/ecmascript.h index 4d472698b..e4b4528fa 100644 --- a/src/js/ecmascript.h +++ b/src/js/ecmascript.h @@ -112,6 +112,7 @@ struct ecmascript_interpreter { #endif #ifdef CONFIG_MUJS const char *fun; + void *doc; #endif int element_offset; unsigned int changed:1; diff --git a/src/js/mujs.c b/src/js/mujs.c index bb311f286..068251835 100644 --- a/src/js/mujs.c +++ b/src/js/mujs.c @@ -36,6 +36,7 @@ #include "js/mujs/domparser.h" #include "js/mujs/element.h" #include "js/mujs/event.h" +#include "js/mujs/fragment.h" #include "js/mujs/history.h" #include "js/mujs/image.h" #include "js/mujs/keyboard.h" @@ -171,6 +172,7 @@ mujs_get_interpreter(struct ecmascript_interpreter *interpreter) mjs_push_document(J, document->dom); mjs_document_init(J); + mjs_fragment_init(J); return J; #if 0 diff --git a/src/js/mujs/document.c b/src/js/mujs/document.c index b211edd5e..581f5b9c0 100644 --- a/src/js/mujs/document.c +++ b/src/js/mujs/document.c @@ -1715,12 +1715,12 @@ mjs_push_document(js_State *J, void *doc) addproperty(J, "title", mjs_document_get_property_title, mjs_document_set_property_title); /* TODO: Charset? */ addproperty(J, "URL", mjs_document_get_property_url, mjs_document_set_property_url); } - js_defglobal(J, "document", JS_DONTENUM); + js_setglobal(J, "document"); init_list(doc_private->listeners); struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)js_getcontext(J); doc_private->interpreter = interpreter; - doc_private->node = doc; + interpreter->doc = doc_private->node = doc; doc_private->ref_count = 1; doc_private->thisval = js_ref(J); if (doc) { diff --git a/src/js/mujs/fragment.c b/src/js/mujs/fragment.c index 45fd8acba..afe5a4c60 100644 --- a/src/js/mujs/fragment.c +++ b/src/js/mujs/fragment.c @@ -1350,13 +1350,91 @@ fprintf(stderr, "Before: %s:%d\n", __FUNCTION__, __LINE__); } } +static void +mjs_DocumentFragment_fun(js_State *J) +{ +#ifdef ECMASCRIPT_DEBUG + fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); +#endif + js_pushundefined(J); +} + +static void +mjs_DocumentFragment_constructor(js_State *J) +{ +#ifdef ECMASCRIPT_DEBUG + fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); +#endif + struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)js_getcontext(J); + dom_document *doc = (dom_document *)interpreter->doc; + + if (!doc) { + js_pushnull(J); + return; + } + dom_document_fragment *fragment = NULL; + dom_exception exc = dom_document_create_document_fragment(doc, &fragment); + + if (exc != DOM_NO_ERR || !fragment) { + js_pushnull(J); + return; + } + struct mjs_fragment_private *el_private = (struct mjs_fragment_private *)mem_calloc(1, sizeof(*el_private)); + + if (!el_private) { + dom_node_unref((dom_node *)fragment); + js_pushnull(J); + return; + } + el_private->node = fragment; + + js_newobject(J); + { + js_copy(J, 0); + el_private->thisval = js_ref(J); + js_newuserdata(J, "fragment", el_private, mjs_fragment_finalizer); + addmethod(J, "addEventListener", mjs_fragment_addEventListener, 3); + addmethod(J, "appendChild",mjs_fragment_appendChild, 1); + addmethod(J, "cloneNode", mjs_fragment_cloneNode, 1); + addmethod(J, "contains", mjs_fragment_contains, 1); + addmethod(J, "dispatchEvent", mjs_fragment_dispatchEvent, 1); + addmethod(J, "hasChildNodes", mjs_fragment_hasChildNodes, 0); + addmethod(J, "insertBefore", mjs_fragment_insertBefore, 2); + addmethod(J, "isEqualNode", mjs_fragment_isEqualNode, 1); + addmethod(J, "isSameNode", mjs_fragment_isSameNode, 1); + addmethod(J, "querySelector", mjs_fragment_querySelector, 1); + addmethod(J, "querySelectorAll", mjs_fragment_querySelectorAll, 1); + addmethod(J, "removeChild", mjs_fragment_removeChild, 1); + addmethod(J, "removeEventListener", mjs_fragment_removeEventListener, 3); + addmethod(J, "toString", mjs_fragment_toString, 0); + + addproperty(J, "children", mjs_fragment_get_property_children, NULL); + addproperty(J, "childElementCount", mjs_fragment_get_property_childElementCount, NULL); + addproperty(J, "childNodes", mjs_fragment_get_property_childNodes, NULL); + addproperty(J, "firstChild", mjs_fragment_get_property_firstChild, NULL); + addproperty(J, "firstElementChild", mjs_fragment_get_property_firstElementChild, NULL); + addproperty(J, "lastChild", mjs_fragment_get_property_lastChild, NULL); + addproperty(J, "lastElementChild", mjs_fragment_get_property_lastElementChild, NULL); +//// addproperty(J, "nextElementSibling", mjs_fragment_get_property_nextElementSibling, NULL); + addproperty(J, "nextSibling", mjs_fragment_get_property_nextSibling, NULL); + addproperty(J, "nodeName", mjs_fragment_get_property_nodeName, NULL); + addproperty(J, "nodeType", mjs_fragment_get_property_nodeType, NULL); + addproperty(J, "nodeValue", mjs_fragment_get_property_nodeValue, mjs_fragment_set_property_nodeValue); + addproperty(J, "ownerDocument", mjs_fragment_get_property_ownerDocument, NULL); + addproperty(J, "parentElement", mjs_fragment_get_property_parentElement, NULL); + addproperty(J, "parentNode", mjs_fragment_get_property_parentNode, NULL); +//// addproperty(J, "previousElementSibling", mjs_fragment_get_property_previousElementSibling, NULL); + addproperty(J, "previousSibling", mjs_fragment_get_property_previousSibling, NULL); + addproperty(J, "textContent", mjs_fragment_get_property_textContent, mjs_fragment_set_property_textContent); + } +} + int mjs_fragment_init(js_State *J) { -#if 0 - mjs_push_node(J, NULL); - js_defglobal(J, "fragment", JS_DONTENUM); -#endif + js_pushglobal(J); + js_newcconstructor(J, mjs_DocumentFragment_fun, mjs_DocumentFragment_constructor, "DocumentFragment", 0); + js_defglobal(J, "DocumentFragment", JS_DONTENUM); return 0; } diff --git a/src/js/mujs/fragment.h b/src/js/mujs/fragment.h index e0c738c3a..942917c51 100644 --- a/src/js/mujs/fragment.h +++ b/src/js/mujs/fragment.h @@ -9,6 +9,7 @@ extern "C" { void *mjs_getprivate_fragment(js_State *J, int idx); void mjs_push_fragment(js_State *J, void *node); +int mjs_fragment_init(js_State *J); #ifdef __cplusplus }