fix(scheduled-tasks): avoid clearing toastr auto-dismiss timers in taskjs sandbox

This commit is contained in:
2026-02-25 21:56:45 +08:00
parent 21f09a7bd1
commit ad825c1189

View File

@@ -679,6 +679,9 @@ async function executeTaskJS(jsCode, taskName = 'AnonymousTask') {
const listeners = new Set();
const createdNodes = new Set();
const waiters = new Set();
let suppressTimerTracking = false;
const originalToastrFns = {};
const toastrMethods = ['info', 'success', 'warning', 'error'];
const notifyActivityChange = () => {
if (waiters.size === 0) return;
@@ -689,16 +692,36 @@ async function executeTaskJS(jsCode, taskName = 'AnonymousTask') {
window.setTimeout = function(fn, t, ...args) {
const id = originals.setTimeout(function(...inner) {
try { fn?.(...inner); } finally { timeouts.delete(id); notifyActivityChange(); }
try { fn?.(...inner); }
finally {
if (timeouts.delete(id)) notifyActivityChange();
}
}, t, ...args);
timeouts.add(id);
notifyActivityChange();
if (!suppressTimerTracking) {
timeouts.add(id);
notifyActivityChange();
}
return id;
};
window.clearTimeout = function(id) { originals.clearTimeout(id); timeouts.delete(id); notifyActivityChange(); };
window.clearTimeout = function(id) {
originals.clearTimeout(id);
if (timeouts.delete(id)) notifyActivityChange();
};
window.setInterval = function(fn, t, ...args) { const id = originals.setInterval(fn, t, ...args); intervals.add(id); notifyActivityChange(); return id; };
window.clearInterval = function(id) { originals.clearInterval(id); intervals.delete(id); notifyActivityChange(); };
if (window.toastr) {
for (const method of toastrMethods) {
if (typeof window.toastr[method] !== 'function') continue;
originalToastrFns[method] = window.toastr[method];
window.toastr[method] = function(...fnArgs) {
suppressTimerTracking = true;
try { return originalToastrFns[method].apply(window.toastr, fnArgs); }
finally { suppressTimerTracking = false; }
};
}
}
const addListenerEntry = (entry) => { listeners.add(entry); notifyActivityChange(); };
const removeListenerEntry = (target, type, listener, options) => {
let removed = false;
@@ -736,6 +759,13 @@ async function executeTaskJS(jsCode, taskName = 'AnonymousTask') {
Node.prototype.appendChild = originals.appendChild;
Node.prototype.insertBefore = originals.insertBefore;
Node.prototype.replaceChild = originals.replaceChild;
if (window.toastr) {
for (const method of toastrMethods) {
if (typeof originalToastrFns[method] === 'function') {
window.toastr[method] = originalToastrFns[method];
}
}
}
};
const hardCleanup = () => {