diff --git a/mozilla/layout/html/base/src/nsHTMLImage.cpp b/mozilla/layout/html/base/src/nsHTMLImage.cpp index 2c27d38068f..aaf206cc3db 100644 --- a/mozilla/layout/html/base/src/nsHTMLImage.cpp +++ b/mozilla/layout/html/base/src/nsHTMLImage.cpp @@ -129,15 +129,19 @@ nsHTMLImageLoader::nsHTMLImageLoader() mImageLoader = nsnull; mLoadImageFailed = PR_FALSE; mLoadBrokenImageFailed = PR_FALSE; + mURLSpec = nsnull; } nsHTMLImageLoader::~nsHTMLImageLoader() { NS_IF_RELEASE(mImageLoader); + if (nsnull != mURLSpec) { + delete mURLSpec; + } } nsIImage* -nsHTMLImageLoader:: GetImage() +nsHTMLImageLoader::GetImage() { nsIImage* image = nsnull; if (nsnull != mImageLoader) { @@ -146,6 +150,19 @@ nsHTMLImageLoader:: GetImage() return image; } +nsresult +nsHTMLImageLoader::SetURL(const nsString& aURLSpec) +{ + if (nsnull != mURLSpec) { + delete mURLSpec; + } + mURLSpec = new nsString(aURLSpec); + if (nsnull == mURLSpec) { + return NS_ERROR_OUT_OF_MEMORY; + } + return NS_OK; +} + nsresult nsHTMLImageLoader::LoadImage(nsIPresContext* aPresContext, nsIFrame* aForFrame, @@ -154,40 +171,29 @@ nsHTMLImageLoader::LoadImage(nsIPresContext* aPresContext, { aLoadStatus = NS_IMAGE_LOAD_STATUS_NONE; - // Get absolute url + // Get absolute url the first time through nsresult rv; nsAutoString src; - if (mLoadImageFailed) { + if (mLoadImageFailed || (nsnull == mURLSpec)) { src.Append(BROKEN_IMAGE_URL); } else { - nsAutoString srcParam; - nsIContent* content; - aForFrame->GetContent(content); - if (eContentAttr_HasValue != content->GetAttribute("SRC", srcParam)) { - NS_RELEASE(content); - src.Append(BROKEN_IMAGE_URL); - mLoadImageFailed = PR_TRUE; - } - else { - NS_RELEASE(content); - nsAutoString baseURL; + nsAutoString baseURL; - // Get documentURL - nsIPresShell* shell; - shell = aPresContext->GetShell(); - nsIDocument* doc = shell->GetDocument(); - nsIURL* docURL = doc->GetDocumentURL(); + // Get documentURL + nsIPresShell* shell; + shell = aPresContext->GetShell(); + nsIDocument* doc = shell->GetDocument(); + nsIURL* docURL = doc->GetDocumentURL(); - // Create an absolute URL - nsresult rv = NS_MakeAbsoluteURL(docURL, baseURL, srcParam, src); + // Create an absolute URL + nsresult rv = NS_MakeAbsoluteURL(docURL, baseURL, *mURLSpec, src); - // Release references - NS_RELEASE(shell); - NS_RELEASE(docURL); - NS_RELEASE(doc); - if (NS_OK != rv) { - return rv; - } + // Release references + NS_RELEASE(shell); + NS_RELEASE(docURL); + NS_RELEASE(doc); + if (NS_OK != rv) { + return rv; } } @@ -353,6 +359,11 @@ ImageFrame::GetDesiredSize(nsIPresContext* aPresContext, nsReflowMetrics& aDesiredSize, const nsSize& aMaxSize) { + // Setup url before starting the image load + nsAutoString src; + if (eContentAttr_HasValue == mContent->GetAttribute("SRC", src)) { + mImageLoader.SetURL(src); + } mImageLoader.GetDesiredSize(aPresContext, this, aDesiredSize, aMaxSize); }