mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-21 01:05:45 +00:00
Bug 784591. Part 2. Don't track images that don't have a frame created. r=jlebar
This commit is contained in:
parent
f57acdd62d
commit
8f8182655c
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user