From 67deceb07ac4eeed579de817868c1a6274b99707 Mon Sep 17 00:00:00 2001 From: Witold Filipczyk Date: Thu, 23 May 2024 16:23:47 +0200 Subject: [PATCH] [ecmascript] Added event.target getters It does not work, it is a bug in libdom (unintialised value). --- src/ecmascript/mujs/event.c | 26 ++++++++++++++++++ src/ecmascript/quickjs/event.c | 28 ++++++++++++++++++++ src/ecmascript/spidermonkey/event.cpp | 38 +++++++++++++++++++++++++++ test/ecmascript/assert/event.html | 1 + 4 files changed, 93 insertions(+) diff --git a/src/ecmascript/mujs/event.c b/src/ecmascript/mujs/event.c index d3d14bff1..3873ffc03 100644 --- a/src/ecmascript/mujs/event.c +++ b/src/ecmascript/mujs/event.c @@ -13,6 +13,7 @@ #include "ecmascript/ecmascript.h" #include "ecmascript/libdom/dom.h" #include "ecmascript/mujs.h" +#include "ecmascript/mujs/element.h" #include "ecmascript/mujs/event.h" #include "intl/charsets.h" #include "terminal/event.h" @@ -21,6 +22,7 @@ static void mjs_event_get_property_bubbles(js_State *J); static void mjs_event_get_property_cancelable(js_State *J); //static void mjs_event_get_property_composed(js_State *J); static void mjs_event_get_property_defaultPrevented(js_State *J); +static void mjs_event_get_property_target(js_State *J); static void mjs_event_get_property_type(js_State *J); static void mjs_event_preventDefault(js_State *J); @@ -60,6 +62,7 @@ mjs_push_event(js_State *J, char *type_) addproperty(J, "cancelable", mjs_event_get_property_cancelable, NULL); // addproperty(J, "composed", mjs_event_get_property_composed, NULL); addproperty(J, "defaultPrevented", mjs_event_get_property_defaultPrevented, NULL); + addproperty(J, "target", mjs_event_get_property_type, NULL); addproperty(J, "type", mjs_event_get_property_type, NULL); } } @@ -132,6 +135,29 @@ mjs_event_get_property_defaultPrevented(js_State *J) js_pushboolean(J, prevented); } +static void +mjs_event_get_property_target(js_State *J) +{ +#ifdef ECMASCRIPT_DEBUG + fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); +#endif + dom_event *event = (dom_event *)js_touserdata(J, 0, "event"); + + if (!event) { + js_pushnull(J); + return; + } + dom_event_target *target = NULL; + dom_exception exc = dom_event_get_type(event, &target); + + if (exc != DOM_NO_ERR || !target) { + js_pushnull(J); + return; + } + mjs_push_element(J, target); + dom_node_unref(target); +} + static void mjs_event_get_property_type(js_State *J) { diff --git a/src/ecmascript/quickjs/event.c b/src/ecmascript/quickjs/event.c index 47fa599ae..47f01f874 100644 --- a/src/ecmascript/quickjs/event.c +++ b/src/ecmascript/quickjs/event.c @@ -13,6 +13,7 @@ #include "ecmascript/ecmascript.h" #include "ecmascript/libdom/dom.h" #include "ecmascript/quickjs.h" +#include "ecmascript/quickjs/element.h" #include "ecmascript/quickjs/event.h" #include "intl/charsets.h" #include "terminal/event.h" @@ -25,6 +26,7 @@ static JSValue js_event_get_property_bubbles(JSContext *ctx, JSValueConst this_v static JSValue js_event_get_property_cancelable(JSContext *ctx, JSValueConst this_val); //static JSValue js_event_get_property_composed(JSContext *ctx, JSValueConst this_val); static JSValue js_event_get_property_defaultPrevented(JSContext *ctx, JSValueConst this_val); +static JSValue js_event_get_property_target(JSContext *ctx, JSValueConst this_val); static JSValue js_event_get_property_type(JSContext *ctx, JSValueConst this_val); static JSValue js_event_preventDefault(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv); @@ -51,6 +53,7 @@ static const JSCFunctionListEntry js_event_proto_funcs[] = { JS_CGETSET_DEF("cancelable", js_event_get_property_cancelable, NULL), // JS_CGETSET_DEF("composed", js_event_get_property_composed, NULL), JS_CGETSET_DEF("defaultPrevented", js_event_get_property_defaultPrevented, NULL), + JS_CGETSET_DEF("target", js_event_get_property_target, NULL), JS_CGETSET_DEF("type", js_event_get_property_type, NULL), JS_CFUNC_DEF("preventDefault", 0, js_event_preventDefault), }; @@ -135,6 +138,31 @@ js_event_get_property_defaultPrevented(JSContext *ctx, JSValueConst this_val) RETURN_JS(r); } +static JSValue +js_event_get_property_target(JSContext *ctx, JSValueConst this_val) +{ +#ifdef ECMASCRIPT_DEBUG + fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); +#endif + REF_JS(this_val); + + dom_event *event = (dom_event *)(JS_GetOpaque(this_val, js_event_class_id)); + + if (!event) { + return JS_NULL; + } + dom_event_target *target = NULL; + dom_exception exc = dom_event_get_target(event, &target); + + if (exc != DOM_NO_ERR || !target) { + return JS_NULL; + } + JSValue r = getElement(ctx, target); + dom_node_unref(target); + + RETURN_JS(r); +} + static JSValue js_event_get_property_type(JSContext *ctx, JSValueConst this_val) { diff --git a/src/ecmascript/spidermonkey/event.cpp b/src/ecmascript/spidermonkey/event.cpp index 803eb56cf..19b27dc00 100644 --- a/src/ecmascript/spidermonkey/event.cpp +++ b/src/ecmascript/spidermonkey/event.cpp @@ -26,6 +26,7 @@ #include "ecmascript/ecmascript.h" #include "ecmascript/libdom/dom.h" #include "ecmascript/spidermonkey.h" +#include "ecmascript/spidermonkey/element.h" #include "ecmascript/spidermonkey/heartbeat.h" #include "ecmascript/spidermonkey/event.h" #include "ecmascript/timer.h" @@ -63,6 +64,7 @@ static bool event_get_property_bubbles(JSContext *ctx, unsigned int argc, JS::Va static bool event_get_property_cancelable(JSContext *ctx, unsigned int argc, JS::Value *vp); //static bool event_get_property_composed(JSContext *ctx, unsigned int argc, JS::Value *vp); static bool event_get_property_defaultPrevented(JSContext *ctx, unsigned int argc, JS::Value *vp); +static bool event_get_property_target(JSContext *ctx, unsigned int argc, JS::Value *vp); static bool event_get_property_type(JSContext *ctx, unsigned int argc, JS::Value *vp); static bool event_preventDefault(JSContext *ctx, unsigned int argc, JS::Value *vp); @@ -167,6 +169,7 @@ JSPropertySpec event_props[] = { JS_PSG("bubbles", event_get_property_bubbles, JSPROP_ENUMERATE), JS_PSG("cancelable", event_get_property_cancelable, JSPROP_ENUMERATE), JS_PSG("defaultPrevented", event_get_property_defaultPrevented, JSPROP_ENUMERATE), + JS_PSG("target", event_get_property_target, JSPROP_ENUMERATE), JS_PSG("type", event_get_property_type, JSPROP_ENUMERATE), JS_PS_END }; @@ -315,6 +318,41 @@ event_preventDefault(JSContext *ctx, unsigned int argc, JS::Value *vp) return true; } +static bool +event_get_property_target(JSContext *ctx, unsigned int argc, JS::Value *vp) +{ +#ifdef ECMASCRIPT_DEBUG + fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); +#endif + JS::CallArgs args = JS::CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + JS::Realm *comp = js::GetContextRealm(ctx); + + if (!comp) { +#ifdef ECMASCRIPT_DEBUG + fprintf(stderr, "%s:%s %d\n", __FILE__, __FUNCTION__, __LINE__); +#endif + return false; + } + dom_event *event = JS::GetMaybePtrFromReservedSlot(hobj, 0); + + if (!event) { + return false; + } + dom_event_target *target = NULL; + dom_exception exc = dom_event_get_target(event, &target); + + if (exc != DOM_NO_ERR || !target) { + args.rval().setNull(); + return true; + } + JSObject *obj = getElement(ctx, target); + args.rval().setObject(*obj); + dom_node_unref(target); + + return true; +} + static bool event_get_property_type(JSContext *ctx, unsigned int argc, JS::Value *vp) { diff --git a/test/ecmascript/assert/event.html b/test/ecmascript/assert/event.html index 0d64354ba..a70aea245 100644 --- a/test/ecmascript/assert/event.html +++ b/test/ecmascript/assert/event.html @@ -2,6 +2,7 @@ var e = new Event('message', { cancelable: true }); console.error('event.html'); +console.assert(e.target === null, e.target); console.assert(e.cancelable, 'cancelable true'); console.assert(!e.defaultPrevented, 'false'); e.preventDefault();