From 0d91ba6ba77c1ac97fce78592369ae9830cf9ded Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Fri, 21 Jun 2024 19:39:54 -0700 Subject: [PATCH] fix: zero cooercion timeout removal bug --- builtins/web/timers.cpp | 2 +- tests/integration/timers/timers.js | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/builtins/web/timers.cpp b/builtins/web/timers.cpp index b785e62..bb80c16 100644 --- a/builtins/web/timers.cpp +++ b/builtins/web/timers.cpp @@ -114,7 +114,7 @@ class TimerTask final : public api::AsyncTask { }; std::map TimerTask::timer_ids_ = {}; -int32_t TimerTask::next_timer_id = 0; +int32_t TimerTask::next_timer_id = 1; namespace builtins::web::timers { diff --git a/tests/integration/timers/timers.js b/tests/integration/timers/timers.js index 64470fc..c46fb72 100644 --- a/tests/integration/timers/timers.js +++ b/tests/integration/timers/timers.js @@ -2,6 +2,16 @@ import { serveTest } from "../test-server.js"; import { assert, strictEqual, throws, deepStrictEqual, AssertionError } from "../assert.js"; export const handler = serveTest(async (t) => { + await t.asyncTest("clearTimeout invalid", (resolve, reject) => { + // cleartimeout can be called with arbitrary stuff + clearTimeout('blah'); + + const dontDeleteTimeout = setTimeout(resolve, 100); + + // null converts to zero, which must not delete a real timer + clearTimeout(null); + }); + await t.asyncTest("setTimeout-order", (resolve, reject) => { let first = false; setTimeout(() => {