Bug 784591. Part 2. Don't track images that don't have a frame created. r=jlebar

This commit is contained in:
Timothy Nikkel 2013-01-17 17:58:37 -06:00
parent f57acdd62d
commit 8f8182655c
2 changed files with 70 additions and 12 deletions

View File

@ -382,6 +382,21 @@ nsImageLoadingContent::FrameCreated(nsIFrame* aFrame)
// be registered.
nsPresContext* presContext = aFrame->PresContext();
if (mCurrentRequest && !(mCurrentRequestFlags & REQUEST_IS_TRACKED)) {
nsIDocument* doc = GetOurCurrentDoc();
if (doc) {
mCurrentRequestFlags |= REQUEST_IS_TRACKED;
doc->AddImage(mCurrentRequest);
}
}
if (mPendingRequest && !(mPendingRequestFlags & REQUEST_IS_TRACKED)) {
nsIDocument* doc = GetOurCurrentDoc();
if (doc) {
mPendingRequestFlags |= REQUEST_IS_TRACKED;
doc->AddImage(mPendingRequest);
}
}
if (mCurrentRequest) {
nsLayoutUtils::RegisterImageRequestIfAnimated(presContext, mCurrentRequest,
&mCurrentRequestRegistered);
@ -410,6 +425,21 @@ nsImageLoadingContent::FrameDestroyed(nsIFrame* aFrame)
mPendingRequest,
&mPendingRequestRegistered);
}
if (mCurrentRequest && (mCurrentRequestFlags & REQUEST_IS_TRACKED)) {
nsIDocument* doc = GetOurCurrentDoc();
if (doc) {
mCurrentRequestFlags &= ~REQUEST_IS_TRACKED;
doc->RemoveImage(mCurrentRequest);
}
}
if (mPendingRequest && (mPendingRequestFlags & REQUEST_IS_TRACKED)) {
nsIDocument* doc = GetOurCurrentDoc();
if (doc) {
mPendingRequestFlags &= ~REQUEST_IS_TRACKED;
doc->RemoveImage(mPendingRequest);
}
}
}
int32_t
@ -1156,10 +1186,16 @@ nsImageLoadingContent::BindToTree(nsIDocument* aDocument, nsIContent* aParent,
nsCxPusher pusher;
pusher.PushNull();
if (mCurrentRequest)
aDocument->AddImage(mCurrentRequest);
if (mPendingRequest)
aDocument->AddImage(mPendingRequest);
if (GetOurPrimaryFrame()) {
if (mCurrentRequest && !(mCurrentRequestFlags & REQUEST_IS_TRACKED)) {
mCurrentRequestFlags |= REQUEST_IS_TRACKED;
aDocument->AddImage(mCurrentRequest);
}
if (mPendingRequest && !(mPendingRequestFlags & REQUEST_IS_TRACKED)) {
mPendingRequestFlags |= REQUEST_IS_TRACKED;
aDocument->AddImage(mPendingRequest);
}
}
if (mCurrentRequestFlags & REQUEST_BLOCKS_ONLOAD)
aDocument->BlockOnload();
@ -1178,10 +1214,14 @@ nsImageLoadingContent::UnbindFromTree(bool aDeep, bool aNullParent)
nsCxPusher pusher;
pusher.PushNull();
if (mCurrentRequest)
if (mCurrentRequest && (mCurrentRequestFlags & REQUEST_IS_TRACKED)) {
mCurrentRequestFlags &= ~REQUEST_IS_TRACKED;
doc->RemoveImage(mCurrentRequest);
if (mPendingRequest)
}
if (mPendingRequest && (mPendingRequestFlags & REQUEST_IS_TRACKED)) {
mPendingRequestFlags &= ~REQUEST_IS_TRACKED;
doc->RemoveImage(mPendingRequest);
}
if (mCurrentRequestFlags & REQUEST_BLOCKS_ONLOAD)
doc->UnblockOnload(false);
@ -1197,8 +1237,16 @@ nsImageLoadingContent::TrackImage(imgIRequest* aImage)
"Why haven't we heard of this request?");
nsIDocument* doc = GetOurCurrentDoc();
if (doc)
return doc->AddImage(aImage);
if (doc && GetOurPrimaryFrame()) {
if (aImage == mCurrentRequest && !(mCurrentRequestFlags & REQUEST_IS_TRACKED)) {
mCurrentRequestFlags |= REQUEST_IS_TRACKED;
doc->AddImage(mCurrentRequest);
}
if (aImage == mPendingRequest && !(mPendingRequestFlags & REQUEST_IS_TRACKED)) {
mPendingRequestFlags |= REQUEST_IS_TRACKED;
doc->AddImage(mPendingRequest);
}
}
return NS_OK;
}
@ -1215,8 +1263,16 @@ nsImageLoadingContent::UntrackImage(imgIRequest* aImage)
// That's fine, because the document empties out the tracker and unlocks
// all locked images on destruction.
nsIDocument* doc = GetOurCurrentDoc();
if (doc)
return doc->RemoveImage(aImage, nsIDocument::REQUEST_DISCARD);
if (doc) {
if (aImage == mCurrentRequest && (mCurrentRequestFlags & REQUEST_IS_TRACKED)) {
mCurrentRequestFlags &= ~REQUEST_IS_TRACKED;
doc->RemoveImage(mCurrentRequest, nsIDocument::REQUEST_DISCARD);
}
if (aImage == mPendingRequest && (mPendingRequestFlags & REQUEST_IS_TRACKED)) {
mPendingRequestFlags &= ~REQUEST_IS_TRACKED;
doc->RemoveImage(mPendingRequest, nsIDocument::REQUEST_DISCARD);
}
}
return NS_OK;
}

View File

@ -342,10 +342,12 @@ protected:
uint32_t mPendingRequestFlags;
enum {
// Set if the request needs
// Set if the request needs ResetAnimation called on it.
REQUEST_NEEDS_ANIMATION_RESET = 0x00000001U,
// Set if the request is blocking onload.
REQUEST_BLOCKS_ONLOAD = 0x00000002U
REQUEST_BLOCKS_ONLOAD = 0x00000002U,
// Set if the request is currently tracked with the document.
REQUEST_IS_TRACKED = 0x00000004U
};
// If the image was blocked or if there was an error loading, it's nice to