Changeset 254861 in webkit for trunk/Source/WebCore/css/CSSImageSetValue.cpp
- Timestamp:
- Jan 21, 2020, 10:28:17 AM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/css/CSSImageSetValue.cpp
r238698 r254861 29 29 #include "CSSImageValue.h" 30 30 #include "CSSPrimitiveValue.h" 31 #include "CachedImage.h"32 #include "CachedResourceLoader.h"33 #include "CachedResourceRequest.h"34 #include "CachedResourceRequestInitiators.h"35 31 #include "Document.h" 36 32 #include "Page.h" 33 #include "StyleBuilderState.h" 37 34 #include <wtf/text/StringBuilder.h> 38 35 39 36 namespace WebCore { 40 37 41 CSSImageSetValue::CSSImageSetValue(LoadedFromOpaqueSource loadedFromOpaqueSource) 38 Ref<CSSImageSetValue> CSSImageSetValue::create() 39 { 40 return adoptRef(*new CSSImageSetValue); 41 } 42 43 CSSImageSetValue::CSSImageSetValue() 42 44 : CSSValueList(ImageSetClass, CommaSeparator) 43 , m_loadedFromOpaqueSource(loadedFromOpaqueSource)44 45 { 45 46 } … … 53 54 while (i < length) { 54 55 CSSValue* imageValue = item(i); 55 URL imageURL = downcast<CSSImageValue>(*imageValue).url(); 56 56 ASSERT(is<CSSImageValue>(imageValue) || is<CSSImageGeneratorValue>(imageValue)); 57 57 ++i; 58 58 ASSERT_WITH_SECURITY_IMPLICATION(i < length); … … 61 61 62 62 ImageWithScale image; 63 image. imageURL = imageURL;63 image.value = imageValue; 64 64 image.scaleFactor = scaleFactor; 65 65 m_imagesInSet.append(image); … … 71 71 } 72 72 73 CSSImageSetValue::ImageWithScale CSSImageSetValue::bestImageForScaleFactor()73 ImageWithScale CSSImageSetValue::bestImageForScaleFactor() 74 74 { 75 75 if (!m_imagesInSet.size()) … … 86 86 } 87 87 88 std::pair<CachedImage*, float> CSSImageSetValue::loadBestFitImage(CachedResourceLoader& loader, const ResourceLoaderOptions& options) 88 CachedImage* CSSImageSetValue::cachedImage() const 89 89 { 90 Document* document = loader.document(); 91 ASSERT(document); 90 if (is<CSSImageValue>(m_selectedImageValue)) 91 return downcast<CSSImageValue>(*m_selectedImageValue).cachedImage(); 92 return nullptr; 93 } 92 94 93 updateDeviceScaleFactor(*document); 95 ImageWithScale CSSImageSetValue::selectBestFitImage(const Document& document) 96 { 97 updateDeviceScaleFactor(document); 94 98 95 99 if (!m_accessedBestFitImage) { 96 100 m_accessedBestFitImage = true; 101 m_bestFitImage = bestImageForScaleFactor(); 102 } 97 103 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 103 ResourceLoaderOptions loadOptions = options; 104 loadOptions.loadedFromOpaqueSource = m_loadedFromOpaqueSource; 105 CachedResourceRequest request(ResourceRequest(document->completeURL(image.imageURL)), loadOptions); 106 request.setInitiator(cachedResourceRequestInitiators().css); 107 if (options.mode == FetchOptions::Mode::Cors) 108 request.updateForAccessControl(*document); 109 110 m_cachedImage = loader.requestImage(WTFMove(request)).value_or(nullptr); 111 m_bestFitImageScaleFactor = image.scaleFactor; 112 } 113 return { m_cachedImage.get(), m_bestFitImageScaleFactor }; 104 return m_bestFitImage; 114 105 } 115 106 116 107 void CSSImageSetValue::updateDeviceScaleFactor(const Document& document) 117 108 { 109 110 // FIXME: In the future, we want to take much more than deviceScaleFactor into acount here. 111 // All forms of scale should be included: Page::pageScaleFactor(), Frame::pageZoomFactor(), 112 // and any CSS transforms. https://bugs.webkit.org/show_bug.cgi?id=81698 118 113 float deviceScaleFactor = document.page() ? document.page()->deviceScaleFactor() : 1; 119 114 if (deviceScaleFactor == m_deviceScaleFactor) … … 121 116 m_deviceScaleFactor = deviceScaleFactor; 122 117 m_accessedBestFitImage = false; 123 m_cachedImage = nullptr; 118 m_selectedImageValue = nullptr; 119 } 120 121 Ref<CSSImageSetValue> CSSImageSetValue::imageSetWithStylesResolved(Style::BuilderState& builderState) 122 { 123 Ref<CSSImageSetValue> result = CSSImageSetValue::create(); 124 size_t length = this->length(); 125 for (size_t i = 0; i + 1 < length; i += 2) { 126 result->append(builderState.resolveImageStyles(*itemWithoutBoundsCheck(i))); 127 result->append(*itemWithoutBoundsCheck(i + 1)); 128 } 129 130 return result; 124 131 } 125 132 … … 156 163 bool CSSImageSetValue::traverseSubresources(const WTF::Function<bool (const CachedResource&)>& handler) const 157 164 { 158 if (!m_cachedImage) 159 return false; 160 return handler(*m_cachedImage); 165 return m_selectedImageValue && m_selectedImageValue->traverseSubresources(handler); 161 166 } 162 167
Note:
See TracChangeset
for help on using the changeset viewer.