diff options
Diffstat (limited to 'Source/WebCore/css/CSSImageSetValue.cpp')
-rw-r--r-- | Source/WebCore/css/CSSImageSetValue.cpp | 113 |
1 files changed, 30 insertions, 83 deletions
diff --git a/Source/WebCore/css/CSSImageSetValue.cpp b/Source/WebCore/css/CSSImageSetValue.cpp index b031cc2ee..db7c3d726 100644 --- a/Source/WebCore/css/CSSImageSetValue.cpp +++ b/Source/WebCore/css/CSSImageSetValue.cpp @@ -26,8 +26,6 @@ #include "config.h" #include "CSSImageSetValue.h" -#if ENABLE(CSS_IMAGE_SET) - #include "CSSImageValue.h" #include "CSSPrimitiveValue.h" #include "CachedImage.h" @@ -37,31 +35,17 @@ #include "CrossOriginAccessControl.h" #include "Document.h" #include "Page.h" -#include "StyleCachedImageSet.h" -#include "StylePendingImage.h" #include <wtf/text/StringBuilder.h> namespace WebCore { CSSImageSetValue::CSSImageSetValue() : CSSValueList(ImageSetClass, CommaSeparator) - , m_accessedBestFitImage(false) - , m_scaleFactor(1) -{ -} - -inline void CSSImageSetValue::detachPendingImage() { - if (m_imageSet && m_imageSet->isPendingImage()) - static_cast<StylePendingImage&>(*m_imageSet).detachFromCSSValue(); } CSSImageSetValue::~CSSImageSetValue() { - detachPendingImage(); - - if (m_imageSet && m_imageSet->isCachedImageSet()) - static_cast<StyleCachedImageSet*>(m_imageSet.get())->clearImageSetValue(); } void CSSImageSetValue::fillImageSet() @@ -70,13 +54,12 @@ void CSSImageSetValue::fillImageSet() size_t i = 0; while (i < length) { CSSValue* imageValue = item(i); - String imageURL = toCSSImageValue(imageValue)->url(); + String imageURL = downcast<CSSImageValue>(*imageValue).url(); ++i; ASSERT_WITH_SECURITY_IMPLICATION(i < length); CSSValue* scaleFactorValue = item(i); - ASSERT_WITH_SECURITY_IMPLICATION(scaleFactorValue->isPrimitiveValue()); - float scaleFactor = toCSSPrimitiveValue(scaleFactorValue)->getFloatValue(); + float scaleFactor = downcast<CSSPrimitiveValue>(*scaleFactorValue).floatValue(); ImageWithScale image; image.imageURL = imageURL; @@ -91,76 +74,58 @@ void CSSImageSetValue::fillImageSet() CSSImageSetValue::ImageWithScale CSSImageSetValue::bestImageForScaleFactor() { + if (!m_imagesInSet.size()) + fillImageSet(); + ImageWithScale image; size_t numberOfImages = m_imagesInSet.size(); for (size_t i = 0; i < numberOfImages; ++i) { image = m_imagesInSet.at(i); - if (image.scaleFactor >= m_scaleFactor) + if (image.scaleFactor >= m_deviceScaleFactor) return image; } return image; } -StyleCachedImageSet* CSSImageSetValue::cachedImageSet(CachedResourceLoader* loader, const ResourceLoaderOptions& options) +std::pair<CachedImage*, float> CSSImageSetValue::loadBestFitImage(CachedResourceLoader& loader, const ResourceLoaderOptions& options) { - ASSERT(loader); - - Document* document = loader->document(); - if (Page* page = document->page()) - m_scaleFactor = page->deviceScaleFactor(); - else - m_scaleFactor = 1; + Document* document = loader.document(); + ASSERT(document); - if (!m_imagesInSet.size()) - fillImageSet(); + updateDeviceScaleFactor(*document); if (!m_accessedBestFitImage) { - // FIXME: In the future, we want to take much more than deviceScaleFactor into acount here. + m_accessedBestFitImage = true; + + // FIXME: In the future, we want to take much more than deviceScaleFactor into acount here. // All forms of scale should be included: Page::pageScaleFactor(), Frame::pageZoomFactor(), // and any CSS transforms. https://bugs.webkit.org/show_bug.cgi?id=81698 ImageWithScale image = bestImageForScaleFactor(); CachedResourceRequest request(ResourceRequest(document->completeURL(image.imageURL)), options); request.setInitiator(cachedResourceRequestInitiators().css); - if (options.requestOriginPolicy == PotentiallyCrossOriginEnabled) - updateRequestForAccessControl(request.mutableResourceRequest(), document->securityOrigin(), options.allowCredentials); - if (CachedResourceHandle<CachedImage> cachedImage = loader->requestImage(request)) { - detachPendingImage(); - m_imageSet = StyleCachedImageSet::create(cachedImage.get(), image.scaleFactor, this); - m_accessedBestFitImage = true; - } - } + if (options.mode == FetchOptions::Mode::Cors) + request.updateForAccessControl(*document); - return (m_imageSet && m_imageSet->isCachedImageSet()) ? static_cast<StyleCachedImageSet*>(m_imageSet.get()) : 0; + m_cachedImage = loader.requestImage(WTFMove(request)); + m_bestFitImageScaleFactor = image.scaleFactor; + } + return { m_cachedImage.get(), m_bestFitImageScaleFactor }; } -StyleCachedImageSet* CSSImageSetValue::cachedImageSet(CachedResourceLoader* loader) +void CSSImageSetValue::updateDeviceScaleFactor(const Document& document) { - return cachedImageSet(loader, CachedResourceLoader::defaultCachedResourceOptions()); -} - -StyleImage* CSSImageSetValue::cachedOrPendingImageSet(Document& document) -{ - if (!m_imageSet) - m_imageSet = StylePendingImage::create(this); - else if (!m_imageSet->isPendingImage()) { - float deviceScaleFactor = 1; - if (Page* page = document.page()) - deviceScaleFactor = page->deviceScaleFactor(); - - // If the deviceScaleFactor has changed, we may not have the best image loaded, so we have to re-assess. - if (deviceScaleFactor != m_scaleFactor) { - m_accessedBestFitImage = false; - m_imageSet = StylePendingImage::create(this); - } - } - - return m_imageSet.get(); + float deviceScaleFactor = document.page() ? document.page()->deviceScaleFactor() : 1; + if (deviceScaleFactor == m_deviceScaleFactor) + return; + m_deviceScaleFactor = deviceScaleFactor; + m_accessedBestFitImage = false; + m_cachedImage = nullptr; } String CSSImageSetValue::customCSSText() const { StringBuilder result; - result.appendLiteral("-webkit-image-set("); + result.appendLiteral("image-set("); size_t length = this->length(); size_t i = 0; @@ -187,29 +152,11 @@ String CSSImageSetValue::customCSSText() const return result.toString(); } -bool CSSImageSetValue::hasFailedOrCanceledSubresources() const +bool CSSImageSetValue::traverseSubresources(const std::function<bool (const CachedResource&)>& handler) const { - if (!m_imageSet || !m_imageSet->isCachedImageSet()) + if (!m_cachedImage) return false; - CachedResource* cachedResource = static_cast<StyleCachedImageSet*>(m_imageSet.get())->cachedImage(); - if (!cachedResource) - return true; - return cachedResource->loadFailedOrCanceled(); -} - -CSSImageSetValue::CSSImageSetValue(const CSSImageSetValue& cloneFrom) - : CSSValueList(cloneFrom) - , m_accessedBestFitImage(false) - , m_scaleFactor(1) -{ - // Non-CSSValueList data is not accessible through CSS OM, no need to clone. -} - -PassRefPtr<CSSImageSetValue> CSSImageSetValue::cloneForCSSOM() const -{ - return adoptRef(new CSSImageSetValue(*this)); + return handler(*m_cachedImage); } } // namespace WebCore - -#endif // ENABLE(CSS_IMAGE_SET) |