1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-06-25 01:05:37 +00:00

Bug 1027, SMJS: make null mean "none" in elinks.keymaps

elinks.keymaps.main["/"] = null;
used to crash ELinks with a segfault in JS_ObjectIsFunction.
Fix that by recognizing JSVAL_NULL explicitly and treating it as "none".
Likewise, if keymap_get_property would return "none" to ECMAScript,
return JSVAL_NULL instead.
This commit is contained in:
Kalle Olavi Niemitalo 2008-07-11 16:37:44 +03:00 committed by Kalle Olavi Niemitalo
parent 5251441fdc
commit fd27acf784
3 changed files with 23 additions and 6 deletions

2
NEWS
View File

@ -181,6 +181,8 @@ ELinks 0.11.4.GIT now:
To be released as 0.11.5. To be released as 0.11.5.
* critical bug 1027 in user SMJS: make elinks.keymaps treat null and
"none" as equivalent actions, avoiding a segfault
* build bug 1021: fixed uninitialized variable in http_got_header * build bug 1021: fixed uninitialized variable in http_got_header
ELinks 0.11.4: ELinks 0.11.4:

View File

@ -244,12 +244,21 @@ rather than save it in a variable and call it later.
Currently, there are three: 'elinks.keymaps.main', 'elinks.keymaps.edit', Currently, there are three: 'elinks.keymaps.main', 'elinks.keymaps.edit',
and 'elinks.keymaps.menu'. These elements are also hashes, the elements of and 'elinks.keymaps.menu'. These elements are also hashes, the elements of
which correspond to bindings. For example, `elinks.keymaps.main["q"]` is which correspond to bindings. For example, `elinks.keymaps.main["q"]` is
the binding to the ``q'' key in the main map. These bindings can be red, the binding to the ``q'' key in the main map. These bindings can be read,
to get the name of the action to which the key is bound, or set, either to get the name of the action to which the key is bound, or set to one of:
to a string with the name of the ELinks action or to a function, which will
thenceforth be called when the key is pressed. For example,
+ +
-- --
- A string with the name of the ELinks action.
- A function, which will thenceforth be called when the key is pressed.
- The string `"none"`, to unbind the key. You can also use the `null`
value for this purpose, but that crashes ELinks 0.11.4 and 0.12pre1
(http://bugzilla.elinks.cz/show_bug.cgi?id=1027[bug 1027]),
so it may be best to use the string for now.
--
+
--
For example,
---------------------------------------------------------------------- ----------------------------------------------------------------------
elinks.keymaps.main["!"] = function () { elinks.alert("Hello!"); } elinks.keymaps.main["!"] = function () { elinks.alert("Hello!"); }
---------------------------------------------------------------------- ----------------------------------------------------------------------
@ -264,7 +273,7 @@ elinks.keymaps.main["/"] = "search-typeahead-text";
changes the ``/'' key to use the nice typeahead search function instead of changes the ``/'' key to use the nice typeahead search function instead of
opening that ugly old search dialogue box. opening that ugly old search dialogue box.
*Compatibility:* ELinks 0.11.0 *Compatibility:* ELinks 0.11.0, unless you use `null`.
NOTE: Do not read a function from <<smjs-elinks.action,'elinks.action'>>, NOTE: Do not read a function from <<smjs-elinks.action,'elinks.action'>>,
e.g. `elinks.action.search_typeahead_text`, and place it in a keymap. e.g. `elinks.action.search_typeahead_text`, and place it in a keymap.

View File

@ -37,7 +37,7 @@ keymap_get_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp)
action_str = get_action_name_from_keystroke((enum keymap_id) *data, action_str = get_action_name_from_keystroke((enum keymap_id) *data,
keystroke_str); keystroke_str);
if (!action_str) goto ret_null; if (!action_str || !strcmp(action_str, "none")) goto ret_null;
*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(ctx, action_str)); *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(ctx, action_str));
@ -106,6 +106,12 @@ keymap_set_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp)
return JS_TRUE; return JS_TRUE;
} else if (JSVAL_IS_NULL(*vp)) { /* before JSVAL_IS_OBJECT */
if (bind_do(keymap_str, keystroke_str, "none", 0))
return JS_FALSE;
return JS_TRUE;
} else if (JSVAL_IS_OBJECT(*vp)) { } else if (JSVAL_IS_OBJECT(*vp)) {
unsigned char *err = NULL; unsigned char *err = NULL;
int event_id; int event_id;