Bug 553075: Don't register for periodic SMIL sample callbacks until we've got some animations registered. r=roc

This commit is contained in:
Daniel Holbert 2010-03-21 12:22:36 -07:00
parent 94ad96ba23
commit 1c298b72ff
2 changed files with 20 additions and 2 deletions

View File

@ -81,6 +81,7 @@ GetRefreshDriverForDoc(nsIDocument* aDoc)
nsSMILAnimationController::nsSMILAnimationController()
: mResampleNeeded(PR_FALSE),
mDeferredStartSampling(PR_FALSE),
mDocument(nsnull)
{
mAnimationElementTable.Init();
@ -150,7 +151,11 @@ nsSMILAnimationController::Resume(PRUint32 aType)
if (wasPaused && !mPauseState && mChildContainerTable.Count()) {
Sample(); // Run the first sample manually
StartSampling(GetRefreshDriverForDoc(mDocument));
if (mAnimationElementTable.Count()) {
StartSampling(GetRefreshDriverForDoc(mDocument));
} else {
mDeferredStartSampling = PR_TRUE;
}
}
}
@ -185,6 +190,14 @@ nsSMILAnimationController::RegisterAnimationElement(
nsISMILAnimationElement* aAnimationElement)
{
mAnimationElementTable.PutEntry(aAnimationElement);
if (mDeferredStartSampling) {
// mAnimationElementTable was empty until we just inserted its first element
NS_ABORT_IF_FALSE(mAnimationElementTable.Count() == 1,
"we shouldn't have deferred sampling if we already had "
"animations registered");
mDeferredStartSampling = PR_FALSE;
StartSampling(GetRefreshDriverForDoc(mDocument));
}
}
void
@ -695,7 +708,11 @@ nsSMILAnimationController::AddChild(nsSMILTimeContainer& aChild)
if (!mPauseState && mChildContainerTable.Count() == 1) {
Sample(); // Run the first sample manually
StartSampling(GetRefreshDriverForDoc(mDocument));
if (mAnimationElementTable.Count()) {
StartSampling(GetRefreshDriverForDoc(mDocument));
} else {
mDeferredStartSampling = PR_TRUE;
}
}
return NS_OK;

View File

@ -183,6 +183,7 @@ protected:
AnimationElementHashtable mAnimationElementTable;
TimeContainerHashtable mChildContainerTable;
PRPackedBool mResampleNeeded;
PRPackedBool mDeferredStartSampling;
// Store raw ptr to mDocument. It owns the controller, so controller
// shouldn't outlive it