Changeset 185395 in webkit
- Timestamp:
- Jun 9, 2015 5:45:58 PM (9 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r185393 r185395 1 2015-06-09 Said Abou-Hallawa <sabouhallawa@apple.com> 2 3 SVG Fragment is not rendered if it is the css background image of an HTML element 4 https://bugs.webkit.org/show_bug.cgi?id=91790 5 6 Reviewed by Darin Adler. 7 8 * svg/css/svg-resource-fragment-identifier-background-expected.html: Added. 9 * svg/css/svg-resource-fragment-identifier-background.html: Added. 10 Ensure that the SVG fragment is displayed correctly when it's used as a 11 css background image. 12 1 13 2015-06-09 Darin Adler <darin@apple.com> 2 14 -
trunk/Source/WebCore/ChangeLog
r185394 r185395 1 2015-06-09 Said Abou-Hallawa <sabouhallawa@apple.com> 2 3 SVG Fragment is not rendered if it is the css background image of an HTML element 4 https://bugs.webkit.org/show_bug.cgi?id=91790 5 6 Reviewed by Darin Adler. 7 8 To show an SVG fragment, the SVGImage has to scrollToFragment() using 9 the resource url. The changes http://trac.webkit.org/changeset/164804 10 and http://trac.webkit.org/changeset/164983 set the url of SVGImage to 11 to be used later in SVGImage::draw(). The problem is the SVGImage url 12 is only set when it is the src of an <img> tag. We did not do the same 13 thing when the SVGImage is the css background image of an HTML element. 14 15 The fix is to set the url of the SVGImage always when it's created by 16 the CachedImage. The CachedImage must have a valid url when the SVGImage 17 is created. 18 19 Test: svg/css/svg-resource-fragment-identifier-background.html 20 21 * loader/cache/CachedImage.cpp: 22 (WebCore::CachedImage::load): 23 (WebCore::CachedImage::checkShouldPaintBrokenImage): 24 Replace the calls resourceRequest().url() and m_resourceRequest.url() by 25 calling url() since they are all the same. 26 27 (WebCore::CachedImage::createImage): Pass the resource url to SVGImage 28 and change ImageObserver& by ImageObserver*, since null is not legal. 29 30 * svg/graphics/SVGImage.cpp: 31 (WebCore::SVGImage::SVGImage): 32 * svg/graphics/SVGImage.h: Add a url parameter to SVGImage constructor. 33 34 * svg/graphics/SVGImageCache.cpp: 35 (WebCore::SVGImageCache::findImageForRenderer): Add a new helper function. 36 37 (WebCore::SVGImageCache::imageSizeForRenderer): 38 (WebCore::SVGImageCache::imageForRenderer): Code clean up. 39 40 * svg/graphics/SVGImageCache.h: Make imageForRenderer() const. 41 42 * svg/graphics/SVGImageForContainer.cpp: Remove unneeded header file. 43 1 44 2015-06-09 Matt Rajca <mrajca@apple.com> 2 45 -
trunk/Source/WebCore/loader/cache/CachedImage.cpp
r184434 r185395 110 110 void CachedImage::load(CachedResourceLoader& cachedResourceLoader, const ResourceLoaderOptions& options) 111 111 { 112 if (cachedResourceLoader.shouldPerformImageLoad( resourceRequest().url()))112 if (cachedResourceLoader.shouldPerformImageLoad(url())) 113 113 CachedResource::load(cachedResourceLoader, options); 114 114 else … … 321 321 return; 322 322 323 m_shouldPaintBrokenImage = m_loader->frameLoader()->client().shouldPaintBrokenImage( m_resourceRequest.url());323 m_shouldPaintBrokenImage = m_loader->frameLoader()->client().shouldPaintBrokenImage(url()); 324 324 } 325 325 … … 343 343 #endif 344 344 else if (m_response.mimeType() == "image/svg+xml") { 345 RefPtr<SVGImage> svgImage = SVGImage::create( this);345 RefPtr<SVGImage> svgImage = SVGImage::create(*this, url()); 346 346 m_svgImageCache = std::make_unique<SVGImageCache>(svgImage.get()); 347 347 m_image = svgImage.release(); -
trunk/Source/WebCore/svg/graphics/SVGImage.cpp
r184874 r185395 49 49 namespace WebCore { 50 50 51 SVGImage::SVGImage(ImageObserver* observer) 52 : Image(observer) 51 SVGImage::SVGImage(ImageObserver& observer, const URL& url) 52 : Image(&observer) 53 , m_url(url) 53 54 { 54 55 } -
trunk/Source/WebCore/svg/graphics/SVGImage.h
r183536 r185395 46 46 class SVGImage final : public Image { 47 47 public: 48 static Ref<SVGImage> create(ImageObserver * observer)48 static Ref<SVGImage> create(ImageObserver& observer, const URL& url) 49 49 { 50 return adoptRef(*new SVGImage(observer ));50 return adoptRef(*new SVGImage(observer, url)); 51 51 } 52 52 … … 94 94 virtual bool currentFrameKnownToBeOpaque() override { return false; } 95 95 96 SVGImage(ImageObserver *);96 SVGImage(ImageObserver&, const URL&); 97 97 virtual void draw(GraphicsContext*, const FloatRect& fromRect, const FloatRect& toRect, ColorSpace styleColorSpace, CompositeOperator, BlendMode, ImageOrientationDescription) override; 98 98 void drawForContainer(GraphicsContext*, const FloatSize, float, const FloatRect&, const FloatRect&, ColorSpace, CompositeOperator, BlendMode); -
trunk/Source/WebCore/svg/graphics/SVGImageCache.cpp
r174225 r185395 24 24 #include "FrameView.h" 25 25 #include "GraphicsContext.h" 26 #include "HTMLImageElement.h"27 26 #include "ImageBuffer.h" 28 27 #include "LayoutSize.h" … … 64 63 } 65 64 65 Image* SVGImageCache::findImageForRenderer(const RenderObject* renderer) const 66 { 67 return renderer ? m_imageForContainerMap.get(renderer) : nullptr; 68 } 69 66 70 FloatSize SVGImageCache::imageSizeForRenderer(const RenderObject* renderer) const 67 71 { 68 FloatSize imageSize = m_svgImage->size(); 69 if (!renderer) 70 return imageSize; 71 72 ImageForContainerMap::const_iterator it = m_imageForContainerMap.find(renderer); 73 if (it == m_imageForContainerMap.end()) 74 return imageSize; 75 76 RefPtr<SVGImageForContainer> imageForContainer = it->value; 77 ASSERT(!imageForContainer->size().isEmpty()); 78 return imageForContainer->size(); 72 auto* image = findImageForRenderer(renderer); 73 return image ? image->size() : m_svgImage->size(); 79 74 } 80 75 81 76 // FIXME: This doesn't take into account the animation timeline so animations will not 82 77 // restart on page load, nor will two animations in different pages have different timelines. 83 Image* SVGImageCache::imageForRenderer(const RenderObject* renderer) 78 Image* SVGImageCache::imageForRenderer(const RenderObject* renderer) const 84 79 { 85 if (!renderer) 80 auto* image = findImageForRenderer(renderer); 81 if (!image) 86 82 return Image::nullImage(); 87 88 ImageForContainerMap::iterator it = m_imageForContainerMap.find(renderer); 89 if (it == m_imageForContainerMap.end()) 90 return Image::nullImage(); 91 92 RefPtr<SVGImageForContainer> imageForContainer = it->value; 93 94 Node* node = renderer->node(); 95 if (is<HTMLImageElement>(node)) { 96 const AtomicString& urlString = downcast<HTMLImageElement>(*node).imageSourceURL(); 97 URL url = node->document().completeURL(urlString); 98 imageForContainer->setURL(url); 99 } 100 101 ASSERT(!imageForContainer->size().isEmpty()); 102 return imageForContainer.get(); 83 ASSERT(!image->size().isEmpty()); 84 return image; 103 85 } 104 86 -
trunk/Source/WebCore/svg/graphics/SVGImageCache.h
r166642 r185395 48 48 FloatSize imageSizeForRenderer(const RenderObject*) const; 49 49 50 Image* imageForRenderer(const RenderObject*) ;50 Image* imageForRenderer(const RenderObject*) const; 51 51 52 52 private: 53 Image* findImageForRenderer(const RenderObject*) const; 54 53 55 typedef HashMap<const CachedImageClient*, RefPtr<SVGImageForContainer>> ImageForContainerMap; 54 56 -
trunk/Source/WebCore/svg/graphics/SVGImageForContainer.cpp
r166582 r185395 24 24 #include "FloatRect.h" 25 25 #include "FloatSize.h" 26 #include "FrameView.h"27 26 #include "Image.h" 28 27
Note: See TracChangeset
for help on using the changeset viewer.