From 98d970d606384bfdb683f9dc0e46bca6a0b25be6 Mon Sep 17 00:00:00 2001 From: Witold Filipczyk Date: Wed, 1 Dec 2021 20:47:25 +0100 Subject: [PATCH] [spidermonkey] clearTimeout --- src/ecmascript/ecmascript.c | 18 ++++++++---- src/ecmascript/ecmascript.h | 4 +-- src/ecmascript/quickjs/window.c | 1 - src/ecmascript/spidermonkey/window.c | 43 ++++++++++++++++++++++++++-- 4 files changed, 56 insertions(+), 10 deletions(-) diff --git a/src/ecmascript/ecmascript.c b/src/ecmascript/ecmascript.c index 431d2a01d..2a5a2e99e 100644 --- a/src/ecmascript/ecmascript.c +++ b/src/ecmascript/ecmascript.c @@ -585,30 +585,38 @@ ecmascript_timeout_handler2(void *i) } #endif -void +timer_id_T ecmascript_set_timeout(struct ecmascript_interpreter *interpreter, char *code, int timeout) { assert(interpreter && interpreter->vs->doc_view->document); - if (!code) return; + if (!code) return nullptr; done_string(&interpreter->code); init_string(&interpreter->code); add_to_string(&interpreter->code, code); mem_free(code); - kill_timer(&interpreter->vs->doc_view->document->timeout); + if (check_in_map_timer(interpreter->vs->doc_view->document->timeout)) { + kill_timer(&interpreter->vs->doc_view->document->timeout); + } install_timer(&interpreter->vs->doc_view->document->timeout, timeout, ecmascript_timeout_handler, interpreter); + + return interpreter->vs->doc_view->document->timeout; } #ifdef CONFIG_ECMASCRIPT_SMJS -void +timer_id_T ecmascript_set_timeout2(struct ecmascript_interpreter *interpreter, JS::HandleValue f, int timeout) { assert(interpreter && interpreter->vs->doc_view->document); done_string(&interpreter->code); init_string(&interpreter->code); - kill_timer(&interpreter->vs->doc_view->document->timeout); + if (check_in_map_timer(interpreter->vs->doc_view->document->timeout)) { + kill_timer(&interpreter->vs->doc_view->document->timeout); + } JS::RootedValue fun((JSContext *)interpreter->backend_data, f); interpreter->fun = fun; install_timer(&interpreter->vs->doc_view->document->timeout, timeout, ecmascript_timeout_handler2, interpreter); + + return interpreter->vs->doc_view->document->timeout; } #endif diff --git a/src/ecmascript/ecmascript.h b/src/ecmascript/ecmascript.h index 55500b989..bc58cffb5 100644 --- a/src/ecmascript/ecmascript.h +++ b/src/ecmascript/ecmascript.h @@ -135,10 +135,10 @@ void ecmascript_timeout_dialog(struct terminal *term, int max_exec_time); void ecmascript_set_action(char **action, char *string); -void ecmascript_set_timeout(struct ecmascript_interpreter *interpreter, char *code, int timeout); +timer_id_T ecmascript_set_timeout(struct ecmascript_interpreter *interpreter, char *code, int timeout); #ifdef CONFIG_ECMASCRIPT_SMJS -void ecmascript_set_timeout2(struct ecmascript_interpreter *interpreter, JS::HandleValue f, int timeout); +timer_id_T ecmascript_set_timeout2(struct ecmascript_interpreter *interpreter, JS::HandleValue f, int timeout); #endif #ifdef CONFIG_QUICKJS diff --git a/src/ecmascript/quickjs/window.c b/src/ecmascript/quickjs/window.c index cd0f4cc1d..117b0c9b6 100644 --- a/src/ecmascript/quickjs/window.c +++ b/src/ecmascript/quickjs/window.c @@ -216,7 +216,6 @@ js_window_setTimeout(JSContext *ctx, JSValueConst this_val, int argc, JSValueCon return JS_UNDEFINED; } timer_id_T id = ecmascript_set_timeout2q(interpreter, func, timeout); - add_to_map_timer(id); return JS_NewInt64(ctx, reinterpret_cast(id)); } diff --git a/src/ecmascript/spidermonkey/window.c b/src/ecmascript/spidermonkey/window.c index c319128d2..ee7f63b7f 100644 --- a/src/ecmascript/spidermonkey/window.c +++ b/src/ecmascript/spidermonkey/window.c @@ -11,6 +11,7 @@ #include "elinks.h" #include "ecmascript/spidermonkey/util.h" +#include #include #include "bfu/dialog.h" @@ -24,6 +25,7 @@ #include "document/view.h" #include "ecmascript/ecmascript.h" #include "ecmascript/spidermonkey/window.h" +#include "ecmascript/timer.h" #include "intl/libintl.h" #include "main/select.h" #include "osdep/newwin.h" @@ -216,11 +218,13 @@ window_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS: void location_goto(struct document_view *doc_view, char *url); static bool window_alert(JSContext *ctx, unsigned int argc, JS::Value *rval); +static bool window_clearTimeout(JSContext *ctx, unsigned int argc, JS::Value *rval); static bool window_open(JSContext *ctx, unsigned int argc, JS::Value *rval); static bool window_setTimeout(JSContext *ctx, unsigned int argc, JS::Value *rval); const spidermonkeyFunctionSpec window_funcs[] = { { "alert", window_alert, 1 }, + { "clearTimeout", window_clearTimeout, 1 }, { "open", window_open, 3 }, { "setTimeout", window_setTimeout, 2 }, { NULL } @@ -443,14 +447,49 @@ window_setTimeout(JSContext *ctx, unsigned int argc, JS::Value *rval) return true; } - ecmascript_set_timeout(interpreter, code, timeout); + timer_id_T id = ecmascript_set_timeout(interpreter, code, timeout); + JS::BigInt *bi = JS::NumberToBigInt(ctx, reinterpret_cast(id)); + args.rval().setBigInt(bi); return true; } + timer_id_T id = ecmascript_set_timeout2(interpreter, args[0], timeout); + JS::BigInt *bi = JS::NumberToBigInt(ctx, reinterpret_cast(id)); + args.rval().setBigInt(bi); - ecmascript_set_timeout2(interpreter, args[0], timeout); return true; } +/* @window_funcs{"clearTimeout"} */ +static bool +window_clearTimeout(JSContext *ctx, unsigned int argc, JS::Value *rval) +{ +#ifdef ECMASCRIPT_DEBUG + fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); +#endif + JS::Realm *comp = js::GetContextRealm(ctx); + + if (!comp) { +#ifdef ECMASCRIPT_DEBUG + fprintf(stderr, "%s:%s %d\n", __FILE__, __FUNCTION__, __LINE__); +#endif + return false; + } + JS::CallArgs args = JS::CallArgsFromVp(argc, rval); + + if (argc != 1) { + return true; + } + JS::BigInt *bi = JS::ToBigInt(ctx, args[0]); + int64_t number = JS::ToBigInt64(bi); + timer_id_T id = reinterpret_cast(number); + + if (check_in_map_timer(id)) { + kill_timer(&id); + } + return true; +} + + #if 0 static bool window_get_property_closed(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp)