Respect SVG fragment identifiers in <img> src attribute
authorgraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 3 Mar 2014 11:57:30 +0000 (11:57 +0000)
committergraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 3 Mar 2014 11:57:30 +0000 (11:57 +0000)
https://bugs.webkit.org/show_bug.cgi?id=129387

Reviewed by Dirk Schulze.

Following Dirk Schulze's suggestion, we set the URL on the SVGImage itself and handle the URL's
fragment identifier at draw time in the SVGImage itself, which will provide a sounder base for
handling of fragment identifier in SVG resource URLs in CSS properties, and should also deal
with the crasher reported in http://webkit.org/b/129498 since there is a guaranteed Frame at the
time we call SVGImage::draw().

* svg/graphics/SVGImage.cpp:
(WebCore::SVGImage::draw):
* svg/graphics/SVGImage.h:
* svg/graphics/SVGImageForContainer.cpp:
* svg/graphics/SVGImageForContainer.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@164983 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/svg/graphics/SVGImage.cpp
Source/WebCore/svg/graphics/SVGImage.h
Source/WebCore/svg/graphics/SVGImageForContainer.cpp
Source/WebCore/svg/graphics/SVGImageForContainer.h

index fdabca6..e20fae7 100644 (file)
@@ -1,3 +1,22 @@
+2014-03-03  Antoine Quint  <graouts@webkit.org>
+
+        Respect SVG fragment identifiers in <img> src attribute
+        https://bugs.webkit.org/show_bug.cgi?id=129387
+
+        Reviewed by Dirk Schulze.
+
+        Following Dirk Schulze's suggestion, we set the URL on the SVGImage itself and handle the URL's
+        fragment identifier at draw time in the SVGImage itself, which will provide a sounder base for
+        handling of fragment identifier in SVG resource URLs in CSS properties, and should also deal
+        with the crasher reported in http://webkit.org/b/129498 since there is a guaranteed Frame at the
+        time we call SVGImage::draw().
+
+        * svg/graphics/SVGImage.cpp:
+        (WebCore::SVGImage::draw):
+        * svg/graphics/SVGImage.h:
+        * svg/graphics/SVGImageForContainer.cpp:
+        * svg/graphics/SVGImageForContainer.h:
+
 2014-03-03  Laszlo Vidacs  <lvidacs.u-szeged@partner.samsung.com>
 
         Move function calls outside loop in dom
index 23fdda5..780ae4a 100644 (file)
@@ -220,6 +220,7 @@ void SVGImage::draw(GraphicsContext* context, const FloatRect& dstRect, const Fl
         return;
 
     FrameView* view = frameView();
+    ASSERT(view);
 
     GraphicsContextStateSaver stateSaver(*context);
     context->setCompositeOperation(compositeOp, blendMode);
@@ -252,6 +253,9 @@ void SVGImage::draw(GraphicsContext* context, const FloatRect& dstRect, const Fl
 
     stateSaver.restore();
 
+    if (!m_url.isEmpty())
+        view->scrollToFragment(m_url);
+
     if (imageObserver())
         imageObserver()->didDraw(this);
 }
index d416211..58eef30 100644 (file)
@@ -28,6 +28,7 @@
 #define SVGImage_h
 
 #include "Image.h"
+#include "URL.h"
 
 namespace WebCore {
 
@@ -52,6 +53,8 @@ public:
     virtual bool isSVGImage() const override { return true; }
     virtual IntSize size() const override { return m_intrinsicSize; }
 
+    void setURL(const URL& url) { m_url = url; }
+
     virtual bool hasSingleSecurityOrigin() const override;
 
     virtual bool hasRelativeWidth() const override;
@@ -95,6 +98,7 @@ private:
     std::unique_ptr<SVGImageChromeClient> m_chromeClient;
     std::unique_ptr<Page> m_page;
     IntSize m_intrinsicSize;
+    URL m_url;
 };
 
 bool isInSVGImage(const Element*);
index 9095760..434efc8 100644 (file)
@@ -25,7 +25,6 @@
 #include "FloatSize.h"
 #include "FrameView.h"
 #include "Image.h"
-#include "SVGImage.h"
 
 namespace WebCore {
 
@@ -54,9 +53,4 @@ PassNativeImagePtr SVGImageForContainer::nativeImageForCurrentFrame()
     return m_image->nativeImageForCurrentFrame();
 }
 
-void SVGImageForContainer::setURL(const URL& url)
-{ 
-    m_image->frameView()->scrollToFragment(url);
-}
-
 } // namespace WebCore
index 7f3823c..de4003f 100644 (file)
@@ -46,7 +46,7 @@ public:
 
     virtual IntSize size() const override;
 
-    void setURL(const URL&);
+    void setURL(const URL& url) { m_image->setURL(url); }
 
     virtual bool usesContainerSize() const override { return m_image->usesContainerSize(); }
     virtual bool hasRelativeWidth() const override { return m_image->hasRelativeWidth(); }