Bug 376643 ��� setInterval fires repeatedly with incorrectly small delays...

r=jst
sr=brendan
This commit is contained in:
samuel%sieb.net 2007-05-31 06:11:10 +00:00
Родитель 50bc2f2977
Коммит 332b090176
1 изменённых файлов: 9 добавлений и 6 удалений

Просмотреть файл

@ -6888,14 +6888,17 @@ nsGlobalWindow::RunTimeout(nsTimeout *aTimeout)
// disabled (!aTimeout), set the next interval to be relative to // disabled (!aTimeout), set the next interval to be relative to
// "now", and not to when the timeout that was pending should // "now", and not to when the timeout that was pending should
// have fired. // have fired.
PRTime nextInterval = (aTimeout ? timeout->mWhen : now) + // Also check if the next interval timeout is overdue. If so,
((PRTime)timeout->mInterval * PR_USEC_PER_MSEC); // then restart the interval from now.
PRTime nextInterval = (PRTime)timeout->mInterval * PR_USEC_PER_MSEC;
if (!aTimeout || nextInterval + timeout->mWhen <= now)
nextInterval += now;
else
nextInterval += timeout->mWhen;
PRTime delay = nextInterval - PR_Now(); PRTime delay = nextInterval - PR_Now();
// If the next interval timeout is already supposed to have // Make sure the delay is at least DOM_MIN_TIMEOUT_VALUE.
// happened then run the timeout as soon as we can (meaning
// after DOM_MIN_TIMEOUT_VALUE time has passed).
// Note: We must cast the rhs expression to PRTime to work // Note: We must cast the rhs expression to PRTime to work
// around what looks like a compiler bug on x86_64. // around what looks like a compiler bug on x86_64.
if (delay < (PRTime)(DOM_MIN_TIMEOUT_VALUE * PR_USEC_PER_MSEC)) { if (delay < (PRTime)(DOM_MIN_TIMEOUT_VALUE * PR_USEC_PER_MSEC)) {