[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

simon.fraser at apple.com simon.fraser at apple.com
Wed Dec 22 12:39:55 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit bf850185e4e26d19c53091ce1d1b998a747db745
Author: simon.fraser at apple.com <simon.fraser at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu Aug 26 22:15:58 2010 +0000

    2010-08-26  Simon Fraser  <simon.fraser at apple.com>
    
            Reviewed by Dave Hyatt.
    
            CSS downloads all background images related to element, instead of just final rule
            https://bugs.webkit.org/show_bug.cgi?id=24223
    
            We used to kick off image loads at the point where the style selector
            applies a CSS rule to an element, even if that rule was overridden
            by a rule in a later block of rules. This caused loads of images that
            weren't actually used.
    
            Fix this by delaying image loads until the style has been fully
            resolved. This is achieved by inserting a StylePendingImage into
            the RenderStyle for duration of the style resolution, and keeping
            an entry in a hash for the relevant CSS property.
    
            At the end of style resolution, we iterate through the hash, and
            replace the StylePendingImage with StyleCachedImages, which
            causes the loads to happen only for images that are in the final style.
    
            Tests: http/tests/css/border-image-loading.html
                   http/tests/css/mask-image-loading.html
                   http/tests/css/reflection-mask-image-loading.html
    
            * GNUmakefile.am: Add StylePendingImage.h
            * WebCore.gypi: Ditto
            * WebCore.vcproj/WebCore.vcproj: Ditto
    
            * css/CSSImageValue.h: Change m_image to a RefPtr<StyleImage>,
            since it may be a StylePendingImage or StyleCachedImage.
            * css/CSSImageValue.cpp:
            (WebCore::CSSImageValue::~CSSImageValue): Only call removeClient if it's a cachedImage.
            (WebCore::CSSImageValue::cachedOrPendingImage): If we have an image (pending or cached),
            return it. Otherwise make a pending image and return it.
            (WebCore::CSSImageValue::cachedImage): Only return the image if it's a cached image.
            (WebCore::CSSImageValue::cachedImageURL):
            (WebCore::CSSImageValue::clearCachedImage):
    
            * css/CSSStyleSelector.h:
            * css/CSSStyleSelector.cpp:
            (WebCore::CSSStyleSelector::initForStyleResolve): Clear m_pendingImageProperties.
            (WebCore::CSSStyleSelector::styleForElement): Load pending images.
            (WebCore::CSSStyleSelector::styleForKeyframe): Ditto.
            (WebCore::CSSStyleSelector::pseudoStyleForElement): Ditto.
            (WebCore::CSSStyleSelector::styleForPage): Ditto.
            (WebCore::CSSStyleSelector::applyProperty): Pull property into a local variable
            so we can use it in macros.
            (WebCore::CSSStyleSelector::mapFillAttachment): Pass the property down (needed to avoid
            additional macro complexity).
            (WebCore::CSSStyleSelector::mapFillClip): Ditto
            (WebCore::CSSStyleSelector::mapFillComposite): Ditto
            (WebCore::CSSStyleSelector::mapFillOrigin): Ditto
            (WebCore::CSSStyleSelector::styleImage): Call cachedOrPendingFromValue()
            (WebCore::CSSStyleSelector::cachedOrPendingFromValue): Get the cachedOrPendingImage()
            from the CSSValue, and if it's a pending image, record the property.
            (WebCore::CSSStyleSelector::mapFillImage): Pass the property down (needed to avoid
            additional macro complexity).
            (WebCore::CSSStyleSelector::mapFillRepeatX): Ditto
            (WebCore::CSSStyleSelector::mapFillRepeatY): Ditto
            (WebCore::CSSStyleSelector::mapFillSize): Ditto
            (WebCore::CSSStyleSelector::mapFillXPosition): Ditto
            (WebCore::CSSStyleSelector::mapFillYPosition): Ditto
            (WebCore::CSSStyleSelector::mapNinePieceImage): Ditto
            (WebCore::CSSStyleSelector::loadPendingImages): Iterate through the m_pendingImageProperties
            hash, and replace the pending images with cached images.
    
            * rendering/style/StyleCachedImage.h: Make cssValue() const.
            * rendering/style/StyleCachedImage.cpp:
            (WebCore::StyleCachedImage::cssValue):
    
            * rendering/style/StyleGeneratedImage.h:  Make cssValue() const.
            * rendering/style/StyleGeneratedImage.cpp:
            (WebCore::StyleGeneratedImage::cssValue):
    
            * rendering/style/StyleImage.h:
            (WebCore::StyleImage::operator==): Make const.
            (WebCore::StyleImage::isPendingImage):
            * rendering/style/StylePendingImage.h: Added.
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@66141 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 4c3a323..6cfae1d 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,20 @@
+2010-08-26  Simon Fraser  <simon.fraser at apple.com>
+
+        Reviewed by Dave Hyatt.
+
+        CSS downloads all background images related to element, instead of just final rule
+        https://bugs.webkit.org/show_bug.cgi?id=24223
+        
+        New tests that log which image requests are made by CSS.
+
+        * http/tests/css/border-image-loading-expected.txt: Added.
+        * http/tests/css/border-image-loading.html: Added.
+        * http/tests/css/css-image-loading-expected.txt:
+        * http/tests/css/mask-image-loading-expected.txt: Added.
+        * http/tests/css/mask-image-loading.html: Added.
+        * http/tests/css/reflection-mask-image-loading-expected.txt: Added.
+        * http/tests/css/reflection-mask-image-loading.html: Added.
+
 2010-08-26  Andy Estes  <aestes at apple.com>
 
         Reviewed by Eric Carlson.
diff --git a/LayoutTests/http/tests/css/border-image-loading-expected.txt b/LayoutTests/http/tests/css/border-image-loading-expected.txt
new file mode 100644
index 0000000..7aa8fbd
--- /dev/null
+++ b/LayoutTests/http/tests/css/border-image-loading-expected.txt
@@ -0,0 +1,4 @@
+Resource requests:
+
+
+border2.jpg
diff --git a/LayoutTests/http/tests/css/border-image-loading.html b/LayoutTests/http/tests/css/border-image-loading.html
new file mode 100644
index 0000000..1352127
--- /dev/null
+++ b/LayoutTests/http/tests/css/border-image-loading.html
@@ -0,0 +1,26 @@
+<html>
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+  <script src="resources/request-logging.js" type="text/javascript" charset="utf-8"></script>
+
+  <style type="text/css">
+    .box {
+      height: 100px;
+      width: 100px;
+      -webkit-border-image: url("/resources/network-simulator.php?command=log-resource-request&path=border1.jpg") 10 10 10 10 stretch;
+    }
+    
+    .bordered {
+      -webkit-border-image: url("/resources/network-simulator.php?command=log-resource-request&path=border2.jpg") 10 10 10 10 stretch;
+    }
+    
+  </style>
+</head>
+<body>
+
+  <div class="box bordered"></div>
+
+  <h2>Resource requests:</h2>
+  <pre id="result">Request log goes here in DRT</pre>
+</body>
+</html>
diff --git a/LayoutTests/http/tests/css/css-image-loading-expected.txt b/LayoutTests/http/tests/css/css-image-loading-expected.txt
index 6e97434..c293b23 100644
--- a/LayoutTests/http/tests/css/css-image-loading-expected.txt
+++ b/LayoutTests/http/tests/css/css-image-loading-expected.txt
@@ -2,10 +2,7 @@ item
 Resource requests:
 
 
-background1.jpg
 background2.jpg
-content-image1.jpg
 content-image2.jpg
 content-image3.jpg
-list-image1.jpg
 list-image2.jpg
diff --git a/LayoutTests/http/tests/css/mask-image-loading-expected.txt b/LayoutTests/http/tests/css/mask-image-loading-expected.txt
new file mode 100644
index 0000000..94fb6c0
--- /dev/null
+++ b/LayoutTests/http/tests/css/mask-image-loading-expected.txt
@@ -0,0 +1,4 @@
+Resource requests:
+
+
+mask2.jpg
diff --git a/LayoutTests/http/tests/css/mask-image-loading.html b/LayoutTests/http/tests/css/mask-image-loading.html
new file mode 100644
index 0000000..4f28191
--- /dev/null
+++ b/LayoutTests/http/tests/css/mask-image-loading.html
@@ -0,0 +1,26 @@
+<html>
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+  <script src="resources/request-logging.js" type="text/javascript" charset="utf-8"></script>
+
+  <style type="text/css">
+    .box {
+      height: 100px;
+      width: 100px;
+      -webkit-mask-box-image: url("/resources/network-simulator.php?command=log-resource-request&path=mask1.jpg");
+    }
+    
+    .masked {
+      -webkit-mask-box-image: url("/resources/network-simulator.php?command=log-resource-request&path=mask2.jpg");
+    }
+    
+  </style>
+</head>
+<body>
+
+  <div class="box masked"></div>
+
+  <h2>Resource requests:</h2>
+  <pre id="result">Request log goes here in DRT</pre>
+</body>
+</html>
diff --git a/LayoutTests/http/tests/css/reflection-mask-image-loading-expected.txt b/LayoutTests/http/tests/css/reflection-mask-image-loading-expected.txt
new file mode 100644
index 0000000..94fb6c0
--- /dev/null
+++ b/LayoutTests/http/tests/css/reflection-mask-image-loading-expected.txt
@@ -0,0 +1,4 @@
+Resource requests:
+
+
+mask2.jpg
diff --git a/LayoutTests/http/tests/css/reflection-mask-image-loading.html b/LayoutTests/http/tests/css/reflection-mask-image-loading.html
new file mode 100644
index 0000000..d7e68d9
--- /dev/null
+++ b/LayoutTests/http/tests/css/reflection-mask-image-loading.html
@@ -0,0 +1,25 @@
+<html>
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+  <script src="resources/request-logging.js" type="text/javascript" charset="utf-8"></script>
+
+  <style type="text/css">
+    .box {
+      height: 100px;
+      width: 100px;
+      -webkit-box-reflect: below 10px url("/resources/network-simulator.php?command=log-resource-request&path=mask1.jpg");
+    }
+    
+    .reflected {
+      -webkit-box-reflect: below 10px url("/resources/network-simulator.php?command=log-resource-request&path=mask2.jpg");
+    }
+    
+  </style>
+</head>
+<body>
+  <div class="box reflected"></div>
+
+  <h2>Resource requests:</h2>
+  <pre id="result">Request log goes here in DRT</pre>
+</body>
+</html>
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 6561006..83edca5 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,83 @@
+2010-08-26  Simon Fraser  <simon.fraser at apple.com>
+
+        Reviewed by Dave Hyatt.
+
+        CSS downloads all background images related to element, instead of just final rule
+        https://bugs.webkit.org/show_bug.cgi?id=24223
+        
+        We used to kick off image loads at the point where the style selector
+        applies a CSS rule to an element, even if that rule was overridden
+        by a rule in a later block of rules. This caused loads of images that
+        weren't actually used.
+        
+        Fix this by delaying image loads until the style has been fully
+        resolved. This is achieved by inserting a StylePendingImage into
+        the RenderStyle for duration of the style resolution, and keeping
+        an entry in a hash for the relevant CSS property.
+        
+        At the end of style resolution, we iterate through the hash, and
+        replace the StylePendingImage with StyleCachedImages, which
+        causes the loads to happen only for images that are in the final style.        
+
+        Tests: http/tests/css/border-image-loading.html
+               http/tests/css/mask-image-loading.html
+               http/tests/css/reflection-mask-image-loading.html
+
+        * GNUmakefile.am: Add StylePendingImage.h
+        * WebCore.gypi: Ditto
+        * WebCore.vcproj/WebCore.vcproj: Ditto
+
+        * css/CSSImageValue.h: Change m_image to a RefPtr<StyleImage>,
+        since it may be a StylePendingImage or StyleCachedImage.
+        * css/CSSImageValue.cpp:
+        (WebCore::CSSImageValue::~CSSImageValue): Only call removeClient if it's a cachedImage.
+        (WebCore::CSSImageValue::cachedOrPendingImage): If we have an image (pending or cached),
+        return it. Otherwise make a pending image and return it.
+        (WebCore::CSSImageValue::cachedImage): Only return the image if it's a cached image.
+        (WebCore::CSSImageValue::cachedImageURL):
+        (WebCore::CSSImageValue::clearCachedImage):
+
+        * css/CSSStyleSelector.h:
+        * css/CSSStyleSelector.cpp:
+        (WebCore::CSSStyleSelector::initForStyleResolve): Clear m_pendingImageProperties.
+        (WebCore::CSSStyleSelector::styleForElement): Load pending images.
+        (WebCore::CSSStyleSelector::styleForKeyframe): Ditto.
+        (WebCore::CSSStyleSelector::pseudoStyleForElement): Ditto.
+        (WebCore::CSSStyleSelector::styleForPage): Ditto.
+        (WebCore::CSSStyleSelector::applyProperty): Pull property into a local variable
+        so we can use it in macros.
+        (WebCore::CSSStyleSelector::mapFillAttachment): Pass the property down (needed to avoid
+        additional macro complexity).
+        (WebCore::CSSStyleSelector::mapFillClip): Ditto
+        (WebCore::CSSStyleSelector::mapFillComposite): Ditto
+        (WebCore::CSSStyleSelector::mapFillOrigin): Ditto
+        (WebCore::CSSStyleSelector::styleImage): Call cachedOrPendingFromValue()
+        (WebCore::CSSStyleSelector::cachedOrPendingFromValue): Get the cachedOrPendingImage()
+        from the CSSValue, and if it's a pending image, record the property.
+        (WebCore::CSSStyleSelector::mapFillImage): Pass the property down (needed to avoid
+        additional macro complexity).
+        (WebCore::CSSStyleSelector::mapFillRepeatX): Ditto
+        (WebCore::CSSStyleSelector::mapFillRepeatY): Ditto
+        (WebCore::CSSStyleSelector::mapFillSize): Ditto
+        (WebCore::CSSStyleSelector::mapFillXPosition): Ditto
+        (WebCore::CSSStyleSelector::mapFillYPosition): Ditto
+        (WebCore::CSSStyleSelector::mapNinePieceImage): Ditto
+        (WebCore::CSSStyleSelector::loadPendingImages): Iterate through the m_pendingImageProperties
+        hash, and replace the pending images with cached images.
+
+        * rendering/style/StyleCachedImage.h: Make cssValue() const.
+        * rendering/style/StyleCachedImage.cpp:
+        (WebCore::StyleCachedImage::cssValue):
+
+        * rendering/style/StyleGeneratedImage.h:  Make cssValue() const.
+        * rendering/style/StyleGeneratedImage.cpp:
+        (WebCore::StyleGeneratedImage::cssValue):
+
+        * rendering/style/StyleImage.h:
+        (WebCore::StyleImage::operator==): Make const.
+        (WebCore::StyleImage::isPendingImage):
+        * rendering/style/StylePendingImage.h: Added.
+
 2010-08-26  Sam Weinig  <sam at webkit.org>
 
         Reviewed by Darin Adler.
diff --git a/WebCore/GNUmakefile.am b/WebCore/GNUmakefile.am
index 2707a1a..fe49ee0 100644
--- a/WebCore/GNUmakefile.am
+++ b/WebCore/GNUmakefile.am
@@ -2411,6 +2411,7 @@ webcore_sources += \
 	WebCore/rendering/style/StyleMarqueeData.h \
 	WebCore/rendering/style/StyleMultiColData.cpp \
 	WebCore/rendering/style/StyleMultiColData.h \
+	WebCore/rendering/style/StylePendingImage.h \
 	WebCore/rendering/style/StyleRareInheritedData.cpp \
 	WebCore/rendering/style/StyleRareInheritedData.h \
 	WebCore/rendering/style/StyleRareNonInheritedData.cpp \
diff --git a/WebCore/WebCore.gypi b/WebCore/WebCore.gypi
index f7fc01c..5d86552 100644
--- a/WebCore/WebCore.gypi
+++ b/WebCore/WebCore.gypi
@@ -3240,6 +3240,7 @@
             'rendering/style/StyleMarqueeData.h',
             'rendering/style/StyleMultiColData.cpp',
             'rendering/style/StyleMultiColData.h',
+            'rendering/style/StylePendingImage.h',
             'rendering/style/StyleRareInheritedData.cpp',
             'rendering/style/StyleRareInheritedData.h',
             'rendering/style/StyleRareNonInheritedData.cpp',
diff --git a/WebCore/WebCore.vcproj/WebCore.vcproj b/WebCore/WebCore.vcproj/WebCore.vcproj
index dd2bbe6..00c0fcc 100644
--- a/WebCore/WebCore.vcproj/WebCore.vcproj
+++ b/WebCore/WebCore.vcproj/WebCore.vcproj
@@ -32982,6 +32982,10 @@
 					>
 				</File>
 				<File
+					RelativePath="..\rendering\style\StylePendingImage.h"
+					>
+				</File>
+				<File
 					RelativePath="..\rendering\style\StyleRareInheritedData.cpp"
 					>
 				</File>
diff --git a/WebCore/css/CSSImageValue.cpp b/WebCore/css/CSSImageValue.cpp
index 96a8dec..058d0e9 100644
--- a/WebCore/css/CSSImageValue.cpp
+++ b/WebCore/css/CSSImageValue.cpp
@@ -26,6 +26,7 @@
 #include "CachedImage.h"
 #include "DocLoader.h"
 #include "StyleCachedImage.h"
+#include "StylePendingImage.h"
 
 namespace WebCore {
 
@@ -43,8 +44,16 @@ CSSImageValue::CSSImageValue()
 
 CSSImageValue::~CSSImageValue()
 {
-    if (m_image)
-        m_image->cachedImage()->removeClient(this);
+    if (m_image && m_image->isCachedImage())
+        static_cast<StyleCachedImage*>(m_image.get())->cachedImage()->removeClient(this);
+}
+
+StyleImage* CSSImageValue::cachedOrPendingImage()
+{
+    if (!m_image)
+        m_image = StylePendingImage::create(this);
+
+    return m_image.get();
 }
 
 StyleCachedImage* CSSImageValue::cachedImage(DocLoader* loader)
@@ -71,20 +80,20 @@ StyleCachedImage* CSSImageValue::cachedImage(DocLoader* loader, const String& ur
         }
     }
     
-    return m_image.get();
+    return m_image->isCachedImage() ? static_cast<StyleCachedImage*>(m_image.get()) : 0;
 }
 
 String CSSImageValue::cachedImageURL()
 {
-    if (!m_image)
+    if (!m_image || !m_image->isCachedImage())
         return String();
-    return m_image->cachedImage()->url();
+    return static_cast<StyleCachedImage*>(m_image.get())->cachedImage()->url();
 }
 
 void CSSImageValue::clearCachedImage()
 {
-    if (m_image)
-        m_image->cachedImage()->removeClient(this);
+    if (m_image && m_image->isCachedImage())
+        static_cast<StyleCachedImage*>(m_image.get())->cachedImage()->removeClient(this);
     m_image = 0;
     m_accessedImage = false;
 }
