diff --git a/widget/timer/src/windows/nsTimer.cpp b/widget/timer/src/windows/nsTimer.cpp index 6328a10f95e6..6c34fda0b6e1 100644 --- a/widget/timer/src/windows/nsTimer.cpp +++ b/widget/timer/src/windows/nsTimer.cpp @@ -71,21 +71,24 @@ void CALLBACK FireTimeout(HWND aWindow, nsCOMPtr queue = do_QueryInterface(manager, &rv); if (NS_FAILED(rv)) return; - if (timer->GetPriority() >= NS_PRIORITY_IMMEDIATE) { + MSG wmsg; + if (!::PeekMessage(&wmsg, NULL, 0, 0, PM_NOREMOVE) || + timer->GetPriority() >= NS_PRIORITY_IMMEDIATE) { + // fire timer immediatly timer->Fire(); - + + // while event queue is empty, fire off waiting timers + while (queue->HasReadyTimers(NS_PRIORITY_LOWEST) && + !::PeekMessage(&wmsg, NULL, 0, 0, PM_NOREMOVE)) { + + queue->FireNextReadyTimer(NS_PRIORITY_LOWEST); + } + } else { // defer timer firing queue->AddReadyQueue(timer); } - - // while event queue is empty, fire off waiting timers - MSG wmsg; - while (queue->HasReadyTimers(NS_PRIORITY_LOWEST) && - !::PeekMessage(&wmsg, NULL, 0, 0, PM_NOREMOVE)) { - queue->FireNextReadyTimer(NS_PRIORITY_LOWEST); - } }