summaryrefslogtreecommitdiff
path: root/Source/WebCore/css/CSSImageSetValue.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/css/CSSImageSetValue.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebCore/css/CSSImageSetValue.cpp')
-rw-r--r--Source/WebCore/css/CSSImageSetValue.cpp113
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)