Ignore:
Timestamp:
Sep 4, 2016, 6:42:42 AM (9 years ago)
Author:
Antti Koivisto
Message:

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:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/css/CSSImageSetValue.cpp

    r205346 r205419  
    3636#include "Document.h"
    3737#include "Page.h"
    38 #include "StyleCachedImage.h"
    3938#include <wtf/text/StringBuilder.h>
    4039
     
    4342CSSImageSetValue::CSSImageSetValue()
    4443    : CSSValueList(ImageSetClass, CommaSeparator)
    45     , m_accessedBestFitImage(false)
    46     , m_scaleFactor(1)
    4744{
    4845}
     
    5047CSSImageSetValue::~CSSImageSetValue()
    5148{
    52     if (m_image)
    53         m_image->detachFromCSSValue();
    5449}
    5550
     
    8075CSSImageSetValue::ImageWithScale CSSImageSetValue::bestImageForScaleFactor()
    8176{
     77    if (!m_imagesInSet.size())
     78        fillImageSet();
     79
    8280    ImageWithScale image;
    8381    size_t numberOfImages = m_imagesInSet.size();
    8482    for (size_t i = 0; i < numberOfImages; ++i) {
    8583        image = m_imagesInSet.at(i);
    86         if (image.scaleFactor >= m_scaleFactor)
     84        if (image.scaleFactor >= m_deviceScaleFactor)
    8785            return image;
    8886    }
     
    9088}
    9189
    92 void CSSImageSetValue::loadBestFitImage(CachedResourceLoader& loader, const ResourceLoaderOptions& options)
     90std::pair<CachedImage*, float> CSSImageSetValue::loadBestFitImage(CachedResourceLoader& loader, const ResourceLoaderOptions& options)
    9391{
    9492    Document* document = loader.document();
    95     if (Page* page = document->page())
    96         m_scaleFactor = page->deviceScaleFactor();
    97     else
    98         m_scaleFactor = 1;
     93    updateDeviceScaleFactor(*document);
     94   
     95    if (!m_accessedBestFitImage) {
     96        m_accessedBestFitImage = true;
    9997
    100     if (!m_imagesInSet.size())
    101         fillImageSet();
    102 
    103     if (m_accessedBestFitImage)
    104         return;
    105     // FIXME: In the future, we want to take much more than deviceScaleFactor into acount here.
    106     // All forms of scale should be included: Page::pageScaleFactor(), Frame::pageZoomFactor(),
    107     // and any CSS transforms. https://bugs.webkit.org/show_bug.cgi?id=81698
    108     ImageWithScale image = bestImageForScaleFactor();
    109     CachedResourceRequest request(ResourceRequest(document->completeURL(image.imageURL)), options);
    110     request.setInitiator(cachedResourceRequestInitiators().css);
    111     if (options.mode == FetchOptions::Mode::Cors) {
    112         ASSERT(document->securityOrigin());
    113         updateRequestForAccessControl(request.mutableResourceRequest(), *document->securityOrigin(), options.allowCredentials);
     98        // FIXME: In the future, we want to take much more than deviceScaleFactor into acount here.
     99        // All forms of scale should be included: Page::pageScaleFactor(), Frame::pageZoomFactor(),
     100        // and any CSS transforms. https://bugs.webkit.org/show_bug.cgi?id=81698
     101        ImageWithScale image = bestImageForScaleFactor();
     102        CachedResourceRequest request(ResourceRequest(document->completeURL(image.imageURL)), options);
     103        request.setInitiator(cachedResourceRequestInitiators().css);
     104        if (options.mode == FetchOptions::Mode::Cors) {
     105            ASSERT(document->securityOrigin());
     106            updateRequestForAccessControl(request.mutableResourceRequest(), *document->securityOrigin(), options.allowCredentials);
     107        }
     108        m_cachedImage = loader.requestImage(request);
     109        m_bestFitImageScaleFactor = image.scaleFactor;
    114110    }
    115     if (CachedResourceHandle<CachedImage> cachedImage = loader.requestImage(request)) {
    116         styleImage(*document).setCachedImage(*cachedImage, image.scaleFactor);
    117         m_accessedBestFitImage = true;
    118     }
     111    return { m_cachedImage.get(), m_bestFitImageScaleFactor };
    119112}
    120113
    121 StyleCachedImage& CSSImageSetValue::styleImage(const Document& document)
     114void CSSImageSetValue::updateDeviceScaleFactor(const Document& document)
    122115{
    123     if (!m_image)
    124         m_image = StyleCachedImage::create(*this);
    125     else if (!m_image->isPending()) {
    126         float deviceScaleFactor = 1;
    127         if (Page* page = document.page())
    128             deviceScaleFactor = page->deviceScaleFactor();
    129 
    130         // If the deviceScaleFactor has changed, we may not have the best image loaded, so we have to re-assess.
    131         if (deviceScaleFactor != m_scaleFactor) {
    132             m_accessedBestFitImage = false;
    133             m_image->detachFromCSSValue();
    134             m_image = StyleCachedImage::create(*this);
    135         }
    136     }
    137 
    138     return *m_image;
     116    float deviceScaleFactor = document.page() ? document.page()->deviceScaleFactor() : 1;
     117    if (deviceScaleFactor == m_deviceScaleFactor)
     118        return;
     119    m_deviceScaleFactor = deviceScaleFactor;
     120    m_accessedBestFitImage = false;
     121    m_cachedImage = nullptr;
    139122}
    140123
     
    171154bool CSSImageSetValue::traverseSubresources(const std::function<bool (const CachedResource&)>& handler) const
    172155{
    173     if (!m_image)
     156    if (!m_cachedImage)
    174157        return false;
    175     CachedImage* cachedResource = m_image->cachedImage();
    176     if (!cachedResource)
    177         return false;
    178     return handler(*cachedResource);
     158    return handler(*m_cachedImage);
    179159}
    180160
    181161CSSImageSetValue::CSSImageSetValue(const CSSImageSetValue& cloneFrom)
    182162    : CSSValueList(cloneFrom)
    183     , m_accessedBestFitImage(false)
    184     , m_scaleFactor(1)
    185163{
    186164    // Non-CSSValueList data is not accessible through CSS OM, no need to clone.
Note: See TracChangeset for help on using the changeset viewer.