Вот такой тест
<!DOCTYPE html>
<html class=" ">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<body>
<button id='but'>Start</button>
<div id='res'></div>
<script>
const but = document.getElementById('but')
const res = document.getElementById('res')
const dt = 5*1000;
let dtim
let t0
const check = () => {
let t = performance.now();
const dtim = new Date().toLocaleTimeString('ru')
res.innerHTML += `<span style="color:${document.hidden?'blue':'red'}">${dtim} Check ${((t-t0)/1000).toFixed(2)}</span><br>`;
t0 = t
setTimeout (check, dt)
}
but.addEventListener('click', () => {
t0 = performance.now();
const dtim = new Date().toLocaleTimeString('ru')
res.innerHTML = `${dtim} Start<br>`;
setTimeout (check, dt)
})
</script>
</body>
</html>
На Chrome у меня получается следующее
Если dt - интервал устанавливаемый в setTimeout, то в неактивной вкладке он становится таким
Первые 5 мин неактивности - dt + 1сек
После 5 мин - max(dt, 60) + 1сек
Если setTimeout вызван до 5 мин неактивности, а сработать функция должна после, то результирующий интервал получается каким то промежуточным, вероятно прибавляется не 60 сек, а пропорционально времени, превышающим 5 мин.