diff --git a/mozilla/layout/base/nsCSSRendering.cpp b/mozilla/layout/base/nsCSSRendering.cpp index 565ec6cf43e..fb494865dea 100644 --- a/mozilla/layout/base/nsCSSRendering.cpp +++ b/mozilla/layout/base/nsCSSRendering.cpp @@ -2752,7 +2752,7 @@ nsCSSRendering::PaintBackgroundWithSC(nsIPresContext* aPresContext, if (req) req->GetImageStatus(&status); - if (NS_FAILED(rv) || !req || !(status & imgIRequest::STATUS_SIZE_AVAILABLE)) { + if (NS_FAILED(rv) || !req || !(status & imgIRequest::STATUS_FRAME_COMPLETE) || !(status & imgIRequest::STATUS_SIZE_AVAILABLE)) { if (!transparentBG) { // The background color is rendered over the 'border' 'padding' and // 'content' areas diff --git a/mozilla/layout/base/nsImageLoader.cpp b/mozilla/layout/base/nsImageLoader.cpp index 0836daabf5a..529ae3de5be 100644 --- a/mozilla/layout/base/nsImageLoader.cpp +++ b/mozilla/layout/base/nsImageLoader.cpp @@ -164,6 +164,18 @@ NS_IMETHODIMP nsImageLoader::OnStopFrame(imgIRequest *aRequest, nsISupports *aCo { if (!mFrame) return NS_ERROR_FAILURE; + +#ifdef NS_DEBUG +// Make sure the image request status's STATUS_FRAME_COMPLETE flag has been set to ensure +// the image will be painted when invalidated + if (aRequest) { + PRUint32 status = imgIRequest::STATUS_ERROR; + nsresult rv = aRequest->GetImageStatus(&status); + if (NS_SUCCEEDED(rv)) { + NS_ASSERTION((status & imgIRequest::STATUS_FRAME_COMPLETE), "imgIRequest::STATUS_FRAME_COMPLETE not set"); + } + } +#endif // Draw the background image RedrawDirtyFrame(nsnull); diff --git a/mozilla/layout/base/src/nsImageLoader.cpp b/mozilla/layout/base/src/nsImageLoader.cpp index 0836daabf5a..529ae3de5be 100644 --- a/mozilla/layout/base/src/nsImageLoader.cpp +++ b/mozilla/layout/base/src/nsImageLoader.cpp @@ -164,6 +164,18 @@ NS_IMETHODIMP nsImageLoader::OnStopFrame(imgIRequest *aRequest, nsISupports *aCo { if (!mFrame) return NS_ERROR_FAILURE; + +#ifdef NS_DEBUG +// Make sure the image request status's STATUS_FRAME_COMPLETE flag has been set to ensure +// the image will be painted when invalidated + if (aRequest) { + PRUint32 status = imgIRequest::STATUS_ERROR; + nsresult rv = aRequest->GetImageStatus(&status); + if (NS_SUCCEEDED(rv)) { + NS_ASSERTION((status & imgIRequest::STATUS_FRAME_COMPLETE), "imgIRequest::STATUS_FRAME_COMPLETE not set"); + } + } +#endif // Draw the background image RedrawDirtyFrame(nsnull); diff --git a/mozilla/layout/html/style/src/nsCSSRendering.cpp b/mozilla/layout/html/style/src/nsCSSRendering.cpp index 565ec6cf43e..fb494865dea 100644 --- a/mozilla/layout/html/style/src/nsCSSRendering.cpp +++ b/mozilla/layout/html/style/src/nsCSSRendering.cpp @@ -2752,7 +2752,7 @@ nsCSSRendering::PaintBackgroundWithSC(nsIPresContext* aPresContext, if (req) req->GetImageStatus(&status); - if (NS_FAILED(rv) || !req || !(status & imgIRequest::STATUS_SIZE_AVAILABLE)) { + if (NS_FAILED(rv) || !req || !(status & imgIRequest::STATUS_FRAME_COMPLETE) || !(status & imgIRequest::STATUS_SIZE_AVAILABLE)) { if (!transparentBG) { // The background color is rendered over the 'border' 'padding' and // 'content' areas diff --git a/mozilla/modules/libpr0n/public/imgIRequest.idl b/mozilla/modules/libpr0n/public/imgIRequest.idl index 31940284245..647eadf7256 100644 --- a/mozilla/modules/libpr0n/public/imgIRequest.idl +++ b/mozilla/modules/libpr0n/public/imgIRequest.idl @@ -55,6 +55,7 @@ interface imgIRequest : nsIRequest const long STATUS_LOAD_PARTIAL = 0x2; const long STATUS_LOAD_COMPLETE = 0x4; const long STATUS_ERROR = 0x8; + const long STATUS_FRAME_COMPLETE = 0x10; //@} /** diff --git a/mozilla/modules/libpr0n/src/imgRequest.cpp b/mozilla/modules/libpr0n/src/imgRequest.cpp index 68d3d06e3ff..44c2baf2c22 100644 --- a/mozilla/modules/libpr0n/src/imgRequest.cpp +++ b/mozilla/modules/libpr0n/src/imgRequest.cpp @@ -444,6 +444,8 @@ NS_IMETHODIMP imgRequest::OnStopFrame(imgIRequest *request, nsISupports *cx, gfx LOG_SCOPE(gImgLog, "imgRequest::OnStopFrame"); + mImageStatus |= imgIRequest::STATUS_FRAME_COMPLETE; + if (mCacheEntry) { PRUint32 cacheSize = 0;