StyleFetchedImageSet* CSSImageSetValue::cachedImageSet(ResourceFetcher* loader, float deviceScaleFactor, const ResourceLoaderOptions& options) { ASSERT(loader); m_scaleFactor = deviceScaleFactor; if (!m_imagesInSet.size()) fillImageSet(); if (!m_accessedBestFitImage) { // FIXME: In the future, we want to take much more than deviceScaleFactor into acount here. // All forms of scale should be included: Page::pageScaleFactor(), LocalFrame::pageZoomFactor(), // and any CSS transforms. https://bugs.webkit.org/show_bug.cgi?id=81698 ImageWithScale image = bestImageForScaleFactor(); if (Document* document = loader->document()) { FetchRequest request(ResourceRequest(document->completeURL(image.imageURL)), FetchInitiatorTypeNames::css, options); if (options.corsEnabled == IsCORSEnabled) request.setCrossOriginAccessControl(loader->document()->securityOrigin(), options.allowCredentials); if (ResourcePtr<ImageResource> cachedImage = loader->fetchImage(request)) { m_imageSet = StyleFetchedImageSet::create(cachedImage.get(), image.scaleFactor, this); m_accessedBestFitImage = true; } } } return (m_imageSet && m_imageSet->isImageResourceSet()) ? toStyleFetchedImageSet(m_imageSet) : 0; }
StyleCachedImageSet* CSSImageSetValue::cachedImageSet(CachedResourceLoader* loader) { ASSERT(loader); Document* document = loader->document(); if (Page* page = document->page()) m_scaleFactor = page->deviceScaleFactor(); else m_scaleFactor = 1; if (!m_imagesInSet.size()) fillImageSet(); if (!m_accessedBestFitImage) { // 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(); ResourceRequest request(loader->document()->completeURL(image.imageURL)); if (CachedResourceHandle<CachedImage> cachedImage = loader->requestImage(request)) { m_imageSet = StyleCachedImageSet::create(cachedImage.get(), image.scaleFactor, this); m_accessedBestFitImage = true; } } return (m_imageSet && m_imageSet->isCachedImageSet()) ? static_cast<StyleCachedImageSet*>(m_imageSet.get()) : 0; }
StyleCachedImageSet* CSSImageSetValue::cachedImageSet(CachedResourceLoader* loader, const ResourceLoaderOptions& options) { ASSERT(loader); Document* document = loader->document(); if (Page* page = document->page()) m_scaleFactor = page->deviceScaleFactor(); else m_scaleFactor = 1; if (!m_imagesInSet.size()) fillImageSet(); if (!m_accessedBestFitImage) { // 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; } } return (m_imageSet && m_imageSet->isCachedImageSet()) ? toStyleCachedImageSet(m_imageSet.get()) : nullptr; }
StyleCachedImage* CSSImageSetValue::bestFitImage(CachedResourceLoader& loader, const ResourceLoaderOptions& options) { Document* document = loader.document(); if (Page* page = document->page()) m_scaleFactor = page->deviceScaleFactor(); else m_scaleFactor = 1; if (!m_imagesInSet.size()) fillImageSet(); if (!m_accessedBestFitImage) { // 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.mode == FetchOptions::Mode::Cors) { ASSERT(document->securityOrigin()); updateRequestForAccessControl(request.mutableResourceRequest(), *document->securityOrigin(), options.allowCredentials); } if (CachedResourceHandle<CachedImage> cachedImage = loader.requestImage(request)) { detachPendingImage(); m_image = StyleCachedImage::createForImageSet(cachedImage.get(), image.scaleFactor, *this); m_accessedBestFitImage = true; } } return is<StyleCachedImage>(m_image.get()) ? downcast<StyleCachedImage>(m_image.get()) : nullptr; }
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_deviceScaleFactor) return image; } return image; }