[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc
mitz at apple.com
mitz at apple.com
Wed Dec 22 15:52:40 UTC 2010
The following commit has been merged in the debian/experimental branch:
commit c3d51cd18e312450dae36ae021a729ff5569559c
Author: mitz at apple.com <mitz at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Mon Nov 15 22:27:06 2010 +0000
<rdar://problem/8662770> Error image has incorrect size when a custom font is used
Reviewed by Darin Adler.
WebCore:
Test: fast/images/style-access-during-imageChanged-crash.html
* rendering/RenderImage.cpp:
(WebCore::RenderImage::RenderImage): Added initialization of m_needsToSetSizeForAltText.
(WebCore::RenderImage::imageSizeForError): Factored the non-alt-text dependent size computation
out of setImageSizeForAltText() into this function.
(WebCore::RenderImage::setImageSizeForAltText): Changed to use imageSizeForError().
(WebCore::RenderImage::styleDidChange): Added. If m_needsToSetSizeForAltText is true, sets the
intrinsic size and calls imageDimensionsChanged() as needed to cause layout or invalidation.
(WebCore::RenderImage::imageChanged): Moved som comed from here...
(WebCore::RenderImage::imageDimensionsChanged): ...to here.
* rendering/RenderImage.h:
LayoutTests:
* fast/images/style-access-during-imageChanged-crash-expected.txt: Added.
* fast/images/style-access-during-imageChanged-crash.html: Added.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@72040 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 4628c4d..aed6ef0 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,12 @@
+2010-11-15 Dan Bernstein <mitz at apple.com>
+
+ Reviewed by Darin Adler.
+
+ <rdar://problem/8662770> Error image has incorrect size when a custom font is used
+
+ * fast/images/style-access-during-imageChanged-crash-expected.txt: Added.
+ * fast/images/style-access-during-imageChanged-crash.html: Added.
+
2010-11-15 Andy Estes <aestes at apple.com>
r72003 caused fast/forms/submit-form-attributes.html to crash
diff --git a/LayoutTests/fast/images/style-access-during-imageChanged-crash-expected.txt b/LayoutTests/fast/images/style-access-during-imageChanged-crash-expected.txt
new file mode 100644
index 0000000..fd237cd
--- /dev/null
+++ b/LayoutTests/fast/images/style-access-during-imageChanged-crash-expected.txt
@@ -0,0 +1,3 @@
+This test passes if it does not cause an assertion failure or a crash.
+
+A
diff --git a/LayoutTests/fast/images/style-access-during-imageChanged-crash.html b/LayoutTests/fast/images/style-access-during-imageChanged-crash.html
new file mode 100644
index 0000000..6ddd729
--- /dev/null
+++ b/LayoutTests/fast/images/style-access-during-imageChanged-crash.html
@@ -0,0 +1,24 @@
+<style>
+ @font-face {
+ font-family: test;
+ src: url(data:text/plain,1);
+ }
+</style>
+<p>
+ This test passes if it does not cause an assertion failure or a crash.
+</p>
+A <img id="target" alt="A">
+<script>
+ function test()
+ {
+ document.body.offsetTop;
+ document.body.style.fontFamily="test";
+ document.body.offsetTop;
+ document.getElementById("target").src = "data:text/plain,2";
+ }
+
+ if (window.layoutTestController)
+ layoutTestController.dumpAsText();
+
+ test();
+</script>
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index e8a8a78..c9b787c 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,22 @@
+2010-11-15 Dan Bernstein <mitz at apple.com>
+
+ Reviewed by Darin Adler.
+
+ <rdar://problem/8662770> Error image has incorrect size when a custom font is used
+
+ Test: fast/images/style-access-during-imageChanged-crash.html
+
+ * rendering/RenderImage.cpp:
+ (WebCore::RenderImage::RenderImage): Added initialization of m_needsToSetSizeForAltText.
+ (WebCore::RenderImage::imageSizeForError): Factored the non-alt-text dependent size computation
+ out of setImageSizeForAltText() into this function.
+ (WebCore::RenderImage::setImageSizeForAltText): Changed to use imageSizeForError().
+ (WebCore::RenderImage::styleDidChange): Added. If m_needsToSetSizeForAltText is true, sets the
+ intrinsic size and calls imageDimensionsChanged() as needed to cause layout or invalidation.
+ (WebCore::RenderImage::imageChanged): Moved som comed from here...
+ (WebCore::RenderImage::imageDimensionsChanged): ...to here.
+ * rendering/RenderImage.h:
+
2010-11-15 Anders Carlsson <andersca at apple.com>
Reviewed by Dimitri Glazkov.
@@ -946,7 +965,7 @@
2010-11-12 Ryosuke Niwa <rniwa at webkit.org>
- Unreviewed XCode project fix.
+ Unreviewed Xcode project fix.
* WebCore.xcodeproj/project.pbxproj:
diff --git a/WebCore/rendering/RenderImage.cpp b/WebCore/rendering/RenderImage.cpp
index 84feb0f..92d8d97 100644
--- a/WebCore/rendering/RenderImage.cpp
+++ b/WebCore/rendering/RenderImage.cpp
@@ -57,6 +57,7 @@ using namespace HTMLNames;
RenderImage::RenderImage(Node* node)
: RenderReplaced(node, IntSize(0, 0))
+ , m_needsToSetSizeForAltText(false)
{
updateAltText();
@@ -85,34 +86,35 @@ static const unsigned short paddingHeight = 4;
static const int maxAltTextWidth = 1024;
static const int maxAltTextHeight = 256;
+IntSize RenderImage::imageSizeForError(CachedImage* newImage) const
+{
+ ASSERT_ARG(newImage, newImage);
+ ASSERT_ARG(newImage, newImage->image());
+
+ // imageSize() returns 0 for the error image. We need the true size of the
+ // error image, so we have to get it by grabbing image() directly.
+ return IntSize(paddingWidth + newImage->image()->width() * style()->effectiveZoom(), paddingHeight + newImage->image()->height() * style()->effectiveZoom());
+}
+
// Sets the image height and width to fit the alt text. Returns true if the
// image size changed.
bool RenderImage::setImageSizeForAltText(CachedImage* newImage /* = 0 */)
{
- int imageWidth = 0;
- int imageHeight = 0;
-
- // If we'll be displaying either text or an image, add a little padding.
- if (!m_altText.isEmpty() || newImage) {
- imageWidth = paddingWidth;
- imageHeight = paddingHeight;
- }
-
- if (newImage && newImage->image()) {
- // imageSize() returns 0 for the error image. We need the true size of the
- // error image, so we have to get it by grabbing image() directly.
- imageWidth += newImage->image()->width() * style()->effectiveZoom();
- imageHeight += newImage->image()->height() * style()->effectiveZoom();
+ IntSize imageSize;
+ if (newImage && newImage->image())
+ imageSize = imageSizeForError(newImage);
+ else if (!m_altText.isEmpty() || newImage) {
+ // If we'll be displaying either text or an image, add a little padding.
+ imageSize = IntSize(paddingWidth, paddingHeight);
}
-
+
// we have an alt and the user meant it (its not a text we invented)
if (!m_altText.isEmpty()) {
const Font& font = style()->font();
- imageWidth = max(imageWidth, min(font.width(TextRun(m_altText.characters(), m_altText.length())), maxAltTextWidth));
- imageHeight = max(imageHeight, min(font.height(), maxAltTextHeight));
+ IntSize textSize(min(font.width(TextRun(m_altText.characters(), m_altText.length())), maxAltTextWidth), min(font.height(), maxAltTextHeight));
+ imageSize = imageSize.expandedTo(textSize);
}
-
- IntSize imageSize = IntSize(imageWidth, imageHeight);
+
if (imageSize == intrinsicSize())
return false;
@@ -120,6 +122,16 @@ bool RenderImage::setImageSizeForAltText(CachedImage* newImage /* = 0 */)
return true;
}
+void RenderImage::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
+{
+ RenderReplaced::styleDidChange(diff, oldStyle);
+ if (m_needsToSetSizeForAltText) {
+ if (!m_altText.isEmpty() && setImageSizeForAltText(m_imageResource->cachedImage()))
+ imageDimensionsChanged(true /* imageSizeChanged */);
+ m_needsToSetSizeForAltText = false;
+ }
+}
+
void RenderImage::imageChanged(WrappedImagePtr newImage, const IntRect* rect)
{
if (documentBeingDestroyed())
@@ -137,12 +149,29 @@ void RenderImage::imageChanged(WrappedImagePtr newImage, const IntRect* rect)
bool imageSizeChanged = false;
// Set image dimensions, taking into account the size of the alt text.
- if (m_imageResource->errorOccurred())
- imageSizeChanged = setImageSizeForAltText(m_imageResource->cachedImage());
+ if (m_imageResource->errorOccurred()) {
+ if (!m_altText.isEmpty()) {
+ ASSERT(node());
+ if (node()) {
+ m_needsToSetSizeForAltText = true;
+ node()->setNeedsStyleRecalc(SyntheticStyleChange);
+ }
+ return;
+ }
+ IntSize errorImageSize = imageSizeForError(m_imageResource->cachedImage());
+ if (errorImageSize != intrinsicSize()) {
+ setIntrinsicSize(errorImageSize);
+ imageSizeChanged = true;
+ }
+ }
+
+ imageDimensionsChanged(imageSizeChanged, rect);
+}
+void RenderImage::imageDimensionsChanged(bool imageSizeChanged, const IntRect* rect)
+{
bool shouldRepaint = true;
- // Image dimensions have been changed, see what needs to be done
if (m_imageResource->imageSize(style()->effectiveZoom()) != intrinsicSize() || imageSizeChanged) {
if (!m_imageResource->errorOccurred())
setIntrinsicSize(m_imageResource->imageSize(style()->effectiveZoom()));
diff --git a/WebCore/rendering/RenderImage.h b/WebCore/rendering/RenderImage.h
index 308c863..86f5621 100644
--- a/WebCore/rendering/RenderImage.h
+++ b/WebCore/rendering/RenderImage.h
@@ -52,6 +52,8 @@ public:
void highQualityRepaintTimerFired(Timer<RenderImage>*);
protected:
+ virtual void styleDidChange(StyleDifference, const RenderStyle*);
+
virtual void imageChanged(WrappedImagePtr, const IntRect* = 0);
virtual void paintIntoRect(GraphicsContext*, const IntRect&);
@@ -83,13 +85,16 @@ private:
virtual int computeReplacedLogicalWidth(bool includeMaxWidth = true) const;
virtual int computeReplacedLogicalHeight() const;
+ IntSize imageSizeForError(CachedImage*) const;
+ void imageDimensionsChanged(bool imageSizeChanged, const IntRect* = 0);
+
int calcAspectRatioLogicalWidth() const;
int calcAspectRatioLogicalHeight() const;
-private:
// Text to display as long as the image isn't available.
String m_altText;
OwnPtr<RenderImageResource> m_imageResource;
+ bool m_needsToSetSizeForAltText;
friend class RenderImageScaleObserver;
};
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list