Title: [185395] trunk
Revision
185395
Author
[email protected]
Date
2015-06-09 17:45:58 -0700 (Tue, 09 Jun 2015)

Log Message

SVG Fragment is not rendered if it is the css background image of an HTML element
https://bugs.webkit.org/show_bug.cgi?id=91790

Patch by Said Abou-Hallawa <[email protected]> on 2015-06-09
Reviewed by Darin Adler.

Source/WebCore:

To show an SVG fragment, the SVGImage has to scrollToFragment() using
the resource url. The changes http://trac.webkit.org/changeset/164804
and http://trac.webkit.org/changeset/164983 set the url of SVGImage to
to be used later in SVGImage::draw(). The problem is the SVGImage url
is only set when it is the src of an <img> tag. We did not do the same
thing when the SVGImage is the css background image of an HTML element.

The fix is to set the url of the SVGImage always when it's created by
the CachedImage. The CachedImage must have a valid url when the SVGImage
is created.

Test: svg/css/svg-resource-fragment-identifier-background.html

* loader/cache/CachedImage.cpp:
(WebCore::CachedImage::load):
(WebCore::CachedImage::checkShouldPaintBrokenImage):
Replace the calls resourceRequest().url() and m_resourceRequest.url() by
calling url() since they are all the same.

(WebCore::CachedImage::createImage): Pass the resource url to SVGImage
and change ImageObserver& by ImageObserver*, since null is not legal.

* svg/graphics/SVGImage.cpp:
(WebCore::SVGImage::SVGImage):
* svg/graphics/SVGImage.h: Add a url parameter to SVGImage constructor.

* svg/graphics/SVGImageCache.cpp:
(WebCore::SVGImageCache::findImageForRenderer): Add a new helper function.

(WebCore::SVGImageCache::imageSizeForRenderer):
(WebCore::SVGImageCache::imageForRenderer): Code clean up.

* svg/graphics/SVGImageCache.h: Make imageForRenderer() const.

* svg/graphics/SVGImageForContainer.cpp: Remove unneeded header file.

LayoutTests:

* svg/css/svg-resource-fragment-identifier-background-expected.html: Added.
* svg/css/svg-resource-fragment-identifier-background.html: Added.
Ensure that the SVG fragment is displayed correctly when it's used as a
css background image.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (185394 => 185395)


--- trunk/LayoutTests/ChangeLog	2015-06-10 00:43:05 UTC (rev 185394)
+++ trunk/LayoutTests/ChangeLog	2015-06-10 00:45:58 UTC (rev 185395)
@@ -1,3 +1,15 @@
+2015-06-09  Said Abou-Hallawa  <[email protected]>
+
+        SVG Fragment is not rendered if it is the css background image of an HTML element
+        https://bugs.webkit.org/show_bug.cgi?id=91790
+
+        Reviewed by Darin Adler.
+
+        * svg/css/svg-resource-fragment-identifier-background-expected.html: Added.
+        * svg/css/svg-resource-fragment-identifier-background.html: Added.
+        Ensure that the SVG fragment is displayed correctly when it's used as a
+        css background image.
+
 2015-06-09  Darin Adler  <[email protected]>
 
         Takes two delete key presses to delete pasted emoji up-pointing index finger with skin tone

Added: trunk/LayoutTests/svg/css/svg-resource-fragment-identifier-background-expected.html (0 => 185395)


--- trunk/LayoutTests/svg/css/svg-resource-fragment-identifier-background-expected.html	                        (rev 0)
+++ trunk/LayoutTests/svg/css/svg-resource-fragment-identifier-background-expected.html	2015-06-10 00:45:58 UTC (rev 185395)
@@ -0,0 +1,17 @@
+<html>
+<head>
+<style>
+  div {
+    width: 100px;
+    height: 100px;
+    margin: 10px;
+    display: inline-block;
+  }
+</style>
+</head>
+<body>
+  <div style="background-color: red"></div>
+  <div style="background-color: green"></div>
+  <div style="background-color: blue"></div>
+</body>
+</html>

