diff --git a/mozilla/content/html/content/src/nsHTMLImageElement.cpp b/mozilla/content/html/content/src/nsHTMLImageElement.cpp index d5dc88d68c2..925e4d0ee2f 100644 --- a/mozilla/content/html/content/src/nsHTMLImageElement.cpp +++ b/mozilla/content/html/content/src/nsHTMLImageElement.cpp @@ -941,7 +941,7 @@ nsHTMLImageElement::SetSrcInner(nsIURI* aBaseURL, doc->GetDocumentLoadGroup(getter_AddRefs(loadGroup)); } - il->LoadImage(uri, loadGroup, this, sup, nsIRequest::LOAD_NORMAL, nsnull, getter_AddRefs(mRequest)); + il->LoadImage(uri, loadGroup, this, sup, nsIRequest::LOAD_NORMAL, nsnull, nsnull, getter_AddRefs(mRequest)); } } diff --git a/mozilla/content/xbl/src/nsXBLPrototypeBinding.cpp b/mozilla/content/xbl/src/nsXBLPrototypeBinding.cpp index 72fe9c2a7e6..f21067b6aa6 100644 --- a/mozilla/content/xbl/src/nsXBLPrototypeBinding.cpp +++ b/mozilla/content/xbl/src/nsXBLPrototypeBinding.cpp @@ -535,7 +535,7 @@ nsXBLPrototypeBinding::LoadResources(PRBool* aResult) // Now kick off the image load nsCOMPtr req; - il->LoadImage(url, nsnull, nsnull, nsnull, nsIRequest::LOAD_BACKGROUND, nsnull, getter_AddRefs(req)); + il->LoadImage(url, nsnull, nsnull, nsnull, nsIRequest::LOAD_BACKGROUND, nsnull, nsnull, getter_AddRefs(req)); } else #endif diff --git a/mozilla/layout/base/nsImageLoader.cpp b/mozilla/layout/base/nsImageLoader.cpp index 696b35f8fe6..529a927ef60 100644 --- a/mozilla/layout/base/nsImageLoader.cpp +++ b/mozilla/layout/base/nsImageLoader.cpp @@ -119,7 +119,7 @@ nsImageLoader::Load(const nsAReadableString &aURI) if (NS_FAILED(rv)) return rv; return il->LoadImage(uri, loadGroup, NS_STATIC_CAST(imgIDecoderObserver *, this), - nsnull, nsIRequest::LOAD_BACKGROUND, nsnull, getter_AddRefs(mRequest)); + nsnull, nsIRequest::LOAD_BACKGROUND, nsnull, nsnull, getter_AddRefs(mRequest)); } diff --git a/mozilla/layout/base/src/nsImageLoader.cpp b/mozilla/layout/base/src/nsImageLoader.cpp index 696b35f8fe6..529a927ef60 100644 --- a/mozilla/layout/base/src/nsImageLoader.cpp +++ b/mozilla/layout/base/src/nsImageLoader.cpp @@ -119,7 +119,7 @@ nsImageLoader::Load(const nsAReadableString &aURI) if (NS_FAILED(rv)) return rv; return il->LoadImage(uri, loadGroup, NS_STATIC_CAST(imgIDecoderObserver *, this), - nsnull, nsIRequest::LOAD_BACKGROUND, nsnull, getter_AddRefs(mRequest)); + nsnull, nsIRequest::LOAD_BACKGROUND, nsnull, nsnull, getter_AddRefs(mRequest)); } diff --git a/mozilla/layout/generic/nsBulletFrame.cpp b/mozilla/layout/generic/nsBulletFrame.cpp index a95d05fbc8b..09919708605 100644 --- a/mozilla/layout/generic/nsBulletFrame.cpp +++ b/mozilla/layout/generic/nsBulletFrame.cpp @@ -145,7 +145,7 @@ nsBulletFrame::Init(nsIPresContext* aPresContext, NS_RELEASE(listener); } - il->LoadImage(imgURI, loadGroup, mListener, aPresContext, nsIRequest::LOAD_NORMAL, nsnull, getter_AddRefs(mImageRequest)); + il->LoadImage(imgURI, loadGroup, mListener, aPresContext, nsIRequest::LOAD_NORMAL, nsnull, nsnull, getter_AddRefs(mImageRequest)); } return NS_OK; @@ -1383,7 +1383,7 @@ nsBulletFrame::Reflow(nsIPresContext* aPresContext, nsCOMPtr loadGroup; GetLoadGroup(aPresContext, getter_AddRefs(loadGroup)); - il->LoadImage(newURI, loadGroup, mListener, aPresContext, nsIRequest::LOAD_NORMAL, nsnull, getter_AddRefs(mImageRequest)); + il->LoadImage(newURI, loadGroup, mListener, aPresContext, nsIRequest::LOAD_NORMAL, nsnull, nsnull, getter_AddRefs(mImageRequest)); } } } diff --git a/mozilla/layout/generic/nsImageFrame.cpp b/mozilla/layout/generic/nsImageFrame.cpp index 7258bbc76c9..95bb3ea0c3b 100644 --- a/mozilla/layout/generic/nsImageFrame.cpp +++ b/mozilla/layout/generic/nsImageFrame.cpp @@ -131,6 +131,24 @@ NS_NewImageFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame) return NS_OK; } + +int +nsImageFrame::GetImageLoad(imgIRequest *aRequest) +{ + if (aRequest == mLoads[0].mRequest) + return 0; + else if (aRequest == mLoads[1].mRequest) + return 1; + else if (aRequest == mLoads[2].mRequest) + return 2; + + NS_ASSERTION((aRequest == mLoads[0].mRequest && + aRequest == mLoads[1].mRequest && + aRequest == mLoads[2].mRequest), "Failure to figure out which imgIRequest this is!"); + + return -1; +} + nsImageFrame::nsImageFrame() : mIntrinsicSize(0, 0), mGotInitialReflow(PR_FALSE), @@ -208,17 +226,17 @@ nsImageFrame::Destroy(nsIPresContext* aPresContext) NS_RELEASE(mImageMap); } - if (mImageRequest) - mImageRequest->Cancel(NS_ERROR_FAILURE); // NS_BINDING_ABORT ? - if (mLowImageRequest) - mLowImageRequest->Cancel(NS_ERROR_FAILURE); // NS_BINDING_ABORT ? + for (int i=0; i != 3; ++i) { + if (mLoads[i].mRequest) { + mLoads[i].mRequest->Cancel(NS_ERROR_FAILURE); + mLoads[i].mRequest = nsnull; + } + } // set the frame to null so we don't send messages to a dead object. if (mListener) NS_REINTERPRET_CAST(nsImageListener*, mListener.get())->SetFrame(nsnull); - mImageRequest = nsnull; - mLowImageRequest = nsnull; mListener = nsnull; return nsLeafFrame::Destroy(aPresContext); @@ -258,15 +276,17 @@ nsImageFrame::Init(nsIPresContext* aPresContext, // Set the image loader's source URL and base URL if (NS_CONTENT_ATTR_HAS_VALUE == lowSrcResult && !lowSrc.IsEmpty()) { - LoadImage(lowSrc, aPresContext, getter_AddRefs(mLowImageRequest)); + mLoads[1].mRequest = do_CreateInstance("@mozilla.org/image/request;1"); + LoadImage(lowSrc, aPresContext, mLoads[1].mRequest); } mInitialLoadCompleted = PR_FALSE; mCanSendLoadEvent = PR_TRUE; - rv = LoadImage(src, aPresContext, getter_AddRefs(mImageRequest)); // if the image was found in the cache, - // it is possible that LoadImage will result in - // a call to OnStartContainer() + mLoads[0].mRequest = do_CreateInstance("@mozilla.org/image/request;1"); + rv = LoadImage(src, aPresContext, mLoads[0].mRequest); // if the image was found in the cache, + // it is possible that LoadImage will result in + // a call to OnStartContainer() return rv; } @@ -279,8 +299,14 @@ NS_IMETHODIMP nsImageFrame::OnStartDecode(imgIRequest *aRequest, nsIPresContext NS_IMETHODIMP nsImageFrame::OnStartContainer(imgIRequest *aRequest, nsIPresContext *aPresContext, imgIContainer *aImage) { + if (!aImage) return NS_ERROR_INVALID_ARG; + mInitialLoadCompleted = PR_TRUE; + int whichLoad = GetImageLoad(aRequest); + if (whichLoad == -1) return NS_ERROR_FAILURE; + struct ImageLoad *load= &mLoads[whichLoad]; + if (aImage) { /* Get requested animation policy from the pres context: @@ -295,11 +321,6 @@ NS_IMETHODIMP nsImageFrame::OnStartContainer(imgIRequest *aRequest, nsIPresConte } nscoord w, h; -#ifdef DEBUG_pavlov - NS_ENSURE_ARG_POINTER(aImage); -#else - if (!aImage) return NS_ERROR_INVALID_ARG; -#endif aImage->GetWidth(&w); aImage->GetHeight(&h); @@ -308,19 +329,19 @@ NS_IMETHODIMP nsImageFrame::OnStartContainer(imgIRequest *aRequest, nsIPresConte nsSize newsize(NSIntPixelsToTwips(w, p2t), NSIntPixelsToTwips(h, p2t)); - if (mIntrinsicSize != newsize) { - mIntrinsicSize = newsize; + if (load->mIntrinsicSize != newsize) { + load->mIntrinsicSize = newsize; - if (mIntrinsicSize.width != 0 && mIntrinsicSize.height != 0) - mTransform.SetToScale((float(mComputedSize.width) / float(mIntrinsicSize.width)), - (float(mComputedSize.height) / float(mIntrinsicSize.height))); + if (load->mIntrinsicSize.width != 0 && load->mIntrinsicSize.height != 0) + load->mTransform.SetToScale((float(mComputedSize.width) / float(load->mIntrinsicSize.width)), + (float(mComputedSize.height) / float(load->mIntrinsicSize.height))); if (!mSizeConstrained) { nsCOMPtr presShell; aPresContext->GetShell(getter_AddRefs(presShell)); NS_ASSERTION(mParent, "No parent to pass the reflow request up to."); NS_ASSERTION(presShell, "No PresShell."); - if (mParent && presShell && mGotInitialReflow) { // don't reflow if we havn't gotten the inital reflow yet + if (mParent && presShell && mGotInitialReflow && whichLoad == 0) { // don't reflow if we havn't gotten the inital reflow yet mState |= NS_FRAME_IS_DIRTY; mParent->ReflowDirtyChild(presShell, NS_STATIC_CAST(nsIFrame*, this)); } @@ -343,6 +364,12 @@ NS_IMETHODIMP nsImageFrame::OnDataAvailable(imgIRequest *aRequest, nsIPresContex if (!aRect) return NS_ERROR_NULL_POINTER; + int whichLoad = GetImageLoad(aRequest); + if (whichLoad == -1) return NS_ERROR_FAILURE; + if (whichLoad != 0) return NS_OK; + struct ImageLoad *load= &mLoads[whichLoad]; + + nsRect r(aRect->x, aRect->y, aRect->width, aRect->height); float p2t; @@ -352,12 +379,13 @@ NS_IMETHODIMP nsImageFrame::OnDataAvailable(imgIRequest *aRequest, nsIPresContex r.width = NSIntPixelsToTwips(r.width, p2t); r.height = NSIntPixelsToTwips(r.height, p2t); - mTransform.TransformCoord(&r.x, &r.y, &r.width, &r.height); + load->mTransform.TransformCoord(&r.x, &r.y, &r.width, &r.height); r.x += mBorderPadding.left; r.y += mBorderPadding.top; - Invalidate(aPresContext, r, PR_FALSE); + if (whichLoad == 0) + Invalidate(aPresContext, r, PR_FALSE); return NS_OK; } @@ -519,18 +547,57 @@ NS_IMETHODIMP nsImageFrame::OnStopDecode(imgIRequest *aRequest, nsIPresContext * // check to see if an image error occurred PRBool imageFailedToLoad = PR_FALSE; - if (NS_FAILED(aStatus)) { // We failed to load the image. Notify the pres shell + int whichLoad = GetImageLoad(aRequest); + + if (whichLoad == -1) return NS_ERROR_FAILURE; + + if (whichLoad == 2) { + if (NS_SUCCEEDED(aStatus)) { + if (mLoads[0].mRequest) { + mLoads[0].mRequest->Cancel(NS_ERROR_FAILURE); + } + + mLoads[0].mRequest = mLoads[2].mRequest; + mLoads[0].mIntrinsicSize = mLoads[2].mIntrinsicSize; + // XXX i don't think we always want to set this. + mLoads[0].mTransform = mLoads[2].mTransform; + struct ImageLoad *load= &mLoads[0]; + + mLoads[2].mRequest = nsnull; + + if (!mSizeConstrained && (mLoads[0].mIntrinsicSize != mIntrinsicSize)) { + nsCOMPtr presShell; + aPresContext->GetShell(getter_AddRefs(presShell)); + NS_ASSERTION(mParent, "No parent to pass the reflow request up to."); + NS_ASSERTION(presShell, "No PresShell."); + if (mParent && presShell && mGotInitialReflow) { // don't reflow if we havn't gotten the inital reflow yet + mState |= NS_FRAME_IS_DIRTY; + mParent->ReflowDirtyChild(presShell, NS_STATIC_CAST(nsIFrame*, this)); + } + } else { + nsSize s; + GetSize(s); + nsRect r(0,0, s.width, s.height); + Invalidate(aPresContext, r, PR_FALSE); + } + + } else { + mLoads[2].mRequest = nsnull; + } + + } else if (NS_FAILED(aStatus)) { PRBool lowFailed = PR_FALSE; PRBool imageFailed = PR_FALSE; // One of the two images didn't load, which one? - if (mLowImageRequest == aRequest || !mLowImageRequest) { - lowFailed = PR_TRUE; - } - if (mImageRequest == aRequest || !mImageRequest) { + if (whichLoad == 0 || !mLoads[0].mRequest) { imageFailed = PR_TRUE; } + if (whichLoad == 1 || !mLoads[1].mRequest) { + lowFailed = PR_TRUE; + } + if (imageFailed && lowFailed) imageFailedToLoad = PR_TRUE; } @@ -568,19 +635,25 @@ NS_IMETHODIMP nsImageFrame::OnStopDecode(imgIRequest *aRequest, nsIPresContext * NS_IMETHODIMP nsImageFrame::FrameChanged(imgIContainer *aContainer, nsIPresContext *aPresContext, gfxIImageFrame *aNewFrame, nsRect *aDirtyRect) { - nsRect r(*aDirtyRect); + if (!mLoads[0].mRequest) + return NS_OK; // if mLoads[0].mRequest is null, this isn't for the first one, so we don't care about it. - float p2t; - aPresContext->GetPixelsToTwips(&p2t); - r.x = NSIntPixelsToTwips(r.x, p2t); - r.y = NSIntPixelsToTwips(r.y, p2t); - r.width = NSIntPixelsToTwips(r.width, p2t); - r.height = NSIntPixelsToTwips(r.height, p2t); + nsCOMPtr con; + mLoads[0].mRequest->GetImage(getter_AddRefs(con)); + if (aContainer == con.get()) { + nsRect r(*aDirtyRect); - mTransform.TransformCoord(&r.x, &r.y, &r.width, &r.height); + float p2t; + aPresContext->GetPixelsToTwips(&p2t); + r.x = NSIntPixelsToTwips(r.x, p2t); + r.y = NSIntPixelsToTwips(r.y, p2t); + r.width = NSIntPixelsToTwips(r.width, p2t); + r.height = NSIntPixelsToTwips(r.height, p2t); - Invalidate(aPresContext, r, PR_FALSE); + mLoads[0].mTransform.TransformCoord(&r.x, &r.y, &r.width, &r.height); + Invalidate(aPresContext, r, PR_FALSE); + } return NS_OK; } @@ -597,7 +670,6 @@ nsImageFrame::GetDesiredSize(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsHTMLReflowMetrics& aDesiredSize) { - nscoord widthConstraint = NS_INTRINSICSIZE; nscoord heightConstraint = NS_INTRINSICSIZE; PRBool fixedContentWidth = PR_FALSE; @@ -621,6 +693,18 @@ nsImageFrame::GetDesiredSize(nsIPresContext* aPresContext, fixedContentHeight = PR_TRUE; } + // if mLoads[0].mIntrinsicSize.width and height are 0, then we should check to see + // if the size is already known by the image container. + if (mLoads[0].mIntrinsicSize.width == 0 && mLoads[0].mIntrinsicSize.height == 0) { + nsCOMPtr con; + mLoads[0].mRequest->GetImage(getter_AddRefs(con)); + if (con) { + con->GetWidth(&mLoads[0].mIntrinsicSize.width); + con->GetHeight(&mLoads[0].mIntrinsicSize.height); + } + } + mIntrinsicSize = mLoads[0].mIntrinsicSize; + PRBool haveComputedSize = PR_FALSE; PRBool needIntrinsicImageSize = PR_FALSE; @@ -675,11 +759,13 @@ nsImageFrame::GetDesiredSize(nsIPresContext* aPresContext, mComputedSize.width = newWidth; mComputedSize.height = newHeight; + nsTransform2D *transform = &mLoads[0].mTransform; + if (mComputedSize == mIntrinsicSize) { - mTransform.SetToIdentity(); + transform->SetToIdentity(); } else { if (mIntrinsicSize.width != 0 && mIntrinsicSize.height != 0) { - mTransform.SetToScale(float(mComputedSize.width) / float(mIntrinsicSize.width), + transform->SetToScale(float(mComputedSize.width) / float(mIntrinsicSize.width), float(mComputedSize.height) / float(mIntrinsicSize.height)); } } @@ -977,17 +1063,16 @@ nsImageFrame::Paint(nsIPresContext* aPresContext, nsCOMPtr imgCon; nsCOMPtr lowImgCon; - if (mImageRequest) { - mImageRequest->GetImage(getter_AddRefs(imgCon)); + PRUint32 loadStatus = imgIRequest::STATUS_ERROR; + + if (mLoads[0].mRequest) { + mLoads[0].mRequest->GetImage(getter_AddRefs(imgCon)); + mLoads[0].mRequest->GetImageStatus(&loadStatus); } - if (mLowImageRequest) { - mLowImageRequest->GetImage(getter_AddRefs(lowImgCon)); + if (mLoads[1].mRequest) { + mLoads[1].mRequest->GetImage(getter_AddRefs(lowImgCon)); } - PRUint32 loadStatus = imgIRequest::STATUS_ERROR; - if (mImageRequest) { - mImageRequest->GetImageStatus(&loadStatus); - } if (loadStatus & imgIRequest::STATUS_ERROR || !(imgCon || lowImgCon)) { // No image yet, or image load failed. Draw the alt-text and an icon // indicating the status @@ -1019,7 +1104,7 @@ nsImageFrame::Paint(nsIPresContext* aPresContext, if (imgCon) { nsPoint p(inner.x, inner.y); - if (mIntrinsicSize == mComputedSize) { + if (mLoads[0].mIntrinsicSize == mComputedSize) { inner.IntersectRect(inner, aDirtyRect); nsRect r(inner.x, inner.y, inner.width, inner.height); r.x -= mBorderPadding.left; @@ -1027,8 +1112,8 @@ nsImageFrame::Paint(nsIPresContext* aPresContext, aRenderingContext.DrawImage(imgCon, &r, &p); } else { nsTransform2D trans; - trans.SetToScale((float(mIntrinsicSize.width) / float(inner.width)), - (float(mIntrinsicSize.height) / float(inner.height))); + trans.SetToScale((float(mLoads[0].mIntrinsicSize.width) / float(inner.width)), + (float(mLoads[0].mIntrinsicSize.height) / float(inner.height))); nsRect r(0, 0, inner.width, inner.height); @@ -1409,20 +1494,25 @@ nsImageFrame::AttributeChanged(nsIPresContext* aPresContext, PRUint32 loadStatus = imgIRequest::STATUS_ERROR; - if (mImageRequest) - mImageRequest->GetImageStatus(&loadStatus); + if (mLoads[0].mRequest) + mLoads[0].mRequest->GetImageStatus(&loadStatus); if (!(loadStatus & imgIRequest::STATUS_SIZE_AVAILABLE)) { - if (mImageRequest) { + if (mLoads[0].mRequest) { mFailureReplace = PR_FALSE; // don't cause a CantRenderReplacedElement call - mImageRequest->Cancel(NS_ERROR_FAILURE); - mImageRequest = nsnull; + mLoads[0].mRequest->Cancel(NS_ERROR_FAILURE); + mLoads[0].mRequest = nsnull; } mCanSendLoadEvent = PR_TRUE; } - LoadImage(newSRC, aPresContext, getter_AddRefs(mImageRequest)); + if (mLoads[2].mRequest) { + mLoads[2].mRequest->Cancel(NS_ERROR_FAILURE); + mLoads[2].mRequest = nsnull; + } + mLoads[2].mRequest = do_CreateInstance("@mozilla.org/image/request;1"); + LoadImage(newSRC, aPresContext, mLoads[2].mRequest); } else if (nsHTMLAtoms::width == aAttribute || nsHTMLAtoms::height == aAttribute) { // XXX: could check for new width == old width, and make that a no-op @@ -1448,7 +1538,7 @@ nsImageFrame::GetFrameType(nsIAtom** aType) const NS_IMETHODIMP nsImageFrame::GetIntrinsicImageSize(nsSize& aSize) { - aSize = mIntrinsicSize; + aSize = mLoads[0].mIntrinsicSize; return NS_OK; } @@ -1459,9 +1549,9 @@ nsImageFrame::GetNaturalImageSize(PRUint32 *naturalWidth, *naturalWidth = 0; *naturalHeight = 0; - if (mImageRequest) { + if (mLoads[0].mRequest) { nsCOMPtr container; - mImageRequest->GetImage(getter_AddRefs(container)); + mLoads[0].mRequest->GetImage(getter_AddRefs(container)); if (container) { PRInt32 w, h; container->GetWidth(&w); @@ -1478,7 +1568,7 @@ nsImageFrame::GetNaturalImageSize(PRUint32 *naturalWidth, NS_IMETHODIMP nsImageFrame::GetImageRequest(imgIRequest **aRequest) { - *aRequest = mImageRequest; + *aRequest = mLoads[0].mRequest; NS_IF_ADDREF(*aRequest); return NS_OK; } @@ -1487,13 +1577,13 @@ NS_IMETHODIMP nsImageFrame::IsImageComplete(PRBool* aComplete) { NS_ENSURE_ARG_POINTER(aComplete); - if (!mImageRequest) { + if (!mLoads[0].mRequest) { *aComplete = PR_FALSE; return NS_OK; } PRUint32 status; - mImageRequest->GetImageStatus(&status); + mLoads[0].mRequest->GetImageStatus(&status); *aComplete = ((status & imgIRequest::STATUS_LOAD_COMPLETE) != 0); return NS_OK; @@ -1516,7 +1606,7 @@ void HaveFixedSize(const nsHTMLReflowState& aReflowState, PRPackedBool& aConstra nsresult -nsImageFrame::LoadImage(const nsAReadableString& aSpec, nsIPresContext *aPresContext, imgIRequest **aRequest) +nsImageFrame::LoadImage(const nsAReadableString& aSpec, nsIPresContext *aPresContext, imgIRequest *aRequest) { nsresult rv = NS_OK; @@ -1561,7 +1651,8 @@ nsImageFrame::LoadImage(const nsAReadableString& aSpec, nsIPresContext *aPresCon /* set this back to FALSE before we do the real load */ mInitialLoadCompleted = PR_FALSE; - return il->LoadImage(uri, loadGroup, mListener, aPresContext, loadFlags, nsnull, aRequest); + nsCOMPtr tempRequest; + return il->LoadImage(uri, loadGroup, mListener, aPresContext, loadFlags, nsnull, aRequest, getter_AddRefs(tempRequest)); } #define INTERNAL_GOPHER_LENGTH 16 /* "internal-gopher-" length */ diff --git a/mozilla/layout/generic/nsImageFrame.h b/mozilla/layout/generic/nsImageFrame.h index 62b53a49687..96c8a040b0e 100644 --- a/mozilla/layout/generic/nsImageFrame.h +++ b/mozilla/layout/generic/nsImageFrame.h @@ -74,6 +74,15 @@ private: nsImageFrame *mFrame; }; + +struct ImageLoad { + ImageLoad() : mIntrinsicSize(0,0) { } + nsCOMPtr mRequest; + nsSize mIntrinsicSize; + + nsTransform2D mTransform; +}; + #define ImageFrameSuper nsLeafFrame class nsImageFrame : public ImageFrameSuper, public nsIImageFrame { @@ -192,7 +201,7 @@ protected: nsRect& aInnerArea) const; - nsresult LoadImage(const nsAReadableString& aSpec, nsIPresContext *aPresContext, imgIRequest **aRequest); + nsresult LoadImage(const nsAReadableString& aSpec, nsIPresContext *aPresContext, imgIRequest *aRequest); inline PRBool CanLoadImage(nsIURI *aURI); @@ -204,18 +213,26 @@ protected: void FireDOMEvent(PRUint32 aMessage); - nsImageMap* mImageMap; - nsCOMPtr mImageRequest; - nsCOMPtr mLowImageRequest; +private: + inline int GetImageLoad(imgIRequest *aRequest); + + + nsImageMap* mImageMap; nsCOMPtr mListener; + /** + * 0 is the current image being displayed on the screen. + * 1 is for the lowsrc image if any. + * 2 is for attribute changed images. + * when the load from 2 completes, it will replace 0. + */ + struct ImageLoad mLoads[3]; + nsSize mComputedSize; nsSize mIntrinsicSize; - nsTransform2D mTransform; - PRPackedBool mSizeConstrained; PRPackedBool mGotInitialReflow; PRPackedBool mInitialLoadCompleted; diff --git a/mozilla/layout/html/base/src/nsBulletFrame.cpp b/mozilla/layout/html/base/src/nsBulletFrame.cpp index a95d05fbc8b..09919708605 100644 --- a/mozilla/layout/html/base/src/nsBulletFrame.cpp +++ b/mozilla/layout/html/base/src/nsBulletFrame.cpp @@ -145,7 +145,7 @@ nsBulletFrame::Init(nsIPresContext* aPresContext, NS_RELEASE(listener); } - il->LoadImage(imgURI, loadGroup, mListener, aPresContext, nsIRequest::LOAD_NORMAL, nsnull, getter_AddRefs(mImageRequest)); + il->LoadImage(imgURI, loadGroup, mListener, aPresContext, nsIRequest::LOAD_NORMAL, nsnull, nsnull, getter_AddRefs(mImageRequest)); } return NS_OK; @@ -1383,7 +1383,7 @@ nsBulletFrame::Reflow(nsIPresContext* aPresContext, nsCOMPtr loadGroup; GetLoadGroup(aPresContext, getter_AddRefs(loadGroup)); - il->LoadImage(newURI, loadGroup, mListener, aPresContext, nsIRequest::LOAD_NORMAL, nsnull, getter_AddRefs(mImageRequest)); + il->LoadImage(newURI, loadGroup, mListener, aPresContext, nsIRequest::LOAD_NORMAL, nsnull, nsnull, getter_AddRefs(mImageRequest)); } } } diff --git a/mozilla/layout/html/base/src/nsImageFrame.cpp b/mozilla/layout/html/base/src/nsImageFrame.cpp index 7258bbc76c9..95bb3ea0c3b 100644 --- a/mozilla/layout/html/base/src/nsImageFrame.cpp +++ b/mozilla/layout/html/base/src/nsImageFrame.cpp @@ -131,6 +131,24 @@ NS_NewImageFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame) return NS_OK; } + +int +nsImageFrame::GetImageLoad(imgIRequest *aRequest) +{ + if (aRequest == mLoads[0].mRequest) + return 0; + else if (aRequest == mLoads[1].mRequest) + return 1; + else if (aRequest == mLoads[2].mRequest) + return 2; + + NS_ASSERTION((aRequest == mLoads[0].mRequest && + aRequest == mLoads[1].mRequest && + aRequest == mLoads[2].mRequest), "Failure to figure out which imgIRequest this is!"); + + return -1; +} + nsImageFrame::nsImageFrame() : mIntrinsicSize(0, 0), mGotInitialReflow(PR_FALSE), @@ -208,17 +226,17 @@ nsImageFrame::Destroy(nsIPresContext* aPresContext) NS_RELEASE(mImageMap); } - if (mImageRequest) - mImageRequest->Cancel(NS_ERROR_FAILURE); // NS_BINDING_ABORT ? - if (mLowImageRequest) - mLowImageRequest->Cancel(NS_ERROR_FAILURE); // NS_BINDING_ABORT ? + for (int i=0; i != 3; ++i) { + if (mLoads[i].mRequest) { + mLoads[i].mRequest->Cancel(NS_ERROR_FAILURE); + mLoads[i].mRequest = nsnull; + } + } // set the frame to null so we don't send messages to a dead object. if (mListener) NS_REINTERPRET_CAST(nsImageListener*, mListener.get())->SetFrame(nsnull); - mImageRequest = nsnull; - mLowImageRequest = nsnull; mListener = nsnull; return nsLeafFrame::Destroy(aPresContext); @@ -258,15 +276,17 @@ nsImageFrame::Init(nsIPresContext* aPresContext, // Set the image loader's source URL and base URL if (NS_CONTENT_ATTR_HAS_VALUE == lowSrcResult && !lowSrc.IsEmpty()) { - LoadImage(lowSrc, aPresContext, getter_AddRefs(mLowImageRequest)); + mLoads[1].mRequest = do_CreateInstance("@mozilla.org/image/request;1"); + LoadImage(lowSrc, aPresContext, mLoads[1].mRequest); } mInitialLoadCompleted = PR_FALSE; mCanSendLoadEvent = PR_TRUE; - rv = LoadImage(src, aPresContext, getter_AddRefs(mImageRequest)); // if the image was found in the cache, - // it is possible that LoadImage will result in - // a call to OnStartContainer() + mLoads[0].mRequest = do_CreateInstance("@mozilla.org/image/request;1"); + rv = LoadImage(src, aPresContext, mLoads[0].mRequest); // if the image was found in the cache, + // it is possible that LoadImage will result in + // a call to OnStartContainer() return rv; } @@ -279,8 +299,14 @@ NS_IMETHODIMP nsImageFrame::OnStartDecode(imgIRequest *aRequest, nsIPresContext NS_IMETHODIMP nsImageFrame::OnStartContainer(imgIRequest *aRequest, nsIPresContext *aPresContext, imgIContainer *aImage) { + if (!aImage) return NS_ERROR_INVALID_ARG; + mInitialLoadCompleted = PR_TRUE; + int whichLoad = GetImageLoad(aRequest); + if (whichLoad == -1) return NS_ERROR_FAILURE; + struct ImageLoad *load= &mLoads[whichLoad]; + if (aImage) { /* Get requested animation policy from the pres context: @@ -295,11 +321,6 @@ NS_IMETHODIMP nsImageFrame::OnStartContainer(imgIRequest *aRequest, nsIPresConte } nscoord w, h; -#ifdef DEBUG_pavlov - NS_ENSURE_ARG_POINTER(aImage); -#else - if (!aImage) return NS_ERROR_INVALID_ARG; -#endif aImage->GetWidth(&w); aImage->GetHeight(&h); @@ -308,19 +329,19 @@ NS_IMETHODIMP nsImageFrame::OnStartContainer(imgIRequest *aRequest, nsIPresConte nsSize newsize(NSIntPixelsToTwips(w, p2t), NSIntPixelsToTwips(h, p2t)); - if (mIntrinsicSize != newsize) { - mIntrinsicSize = newsize; + if (load->mIntrinsicSize != newsize) { + load->mIntrinsicSize = newsize; - if (mIntrinsicSize.width != 0 && mIntrinsicSize.height != 0) - mTransform.SetToScale((float(mComputedSize.width) / float(mIntrinsicSize.width)), - (float(mComputedSize.height) / float(mIntrinsicSize.height))); + if (load->mIntrinsicSize.width != 0 && load->mIntrinsicSize.height != 0) + load->mTransform.SetToScale((float(mComputedSize.width) / float(load->mIntrinsicSize.width)), + (float(mComputedSize.height) / float(load->mIntrinsicSize.height))); if (!mSizeConstrained) { nsCOMPtr presShell; aPresContext->GetShell(getter_AddRefs(presShell)); NS_ASSERTION(mParent, "No parent to pass the reflow request up to."); NS_ASSERTION(presShell, "No PresShell."); - if (mParent && presShell && mGotInitialReflow) { // don't reflow if we havn't gotten the inital reflow yet + if (mParent && presShell && mGotInitialReflow && whichLoad == 0) { // don't reflow if we havn't gotten the inital reflow yet mState |= NS_FRAME_IS_DIRTY; mParent->ReflowDirtyChild(presShell, NS_STATIC_CAST(nsIFrame*, this)); } @@ -343,6 +364,12 @@ NS_IMETHODIMP nsImageFrame::OnDataAvailable(imgIRequest *aRequest, nsIPresContex if (!aRect) return NS_ERROR_NULL_POINTER; + int whichLoad = GetImageLoad(aRequest); + if (whichLoad == -1) return NS_ERROR_FAILURE; + if (whichLoad != 0) return NS_OK; + struct ImageLoad *load= &mLoads[whichLoad]; + + nsRect r(aRect->x, aRect->y, aRect->width, aRect->height); float p2t; @@ -352,12 +379,13 @@ NS_IMETHODIMP nsImageFrame::OnDataAvailable(imgIRequest *aRequest, nsIPresContex r.width = NSIntPixelsToTwips(r.width, p2t); r.height = NSIntPixelsToTwips(r.height, p2t); - mTransform.TransformCoord(&r.x, &r.y, &r.width, &r.height); + load->mTransform.TransformCoord(&r.x, &r.y, &r.width, &r.height); r.x += mBorderPadding.left; r.y += mBorderPadding.top; - Invalidate(aPresContext, r, PR_FALSE); + if (whichLoad == 0) + Invalidate(aPresContext, r, PR_FALSE); return NS_OK; } @@ -519,18 +547,57 @@ NS_IMETHODIMP nsImageFrame::OnStopDecode(imgIRequest *aRequest, nsIPresContext * // check to see if an image error occurred PRBool imageFailedToLoad = PR_FALSE; - if (NS_FAILED(aStatus)) { // We failed to load the image. Notify the pres shell + int whichLoad = GetImageLoad(aRequest); + + if (whichLoad == -1) return NS_ERROR_FAILURE; + + if (whichLoad == 2) { + if (NS_SUCCEEDED(aStatus)) { + if (mLoads[0].mRequest) { + mLoads[0].mRequest->Cancel(NS_ERROR_FAILURE); + } + + mLoads[0].mRequest = mLoads[2].mRequest; + mLoads[0].mIntrinsicSize = mLoads[2].mIntrinsicSize; + // XXX i don't think we always want to set this. + mLoads[0].mTransform = mLoads[2].mTransform; + struct ImageLoad *load= &mLoads[0]; + + mLoads[2].mRequest = nsnull; + + if (!mSizeConstrained && (mLoads[0].mIntrinsicSize != mIntrinsicSize)) { + nsCOMPtr presShell; + aPresContext->GetShell(getter_AddRefs(presShell)); + NS_ASSERTION(mParent, "No parent to pass the reflow request up to."); + NS_ASSERTION(presShell, "No PresShell."); + if (mParent && presShell && mGotInitialReflow) { // don't reflow if we havn't gotten the inital reflow yet + mState |= NS_FRAME_IS_DIRTY; + mParent->ReflowDirtyChild(presShell, NS_STATIC_CAST(nsIFrame*, this)); + } + } else { + nsSize s; + GetSize(s); + nsRect r(0,0, s.width, s.height); + Invalidate(aPresContext, r, PR_FALSE); + } + + } else { + mLoads[2].mRequest = nsnull; + } + + } else if (NS_FAILED(aStatus)) { PRBool lowFailed = PR_FALSE; PRBool imageFailed = PR_FALSE; // One of the two images didn't load, which one? - if (mLowImageRequest == aRequest || !mLowImageRequest) { - lowFailed = PR_TRUE; - } - if (mImageRequest == aRequest || !mImageRequest) { + if (whichLoad == 0 || !mLoads[0].mRequest) { imageFailed = PR_TRUE; } + if (whichLoad == 1 || !mLoads[1].mRequest) { + lowFailed = PR_TRUE; + } + if (imageFailed && lowFailed) imageFailedToLoad = PR_TRUE; } @@ -568,19 +635,25 @@ NS_IMETHODIMP nsImageFrame::OnStopDecode(imgIRequest *aRequest, nsIPresContext * NS_IMETHODIMP nsImageFrame::FrameChanged(imgIContainer *aContainer, nsIPresContext *aPresContext, gfxIImageFrame *aNewFrame, nsRect *aDirtyRect) { - nsRect r(*aDirtyRect); + if (!mLoads[0].mRequest) + return NS_OK; // if mLoads[0].mRequest is null, this isn't for the first one, so we don't care about it. - float p2t; - aPresContext->GetPixelsToTwips(&p2t); - r.x = NSIntPixelsToTwips(r.x, p2t); - r.y = NSIntPixelsToTwips(r.y, p2t); - r.width = NSIntPixelsToTwips(r.width, p2t); - r.height = NSIntPixelsToTwips(r.height, p2t); + nsCOMPtr con; + mLoads[0].mRequest->GetImage(getter_AddRefs(con)); + if (aContainer == con.get()) { + nsRect r(*aDirtyRect); - mTransform.TransformCoord(&r.x, &r.y, &r.width, &r.height); + float p2t; + aPresContext->GetPixelsToTwips(&p2t); + r.x = NSIntPixelsToTwips(r.x, p2t); + r.y = NSIntPixelsToTwips(r.y, p2t); + r.width = NSIntPixelsToTwips(r.width, p2t); + r.height = NSIntPixelsToTwips(r.height, p2t); - Invalidate(aPresContext, r, PR_FALSE); + mLoads[0].mTransform.TransformCoord(&r.x, &r.y, &r.width, &r.height); + Invalidate(aPresContext, r, PR_FALSE); + } return NS_OK; } @@ -597,7 +670,6 @@ nsImageFrame::GetDesiredSize(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsHTMLReflowMetrics& aDesiredSize) { - nscoord widthConstraint = NS_INTRINSICSIZE; nscoord heightConstraint = NS_INTRINSICSIZE; PRBool fixedContentWidth = PR_FALSE; @@ -621,6 +693,18 @@ nsImageFrame::GetDesiredSize(nsIPresContext* aPresContext, fixedContentHeight = PR_TRUE; } + // if mLoads[0].mIntrinsicSize.width and height are 0, then we should check to see + // if the size is already known by the image container. + if (mLoads[0].mIntrinsicSize.width == 0 && mLoads[0].mIntrinsicSize.height == 0) { + nsCOMPtr con; + mLoads[0].mRequest->GetImage(getter_AddRefs(con)); + if (con) { + con->GetWidth(&mLoads[0].mIntrinsicSize.width); + con->GetHeight(&mLoads[0].mIntrinsicSize.height); + } + } + mIntrinsicSize = mLoads[0].mIntrinsicSize; + PRBool haveComputedSize = PR_FALSE; PRBool needIntrinsicImageSize = PR_FALSE; @@ -675,11 +759,13 @@ nsImageFrame::GetDesiredSize(nsIPresContext* aPresContext, mComputedSize.width = newWidth; mComputedSize.height = newHeight; + nsTransform2D *transform = &mLoads[0].mTransform; + if (mComputedSize == mIntrinsicSize) { - mTransform.SetToIdentity(); + transform->SetToIdentity(); } else { if (mIntrinsicSize.width != 0 && mIntrinsicSize.height != 0) { - mTransform.SetToScale(float(mComputedSize.width) / float(mIntrinsicSize.width), + transform->SetToScale(float(mComputedSize.width) / float(mIntrinsicSize.width), float(mComputedSize.height) / float(mIntrinsicSize.height)); } } @@ -977,17 +1063,16 @@ nsImageFrame::Paint(nsIPresContext* aPresContext, nsCOMPtr imgCon; nsCOMPtr lowImgCon; - if (mImageRequest) { - mImageRequest->GetImage(getter_AddRefs(imgCon)); + PRUint32 loadStatus = imgIRequest::STATUS_ERROR; + + if (mLoads[0].mRequest) { + mLoads[0].mRequest->GetImage(getter_AddRefs(imgCon)); + mLoads[0].mRequest->GetImageStatus(&loadStatus); } - if (mLowImageRequest) { - mLowImageRequest->GetImage(getter_AddRefs(lowImgCon)); + if (mLoads[1].mRequest) { + mLoads[1].mRequest->GetImage(getter_AddRefs(lowImgCon)); } - PRUint32 loadStatus = imgIRequest::STATUS_ERROR; - if (mImageRequest) { - mImageRequest->GetImageStatus(&loadStatus); - } if (loadStatus & imgIRequest::STATUS_ERROR || !(imgCon || lowImgCon)) { // No image yet, or image load failed. Draw the alt-text and an icon // indicating the status @@ -1019,7 +1104,7 @@ nsImageFrame::Paint(nsIPresContext* aPresContext, if (imgCon) { nsPoint p(inner.x, inner.y); - if (mIntrinsicSize == mComputedSize) { + if (mLoads[0].mIntrinsicSize == mComputedSize) { inner.IntersectRect(inner, aDirtyRect); nsRect r(inner.x, inner.y, inner.width, inner.height); r.x -= mBorderPadding.left; @@ -1027,8 +1112,8 @@ nsImageFrame::Paint(nsIPresContext* aPresContext, aRenderingContext.DrawImage(imgCon, &r, &p); } else { nsTransform2D trans; - trans.SetToScale((float(mIntrinsicSize.width) / float(inner.width)), - (float(mIntrinsicSize.height) / float(inner.height))); + trans.SetToScale((float(mLoads[0].mIntrinsicSize.width) / float(inner.width)), + (float(mLoads[0].mIntrinsicSize.height) / float(inner.height))); nsRect r(0, 0, inner.width, inner.height); @@ -1409,20 +1494,25 @@ nsImageFrame::AttributeChanged(nsIPresContext* aPresContext, PRUint32 loadStatus = imgIRequest::STATUS_ERROR; - if (mImageRequest) - mImageRequest->GetImageStatus(&loadStatus); + if (mLoads[0].mRequest) + mLoads[0].mRequest->GetImageStatus(&loadStatus); if (!(loadStatus & imgIRequest::STATUS_SIZE_AVAILABLE)) { - if (mImageRequest) { + if (mLoads[0].mRequest) { mFailureReplace = PR_FALSE; // don't cause a CantRenderReplacedElement call - mImageRequest->Cancel(NS_ERROR_FAILURE); - mImageRequest = nsnull; + mLoads[0].mRequest->Cancel(NS_ERROR_FAILURE); + mLoads[0].mRequest = nsnull; } mCanSendLoadEvent = PR_TRUE; } - LoadImage(newSRC, aPresContext, getter_AddRefs(mImageRequest)); + if (mLoads[2].mRequest) { + mLoads[2].mRequest->Cancel(NS_ERROR_FAILURE); + mLoads[2].mRequest = nsnull; + } + mLoads[2].mRequest = do_CreateInstance("@mozilla.org/image/request;1"); + LoadImage(newSRC, aPresContext, mLoads[2].mRequest); } else if (nsHTMLAtoms::width == aAttribute || nsHTMLAtoms::height == aAttribute) { // XXX: could check for new width == old width, and make that a no-op @@ -1448,7 +1538,7 @@ nsImageFrame::GetFrameType(nsIAtom** aType) const NS_IMETHODIMP nsImageFrame::GetIntrinsicImageSize(nsSize& aSize) { - aSize = mIntrinsicSize; + aSize = mLoads[0].mIntrinsicSize; return NS_OK; } @@ -1459,9 +1549,9 @@ nsImageFrame::GetNaturalImageSize(PRUint32 *naturalWidth, *naturalWidth = 0; *naturalHeight = 0; - if (mImageRequest) { + if (mLoads[0].mRequest) { nsCOMPtr container; - mImageRequest->GetImage(getter_AddRefs(container)); + mLoads[0].mRequest->GetImage(getter_AddRefs(container)); if (container) { PRInt32 w, h; container->GetWidth(&w); @@ -1478,7 +1568,7 @@ nsImageFrame::GetNaturalImageSize(PRUint32 *naturalWidth, NS_IMETHODIMP nsImageFrame::GetImageRequest(imgIRequest **aRequest) { - *aRequest = mImageRequest; + *aRequest = mLoads[0].mRequest; NS_IF_ADDREF(*aRequest); return NS_OK; } @@ -1487,13 +1577,13 @@ NS_IMETHODIMP nsImageFrame::IsImageComplete(PRBool* aComplete) { NS_ENSURE_ARG_POINTER(aComplete); - if (!mImageRequest) { + if (!mLoads[0].mRequest) { *aComplete = PR_FALSE; return NS_OK; } PRUint32 status; - mImageRequest->GetImageStatus(&status); + mLoads[0].mRequest->GetImageStatus(&status); *aComplete = ((status & imgIRequest::STATUS_LOAD_COMPLETE) != 0); return NS_OK; @@ -1516,7 +1606,7 @@ void HaveFixedSize(const nsHTMLReflowState& aReflowState, PRPackedBool& aConstra nsresult -nsImageFrame::LoadImage(const nsAReadableString& aSpec, nsIPresContext *aPresContext, imgIRequest **aRequest) +nsImageFrame::LoadImage(const nsAReadableString& aSpec, nsIPresContext *aPresContext, imgIRequest *aRequest) { nsresult rv = NS_OK; @@ -1561,7 +1651,8 @@ nsImageFrame::LoadImage(const nsAReadableString& aSpec, nsIPresContext *aPresCon /* set this back to FALSE before we do the real load */ mInitialLoadCompleted = PR_FALSE; - return il->LoadImage(uri, loadGroup, mListener, aPresContext, loadFlags, nsnull, aRequest); + nsCOMPtr tempRequest; + return il->LoadImage(uri, loadGroup, mListener, aPresContext, loadFlags, nsnull, aRequest, getter_AddRefs(tempRequest)); } #define INTERNAL_GOPHER_LENGTH 16 /* "internal-gopher-" length */ diff --git a/mozilla/layout/html/base/src/nsImageFrame.h b/mozilla/layout/html/base/src/nsImageFrame.h index 62b53a49687..96c8a040b0e 100644 --- a/mozilla/layout/html/base/src/nsImageFrame.h +++ b/mozilla/layout/html/base/src/nsImageFrame.h @@ -74,6 +74,15 @@ private: nsImageFrame *mFrame; }; + +struct ImageLoad { + ImageLoad() : mIntrinsicSize(0,0) { } + nsCOMPtr mRequest; + nsSize mIntrinsicSize; + + nsTransform2D mTransform; +}; + #define ImageFrameSuper nsLeafFrame class nsImageFrame : public ImageFrameSuper, public nsIImageFrame { @@ -192,7 +201,7 @@ protected: nsRect& aInnerArea) const; - nsresult LoadImage(const nsAReadableString& aSpec, nsIPresContext *aPresContext, imgIRequest **aRequest); + nsresult LoadImage(const nsAReadableString& aSpec, nsIPresContext *aPresContext, imgIRequest *aRequest); inline PRBool CanLoadImage(nsIURI *aURI); @@ -204,18 +213,26 @@ protected: void FireDOMEvent(PRUint32 aMessage); - nsImageMap* mImageMap; - nsCOMPtr mImageRequest; - nsCOMPtr mLowImageRequest; +private: + inline int GetImageLoad(imgIRequest *aRequest); + + + nsImageMap* mImageMap; nsCOMPtr mListener; + /** + * 0 is the current image being displayed on the screen. + * 1 is for the lowsrc image if any. + * 2 is for attribute changed images. + * when the load from 2 completes, it will replace 0. + */ + struct ImageLoad mLoads[3]; + nsSize mComputedSize; nsSize mIntrinsicSize; - nsTransform2D mTransform; - PRPackedBool mSizeConstrained; PRPackedBool mGotInitialReflow; PRPackedBool mInitialLoadCompleted; diff --git a/mozilla/layout/xul/base/src/nsImageBoxFrame.cpp b/mozilla/layout/xul/base/src/nsImageBoxFrame.cpp index ded1ba22e41..7cebd63a772 100644 --- a/mozilla/layout/xul/base/src/nsImageBoxFrame.cpp +++ b/mozilla/layout/xul/base/src/nsImageBoxFrame.cpp @@ -287,7 +287,7 @@ nsImageBoxFrame::UpdateImage(nsIPresContext* aPresContext, PRBool& aResize) nsCOMPtr loadGroup; GetLoadGroup(aPresContext, getter_AddRefs(loadGroup)); - il->LoadImage(srcURI, loadGroup, mListener, aPresContext, nsIRequest::LOAD_NORMAL, nsnull, getter_AddRefs(mImageRequest)); + il->LoadImage(srcURI, loadGroup, mListener, aPresContext, nsIRequest::LOAD_NORMAL, nsnull, nsnull, getter_AddRefs(mImageRequest)); aResize = PR_TRUE; diff --git a/mozilla/layout/xul/base/src/outliner/src/nsOutlinerBodyFrame.cpp b/mozilla/layout/xul/base/src/outliner/src/nsOutlinerBodyFrame.cpp index 14029736723..07e93f0e797 100644 --- a/mozilla/layout/xul/base/src/outliner/src/nsOutlinerBodyFrame.cpp +++ b/mozilla/layout/xul/base/src/outliner/src/nsOutlinerBodyFrame.cpp @@ -1336,7 +1336,7 @@ nsOutlinerBodyFrame::GetImage(PRInt32 aRowIndex, const PRUnichar* aColID, nsresult rv; nsCOMPtr il(do_GetService("@mozilla.org/image/loader;1", &rv)); - il->LoadImage(srcURI, nsnull, listener, mPresContext, nsIRequest::LOAD_NORMAL, nsnull, getter_AddRefs(imageRequest)); + il->LoadImage(srcURI, nsnull, listener, mPresContext, nsIRequest::LOAD_NORMAL, nsnull, nsnull, getter_AddRefs(imageRequest)); if (!mImageCache) { mImageCache = new nsSupportsHashtable(32); diff --git a/mozilla/layout/xul/base/src/tree/src/nsTreeBodyFrame.cpp b/mozilla/layout/xul/base/src/tree/src/nsTreeBodyFrame.cpp index 14029736723..07e93f0e797 100644 --- a/mozilla/layout/xul/base/src/tree/src/nsTreeBodyFrame.cpp +++ b/mozilla/layout/xul/base/src/tree/src/nsTreeBodyFrame.cpp @@ -1336,7 +1336,7 @@ nsOutlinerBodyFrame::GetImage(PRInt32 aRowIndex, const PRUnichar* aColID, nsresult rv; nsCOMPtr il(do_GetService("@mozilla.org/image/loader;1", &rv)); - il->LoadImage(srcURI, nsnull, listener, mPresContext, nsIRequest::LOAD_NORMAL, nsnull, getter_AddRefs(imageRequest)); + il->LoadImage(srcURI, nsnull, listener, mPresContext, nsIRequest::LOAD_NORMAL, nsnull, nsnull, getter_AddRefs(imageRequest)); if (!mImageCache) { mImageCache = new nsSupportsHashtable(32); diff --git a/mozilla/modules/libpr0n/public/MANIFEST b/mozilla/modules/libpr0n/public/MANIFEST index c64524a739d..6d55eab4def 100644 --- a/mozilla/modules/libpr0n/public/MANIFEST +++ b/mozilla/modules/libpr0n/public/MANIFEST @@ -1 +1,2 @@ -ImageLogging.h +ImageErrors.h +ImageLogging.h diff --git a/mozilla/modules/libpr0n/public/Makefile.in b/mozilla/modules/libpr0n/public/Makefile.in index 8e1685c4285..f2ff4014237 100644 --- a/mozilla/modules/libpr0n/public/Makefile.in +++ b/mozilla/modules/libpr0n/public/Makefile.in @@ -28,7 +28,7 @@ include $(DEPTH)/config/autoconf.mk MODULE = imglib2 -EXPORTS = ImageLogging.h +EXPORTS = ImageErrors.h ImageLogging.h XPIDLSRCS = imgICache.idl \ imgIContainer.idl \ diff --git a/mozilla/modules/libpr0n/public/imgILoader.idl b/mozilla/modules/libpr0n/public/imgILoader.idl index 4fb109b50bf..69cf55cc895 100644 --- a/mozilla/modules/libpr0n/public/imgILoader.idl +++ b/mozilla/modules/libpr0n/public/imgILoader.idl @@ -55,8 +55,13 @@ interface imgILoader : nsISupports * @param aLoadFlags Load flags for the request * @param aCacheKey cache key to use for a load if the original * image came from a request that had post data + * @param aRequest A newly created, unused imgIRequest object or NULL for one to + be created for you. */ - imgIRequest loadImage(in nsIURI aURI, in nsILoadGroup aLoadGroup, in imgIDecoderObserver aObserver, in nsISupports aCX, in nsLoadFlags aLoadFlags, in nsISupports cacheKey); + imgIRequest loadImage(in nsIURI aURI, in nsILoadGroup aLoadGroup, + in imgIDecoderObserver aObserver, in nsISupports aCX, + in nsLoadFlags aLoadFlags, in nsISupports cacheKey, + in imgIRequest aRequest); /** * Start the load and decode of an image. diff --git a/mozilla/modules/libpr0n/public/imgIRequest.idl b/mozilla/modules/libpr0n/public/imgIRequest.idl index 26d512c1793..8d1e572c27e 100644 --- a/mozilla/modules/libpr0n/public/imgIRequest.idl +++ b/mozilla/modules/libpr0n/public/imgIRequest.idl @@ -68,14 +68,3 @@ interface imgIRequest : nsIRequest readonly attribute imgIDecoderObserver decoderObserver; }; -%{C++ - -/** - * imagelib specific nsresult success and error codes - */ -#define NS_IMAGELIB_SUCCESS_LOAD_FINISHED NS_ERROR_GENERATE_SUCCESS(NS_ERROR_MODULE_IMGLIB, 0) - -#define NS_IMAGELIB_ERROR_FAILURE NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_IMGLIB, 5) -#define NS_IMAGELIB_ERROR_NO_DECODER NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_IMGLIB, 6) - -%} diff --git a/mozilla/modules/libpr0n/public/makefile.win b/mozilla/modules/libpr0n/public/makefile.win index ea5d28b196b..7152a1512d5 100644 --- a/mozilla/modules/libpr0n/public/makefile.win +++ b/mozilla/modules/libpr0n/public/makefile.win @@ -25,7 +25,7 @@ DEPTH = ..\..\.. MODULE = imglib2 XPIDL_MODULE = imglib2 -EXPORTS = ImageLogging.h +EXPORTS = ImageErrors.h ImageLogging.h XPIDLSRCS = \ .\imgICache.idl \ diff --git a/mozilla/modules/libpr0n/src/ImageFactory.cpp b/mozilla/modules/libpr0n/src/ImageFactory.cpp index e1e638f12a2..9f3502f8318 100644 --- a/mozilla/modules/libpr0n/src/ImageFactory.cpp +++ b/mozilla/modules/libpr0n/src/ImageFactory.cpp @@ -52,13 +52,9 @@ static nsModuleComponentInfo components[] = NS_IMGLOADER_CID, "@mozilla.org/image/loader;1", imgLoaderConstructor, }, - { "image request", - NS_IMGREQUEST_CID, - "@mozilla.org/image/request/real;1", - imgRequestConstructor, }, { "image request proxy", NS_IMGREQUESTPROXY_CID, - "@mozilla.org/image/request/proxy;1", + "@mozilla.org/image/request;1", imgRequestProxyConstructor, }, }; diff --git a/mozilla/modules/libpr0n/src/imgLoader.cpp b/mozilla/modules/libpr0n/src/imgLoader.cpp index 0870878961f..a05c236813b 100644 --- a/mozilla/modules/libpr0n/src/imgLoader.cpp +++ b/mozilla/modules/libpr0n/src/imgLoader.cpp @@ -21,7 +21,6 @@ * Stuart Parmenter */ - #include "imgLoader.h" #include "nsCOMPtr.h" @@ -94,8 +93,8 @@ imgLoader::~imgLoader() #define SHOULD_RELOAD(flags) (flags & nsIRequest::LOAD_BYPASS_CACHE || flags & nsIRequest::VALIDATE_ALWAYS) -/* imgIRequest loadImage (in nsIURI aURI, in nsILoadGroup aLoadGroup, in imgIDecoderObserver aObserver, in nsISupports aCX, in nsLoadFlags aLoadFlags, in nsISupports aCacheKey); */ -NS_IMETHODIMP imgLoader::LoadImage(nsIURI *aURI, nsILoadGroup *aLoadGroup, imgIDecoderObserver *aObserver, nsISupports *aCX, nsLoadFlags aLoadFlags, nsISupports* aCacheKey, imgIRequest **_retval) +/* imgIRequest loadImage (in nsIURI aURI, in nsILoadGroup aLoadGroup, in imgIDecoderObserver aObserver, in nsISupports aCX, in nsLoadFlags aLoadFlags, in nsISupports cacheKey, in imgIRequest aRequest); */ +NS_IMETHODIMP imgLoader::LoadImage(nsIURI *aURI, nsILoadGroup *aLoadGroup, imgIDecoderObserver *aObserver, nsISupports *aCX, nsLoadFlags aLoadFlags, nsISupports *cacheKey, imgIRequest *aRequest, imgIRequest **_retval) { NS_ASSERTION(aURI, "imgLoader::LoadImage -- NULL URI pointer"); @@ -232,7 +231,7 @@ NS_IMETHODIMP imgLoader::LoadImage(nsIURI *aURI, nsILoadGroup *aLoadGroup, imgID LOG_MSG(gImgLog, "imgLoader::LoadImage", "async open failed."); nsresult rv = CreateNewProxyForRequest(request, aLoadGroup, aObserver, - aCX, aLoadFlags, _retval); + aCX, aLoadFlags, aRequest, _retval); if (NS_SUCCEEDED(rv)) { request->OnStartRequest(newChannel, nsnull); request->OnStopRequest(newChannel, nsnull, NS_BINDING_ABORTED); @@ -250,7 +249,7 @@ NS_IMETHODIMP imgLoader::LoadImage(nsIURI *aURI, nsILoadGroup *aLoadGroup, imgID LOG_MSG(gImgLog, "imgLoader::LoadImage", "creating proxy request."); - nsresult rv = CreateNewProxyForRequest(request, aLoadGroup, aObserver, aCX, aLoadFlags, _retval); + nsresult rv = CreateNewProxyForRequest(request, aLoadGroup, aObserver, aCX, aLoadFlags, aRequest, _retval); NS_RELEASE(request); @@ -308,7 +307,7 @@ NS_IMETHODIMP imgLoader::LoadImageWithChannel(nsIChannel *channel, imgIDecoderOb nsCOMPtr loadGroup; channel->GetLoadGroup(getter_AddRefs(loadGroup)); - nsresult rv = CreateNewProxyForRequest(request, loadGroup, aObserver, cx, nsIRequest::LOAD_NORMAL, _retval); + nsresult rv = CreateNewProxyForRequest(request, loadGroup, aObserver, cx, nsIRequest::LOAD_NORMAL, nsnull, _retval); NS_RELEASE(request); @@ -316,11 +315,11 @@ NS_IMETHODIMP imgLoader::LoadImageWithChannel(nsIChannel *channel, imgIDecoderOb } - nsresult imgLoader::CreateNewProxyForRequest(imgRequest *aRequest, nsILoadGroup *aLoadGroup, imgIDecoderObserver *aObserver, nsISupports *cx, - nsLoadFlags aLoadFlags, imgIRequest **_retval) + nsLoadFlags aLoadFlags, imgIRequest *aProxyRequest, + imgIRequest **_retval) { LOG_SCOPE_WITH_PARAM(gImgLog, "imgLoader::CreateNewProxyForRequest", "imgRequest", aRequest); @@ -330,9 +329,12 @@ imgLoader::CreateNewProxyForRequest(imgRequest *aRequest, nsILoadGroup *aLoadGro */ imgRequestProxy *proxyRequest; - NS_NEWXPCOM(proxyRequest, imgRequestProxy); - if (!proxyRequest) return NS_ERROR_OUT_OF_MEMORY; - + if (aProxyRequest) { + proxyRequest = NS_STATIC_CAST(imgRequestProxy *, aProxyRequest); + } else { + NS_NEWXPCOM(proxyRequest, imgRequestProxy); + if (!proxyRequest) return NS_ERROR_OUT_OF_MEMORY; + } NS_ADDREF(proxyRequest); /* It is important to call |SetLoadFlags()| before calling |Init()| because diff --git a/mozilla/modules/libpr0n/src/imgLoader.h b/mozilla/modules/libpr0n/src/imgLoader.h index f575a3657f1..2861c26664f 100644 --- a/mozilla/modules/libpr0n/src/imgLoader.h +++ b/mozilla/modules/libpr0n/src/imgLoader.h @@ -52,7 +52,8 @@ public: private: nsresult CreateNewProxyForRequest(imgRequest *aRequest, nsILoadGroup *aLoadGroup, imgIDecoderObserver *aObserver, nsISupports *cx, - nsLoadFlags aLoadFlags, imgIRequest **_retval); + nsLoadFlags aLoadFlags, imgIRequest *aRequestProxy, + imgIRequest **_retval); }; diff --git a/mozilla/modules/libpr0n/src/imgRequest.cpp b/mozilla/modules/libpr0n/src/imgRequest.cpp index d7732597e44..31da437ac6d 100644 --- a/mozilla/modules/libpr0n/src/imgRequest.cpp +++ b/mozilla/modules/libpr0n/src/imgRequest.cpp @@ -27,6 +27,7 @@ #include "imgRequestProxy.h" #include "imgILoader.h" +#include "ImageErrors.h" #include "ImageLogging.h" #include "gfxIImageFrame.h"