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

ELinks no longer crash on clearTimeout.

This commit is contained in:
Witold Filipczyk 2007-09-22 18:59:49 +02:00 committed by Witold Filipczyk
parent e0dfe13be2
commit 959d94b71c
5 changed files with 45 additions and 12 deletions

View File

@ -150,6 +150,7 @@ struct timeout_data {
struct ecmascript_interpreter *interpreter;
unsigned char *code;
timer_id_T timer;
void *object;
};
#endif

View File

@ -333,12 +333,13 @@ ecmascript_timeout_handler(void *i)
assertm(interpreter->vs->doc_view != NULL,
"setTimeout: vs with no document (e_f %d)",
interpreter->vs->ecmascript_fragile);
del_from_list(td);
{
struct string code = INIT_STRING(td->code, strlen(td->code));
ecmascript_clear_timeout2(td);
ecmascript_eval(interpreter, &code, NULL);
}
del_from_list(td);
mem_free(td->code);
mem_free(td);
}

View File

@ -87,7 +87,8 @@ void ecmascript_timeout_dialog(struct terminal *term, int max_exec_time);
void ecmascript_set_action(unsigned char **action, unsigned char *string);
struct timeout_data *ecmascript_set_timeout(struct ecmascript_interpreter *interpreter, unsigned char *code, int timeout);
void ecmascript_clear_timeout(struct timeout_data *td);
void ecmascript_clear_timeout(struct timeout_data *td); /* the same for both SpiderMonkey and SEE */
void ecmascript_clear_timeout2(struct timeout_data *td); /* engine dependent */
extern struct module ecmascript_module;

View File

@ -350,6 +350,17 @@ end:
done_uri(uri);
}
void
ecmascript_clear_timeout2(struct timeout_data *td)
{
struct timeout_class *timer = td->object;
if (timer) {
timer->td = NULL;
td->object = NULL;
}
}
static void
js_clearTimeout(struct SEE_interpreter *interp, struct SEE_object *self,
struct SEE_object *thisobj, int argc, struct SEE_value **argv,
@ -360,7 +371,7 @@ js_clearTimeout(struct SEE_interpreter *interp, struct SEE_object *self,
if (argc != 1) return;
timer = (struct timeout_class *)argv[0]->u.object;
see_check_class(interp, (struct SEE_object *)timer, &js_timeout_object_class);
ecmascript_clear_timeout(timer->td);
if (timer && timer->td) ecmascript_clear_timeout(timer->td);
}
@ -384,9 +395,12 @@ js_setTimeout(struct SEE_interpreter *interp, struct SEE_object *self,
timeout = SEE_ToInt32(interp, argv[1]);
td = ecmascript_set_timeout(ei, code, timeout);
timer = SEE_NEW(interp, struct timeout_class);
timer->object.objectclass = &js_timeout_object_class;
timer->object.Prototype = NULL;
timer->td = td;
if (timer) {
timer->object.objectclass = &js_timeout_object_class;
timer->object.Prototype = NULL;
timer->td = td;
td->object = timer;
}
SEE_SET_OBJECT(res, (struct SEE_object *)timer);
}

View File

@ -448,18 +448,31 @@ end:
static JSBool
window_clearTimeout(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
JSObject *timeout;
JSObject *timer;
struct timeout_data *td;
if (argc != 1)
return JS_TRUE;
timeout = JSVAL_TO_OBJECT(argv[0]);
if (!JS_InstanceOf(ctx, timeout, (JSClass *) &timeout_class, NULL)) return JS_FALSE;
td = JS_GetPrivate(ctx, timeout);
ecmascript_clear_timeout(td);
timer = JSVAL_TO_OBJECT(argv[0]);
if (!JS_InstanceOf(ctx, timer, (JSClass *) &timeout_class, NULL)) return JS_FALSE;
td = JS_GetPrivate(ctx, timer);
if (td) ecmascript_clear_timeout(td);
return JS_TRUE;
}
void
ecmascript_clear_timeout2(struct timeout_data *td)
{
struct ecmascript_interpreter *interpreter = td->interpreter;
JSContext *ctx = interpreter->backend_data;
JSObject *timer = td->object;
if (timer) {
JS_SetPrivate(ctx, timer, NULL);
td->object = NULL;
}
}
/* @window_funcs{"setTimeout"} */
static JSBool
window_setTimeout(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
@ -487,7 +500,10 @@ window_setTimeout(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval
}
td = ecmascript_set_timeout(interpreter, code, timeout);
timer = JS_NewObject(ctx, (JSClass *)&timeout_class, NULL, NULL);
JS_SetPrivate(ctx, timer, td);
if (timer) {
JS_SetPrivate(ctx, timer, td);
td->object = timer;
}
object_to_jsval(ctx, rval, timer);
return JS_TRUE;
}