Added: trunk/LayoutTests/svg/css/svg-resource-fragment-identifier-background.html (0 => 185395)


--- trunk/LayoutTests/svg/css/svg-resource-fragment-identifier-background.html	                        (rev 0)
+++ trunk/LayoutTests/svg/css/svg-resource-fragment-identifier-background.html	2015-06-10 00:45:58 UTC (rev 185395)
@@ -0,0 +1,19 @@
+<html>
+<head>
+<style>
+  button {
+    width:  100px;
+    height: 100px;
+    border: 0;
+    margin: 10px;
+  }
+  button.icon-red { background: url('resources/fragment-identifiers.svg#red'); }
+  button.icon-green { background: url('resources/fragment-identifiers.svg#green'); }
+  button.icon-blue { background: url('resources/fragment-identifiers.svg#blue'); }
+</style>
+<body>
+  <button class="icon-red"></button>
+  <button class="icon-green"></button>
+  <button class="icon-blue"></button>
+</body>
+</html>
\ No newline at end of file

Modified: trunk/Source/WebCore/ChangeLog (185394 => 185395)


--- trunk/Source/WebCore/ChangeLog	2015-06-10 00:43:05 UTC (rev 185394)
+++ trunk/Source/WebCore/ChangeLog	2015-06-10 00:45:58 UTC (rev 185395)
@@ -1,3 +1,46 @@
+2015-06-09  Said Abou-Hallawa  <[email protected]>
+
+        SVG Fragment is not rendered if it is the css background image of an HTML element
+        https://bugs.webkit.org/show_bug.cgi?id=91790
+
+        Reviewed by Darin Adler.
+
+        To show an SVG fragment, the SVGImage has to scrollToFragment() using
+        the resource url. The changes http://trac.webkit.org/changeset/164804
+        and http://trac.webkit.org/changeset/164983 set the url of SVGImage to
+        to be used later in SVGImage::draw(). The problem is the SVGImage url
+        is only set when it is the src of an <img> tag. We did not do the same
+        thing when the SVGImage is the css background image of an HTML element.
+        
+        The fix is to set the url of the SVGImage always when it's created by 
+        the CachedImage. The CachedImage must have a valid url when the SVGImage
+        is created.
+
+        Test: svg/css/svg-resource-fragment-identifier-background.html
+
+        * loader/cache/CachedImage.cpp:
+        (WebCore::CachedImage::load):
+        (WebCore::CachedImage::checkShouldPaintBrokenImage):
+        Replace the calls resourceRequest().url() and m_resourceRequest.url() by
+        calling url() since they are all the same.
+        
+        (WebCore::CachedImage::createImage): Pass the resource url to SVGImage
+        and change ImageObserver& by ImageObserver*, since null is not legal.
+        
+        * svg/graphics/SVGImage.cpp:
+        (WebCore::SVGImage::SVGImage):
+        * svg/graphics/SVGImage.h: Add a url parameter to SVGImage constructor.
+        
+        * svg/graphics/SVGImageCache.cpp:
+        (WebCore::SVGImageCache::findImageForRenderer): Add a new helper function.
+        
+        (WebCore::SVGImageCache::imageSizeForRenderer):
+        (WebCore::SVGImageCache::imageForRenderer): Code clean up.
+        
+        * svg/graphics/SVGImageCache.h: Make imageForRenderer() const.
+
+        * svg/graphics/SVGImageForContainer.cpp: Remove unneeded header file.
+
 2015-06-09  Matt Rajca  <[email protected]>
 
         Add support for toggling playback in MediaSessions and MediaSessionManagers.

Modified: trunk/Source/WebCore/loader/cache/CachedImage.cpp (185394 => 185395)


