mirror of
https://github.com/rkd77/elinks.git
synced 2025-02-02 15:09:23 -05:00
[ecmascript] Added event.target getters
It does not work, it is a bug in libdom (unintialised value).
This commit is contained in:
parent
f5ecff0fd0
commit
67deceb07a
@ -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)
|
||||
{
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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<dom_event>(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)
|
||||
{
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user