Reverse ownership relation of StyleCachedImage and CSSImageValue
https://bugs.webkit.org/show_bug.cgi?id=161447
Reviewed by Andreas Kling.
Currently StyleCachedImage (which represents an image in RenderStyle) has a weak ref to the
underlying CSSImageValue/CSSImageSetValue which actually owns it. This is awkwards especially since
StyleGeneratedImage, the other StyleImage subclass has reversed relationship where it refs
the underlying CSSImageGeneratorValue.
This patch makes StyleCachedImage similar to StyleGeneratedImage. StyleCachedImage now refs the
underlying CSSImageValue/CSSImageSetValue. CSSImageValues no longer need to know about StyleCachedImage.
Instead they reference CachedImages (memory cache objects) directly. StyleCachedImage instances are now
conceptually unique to RenderStyle instances. Actual resources are shared as before by sharing CachedImages.
* css/CSSCursorImageValue.cpp:
(WebCore::CSSCursorImageValue::loadImage):
(WebCore::CSSCursorImageValue::cachedImage):
(WebCore::CSSCursorImageValue::styleImage): Deleted.
* css/CSSCursorImageValue.h:
* css/CSSImageGeneratorValue.cpp:
(WebCore::CSSImageGeneratorValue::cachedImageForCSSValue):
* css/CSSImageSetValue.cpp:
(WebCore::CSSImageSetValue::~CSSImageSetValue):
(WebCore::CSSImageSetValue::loadBestFitImage):
(WebCore::CSSImageSetValue::traverseSubresources):
(WebCore::CSSImageSetValue::styleImage): Deleted.
* css/CSSImageSetValue.h:
* css/CSSImageValue.cpp:
(WebCore::CSSImageValue::CSSImageValue):
(WebCore::CSSImageValue::~CSSImageValue):
(WebCore::CSSImageValue::isPending):
(WebCore::CSSImageValue::loadImage):
(WebCore::CSSImageValue::traverseSubresources):
(WebCore::CSSImageValue::knownToBeOpaque):
(WebCore::CSSImageValue::styleImage): Deleted.
* css/CSSImageValue.h:
* css/StyleBuilderCustom.h:
(WebCore::StyleBuilderCustom::applyValueContent):
* css/StyleResolver.cpp:
(WebCore::StyleResolver::styleImage):
(WebCore::StyleResolver::styleCachedImageFromValue):
(WebCore::StyleResolver::styleGeneratedImageFromValue):
(WebCore::StyleResolver::cachedOrPendingFromValue): Deleted.
(WebCore::StyleResolver::generatedOrPendingFromValue): Deleted.
(WebCore::StyleResolver::setOrPendingFromValue): Deleted.
(WebCore::StyleResolver::cursorOrPendingFromValue): Deleted.
* css/StyleResolver.h:
* editing/TextIterator.cpp:
(WebCore::fullyClipsContents):
* page/PageSerializer.cpp:
(WebCore::PageSerializer::retrieveResourcesForProperties):
* rendering/style/FillLayer.cpp:
(WebCore::FillLayer::imagesIdentical):
Compare data equality instead of pointer equality for StyleImages (since StyleImages are no longer shared).
(WebCore::layerImagesIdentical): Deleted.
* rendering/style/StyleCachedImage.cpp:
(WebCore::StyleCachedImage::StyleCachedImage):
(WebCore::StyleCachedImage::~StyleCachedImage):
(WebCore::StyleCachedImage::cachedImage):
(WebCore::StyleCachedImage::cssValue):
(WebCore::StyleCachedImage::canRender):
(WebCore::StyleCachedImage::isPending):
(WebCore::StyleCachedImage::isLoaded):
(WebCore::StyleCachedImage::errorOccurred):
(WebCore::StyleCachedImage::imageSize):
(WebCore::StyleCachedImage::imageHasRelativeWidth):
(WebCore::StyleCachedImage::imageHasRelativeHeight):
(WebCore::StyleCachedImage::computeIntrinsicDimensions):
(WebCore::StyleCachedImage::usesImageContainerSize):
(WebCore::StyleCachedImage::setContainerSizeForRenderer):
(WebCore::StyleCachedImage::addClient):
(WebCore::StyleCachedImage::removeClient):
(WebCore::StyleCachedImage::image):
(WebCore::StyleCachedImage::knownToBeOpaque):
(WebCore::StyleCachedImage::setCachedImage): Deleted.
* rendering/style/StyleCachedImage.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@205419 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/css/CSSImageValue.cpp b/Source/WebCore/css/CSSImageValue.cpp
index c8aee0d..6f68ab8 100644
--- a/Source/WebCore/css/CSSImageValue.cpp
+++ b/Source/WebCore/css/CSSImageValue.cpp
@@ -32,7 +32,6 @@
#include "Document.h"
#include "Element.h"
#include "MemoryCache.h"
-#include "StyleCachedImage.h"
namespace WebCore {
@@ -46,60 +45,46 @@
CSSImageValue::CSSImageValue(CachedImage& image)
: CSSValue(ImageClass)
, m_url(image.url())
- , m_image(StyleCachedImage::create(*this))
+ , m_cachedImage(&image)
, m_accessedImage(true)
{
- m_image->setCachedImage(image);
}
CSSImageValue::~CSSImageValue()
{
- if (m_image)
- m_image->detachFromCSSValue();
}
bool CSSImageValue::isPending() const
{
- return !m_image || !m_image->cachedImage();
+ return !m_accessedImage;
}
-StyleCachedImage& CSSImageValue::styleImage()
+CachedImage* CSSImageValue::loadImage(CachedResourceLoader& loader, const ResourceLoaderOptions& options)
{
- if (!m_image)
- m_image = StyleCachedImage::create(*this);
+ if (!m_accessedImage) {
+ m_accessedImage = true;
- return *m_image;
-}
+ CachedResourceRequest request(ResourceRequest(loader.document()->completeURL(m_url)), options);
+ if (m_initiatorName.isEmpty())
+ request.setInitiator(cachedResourceRequestInitiators().css);
+ else
+ request.setInitiator(m_initiatorName);
-void CSSImageValue::loadImage(CachedResourceLoader& loader, const ResourceLoaderOptions& options)
-{
- if (m_accessedImage)
- return;
- m_accessedImage = true;
-
- CachedResourceRequest request(ResourceRequest(loader.document()->completeURL(m_url)), options);
- if (m_initiatorName.isEmpty())
- request.setInitiator(cachedResourceRequestInitiators().css);
- else
- request.setInitiator(m_initiatorName);
-
- if (options.mode == FetchOptions::Mode::Cors) {
- ASSERT(loader.document()->securityOrigin());
- updateRequestForAccessControl(request.mutableResourceRequest(), *loader.document()->securityOrigin(), options.allowCredentials);
+ if (options.mode == FetchOptions::Mode::Cors) {
+ ASSERT(loader.document()->securityOrigin());
+ updateRequestForAccessControl(request.mutableResourceRequest(), *loader.document()->securityOrigin(), options.allowCredentials);
+ }
+ m_cachedImage = loader.requestImage(request);
}
- if (CachedResourceHandle<CachedImage> cachedImage = loader.requestImage(request))
- styleImage().setCachedImage(*cachedImage);
+ return m_cachedImage.get();
}
bool CSSImageValue::traverseSubresources(const std::function<bool (const CachedResource&)>& handler) const
{
- if (!m_image)
+ if (!m_cachedImage)
return false;
- CachedResource* cachedResource = m_image->cachedImage();
- if (!cachedResource)
- return false;
- return handler(*cachedResource);
+ return handler(*m_cachedImage);
}
bool CSSImageValue::equals(const CSSImageValue& other) const
@@ -122,7 +107,9 @@
bool CSSImageValue::knownToBeOpaque(const RenderElement* renderer) const
{
- return m_image ? m_image->knownToBeOpaque(renderer) : false;
+ if (!m_cachedImage)
+ return false;
+ return m_cachedImage->currentFrameKnownToBeOpaque(renderer);
}
} // namespace WebCore