[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