diff --git a/WebCore/css/CSSImageValue.h b/WebCore/css/CSSImageValue.h
index a1715cd..4205c4f 100644
--- a/WebCore/css/CSSImageValue.h
+++ b/WebCore/css/CSSImageValue.h
@@ -29,6 +29,7 @@ namespace WebCore {
 
 class DocLoader;
 class StyleCachedImage;
+class StyleImage;
 
 class CSSImageValue : public CSSPrimitiveValue, private CachedResourceClient {
 public:
@@ -37,6 +38,8 @@ public:
     virtual ~CSSImageValue();
 
     virtual StyleCachedImage* cachedImage(DocLoader*);
+    // Returns a StyleCachedImage if the image is cached already, otherwise a StylePendingImage.
+    StyleImage* cachedOrPendingImage();
     
     virtual bool isImageValue() const { return true; }
 
@@ -50,7 +53,7 @@ protected:
 private:
     CSSImageValue();
 
-    RefPtr<StyleCachedImage> m_image;
+    RefPtr<StyleImage> m_image;
     bool m_accessedImage;
 };
 
diff --git a/WebCore/css/CSSStyleSelector.cpp b/WebCore/css/CSSStyleSelector.cpp
index 8477ed7..2abb8eb 100644
--- a/WebCore/css/CSSStyleSelector.cpp
+++ b/WebCore/css/CSSStyleSelector.cpp
@@ -83,6 +83,7 @@
 #include "ShadowValue.h"
 #include "SkewTransformOperation.h"
 #include "StyleCachedImage.h"
+#include "StylePendingImage.h"
 #include "StyleGeneratedImage.h"
 #include "StyleSheetList.h"
 #include "Text.h"
@@ -199,12 +200,12 @@ if (value->isValueList()) { \
             currChild = new FillLayer(LayerType##FillLayer); \
             prevChild->setNext(currChild); \
         } \
-        mapFill##Prop(currChild, valueList->itemWithoutBoundsCheck(i)); \
+        mapFill##Prop(property, currChild, valueList->itemWithoutBoundsCheck(i)); \
         prevChild = currChild; \
         currChild = currChild->next(); \
     } \
 } else { \
-    mapFill##Prop(currChild, value); \
+    mapFill##Prop(property, currChild, value); \
     currChild = currChild->next(); \
 } \
 while (currChild) { \
@@ -855,6 +856,8 @@ inline void CSSStyleSelector::initForStyleResolve(Element* e, RenderStyle* paren
 
     m_matchedDecls.clear();
 
+    m_pendingImageProperties.clear();
+
     m_ruleList = 0;
 
     m_fontDirty = false;
@@ -1357,6 +1360,9 @@ PassRefPtr<RenderStyle> CSSStyleSelector::styleForElement(Element* e, RenderStyl
     // Clean up our style object's display and text decorations (among other fixups).
     adjustRenderStyle(style(), e);
 
+    // Start loading images referenced by this style.
+    loadPendingImages();
+
     // If we have first-letter pseudo style, do not share this style
     if (m_style->hasPseudoStyle(FIRST_LETTER))
         m_style->setUnique();
@@ -1415,6 +1421,9 @@ PassRefPtr<RenderStyle> CSSStyleSelector::styleForKeyframe(const RenderStyle* el
     if (m_fontDirty)
         updateFont();
 
+    // Start loading images referenced by this style.
+    loadPendingImages();
+
     // Add all the animating properties to the list
     if (keyframeRule->style()) {
         CSSMutableStyleDeclaration::const_iterator end = keyframeRule->style()->end();
@@ -1570,6 +1579,9 @@ PassRefPtr<RenderStyle> CSSStyleSelector::pseudoStyleForElement(PseudoId pseudo,
     // Clean up our style object's display and text decorations (among other fixups).
     adjustRenderStyle(style(), 0);
 
+    // Start loading images referenced by this style.
+    loadPendingImages();
+
     // Hang our visited style off m_style.
     if (visitedStyle)
         m_style->addCachedPseudoStyle(visitedStyle.release());
@@ -1604,6 +1616,9 @@ PassRefPtr<RenderStyle> CSSStyleSelector::styleForPage(int pageIndex)
 
     applyDeclarations<false>(false, 0, m_matchedDecls.size() - 1);
 
+    // Start loading images referenced by this style.
+    loadPendingImages();
+
     // Now return the style.
     return m_style.release();
 }
@@ -3121,7 +3136,8 @@ void CSSStyleSelector::applyProperty(int id, CSSValue *value)
     // What follows is a list that maps the CSS properties into their corresponding front-end
     // RenderStyle values.  Shorthands (e.g. border, background) occur in this list as well and
     // are only hit when mapping "inherit" or "initial" into front-end values.
-    switch (static_cast<CSSPropertyID>(id)) {
+    CSSPropertyID property = static_cast<CSSPropertyID>(id);
+    switch (property) {
 // ident only properties
     case CSSPropertyBackgroundAttachment:
         HANDLE_BACKGROUND_VALUE(attachment, Attachment, value)
@@ -3512,7 +3528,7 @@ void CSSStyleSelector::applyProperty(int id, CSSValue *value)
                     if (image->updateIfSVGCursorIsUsed(m_element)) // Elements with SVG cursors are not allowed to share style.
                         m_style->setUnique();
                     // FIXME: Temporary clumsiness to pass off a CachedImage to an API that will eventually convert to using
-                    // StyleImage.
+                    // StyleImage. Should also be fixed to use StylePendingImage at the same time.
                     RefPtr<StyleCachedImage> styleCachedImage(image->cachedImage(m_element->document()->docLoader()));
                     if (styleCachedImage)
                         m_style->addCursor(styleCachedImage->cachedImage(), image->hotSpot());
@@ -3612,7 +3628,7 @@ void CSSStyleSelector::applyProperty(int id, CSSValue *value)
     case CSSPropertyListStyleImage:
     {
         HANDLE_INHERIT_AND_INITIAL(listStyleImage, ListStyleImage)
-        m_style->setListStyleImage(styleImage(value));
+        m_style->setListStyleImage(styleImage(CSSPropertyListStyleImage, value));
         return;
     }
 
@@ -4274,8 +4290,7 @@ void CSSStyleSelector::applyProperty(int id, CSSValue *value)
                     break;
                 }
                 case CSSPrimitiveValue::CSS_URI: {
-                    CSSImageValue* image = static_cast<CSSImageValue*>(val);
-                    m_style->setContent(image->cachedImage(m_element->document()->docLoader()), didSet);
+                    m_style->setContent(cachedOrPendingFromValue(CSSPropertyContent, static_cast<CSSImageValue*>(val)), didSet);
                     didSet = true;
                     break;
                 }
@@ -4702,7 +4717,7 @@ void CSSStyleSelector::applyProperty(int id, CSSValue *value)
         }
 
         NinePieceImage image;
-        mapNinePieceImage(value, image);
+        mapNinePieceImage(property, value, image);
         
         if (id == CSSPropertyWebkitBorderImage)
             m_style->setBorderImage(image);
@@ -4852,7 +4867,7 @@ void CSSStyleSelector::applyProperty(int id, CSSValue *value)
                 reflection->setOffset(Length(reflectValue->offset()->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed));
         }
         NinePieceImage mask;
-        mapNinePieceImage(reflectValue->mask(), mask);
+        mapNinePieceImage(property, reflectValue->mask(), mask);
         reflection->setMask(mask);
         
         m_style->setBoxReflect(reflection.release());
@@ -5677,7 +5692,7 @@ Length CSSStyleSelector::inchLength(double inch)
     return Length(CSSPrimitiveValue::create(inch, CSSPrimitiveValue::CSS_IN)->computeLengthIntForLength(style(), m_rootElementStyle), Fixed);
 }
 
-void CSSStyleSelector::mapFillAttachment(FillLayer* layer, CSSValue* value)
+void CSSStyleSelector::mapFillAttachment(CSSPropertyID, FillLayer* layer, CSSValue* value)
 {
     if (value->cssValueType() == CSSValue::CSS_INITIAL) {
         layer->setAttachment(FillLayer::initialFillAttachment(layer->type()));
@@ -5703,7 +5718,7 @@ void CSSStyleSelector::mapFillAttachment(FillLayer* layer, CSSValue* value)
     }
 }
 
-void CSSStyleSelector::mapFillClip(FillLayer* layer, CSSValue* value)
+void CSSStyleSelector::mapFillClip(CSSPropertyID, FillLayer* layer, CSSValue* value)
 {
     if (value->cssValueType() == CSSValue::CSS_INITIAL) {
         layer->setClip(FillLayer::initialFillClip(layer->type()));
@@ -5717,7 +5732,7 @@ void CSSStyleSelector::mapFillClip(FillLayer* layer, CSSValue* value)
     layer->setClip(*primitiveValue);
 }
 
-void CSSStyleSelector::mapFillComposite(FillLayer* layer, CSSValue* value)
+void CSSStyleSelector::mapFillComposite(CSSPropertyID, FillLayer* layer, CSSValue* value)
 {
     if (value->cssValueType() == CSSValue::CSS_INITIAL) {
         layer->setComposite(FillLayer::initialFillComposite(layer->type()));
@@ -5731,7 +5746,7 @@ void CSSStyleSelector::mapFillComposite(FillLayer* layer, CSSValue* value)
     layer->setComposite(*primitiveValue);
 }
 
-void CSSStyleSelector::mapFillOrigin(FillLayer* layer, CSSValue* value)
+void CSSStyleSelector::mapFillOrigin(CSSPropertyID, FillLayer* layer, CSSValue* value)
 {
     if (value->cssValueType() == CSSValue::CSS_INITIAL) {
         layer->setOrigin(FillLayer::initialFillOrigin(layer->type()));
@@ -5745,26 +5760,36 @@ void CSSStyleSelector::mapFillOrigin(FillLayer* layer, CSSValue* value)
     layer->setOrigin(*primitiveValue);
 }
 
-StyleImage* CSSStyleSelector::styleImage(CSSValue* value)
+StyleImage* CSSStyleSelector::styleImage(CSSPropertyID property, CSSValue* value)
 {
     if (value->isImageValue())
-        return static_cast<CSSImageValue*>(value)->cachedImage(m_element->document()->docLoader());
+        return cachedOrPendingFromValue(property, static_cast<CSSImageValue*>(value));
+
     if (value->isImageGeneratorValue())
         return static_cast<CSSImageGeneratorValue*>(value)->generatedImage();
+
     return 0;
 }
 
-void CSSStyleSelector::mapFillImage(FillLayer* layer, CSSValue* value)
+StyleImage* CSSStyleSelector::cachedOrPendingFromValue(CSSPropertyID property, CSSImageValue* value)
+{
+    StyleImage* image = value->cachedOrPendingImage();
+    if (image->isPendingImage())
+        m_pendingImageProperties.add(property);
+    return image;
+}
+
+void CSSStyleSelector::mapFillImage(CSSPropertyID property, FillLayer* layer, CSSValue* value)
 {
     if (value->cssValueType() == CSSValue::CSS_INITIAL) {
         layer->setImage(FillLayer::initialFillImage(layer->type()));
         return;
     }
 
-    layer->setImage(styleImage(value));
+    layer->setImage(styleImage(property, value));
 }
 
-void CSSStyleSelector::mapFillRepeatX(FillLayer* layer, CSSValue* value)
+void CSSStyleSelector::mapFillRepeatX(CSSPropertyID, FillLayer* layer, CSSValue* value)
 {
     if (value->cssValueType() == CSSValue::CSS_INITIAL) {
         layer->setRepeatX(FillLayer::initialFillRepeatX(layer->type()));
@@ -5778,7 +5803,7 @@ void CSSStyleSelector::mapFillRepeatX(FillLayer* layer, CSSValue* value)
     layer->setRepeatX(*primitiveValue);
 }
 
-void CSSStyleSelector::mapFillRepeatY(FillLayer* layer, CSSValue* value)
+void CSSStyleSelector::mapFillRepeatY(CSSPropertyID, FillLayer* layer, CSSValue* value)
 {
     if (value->cssValueType() == CSSValue::CSS_INITIAL) {
         layer->setRepeatY(FillLayer::initialFillRepeatY(layer->type()));
@@ -5792,7 +5817,7 @@ void CSSStyleSelector::mapFillRepeatY(FillLayer* layer, CSSValue* value)
     layer->setRepeatY(*primitiveValue);
 }
 
-void CSSStyleSelector::mapFillSize(FillLayer* layer, CSSValue* value)
+void CSSStyleSelector::mapFillSize(CSSPropertyID, FillLayer* layer, CSSValue* value)
 {
     if (!value->isPrimitiveValue()) {
         layer->setSizeType(SizeNone);
@@ -5854,7 +5879,7 @@ void CSSStyleSelector::mapFillSize(FillLayer* layer, CSSValue* value)
     layer->setSizeLength(b);
 }
 
-void CSSStyleSelector::mapFillXPosition(FillLayer* layer, CSSValue* value)
+void CSSStyleSelector::mapFillXPosition(CSSPropertyID, FillLayer* layer, CSSValue* value)
 {
     if (value->cssValueType() == CSSValue::CSS_INITIAL) {
         layer->setXPosition(FillLayer::initialFillXPosition(layer->type()));
@@ -5878,7 +5903,7 @@ void CSSStyleSelector::mapFillXPosition(FillLayer* layer, CSSValue* value)
     layer->setXPosition(l);
 }
 
-void CSSStyleSelector::mapFillYPosition(FillLayer* layer, CSSValue* value)
+void CSSStyleSelector::mapFillYPosition(CSSPropertyID, FillLayer* layer, CSSValue* value)
 {
     if (value->cssValueType() == CSSValue::CSS_INITIAL) {
         layer->setYPosition(FillLayer::initialFillYPosition(layer->type()));
@@ -6066,7 +6091,7 @@ void CSSStyleSelector::mapAnimationTimingFunction(Animation* animation, CSSValue
     }
 }
 
-void CSSStyleSelector::mapNinePieceImage(CSSValue* value, NinePieceImage& image)
+void CSSStyleSelector::mapNinePieceImage(CSSPropertyID property, CSSValue* value, NinePieceImage& image)
 {
     // If we're a primitive value, then we are "none" and don't need to alter the empty image at all.
     if (!value || value->isPrimitiveValue())
@@ -6076,7 +6101,7 @@ void CSSStyleSelector::mapNinePieceImage(CSSValue* value, NinePieceImage& image)
     CSSBorderImageValue* borderImage = static_cast<CSSBorderImageValue*>(value);
     
     // Set the image (this kicks off the load).
-    image.setImage(styleImage(borderImage->imageValue()));
+    image.setImage(styleImage(property, borderImage->imageValue()));
 
     // Set up a length box to represent our image slices.
     LengthBox l;
@@ -6685,4 +6710,90 @@ bool CSSStyleSelector::createTransformOperations(CSSValue* inValue, RenderStyle*
     return true;
 }
 
+void CSSStyleSelector::loadPendingImages()
+{
+    if (m_pendingImageProperties.isEmpty())
+        return;
+        
+    HashSet<int>::const_iterator end = m_pendingImageProperties.end();
+    for (HashSet<int>::const_iterator it = m_pendingImageProperties.begin(); it != end; ++it) {
+        CSSPropertyID currentProperty = static_cast<CSSPropertyID>(*it);
+
+        DocLoader* docLoader = m_element->document()->docLoader();
+        
+        switch (currentProperty) {
+            case CSSPropertyBackgroundImage: {
+                for (FillLayer* backgroundLayer = m_style->accessBackgroundLayers(); backgroundLayer; backgroundLayer = backgroundLayer->next()) {
+                    if (backgroundLayer->image() && backgroundLayer->image()->isPendingImage()) {
+                        CSSImageValue* imageValue = static_cast<StylePendingImage*>(backgroundLayer->image())->cssImageValue();
+                        backgroundLayer->setImage(imageValue->cachedImage(docLoader));
+                    }
+                }
+                break;
+            }
+            case CSSPropertyContent: {
+                for (ContentData* contentData = const_cast<ContentData*>(m_style->contentData()); contentData; contentData = contentData->next()) {
+                    if (contentData->isImage() && contentData->image()->isPendingImage()) {
+                        CSSImageValue* imageValue = static_cast<StylePendingImage*>(contentData->image())->cssImageValue();
+                        contentData->setImage(imageValue->cachedImage(docLoader));
+                    }
+                }
+                break;
+            }
+            case CSSPropertyCursor:
+                // Cursor doesn't use StylePendingImage yet.
+                break;
+
+            case CSSPropertyListStyleImage: {
+                if (m_style->listStyleImage()->isPendingImage()) {
+                    CSSImageValue* imageValue = static_cast<StylePendingImage*>(m_style->listStyleImage())->cssImageValue();
+                    m_style->setListStyleImage(imageValue->cachedImage(docLoader));
+                }
+                break;
+            }
+
+            case CSSPropertyWebkitBorderImage: {
+                const NinePieceImage& borderImage = m_style->borderImage();
+                if (borderImage.image()->isPendingImage()) {
+                    CSSImageValue* imageValue = static_cast<StylePendingImage*>(borderImage.image())->cssImageValue();
+                    m_style->setBorderImage(NinePieceImage(imageValue->cachedImage(docLoader), borderImage.slices(), borderImage.horizontalRule(), borderImage.verticalRule()));
+                }
+                break;
+            }
+            
+            case CSSPropertyWebkitBoxReflect: {
+                const NinePieceImage& maskImage = m_style->boxReflect()->mask();
+                if (maskImage.image()->isPendingImage()) {
+                    CSSImageValue* imageValue = static_cast<StylePendingImage*>(maskImage.image())->cssImageValue();
+                    m_style->boxReflect()->setMask(NinePieceImage(imageValue->cachedImage(docLoader), maskImage.slices(), maskImage.horizontalRule(), maskImage.verticalRule()));
+                }
+                break;
+            }
+
+            case CSSPropertyWebkitMaskBoxImage: {
+                const NinePieceImage& maskBoxImage = m_style->maskBoxImage();
+                if (maskBoxImage.image()->isPendingImage()) {
+                    CSSImageValue* imageValue = static_cast<StylePendingImage*>(maskBoxImage.image())->cssImageValue();
+                    m_style->setMaskBoxImage(NinePieceImage(imageValue->cachedImage(docLoader), maskBoxImage.slices(), maskBoxImage.horizontalRule(), maskBoxImage.verticalRule()));
+                }
+                break;
+            }
+            
+            case CSSPropertyWebkitMaskImage: {
+                for (FillLayer* maskLayer = m_style->accessMaskLayers(); maskLayer; maskLayer = maskLayer->next()) {
+                    if (maskLayer->image() && maskLayer->image()->isPendingImage()) {
+                        CSSImageValue* imageValue = static_cast<StylePendingImage*>(maskLayer->image())->cssImageValue();
+                        maskLayer->setImage(imageValue->cachedImage(docLoader));
+                    }
+                }
+                break;
+            }
+            default:
+                ASSERT_NOT_REACHED();
+        }
+    }
+
+    m_pendingImageProperties.clear();
+}
+
 } // namespace WebCore
diff --git a/WebCore/css/CSSStyleSelector.h b/WebCore/css/CSSStyleSelector.h
index b0d977e..c3e423a 100644
--- a/WebCore/css/CSSStyleSelector.h
+++ b/WebCore/css/CSSStyleSelector.h
@@ -40,6 +40,7 @@ class CSSPrimitiveValue;
 class CSSProperty;
 class CSSFontFace;
 class CSSFontFaceRule;
+class CSSImageValue;
 class CSSRuleData;
 class CSSRuleDataList;
 class CSSRuleList;
@@ -240,16 +241,16 @@ public:
         void updateFont();
         void cacheBorderAndBackground();
 
-        void mapFillAttachment(FillLayer*, CSSValue*);
-        void mapFillClip(FillLayer*, CSSValue*);
-        void mapFillComposite(FillLayer*, CSSValue*);
-        void mapFillOrigin(FillLayer*, CSSValue*);
-        void mapFillImage(FillLayer*, CSSValue*);
-        void mapFillRepeatX(FillLayer*, CSSValue*);
-        void mapFillRepeatY(FillLayer*, CSSValue*);
-        void mapFillSize(FillLayer*, CSSValue*);
-        void mapFillXPosition(FillLayer*, CSSValue*);
-        void mapFillYPosition(FillLayer*, CSSValue*);
+        void mapFillAttachment(CSSPropertyID, FillLayer*, CSSValue*);
+        void mapFillClip(CSSPropertyID, FillLayer*, CSSValue*);
+        void mapFillComposite(CSSPropertyID, FillLayer*, CSSValue*);
+        void mapFillOrigin(CSSPropertyID, FillLayer*, CSSValue*);
+        void mapFillImage(CSSPropertyID, FillLayer*, CSSValue*);
+        void mapFillRepeatX(CSSPropertyID, FillLayer*, CSSValue*);
+        void mapFillRepeatY(CSSPropertyID, FillLayer*, CSSValue*);
+        void mapFillSize(CSSPropertyID, FillLayer*, CSSValue*);
+        void mapFillXPosition(CSSPropertyID, FillLayer*, CSSValue*);
+        void mapFillYPosition(CSSPropertyID, FillLayer*, CSSValue*);
 
         void mapAnimationDelay(Animation*, CSSValue*);
         void mapAnimationDirection(Animation*, CSSValue*);
@@ -261,7 +262,7 @@ public:
         void mapAnimationProperty(Animation*, CSSValue*);
         void mapAnimationTimingFunction(Animation*, CSSValue*);
 
-        void mapNinePieceImage(CSSValue*, NinePieceImage&);
+        void mapNinePieceImage(CSSPropertyID, CSSValue*, NinePieceImage&);
 
         void applyProperty(int id, CSSValue*);
         void applyPageSizeProperty(CSSValue*);
@@ -272,7 +273,10 @@ public:
         void applySVGProperty(int id, CSSValue*);
 #endif
 
-        StyleImage* styleImage(CSSValue* value);
+        void loadPendingImages();
+        
+        StyleImage* styleImage(CSSPropertyID, CSSValue* value);
+        StyleImage* cachedOrPendingFromValue(CSSPropertyID property, CSSImageValue* value);
 
         // We collect the set of decls that match in |m_matchedDecls|.  We then walk the
         // set of matched decls four times, once for those properties that others depend on (like font-size),
@@ -285,6 +289,8 @@ public:
         Vector<CSSRuleData*, 32> m_matchedRules;
 
         RefPtr<CSSRuleList> m_ruleList;
+        
+        HashSet<int> m_pendingImageProperties; // Hash of CSSPropertyIDs
 
         MediaQueryEvaluator* m_medium;
         RefPtr<RenderStyle> m_rootDefaultStyle;
diff --git a/WebCore/rendering/style/StyleCachedImage.cpp b/WebCore/rendering/style/StyleCachedImage.cpp
index b55c5b9..1d7aba8 100644
--- a/WebCore/rendering/style/StyleCachedImage.cpp
+++ b/WebCore/rendering/style/StyleCachedImage.cpp
@@ -29,7 +29,7 @@
 
 namespace WebCore {
 
-PassRefPtr<CSSValue> StyleCachedImage::cssValue()
+PassRefPtr<CSSValue> StyleCachedImage::cssValue() const
 {
     return CSSPrimitiveValue::create(m_image->url(), CSSPrimitiveValue::CSS_URI);
 }
diff --git a/WebCore/rendering/style/StyleCachedImage.h b/WebCore/rendering/style/StyleCachedImage.h
index 3d22868..3d6e1a2 100644
--- a/WebCore/rendering/style/StyleCachedImage.h
+++ b/WebCore/rendering/style/StyleCachedImage.h
@@ -38,7 +38,7 @@ public:
 
     virtual bool isCachedImage() const { return true; }
     
-    virtual PassRefPtr<CSSValue> cssValue();
+    virtual PassRefPtr<CSSValue> cssValue() const;
     
     CachedImage* cachedImage() const { return m_image.get(); }
 
diff --git a/WebCore/rendering/style/StyleGeneratedImage.cpp b/WebCore/rendering/style/StyleGeneratedImage.cpp
index 610e73d..2322f5f 100644
--- a/WebCore/rendering/style/StyleGeneratedImage.cpp
+++ b/WebCore/rendering/style/StyleGeneratedImage.cpp
@@ -29,7 +29,7 @@
 
 namespace WebCore {
 
-PassRefPtr<CSSValue> StyleGeneratedImage::cssValue()
+PassRefPtr<CSSValue> StyleGeneratedImage::cssValue() const
 {
     return m_generator;
 }
diff --git a/WebCore/rendering/style/StyleGeneratedImage.h b/WebCore/rendering/style/StyleGeneratedImage.h
index 532e383..7be1f6a 100644
--- a/WebCore/rendering/style/StyleGeneratedImage.h
+++ b/WebCore/rendering/style/StyleGeneratedImage.h
@@ -42,7 +42,7 @@ public:
 
     virtual bool isGeneratedImage() const { return true; }
     
-    virtual PassRefPtr<CSSValue> cssValue();
+    virtual PassRefPtr<CSSValue> cssValue() const;
 
     virtual IntSize imageSize(const RenderObject*, float multiplier) const;
     virtual bool imageHasRelativeWidth() const { return !m_fixedSize; }
diff --git a/WebCore/rendering/style/StyleImage.h b/WebCore/rendering/style/StyleImage.h
index cb90288..ead8d4a 100644
--- a/WebCore/rendering/style/StyleImage.h
+++ b/WebCore/rendering/style/StyleImage.h
@@ -24,6 +24,7 @@
 #ifndef StyleImage_h
 #define StyleImage_h
 
+#include "CSSValue.h"
 #include "IntSize.h"
 #include <wtf/PassRefPtr.h>
 #include <wtf/RefCounted.h>
@@ -41,12 +42,12 @@ class StyleImage : public RefCounted<StyleImage> {
 public:
     virtual ~StyleImage() { }
 
-    bool operator==(const StyleImage& other)
+    bool operator==(const StyleImage& other) const
     {
         return data() == other.data();
     }
-    
-    virtual PassRefPtr<CSSValue> cssValue() = 0;
+
+    virtual PassRefPtr<CSSValue> cssValue() const = 0;
 
     virtual bool canRender(float /*multiplier*/) const { return true; }
     virtual bool isLoaded() const { return true; }
@@ -60,7 +61,9 @@ public:
     virtual void removeClient(RenderObject*) = 0;
     virtual Image* image(RenderObject*, const IntSize&) const = 0;
     virtual WrappedImagePtr data() const = 0;
+
     virtual bool isCachedImage() const { return false; }
+    virtual bool isPendingImage() const { return false; }
     virtual bool isGeneratedImage() const { return false; }
     
     static  bool imagesEquivalent(StyleImage* image1, StyleImage* image2)
diff --git a/WebCore/rendering/style/StylePendingImage.h b/WebCore/rendering/style/StylePendingImage.h
new file mode 100644
index 0000000..b0c9b01
--- /dev/null
+++ b/WebCore/rendering/style/StylePendingImage.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#ifndef StylePendingImage_h
+#define StylePendingImage_h
+
+#include "StyleImage.h"
+
+namespace WebCore {
+
+// StylePendingImage is a placeholder StyleImage that is entered into the RenderStyle during
+// style resolution, in order to avoid loading images that are not referenced by the final style.
+// They should never exist in a RenderStyle after it has been returned from the style selector.
+
+class StylePendingImage : public StyleImage {
+public:
+    static PassRefPtr<StylePendingImage> create(CSSImageValue* value) { return adoptRef(new StylePendingImage(value)); }
+
+    virtual WrappedImagePtr data() const { return m_value; }
+
+    virtual bool isPendingImage() const { return true; }
+    
+    virtual PassRefPtr<CSSValue> cssValue() const { return m_value; }
+    CSSImageValue* cssImageValue() const { return m_value; }
+    
+    virtual IntSize imageSize(const RenderObject*, float /*multiplier*/) const { return IntSize(); }
+    virtual bool imageHasRelativeWidth() const { return false; }
+    virtual bool imageHasRelativeHeight() const { return false; }
+    virtual bool usesImageContainerSize() const { return false; }
+    virtual void setImageContainerSize(const IntSize&) { }
+    virtual void addClient(RenderObject*) { }
+    virtual void removeClient(RenderObject*) { }
+    virtual Image* image(RenderObject*, const IntSize&) const
+    {
+        ASSERT_NOT_REACHED();
+        return 0;
+    }
+    
+private:
+    StylePendingImage(CSSImageValue* value)
+        : m_value(value)
+    {
+    }
+
+    CSSImageValue* m_value; // Not retained; it owns us.
+};
+
+}
+#endif

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list