Changeset 205346 in webkit
- Timestamp:
- Sep 2, 2016 9:26:40 AM (8 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r205344 r205346 1 2016-09-02 Commit Queue <commit-queue@webkit.org> 2 3 Unreviewed, rolling out r205344. 4 https://bugs.webkit.org/show_bug.cgi?id=161533 5 6 Hitting assertions under CachedResource::removeClient in a few 7 tests (Requested by anttik on #webkit). 8 9 Reverted changeset: 10 11 "Reverse ownership relation of StyleCachedImage and 12 CSSImageValue" 13 https://bugs.webkit.org/show_bug.cgi?id=161447 14 http://trac.webkit.org/changeset/205344 15 1 16 2016-09-02 Antti Koivisto <antti@apple.com> 2 17 -
trunk/Source/WebCore/css/CSSCursorImageValue.cpp
r205344 r205346 27 27 #include "CachedImage.h" 28 28 #include "CachedResourceLoader.h" 29 #include "StyleCachedImage.h" 30 #include "StyleImage.h" 29 31 #include "SVGCursorElement.h" 30 32 #include "SVGLengthContext.h" … … 108 110 } 109 111 110 if (auto* cursorElement = updateCursorElement(*loader.document())) {111 if (cursorElement->href() != downcast<CSSImageValue>(m_imageValue.get()).url())112 m_imageValue = CSSImageValue::create(cursorElement->href());113 }114 115 112 downcast<CSSImageValue>(m_imageValue.get()).loadImage(loader, options); 116 113 } 117 114 118 CachedImage* CSSCursorImageValue::cachedImage() const 115 StyleCachedImage& CSSCursorImageValue::styleImage(const Document& document) 119 116 { 117 // Need to delegate completely so that changes in device scale factor can be handled appropriately. 118 StyleCachedImage* styleImage; 120 119 if (is<CSSImageSetValue>(m_imageValue.get())) 121 return downcast<CSSImageSetValue>(m_imageValue.get()).cachedImage(); 120 styleImage = &downcast<CSSImageSetValue>(m_imageValue.get()).styleImage(document); 121 else { 122 if (auto* cursorElement = updateCursorElement(document)) { 123 if (cursorElement->href() != downcast<CSSImageValue>(m_imageValue.get()).url()) 124 m_imageValue = CSSImageValue::create(cursorElement->href()); 125 } 126 styleImage = &downcast<CSSImageValue>(m_imageValue.get()).styleImage(); 127 } 128 styleImage->setCSSValue(*this); 122 129 123 return downcast<CSSImageValue>(m_imageValue.get()).cachedImage(); 124 } 125 126 float CSSCursorImageValue::scaleFactor() const 127 { 128 if (is<CSSImageSetValue>(m_imageValue.get())) 129 return downcast<CSSImageSetValue>(m_imageValue.get()).bestFitScaleFactor(); 130 131 return 1; 130 return *styleImage; 132 131 } 133 132 -
trunk/Source/WebCore/css/CSSCursorImageValue.h
r205344 r205346 32 32 class SVGCursorElement; 33 33 class SVGElement; 34 class StyleCachedImage; 34 35 35 36 class CSSCursorImageValue final : public CSSValue { … … 54 55 55 56 void loadImage(CachedResourceLoader&, const ResourceLoaderOptions&); 56 CachedImage* cachedImage() const; 57 58 float scaleFactor() const; 57 StyleCachedImage& styleImage(const Document&); 59 58 60 59 void removeReferencedElement(SVGElement*); -
trunk/Source/WebCore/css/CSSImageGeneratorValue.cpp
r205344 r205346 254 254 auto& imageValue = downcast<CSSImageValue>(value); 255 255 imageValue.loadImage(cachedResourceLoader, options); 256 return imageValue. cachedImage();256 return imageValue.styleImage().cachedImage(); 257 257 } 258 258 -
trunk/Source/WebCore/css/CSSImageSetValue.cpp
r205344 r205346 36 36 #include "Document.h" 37 37 #include "Page.h" 38 #include "StyleCachedImage.h" 38 39 #include <wtf/text/StringBuilder.h> 39 40 … … 42 43 CSSImageSetValue::CSSImageSetValue() 43 44 : CSSValueList(ImageSetClass, CommaSeparator) 45 , m_accessedBestFitImage(false) 46 , m_scaleFactor(1) 44 47 { 45 48 } … … 47 50 CSSImageSetValue::~CSSImageSetValue() 48 51 { 52 if (m_image) 53 m_image->detachFromCSSValue(); 49 54 } 50 55 … … 75 80 CSSImageSetValue::ImageWithScale CSSImageSetValue::bestImageForScaleFactor() 76 81 { 77 if (!m_imagesInSet.size())78 fillImageSet();79 80 82 ImageWithScale image; 81 83 size_t numberOfImages = m_imagesInSet.size(); 82 84 for (size_t i = 0; i < numberOfImages; ++i) { 83 85 image = m_imagesInSet.at(i); 84 if (image.scaleFactor >= m_ deviceScaleFactor)86 if (image.scaleFactor >= m_scaleFactor) 85 87 return image; 86 88 } … … 91 93 { 92 94 Document* document = loader.document(); 93 updateDeviceScaleFactor(*document); 94 95 if (Page* page = document->page()) 96 m_scaleFactor = page->deviceScaleFactor(); 97 else 98 m_scaleFactor = 1; 99 100 if (!m_imagesInSet.size()) 101 fillImageSet(); 102 95 103 if (m_accessedBestFitImage) 96 104 return; 97 98 105 // FIXME: In the future, we want to take much more than deviceScaleFactor into acount here. 99 106 // All forms of scale should be included: Page::pageScaleFactor(), Frame::pageZoomFactor(), … … 106 113 updateRequestForAccessControl(request.mutableResourceRequest(), *document->securityOrigin(), options.allowCredentials); 107 114 } 108 m_cachedImage = loader.requestImage(request); 109 m_bestFitImageScaleFactor = image.scaleFactor; 110 m_accessedBestFitImage = true; 115 if (CachedResourceHandle<CachedImage> cachedImage = loader.requestImage(request)) { 116 styleImage(*document).setCachedImage(*cachedImage, image.scaleFactor); 117 m_accessedBestFitImage = true; 118 } 111 119 } 112 120 113 void CSSImageSetValue::updateDeviceScaleFactor(const Document& document)121 StyleCachedImage& CSSImageSetValue::styleImage(const Document& document) 114 122 { 115 float deviceScaleFactor = document.page() ? document.page()->deviceScaleFactor() : 1; 116 if (deviceScaleFactor == m_deviceScaleFactor) 117 return; 118 m_deviceScaleFactor = deviceScaleFactor; 119 m_accessedBestFitImage = false; 120 m_cachedImage = nullptr; 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; 121 139 } 122 140 … … 153 171 bool CSSImageSetValue::traverseSubresources(const std::function<bool (const CachedResource&)>& handler) const 154 172 { 155 if (!m_ cachedImage)173 if (!m_image) 156 174 return false; 157 return handler(*m_cachedImage); 175 CachedImage* cachedResource = m_image->cachedImage(); 176 if (!cachedResource) 177 return false; 178 return handler(*cachedResource); 158 179 } 159 180 160 181 CSSImageSetValue::CSSImageSetValue(const CSSImageSetValue& cloneFrom) 161 182 : CSSValueList(cloneFrom) 183 , m_accessedBestFitImage(false) 184 , m_scaleFactor(1) 162 185 { 163 186 // Non-CSSValueList data is not accessible through CSS OM, no need to clone. -
trunk/Source/WebCore/css/CSSImageSetValue.h
r205344 r205346 28 28 29 29 #include "CSSValueList.h" 30 #include "CachedImageClient.h"31 #include "CachedResourceHandle.h"32 30 33 31 namespace WebCore { … … 35 33 class CachedResourceLoader; 36 34 class Document; 35 class StyleCachedImage; 36 class StyleImage; 37 37 struct ResourceLoaderOptions; 38 38 39 39 class CSSImageSetValue final : public CSSValueList { 40 40 public: 41 41 42 static Ref<CSSImageSetValue> create() 42 43 { … … 46 47 47 48 void loadBestFitImage(CachedResourceLoader&, const ResourceLoaderOptions&); 48 CachedImage* cachedImage() const { return m_cachedImage.get(); }49 StyleCachedImage& styleImage(const Document&); 49 50 50 51 String customCSSText() const; 51 52 52 float bestFitScaleFactor() const { return m_bestFitImageScaleFactor; };53 bool isPending() const { return !m_accessedBestFitImage; } 53 54 54 55 struct ImageWithScale { … … 60 61 61 62 Ref<CSSImageSetValue> cloneForCSSOM() const; 62 63 void updateDeviceScaleFactor(const Document&);64 63 65 64 protected: … … 73 72 static inline bool compareByScaleFactor(ImageWithScale first, ImageWithScale second) { return first.scaleFactor < second.scaleFactor; } 74 73 75 CachedResourceHandle<CachedImage> m_cachedImage; 76 bool m_accessedBestFitImage { false }; 77 float m_bestFitImageScaleFactor { 1 }; 78 float m_deviceScaleFactor { 1 }; 74 RefPtr<StyleCachedImage> m_image; 75 bool m_accessedBestFitImage; 76 77 // This represents the scale factor that we used to find the best fit image. It does not necessarily 78 // correspond to the scale factor of the best fit image. 79 float m_scaleFactor; 79 80 80 81 Vector<ImageWithScale> m_imagesInSet; -
trunk/Source/WebCore/css/CSSImageValue.cpp
r205344 r205346 33 33 #include "Element.h" 34 34 #include "MemoryCache.h" 35 #include "StyleCachedImage.h" 35 36 36 37 namespace WebCore { … … 46 47 : CSSValue(ImageClass) 47 48 , m_url(image.url()) 48 , m_ cachedImage(&image)49 , m_image(StyleCachedImage::create(*this)) 49 50 , m_accessedImage(true) 50 51 { 52 m_image->setCachedImage(image); 51 53 } 52 54 … … 54 56 CSSImageValue::~CSSImageValue() 55 57 { 58 if (m_image) 59 m_image->detachFromCSSValue(); 56 60 } 57 61 58 62 bool CSSImageValue::isPending() const 59 63 { 60 return !m_accessedImage; 64 return !m_image || !m_image->cachedImage(); 65 } 66 67 StyleCachedImage& CSSImageValue::styleImage() 68 { 69 if (!m_image) 70 m_image = StyleCachedImage::create(*this); 71 72 return *m_image; 61 73 } 62 74 … … 77 89 updateRequestForAccessControl(request.mutableResourceRequest(), *loader.document()->securityOrigin(), options.allowCredentials); 78 90 } 79 m_cachedImage = loader.requestImage(request); 91 if (CachedResourceHandle<CachedImage> cachedImage = loader.requestImage(request)) 92 styleImage().setCachedImage(*cachedImage); 80 93 } 81 94 82 95 bool CSSImageValue::traverseSubresources(const std::function<bool (const CachedResource&)>& handler) const 83 96 { 84 if (!m_ cachedImage)97 if (!m_image) 85 98 return false; 86 return handler(*m_cachedImage); 99 CachedResource* cachedResource = m_image->cachedImage(); 100 if (!cachedResource) 101 return false; 102 return handler(*cachedResource); 87 103 } 88 104 … … 107 123 bool CSSImageValue::knownToBeOpaque(const RenderElement* renderer) const 108 124 { 109 if (!m_cachedImage) 110 return false; 111 return m_cachedImage->currentFrameKnownToBeOpaque(renderer); 125 return m_image ? m_image->knownToBeOpaque(renderer) : false; 112 126 } 113 127 -
trunk/Source/WebCore/css/CSSImageValue.h
r205344 r205346 23 23 24 24 #include "CSSValue.h" 25 #include "CachedResourceHandle.h"26 25 #include <wtf/RefPtr.h> 27 26 … … 31 30 class CachedResourceLoader; 32 31 class Element; 32 class StyleCachedImage; 33 33 class RenderElement; 34 34 struct ResourceLoaderOptions; … … 42 42 bool isPending() const; 43 43 void loadImage(CachedResourceLoader&, const ResourceLoaderOptions&); 44 CachedImage* cachedImage() const { return m_cachedImage.get(); }44 StyleCachedImage& styleImage(); 45 45 46 46 const String& url() const { return m_url; } … … 63 63 64 64 String m_url; 65 CachedResourceHandle<CachedImage> m_cachedImage;65 RefPtr<StyleCachedImage> m_image; 66 66 bool m_accessedImage; 67 67 AtomicString m_initiatorName; -
trunk/Source/WebCore/css/StyleBuilderCustom.h
r205344 r205346 47 47 #include "SVGRenderStyle.h" 48 48 #include "StyleBuilderConverter.h" 49 #include "StyleCachedImage.h"50 49 #include "StyleFontSizeFunctions.h" 51 50 #include "StyleGeneratedImage.h" … … 1315 1314 didSet = true; 1316 1315 } else if (is<CSSImageSetValue>(item.get())) { 1317 styleResolver.style()->setContent(styleResolver.s tyleCachedImageFromValue(CSSPropertyContent, item), didSet);1316 styleResolver.style()->setContent(styleResolver.setOrPendingFromValue(CSSPropertyContent, downcast<CSSImageSetValue>(item.get())), didSet); 1318 1317 didSet = true; 1319 1318 } 1320 1319 1321 1320 if (is<CSSImageValue>(item.get())) { 1322 styleResolver.style()->setContent(styleResolver. styleCachedImageFromValue(CSSPropertyContent, item), didSet);1321 styleResolver.style()->setContent(styleResolver.cachedOrPendingFromValue(CSSPropertyContent, downcast<CSSImageValue>(item.get())), didSet); 1323 1322 didSet = true; 1324 1323 continue; -
trunk/Source/WebCore/css/StyleResolver.cpp
r205344 r205346 1703 1703 RefPtr<StyleImage> StyleResolver::styleImage(CSSPropertyID property, CSSValue& value) 1704 1704 { 1705 if (is<CSSImageValue>(value)) 1706 return cachedOrPendingFromValue(property, downcast<CSSImageValue>(value)); 1707 1705 1708 if (is<CSSImageGeneratorValue>(value)) { 1706 1709 if (is<CSSGradientValue>(value)) 1707 return styleGeneratedImageFromValue(property, *downcast<CSSGradientValue>(value).gradientWithStylesResolved(this)); 1708 return styleGeneratedImageFromValue(property, downcast<CSSImageGeneratorValue>(value)); 1709 } 1710 1711 if (is<CSSImageValue>(value) || is<CSSImageSetValue>(value) || is<CSSCursorImageValue>(value)) 1712 return styleCachedImageFromValue(property, value); 1710 return generatedOrPendingFromValue(property, *downcast<CSSGradientValue>(value).gradientWithStylesResolved(this)); 1711 return generatedOrPendingFromValue(property, downcast<CSSImageGeneratorValue>(value)); 1712 } 1713 1714 if (is<CSSImageSetValue>(value)) 1715 return setOrPendingFromValue(property, downcast<CSSImageSetValue>(value)); 1716 1717 if (is<CSSCursorImageValue>(value)) 1718 return cursorOrPendingFromValue(property, downcast<CSSCursorImageValue>(value)); 1713 1719 1714 1720 return nullptr; 1715 1721 } 1716 1722 1717 Ref<Style CachedImage> StyleResolver::styleCachedImageFromValue(CSSPropertyID property, CSSValue& value)1718 { 1719 auto image = StyleCachedImage::create(value);1723 Ref<StyleImage> StyleResolver::cachedOrPendingFromValue(CSSPropertyID property, CSSImageValue& value) 1724 { 1725 Ref<StyleImage> image = value.styleImage(); 1720 1726 if (image->isPending()) 1721 1727 m_state.ensurePendingResources().pendingImages.set(property, &value); … … 1723 1729 } 1724 1730 1725 Ref<Style GeneratedImage> StyleResolver::styleGeneratedImageFromValue(CSSPropertyID property, CSSImageGeneratorValue& value)1731 Ref<StyleImage> StyleResolver::generatedOrPendingFromValue(CSSPropertyID property, CSSImageGeneratorValue& value) 1726 1732 { 1727 1733 if (is<CSSFilterImageValue>(value)) { … … 1733 1739 1734 1740 return StyleGeneratedImage::create(value); 1741 } 1742 1743 RefPtr<StyleImage> StyleResolver::setOrPendingFromValue(CSSPropertyID property, CSSImageSetValue& value) 1744 { 1745 auto& image = value.styleImage(document()); 1746 if (image.isPending()) 1747 m_state.ensurePendingResources().pendingImages.set(property, &value); 1748 return ℑ 1749 } 1750 1751 RefPtr<StyleImage> StyleResolver::cursorOrPendingFromValue(CSSPropertyID property, CSSCursorImageValue& value) 1752 { 1753 auto& image = value.styleImage(document()); 1754 if (image.isPending()) 1755 m_state.ensurePendingResources().pendingImages.set(property, &value); 1756 return ℑ 1735 1757 } 1736 1758 -
trunk/Source/WebCore/css/StyleResolver.h
r205344 r205346 73 73 class SelectorFilter; 74 74 class Settings; 75 class StyleCachedImage;76 class StyleGeneratedImage;77 75 class StyleImage; 78 76 class StyleKeyframe; … … 461 459 462 460 RefPtr<StyleImage> styleImage(CSSPropertyID, CSSValue&); 463 Ref<StyleCachedImage> styleCachedImageFromValue(CSSPropertyID, CSSValue&); 464 Ref<StyleGeneratedImage> styleGeneratedImageFromValue(CSSPropertyID, CSSImageGeneratorValue&); 461 Ref<StyleImage> cachedOrPendingFromValue(CSSPropertyID, CSSImageValue&); 462 Ref<StyleImage> generatedOrPendingFromValue(CSSPropertyID, CSSImageGeneratorValue&); 463 RefPtr<StyleImage> setOrPendingFromValue(CSSPropertyID, CSSImageSetValue&); 464 RefPtr<StyleImage> cursorOrPendingFromValue(CSSPropertyID, CSSCursorImageValue&); 465 465 466 466 bool applyPropertyToRegularStyle() const { return m_state.applyPropertyToRegularStyle(); } -
trunk/Source/WebCore/page/PageSerializer.cpp
r205344 r205346 332 332 continue; 333 333 334 auto* image = downcast<CSSImageValue>(*cssValue).cachedImage(); 334 auto& styleImage = downcast<CSSImageValue>(*cssValue).styleImage(); 335 336 auto* image = styleImage.cachedImage(); 335 337 if (!image) 336 338 continue; -
trunk/Source/WebCore/rendering/style/FillLayer.cpp
r205344 r205346 381 381 } 382 382 383 static inline bool layerImagesIdentical(const FillLayer& layer1, const FillLayer& layer2) 384 { 385 // We just care about pointer equivalency. 386 return layer1.image() == layer2.image(); 387 } 388 383 389 bool FillLayer::imagesIdentical(const FillLayer* layer1, const FillLayer* layer2) 384 390 { 385 391 for (; layer1 && layer2; layer1 = layer1->next(), layer2 = layer2->next()) { 386 if (! arePointingToEqualData(layer1->image(), layer2->image()))392 if (!layerImagesIdentical(*layer1, *layer2)) 387 393 return false; 388 394 } -
trunk/Source/WebCore/rendering/style/StyleCachedImage.cpp
r205344 r205346 25 25 #include "StyleCachedImage.h" 26 26 27 #include "CSSCursorImageValue.h"28 27 #include "CSSImageSetValue.h" 29 #include "CSSImageValue.h"30 28 #include "CachedImage.h" 31 29 #include "RenderElement.h" … … 34 32 35 33 StyleCachedImage::StyleCachedImage(CSSValue& cssValue) 36 : m_cssValue( cssValue)34 : m_cssValue(&cssValue) 37 35 { 38 ASSERT(is<CSSImageValue>(m_cssValue) || is<CSSImageSetValue>(m_cssValue) || is<CSSCursorImageValue>(m_cssValue));39 40 36 m_isCachedImage = true; 41 37 } … … 43 39 StyleCachedImage::~StyleCachedImage() 44 40 { 41 if (m_image) 42 m_image->removeClient(this); 45 43 } 46 44 47 bool StyleCachedImage::operator==(const StyleImage& other) const 45 void StyleCachedImage::setCachedImage(CachedImage& image, float scaleFactor) 48 46 { 49 if (!is<StyleCachedImage>(other)) 50 return false; 51 auto& otherCached = downcast<StyleCachedImage>(other); 52 if (&otherCached == this) 53 return true; 54 if (m_cssValue.ptr() == otherCached.m_cssValue.ptr()) 55 return true; 56 if (m_cachedImage && m_cachedImage == otherCached.m_cachedImage) 57 return true; 58 return false; 59 } 60 61 CachedImage* StyleCachedImage::cachedImage() const 62 { 63 if (!m_cachedImage) { 64 if (is<CSSImageValue>(m_cssValue)) { 65 auto& imageValue = downcast<CSSImageValue>(m_cssValue.get()); 66 m_cachedImage = imageValue.cachedImage(); 67 } else if (is<CSSImageSetValue>(m_cssValue)) { 68 auto& imageSetValue = downcast<CSSImageSetValue>(m_cssValue.get()); 69 m_cachedImage = imageSetValue.cachedImage(); 70 m_scaleFactor = imageSetValue.bestFitScaleFactor(); 71 } else if (is<CSSCursorImageValue>(m_cssValue.get())) { 72 auto& cursorValue = downcast<CSSCursorImageValue>(m_cssValue.get()); 73 m_cachedImage = cursorValue.cachedImage(); 74 m_scaleFactor = cursorValue.scaleFactor(); 75 } 76 } 77 return m_cachedImage.get(); 47 ASSERT(!m_image); 48 m_image = ℑ 49 m_image->addClient(this); 50 m_scaleFactor = scaleFactor; 78 51 } 79 52 80 53 PassRefPtr<CSSValue> StyleCachedImage::cssValue() const 81 54 { 82 return const_cast<CSSValue*>(m_cssValue.ptr()); 55 if (m_cssValue) 56 return m_cssValue; 57 return CSSPrimitiveValue::create(m_image->url(), CSSPrimitiveValue::CSS_URI); 83 58 } 84 59 85 60 bool StyleCachedImage::canRender(const RenderObject* renderer, float multiplier) const 86 61 { 87 auto* image = cachedImage(); 88 if (!image) 62 if (!m_image) 89 63 return false; 90 return image->canRender(renderer, multiplier);64 return m_image->canRender(renderer, multiplier); 91 65 } 92 66 93 67 bool StyleCachedImage::isPending() const 94 68 { 95 return !m_ cachedImage;69 return !m_image; 96 70 } 97 71 98 72 bool StyleCachedImage::isLoaded() const 99 73 { 100 auto* image = cachedImage(); 101 if (!image) 74 if (!m_image) 102 75 return false; 103 return image->isLoaded();76 return m_image->isLoaded(); 104 77 } 105 78 106 79 bool StyleCachedImage::errorOccurred() const 107 80 { 108 auto* image = cachedImage(); 109 if (!image) 81 if (!m_image) 110 82 return false; 111 return image->errorOccurred();83 return m_image->errorOccurred(); 112 84 } 113 85 114 86 FloatSize StyleCachedImage::imageSize(const RenderElement* renderer, float multiplier) const 115 87 { 116 auto* image = cachedImage(); 117 if (!image) 88 if (!m_image) 118 89 return { }; 119 FloatSize size = image->imageSizeForRenderer(renderer, multiplier);90 FloatSize size = m_image->imageSizeForRenderer(renderer, multiplier); 120 91 size.scale(1 / m_scaleFactor); 121 92 return size; … … 124 95 bool StyleCachedImage::imageHasRelativeWidth() const 125 96 { 126 auto* image = cachedImage(); 127 if (!image) 97 if (!m_image) 128 98 return false; 129 return image->imageHasRelativeWidth();99 return m_image->imageHasRelativeWidth(); 130 100 } 131 101 132 102 bool StyleCachedImage::imageHasRelativeHeight() const 133 103 { 134 auto* image = cachedImage(); 135 if (!image) 104 if (!m_image) 136 105 return false; 137 return image->imageHasRelativeHeight();106 return m_image->imageHasRelativeHeight(); 138 107 } 139 108 140 109 void StyleCachedImage::computeIntrinsicDimensions(const RenderElement*, Length& intrinsicWidth, Length& intrinsicHeight, FloatSize& intrinsicRatio) 141 110 { 142 auto* image = cachedImage(); 143 if (!image) 111 if (!m_image) 144 112 return; 145 image->computeIntrinsicDimensions(intrinsicWidth, intrinsicHeight, intrinsicRatio);113 m_image->computeIntrinsicDimensions(intrinsicWidth, intrinsicHeight, intrinsicRatio); 146 114 } 147 115 148 116 bool StyleCachedImage::usesImageContainerSize() const 149 117 { 150 auto* image = cachedImage(); 151 if (!image) 118 if (!m_image) 152 119 return false; 153 return image->usesImageContainerSize();120 return m_image->usesImageContainerSize(); 154 121 } 155 122 156 123 void StyleCachedImage::setContainerSizeForRenderer(const RenderElement* renderer, const FloatSize& imageContainerSize, float imageContainerZoomFactor) 157 124 { 158 auto* image = cachedImage(); 159 if (!image) 125 if (!m_image) 160 126 return; 161 image->setContainerSizeForRenderer(renderer, LayoutSize(imageContainerSize), imageContainerZoomFactor);127 m_image->setContainerSizeForRenderer(renderer, LayoutSize(imageContainerSize), imageContainerZoomFactor); 162 128 } 163 129 164 130 void StyleCachedImage::addClient(RenderElement* renderer) 165 131 { 166 auto* image = cachedImage(); 167 if (!image) 132 if (!m_image) 168 133 return; 169 image->addClient(renderer);134 m_image->addClient(renderer); 170 135 } 171 136 172 137 void StyleCachedImage::removeClient(RenderElement* renderer) 173 138 { 174 auto* image = cachedImage(); 175 if (!image) 139 if (!m_image) 176 140 return; 177 image->removeClient(renderer);141 m_image->removeClient(renderer); 178 142 } 179 143 180 144 RefPtr<Image> StyleCachedImage::image(RenderElement* renderer, const FloatSize&) const 181 145 { 182 auto* image = cachedImage(); 183 if (!image) 146 if (!m_image) 184 147 return nullptr; 185 return image->imageForRenderer(renderer);148 return m_image->imageForRenderer(renderer); 186 149 } 187 150 … … 193 156 bool StyleCachedImage::knownToBeOpaque(const RenderElement* renderer) const 194 157 { 195 auto* image = cachedImage(); 196 if (!image) 158 if (!m_image) 197 159 return false; 198 return image->currentFrameKnownToBeOpaque(renderer);160 return m_image->currentFrameKnownToBeOpaque(renderer); 199 161 } 200 162 -
trunk/Source/WebCore/rendering/style/StyleCachedImage.h
r205344 r205346 33 33 class CSSValue; 34 34 class CachedImage; 35 class Document;36 35 37 class StyleCachedImage final : public StyleImage {36 class StyleCachedImage final : public StyleImage, private CachedImageClient { 38 37 WTF_MAKE_FAST_ALLOCATED; 39 38 public: … … 41 40 virtual ~StyleCachedImage(); 42 41 43 bool operator==(const StyleImage& other) const override;42 CachedImage* cachedImage() const override { return m_image.get(); } 44 43 45 CachedImage* cachedImage() const override; 44 void detachFromCSSValue() { m_cssValue = nullptr; } 45 void setCSSValue(CSSValue& value) { m_cssValue = &value; } 46 46 47 WrappedImagePtr data() const override { return m_cachedImage.get(); } 47 void setCachedImage(CachedImage&, float scaleFactor = 1); 48 49 WrappedImagePtr data() const override { return m_image.get(); } 48 50 49 51 PassRefPtr<CSSValue> cssValue() const override; … … 68 70 StyleCachedImage(CSSValue&); 69 71 70 Ref<CSSValue>m_cssValue;71 mutablefloat m_scaleFactor { 1 };72 mutable CachedResourceHandle<CachedImage> m_cachedImage;72 CSSValue* m_cssValue; 73 float m_scaleFactor { 1 }; 74 CachedResourceHandle<CachedImage> m_image; 73 75 }; 74 76 -
trunk/Source/WebCore/rendering/style/StyleGeneratedImage.h
r205344 r205346 42 42 43 43 private: 44 bool operator==(const StyleImage& other) const override { return data() == other.data(); }45 46 44 WrappedImagePtr data() const override { return m_imageGeneratorValue.ptr(); } 47 45 -
trunk/Source/WebCore/rendering/style/StyleImage.h
r205344 r205346 46 46 virtual ~StyleImage() { } 47 47 48 virtual bool operator==(const StyleImage& other) const = 0; 48 bool operator==(const StyleImage& other) const 49 { 50 return &other == this || (data() && data() == other.data()); 51 } 49 52 50 53 virtual PassRefPtr<CSSValue> cssValue() const = 0;
Note: See TracChangeset
for help on using the changeset viewer.