fixing bug 770656, idle fuzz time for idle notifications. r=jst@mozilla.com

This commit is contained in:
Bonnie Surender 2012-07-04 13:21:40 -07:00
Родитель eb8a11b1a8
Коммит d43d53eaee
2 изменённых файлов: 8 добавлений и 38 удалений

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

@ -8545,8 +8545,8 @@ nsGlobalWindow::ScheduleNextIdleObserverCallback()
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
PRUint32 callbackTimeMS = 0; PRUint32 callbackTimeMS = 0;
if (idleObserver.mTimeInS * 1000 > userIdleTimeMS) { if (idleObserver.mTimeInS * 1000 + mIdleFuzzFactor > userIdleTimeMS) {
callbackTimeMS = idleObserver.mTimeInS * 1000 - userIdleTimeMS; callbackTimeMS = idleObserver.mTimeInS * 1000 - userIdleTimeMS + mIdleFuzzFactor;
} }
mIdleTimer->Cancel(); mIdleTimer->Cancel();
@ -8568,7 +8568,7 @@ nsGlobalWindow::GetFuzzTimeMS()
return 0; return 0;
} }
PRUint32 randNum = 0; PRUint32 randNum = MAX_IDLE_FUZZ_TIME_MS;
PRSize nbytes = PR_GetRandomNoise(&randNum, sizeof(randNum)); PRSize nbytes = PR_GetRandomNoise(&randNum, sizeof(randNum));
if (nbytes != sizeof(randNum)) { if (nbytes != sizeof(randNum)) {
NS_WARNING("PR_GetRandomNoise(...) Not implemented or no available noise!"); NS_WARNING("PR_GetRandomNoise(...) Not implemented or no available noise!");
@ -8605,23 +8605,6 @@ nsGlobalWindow::ScheduleActiveTimerCallback()
return NS_OK; return NS_OK;
} }
nsresult
nsGlobalWindow::ScheduleIdleTimerCallback()
{
MOZ_ASSERT(IsInnerWindow(), "Must be an inner window!");
MOZ_ASSERT(mIdleTimer);
nsRefPtr<nsGlobalWindow> kungFuDeathGrip(this);
mIdleTimer->Cancel();
mIdleFuzzFactor = GetFuzzTimeMS();
nsresult rv = mIdleTimer->InitWithFuncCallback(IdleActiveTimerCallback,
this,
mIdleFuzzFactor,
nsITimer::TYPE_ONE_SHOT);
NS_ENSURE_SUCCESS(rv, rv);
return NS_OK;
}
nsresult nsresult
nsGlobalWindow::NotifyIdleObserversOfIdleActiveEvent() nsGlobalWindow::NotifyIdleObserversOfIdleActiveEvent()
{ {
@ -8629,12 +8612,15 @@ nsGlobalWindow::NotifyIdleObserversOfIdleActiveEvent()
if (mCurrentlyIdle) { if (mCurrentlyIdle) {
mIdleCallbackIndex = 0; mIdleCallbackIndex = 0;
mIdleFuzzFactor = GetFuzzTimeMS();
nsresult rv = ScheduleNextIdleObserverCallback(); nsresult rv = ScheduleNextIdleObserverCallback();
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
return NS_OK; return NS_OK;
} }
mIdleCallbackIndex = -1; mIdleCallbackIndex = -1;
MOZ_ASSERT(mIdleTimer);
mIdleTimer->Cancel();
nsTObserverArray<IdleObserverHolder>::ForwardIterator iter(mIdleObservers); nsTObserverArray<IdleObserverHolder>::ForwardIterator iter(mIdleObservers);
while (iter.HasMore()) { while (iter.HasMore()) {
IdleObserverHolder& idleObserver = iter.GetNext(); IdleObserverHolder& idleObserver = iter.GetNext();
@ -8682,8 +8668,6 @@ nsGlobalWindow::RegisterIdleObserver(nsIIdleObserver* aIdleObserver)
} else { } else {
mIdleTimer->Cancel(); mIdleTimer->Cancel();
} }
mIdleFuzzFactor = GetFuzzTimeMS();
} }
MOZ_ASSERT(mIdleService); MOZ_ASSERT(mIdleService);
@ -8730,20 +8714,7 @@ nsGlobalWindow::RegisterIdleObserver(nsIIdleObserver* aIdleObserver)
} }
if (static_cast<PRInt32>(insertAtIndex) == mIdleCallbackIndex) { if (static_cast<PRInt32>(insertAtIndex) == mIdleCallbackIndex) {
PRUint32 userIdleTimeMS;
rv = mIdleService->GetIdleTime(&userIdleTimeMS);
NS_ENSURE_SUCCESS(rv, rv);
if (tmpIdleObserver.mTimeInS*1000 <= userIdleTimeMS) {
NotifyIdleObserver(tmpIdleObserver.mIdleObserver,
tmpIdleObserver.mTimeInS,
true);
mIdleCallbackIndex++;
return NS_OK;
}
mIdleTimer->Cancel(); mIdleTimer->Cancel();
rv = ScheduleNextIdleObserverCallback(); rv = ScheduleNextIdleObserverCallback();
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
} }
@ -8860,7 +8831,7 @@ nsGlobalWindow::Observe(nsISupports* aSubject, const char* aTopic,
mNotifyIdleObserversIdleOnThaw = true; mNotifyIdleObserversIdleOnThaw = true;
mNotifyIdleObserversActiveOnThaw = false; mNotifyIdleObserversActiveOnThaw = false;
} else if (mOuterWindow && mOuterWindow->GetCurrentInnerWindow() == this) { } else if (mOuterWindow && mOuterWindow->GetCurrentInnerWindow() == this) {
ScheduleIdleTimerCallback(); NotifyIdleObserversOfIdleActiveEvent();
} }
return NS_OK; return NS_OK;
} }
@ -9046,7 +9017,7 @@ nsGlobalWindow::FireDelayedDOMEvents()
if (mNotifyIdleObserversIdleOnThaw) { if (mNotifyIdleObserversIdleOnThaw) {
mNotifyIdleObserversIdleOnThaw = false; mNotifyIdleObserversIdleOnThaw = false;
ScheduleIdleTimerCallback(); NotifyIdleObserversOfIdleActiveEvent();
} }
if (mNotifyIdleObserversActiveOnThaw) { if (mNotifyIdleObserversActiveOnThaw) {

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

@ -769,7 +769,6 @@ protected:
nsresult ScheduleNextIdleObserverCallback(); nsresult ScheduleNextIdleObserverCallback();
PRUint32 GetFuzzTimeMS(); PRUint32 GetFuzzTimeMS();
nsresult ScheduleActiveTimerCallback(); nsresult ScheduleActiveTimerCallback();
nsresult ScheduleIdleTimerCallback();
PRUint32 FindInsertionIndex(IdleObserverHolder* aIdleObserver); PRUint32 FindInsertionIndex(IdleObserverHolder* aIdleObserver);
virtual nsresult RegisterIdleObserver(nsIIdleObserver* aIdleObserverPtr); virtual nsresult RegisterIdleObserver(nsIIdleObserver* aIdleObserverPtr);
nsresult FindIndexOfElementToRemove(nsIIdleObserver* aIdleObserver, nsresult FindIndexOfElementToRemove(nsIIdleObserver* aIdleObserver,