--- trunk/Source/WebCore/loader/cache/CachedImage.cpp	2015-06-10 00:43:05 UTC (rev 185394)
+++ trunk/Source/WebCore/loader/cache/CachedImage.cpp	2015-06-10 00:45:58 UTC (rev 185395)
@@ -109,7 +109,7 @@
 
 void CachedImage::load(CachedResourceLoader& cachedResourceLoader, const ResourceLoaderOptions& options)
 {
-    if (cachedResourceLoader.shouldPerformImageLoad(resourceRequest().url()))
+    if (cachedResourceLoader.shouldPerformImageLoad(url()))
         CachedResource::load(cachedResourceLoader, options);
     else
         setLoading(false);
@@ -320,7 +320,7 @@
     if (!m_loader || m_loader->reachedTerminalState())
         return;
 
-    m_shouldPaintBrokenImage = m_loader->frameLoader()->client().shouldPaintBrokenImage(m_resourceRequest.url());
+    m_shouldPaintBrokenImage = m_loader->frameLoader()->client().shouldPaintBrokenImage(url());
 }
 
 void CachedImage::clear()
@@ -342,7 +342,7 @@
         m_image = PDFDocumentImage::create(this);
 #endif
     else if (m_response.mimeType() == "image/svg+xml") {
-        RefPtr<SVGImage> svgImage = SVGImage::create(this);
+        RefPtr<SVGImage> svgImage = SVGImage::create(*this, url());
         m_svgImageCache = std::make_unique<SVGImageCache>(svgImage.get());
         m_image = svgImage.release();
     } else {

Modified: trunk/Source/WebCore/svg/graphics/SVGImage.cpp (185394 => 185395)


--- trunk/Source/WebCore/svg/graphics/SVGImage.cpp	2015-06-10 00:43:05 UTC (rev 185394)
+++ trunk/Source/WebCore/svg/graphics/SVGImage.cpp	2015-06-10 00:45:58 UTC (rev 185395)
@@ -48,8 +48,9 @@
 
 namespace WebCore {
 
-SVGImage::SVGImage(ImageObserver* observer)
-    : Image(observer)
+SVGImage::SVGImage(ImageObserver& observer, const URL& url)
+    : Image(&observer)
+    , m_url(url)
 {
 }
 

Modified: trunk/Source/WebCore/svg/graphics/SVGImage.h (185394 => 185395)


--- trunk/Source/WebCore/svg/graphics/SVGImage.h	2015-06-10 00:43:05 UTC (rev 185394)
+++ trunk/Source/WebCore/svg/graphics/SVGImage.h	2015-06-10 00:45:58 UTC (rev 185395)
@@ -45,9 +45,9 @@
 
 class SVGImage final : public Image {
 public:
-    static Ref<SVGImage> create(ImageObserver* observer)
+    static Ref<SVGImage> create(ImageObserver& observer, const URL& url)
     {
-        return adoptRef(*new SVGImage(observer));
+        return adoptRef(*new SVGImage(observer, url));
     }
 
     RenderBox* embeddedContentBox() const;
@@ -93,7 +93,7 @@
     // FIXME: Implement this to be less conservative.
     virtual bool currentFrameKnownToBeOpaque() override { return false; }
 
-    SVGImage(ImageObserver*);
+    SVGImage(ImageObserver&, const URL&);
     virtual void draw(GraphicsContext*, const FloatRect& fromRect, const FloatRect& toRect, ColorSpace styleColorSpace, CompositeOperator, BlendMode, ImageOrientationDescription) override;
     void drawForContainer(GraphicsContext*, const FloatSize, float, const FloatRect&, const FloatRect&, ColorSpace, CompositeOperator, BlendMode);
     void drawPatternForContainer(GraphicsContext*, const FloatSize, float, const FloatRect&, const AffineTransform&, const FloatPoint&, ColorSpace,

Modified: trunk/Source/WebCore/svg/graphics/SVGImageCache.cpp (185394 => 185395)


--- trunk/Source/WebCore/svg/graphics/SVGImageCache.cpp	2015-06-10 00:43:05 UTC (rev 185394)
+++ trunk/Source/WebCore/svg/graphics/SVGImageCache.cpp	2015-06-10 00:45:58 UTC (rev 185395)
@@ -23,7 +23,6 @@
 
 #include "FrameView.h"
 #include "GraphicsContext.h"
-#include "HTMLImageElement.h"
 #include "ImageBuffer.h"
 #include "LayoutSize.h"
 #include "Page.h"
@@ -63,43 +62,26 @@
     m_imageForContainerMap.set(client, SVGImageForContainer::create(m_svgImage, containerSizeWithoutZoom, containerZoom));
 }
 
-FloatSize SVGImageCache::imageSizeForRenderer(const RenderObject* renderer) const
+Image* SVGImageCache::findImageForRenderer(const RenderObject* renderer) const
 {
-    FloatSize imageSize = m_svgImage->size();
-    if (!renderer)
-        return imageSize;
+    return renderer ? m_imageForContainerMap.get(renderer) : nullptr;
+}
 
-    ImageForContainerMap::const_iterator it = m_imageForContainerMap.find(renderer);
-    if (it == m_imageForContainerMap.end())
-        return imageSize;
-
-    RefPtr<SVGImageForContainer> imageForContainer = it->value;
-    ASSERT(!imageForContainer->size().isEmpty());
-    return imageForContainer->size();
+FloatSize SVGImageCache::imageSizeForRenderer(const RenderObject* renderer) const
+{
+    auto* image = findImageForRenderer(renderer);
+    return image ? image->size() : m_svgImage->size();
 }
 
 // FIXME: This doesn't take into account the animation timeline so animations will not
 // restart on page load, nor will two animations in different pages have different timelines.
-Image* SVGImageCache::imageForRenderer(const RenderObject* renderer)
+Image* SVGImageCache::imageForRenderer(const RenderObject* renderer) const
 {
-    if (!renderer)
+    auto* image = findImageForRenderer(renderer);
+    if (!image)
         return Image::nullImage();
-
-    ImageForContainerMap::iterator it = m_imageForContainerMap.find(renderer);
-    if (it == m_imageForContainerMap.end())
-        return Image::nullImage();
-
-    RefPtr<SVGImageForContainer> imageForContainer = it->value;
-    
-    Node* node = renderer->node();
-    if (is<HTMLImageElement>(node)) {
-        const AtomicString& urlString = downcast<HTMLImageElement>(*node).imageSourceURL();
-        URL url = ""
-        imageForContainer->setURL(url);
-    }
-        
-    ASSERT(!imageForContainer->size().isEmpty());
-    return imageForContainer.get();
+    ASSERT(!image->size().isEmpty());
+    return image;
 }
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/svg/graphics/SVGImageCache.h (185394 => 185395)


--- trunk/Source/WebCore/svg/graphics/SVGImageCache.h	2015-06-10 00:43:05 UTC (rev 185394)
+++ trunk/Source/WebCore/svg/graphics/SVGImageCache.h	2015-06-10 00:45:58 UTC (rev 185395)
@@ -47,9 +47,11 @@
     void setContainerSizeForRenderer(const CachedImageClient*, const LayoutSize&, float);
     FloatSize imageSizeForRenderer(const RenderObject*) const;
 
-    Image* imageForRenderer(const RenderObject*);
+    Image* imageForRenderer(const RenderObject*) const;
 
 private:
+    Image* findImageForRenderer(const RenderObject*) const;
+
     typedef HashMap<const CachedImageClient*, RefPtr<SVGImageForContainer>> ImageForContainerMap;
 
     SVGImage* m_svgImage;

Modified: trunk/Source/WebCore/svg/graphics/SVGImageForContainer.cpp (185394 => 185395)


--- trunk/Source/WebCore/svg/graphics/SVGImageForContainer.cpp	2015-06-10 00:43:05 UTC (rev 185394)
+++ trunk/Source/WebCore/svg/graphics/SVGImageForContainer.cpp	2015-06-10 00:45:58 UTC (rev 185395)
@@ -23,7 +23,6 @@
 #include "AffineTransform.h"
 #include "FloatRect.h"
 #include "FloatSize.h"
-#include "FrameView.h"
 #include "Image.h"
 
 namespace WebCore {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to