Changeset 205419 in webkit for trunk/Source/WebCore/css/CSSImageSetValue.cpp
- Timestamp:
- Sep 4, 2016, 6:42:42 AM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/css/CSSImageSetValue.cpp
r205346 r205419 36 36 #include "Document.h" 37 37 #include "Page.h" 38 #include "StyleCachedImage.h"39 38 #include <wtf/text/StringBuilder.h> 40 39 … … 43 42 CSSImageSetValue::CSSImageSetValue() 44 43 : CSSValueList(ImageSetClass, CommaSeparator) 45 , m_accessedBestFitImage(false)46 , m_scaleFactor(1)47 44 { 48 45 } … … 50 47 CSSImageSetValue::~CSSImageSetValue() 51 48 { 52 if (m_image)53 m_image->detachFromCSSValue();54 49 } 55 50 … … 80 75 CSSImageSetValue::ImageWithScale CSSImageSetValue::bestImageForScaleFactor() 81 76 { 77 if (!m_imagesInSet.size()) 78 fillImageSet(); 79 82 80 ImageWithScale image; 83 81 size_t numberOfImages = m_imagesInSet.size(); 84 82 for (size_t i = 0; i < numberOfImages; ++i) { 85 83 image = m_imagesInSet.at(i); 86 if (image.scaleFactor >= m_ scaleFactor)84 if (image.scaleFactor >= m_deviceScaleFactor) 87 85 return image; 88 86 } … … 90 88 } 91 89 92 voidCSSImageSetValue::loadBestFitImage(CachedResourceLoader& loader, const ResourceLoaderOptions& options)90 std::pair<CachedImage*, float> CSSImageSetValue::loadBestFitImage(CachedResourceLoader& loader, const ResourceLoaderOptions& options) 93 91 { 94 92 Document* document = loader.document(); 95 if (Page* page = document->page())96 m_scaleFactor = page->deviceScaleFactor();97 else98 m_ scaleFactor = 1;93 updateDeviceScaleFactor(*document); 94 95 if (!m_accessedBestFitImage) { 96 m_accessedBestFitImage = true; 99 97 100 if (!m_imagesInSet.size()) 101 fillImageSet(); 102 103 if (m_accessedBestFitImage) 104 return; 105 // FIXME: In the future, we want to take much more than deviceScaleFactor into acount here. 106 // All forms of scale should be included: Page::pageScaleFactor(), Frame::pageZoomFactor(), 107 // and any CSS transforms. https://bugs.webkit.org/show_bug.cgi?id=81698 108 ImageWithScale image = bestImageForScaleFactor(); 109 CachedResourceRequest request(ResourceRequest(document->completeURL(image.imageURL)), options); 110 request.setInitiator(cachedResourceRequestInitiators().css); 111 if (options.mode == FetchOptions::Mode::Cors) { 112 ASSERT(document->securityOrigin()); 113 updateRequestForAccessControl(request.mutableResourceRequest(), *document->securityOrigin(), options.allowCredentials); 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 CachedResourceRequest request(ResourceRequest(document->completeURL(image.imageURL)), options); 103 request.setInitiator(cachedResourceRequestInitiators().css); 104 if (options.mode == FetchOptions::Mode::Cors) { 105 ASSERT(document->securityOrigin()); 106 updateRequestForAccessControl(request.mutableResourceRequest(), *document->securityOrigin(), options.allowCredentials); 107 } 108 m_cachedImage = loader.requestImage(request); 109 m_bestFitImageScaleFactor = image.scaleFactor; 114 110 } 115 if (CachedResourceHandle<CachedImage> cachedImage = loader.requestImage(request)) { 116 styleImage(*document).setCachedImage(*cachedImage, image.scaleFactor); 117 m_accessedBestFitImage = true; 118 } 111 return { m_cachedImage.get(), m_bestFitImageScaleFactor }; 119 112 } 120 113 121 StyleCachedImage& CSSImageSetValue::styleImage(const Document& document)114 void CSSImageSetValue::updateDeviceScaleFactor(const Document& document) 122 115 { 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; 116 float deviceScaleFactor = document.page() ? document.page()->deviceScaleFactor() : 1; 117 if (deviceScaleFactor == m_deviceScaleFactor) 118 return; 119 m_deviceScaleFactor = deviceScaleFactor; 120 m_accessedBestFitImage = false; 121 m_cachedImage = nullptr; 139 122 } 140 123 … … 171 154 bool CSSImageSetValue::traverseSubresources(const std::function<bool (const CachedResource&)>& handler) const 172 155 { 173 if (!m_ image)156 if (!m_cachedImage) 174 157 return false; 175 CachedImage* cachedResource = m_image->cachedImage(); 176 if (!cachedResource) 177 return false; 178 return handler(*cachedResource); 158 return handler(*m_cachedImage); 179 159 } 180 160 181 161 CSSImageSetValue::CSSImageSetValue(const CSSImageSetValue& cloneFrom) 182 162 : CSSValueList(cloneFrom) 183 , m_accessedBestFitImage(false)184 , m_scaleFactor(1)185 163 { 186 164 // Non-CSSValueList data is not accessible through CSS OM, no need to clone.
Note:
See TracChangeset
for help on using the changeset viewer.