1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-06-06 22:10:53 +00:00

[spidermonkey] KeyboardEvent.keyCode (Enter only)

Only Enter is handled. Strings are not "finalized".
This commit is contained in:
Witold Filipczyk 2024-05-12 13:17:15 +02:00
parent 4439f4e976
commit 20ab63c1d1
4 changed files with 199 additions and 2 deletions

View File

@ -211,3 +211,162 @@ convert_key_to_dom_string(term_event_key_T key, dom_string **res)
*res = dom_key;
return true;
}
static const char *__keys_names[] = {
"Enter",
"ArrowLeft",
"ArrowRight",
"ArrowUp",
"ArrowDown",
"PageUp",
"PageDown",
"Home",
"End",
"Escape",
"Backspace",
"Tab",
"Insert",
"Delete",
"F1",
"F1",
"F2",
"F3",
"F4",
"F5",
"F6",
"F7",
"F8",
"F9",
"F10",
"F11",
"F12",
NULL
};
static enum {
KEYB_ENTER,
KEYB_ARROW_LEFT,
KEYB_ARROW_RIGHT,
KEYB_ARROW_UP,
KEYB_ARROW_DOWN,
KEYB_PAGE_UP,
KEYB_PAGE_DOWN,
KEYB_HOME,
KEYB_END,
KEYB_ESCAPE,
KEYB_TAB,
KEYB_INSERT,
KEYB_DELETE,
KEYB_F1,
KEYB_F2,
KEYB_F3,
KEYB_F4,
KEYB_F5,
KEYB_F6,
KEYB_F7,
KEYB_F8,
KEYB_F9,
KEYB_F10,
KEYB_F11,
KEYB_F12,
KEYB_COUNT
};
static lwc_string *keyb_lwc[KEYB_COUNT];
static void
initialize_keyb(void)
{
int i;
for (i = 0; i < KEYB_COUNT; i++) {
dom_exception err = lwc_intern_string(__keys_names[i], strlen(__keys_names[i]), &keyb_lwc[i]);
if (err != lwc_error_ok) {
return;
//return _dom_exception_from_lwc_error(err);
}
}
}
static void
finalize_keyb(void)
{
int i;
for (i = 0; i < KEYB_COUNT; i++) {
if (keyb_lwc[i] != NULL) {
lwc_string_unref(keyb_lwc[i]);
}
}
}
unicode_val_T
convert_dom_string_to_keycode(dom_string *dom_key)
{
static int initialized = 0;
if (!initialized) {
initialize_keyb();
initialized = 1;
}
if (!dom_key) {
return 0;
}
int et = -1;
lwc_string *t = NULL;
dom_exception err;
int i;
err = dom_string_intern(dom_key, &t);
if (err != DOM_NO_ERR) {
return 0;
}
assert(t != NULL);
for (i = 0; i < KEYB_COUNT; i++) {
if (keyb_lwc[i] == t) {
et = i;
break;
}
}
lwc_string_unref(t);
switch (et) {
case KEYB_ENTER:
return 13;
case KEYB_ARROW_LEFT:
case KEYB_ARROW_RIGHT:
case KEYB_ARROW_UP:
case KEYB_ARROW_DOWN:
case KEYB_PAGE_UP:
case KEYB_PAGE_DOWN:
case KEYB_HOME:
case KEYB_END:
case KEYB_ESCAPE:
case KEYB_TAB:
case KEYB_INSERT:
case KEYB_DELETE:
case KEYB_F1:
case KEYB_F2:
case KEYB_F3:
case KEYB_F4:
case KEYB_F5:
case KEYB_F6:
case KEYB_F7:
case KEYB_F8:
case KEYB_F9:
case KEYB_F10:
case KEYB_F11:
case KEYB_F12:
return 0;
default:
{
char *utf8 = dom_string_data(dom_key);
char *end = utf8 + dom_string_length(dom_key);
return utf8_to_unicode(&utf8, end);
}
}
}

View File

@ -17,6 +17,7 @@ void free_document(void *doc);
void *el_match_selector(const char *selector, void *node);
void add_lowercase_to_string(struct string *buf, const char *str, int len);
bool convert_key_to_dom_string(term_event_key_T key, dom_string **res);
unicode_val_T convert_dom_string_to_keycode(dom_string *dom_key);
#ifdef __cplusplus
}

View File

@ -64,6 +64,7 @@
static bool keyboardEvent_get_property_code(JSContext *cx, unsigned int argc, JS::Value *vp);
static bool keyboardEvent_get_property_key(JSContext *cx, unsigned int argc, JS::Value *vp);
static bool keyboardEvent_get_property_keyCode(JSContext *cx, unsigned int argc, JS::Value *vp);
static bool keyboardEvent_get_property_bubbles(JSContext *ctx, unsigned int argc, JS::Value *vp);
static bool keyboardEvent_get_property_cancelable(JSContext *ctx, unsigned int argc, JS::Value *vp);
@ -199,6 +200,7 @@ JSPropertySpec keyboardEvent_props[] = {
// JS_PSG("composed", keyboardEvent_get_property_composed, JSPROP_ENUMERATE),
JS_PSG("defaultPrevented", keyboardEvent_get_property_defaultPrevented, JSPROP_ENUMERATE),
JS_PSG("key", keyboardEvent_get_property_key, JSPROP_ENUMERATE),
JS_PSG("keyCode", keyboardEvent_get_property_keyCode, JSPROP_ENUMERATE),
JS_PSG("type", keyboardEvent_get_property_type, JSPROP_ENUMERATE),
JS_PS_END
};
@ -353,6 +355,40 @@ keyboardEvent_get_property_key(JSContext *ctx, unsigned int argc, JS::Value *vp)
return true;
}
static bool
keyboardEvent_get_property_keyCode(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_keyboard_event *event = JS::GetMaybePtrFromReservedSlot<dom_keyboard_event>(hobj, 0);
if (!event) {
return false;
}
dom_string *key = NULL;
dom_exception exc = dom_keyboard_event_get_key(event, &key);
if (exc != DOM_NO_ERR) {
return false;
}
unicode_val_T keyCode = convert_dom_string_to_keycode(key);
args.rval().setInt32(keyCode);
if (key) dom_string_unref(key);
return true;
}
static bool
keyboardEvent_get_property_code(JSContext *ctx, unsigned int argc, JS::Value *vp)
{

View File

@ -1,5 +1,5 @@
<script>
var e = new KeyboardEvent('message', { cancelable: true, key: "e" });
var e = new KeyboardEvent('message', { cancelable: true, key: "Enter" });
console.error('keyboardEvent.html');
console.assert(e.cancelable, 'cancelable true');
@ -7,6 +7,7 @@ console.assert(!e.defaultPrevented, 'false');
e.preventDefault();
console.assert(e.defaultPrevented, 'true');
console.assert(e.type === 'message', 'message');
console.assert(e.key === 'e', 'key e');
console.assert(e.key === 'Enter', 'key Enter');
console.assert(e.keyCode === 13, 'ENTER = 13');
console.exit(0);
</script>