Changeset 185395 in webkit


Ignore:
Timestamp:
Jun 9, 2015 5:45:58 PM (9 years ago)
Author:
commit-queue@webkit.org
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 <sabouhallawa@apple.com> 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.

Location:
trunk
Files:
2 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r185393 r185395  
     12015-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
    1132015-06-09  Darin Adler  <darin@apple.com>
    214
  • trunk/Source/WebCore/ChangeLog

    r185394 r185395  
     12015-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
    1442015-06-09  Matt Rajca  <mrajca@apple.com>
    245
  • trunk/Source/WebCore/loader/cache/CachedImage.cpp

    r184434 r185395  
    110110void CachedImage::load(CachedResourceLoader& cachedResourceLoader, const ResourceLoaderOptions& options)
    111111{
    112     if (cachedResourceLoader.shouldPerformImageLoad(resourceRequest().url()))
     112    if (cachedResourceLoader.shouldPerformImageLoad(url()))
    113113        CachedResource::load(cachedResourceLoader, options);
    114114    else
     
    321321        return;
    322322
    323     m_shouldPaintBrokenImage = m_loader->frameLoader()->client().shouldPaintBrokenImage(m_resourceRequest.url());
     323    m_shouldPaintBrokenImage = m_loader->frameLoader()->client().shouldPaintBrokenImage(url());
    324324}
    325325
     
    343343#endif
    344344    else if (m_response.mimeType() == "image/svg+xml") {
    345         RefPtr<SVGImage> svgImage = SVGImage::create(this);
     345        RefPtr<SVGImage> svgImage = SVGImage::create(*this, url());
    346346        m_svgImageCache = std::make_unique<SVGImageCache>(svgImage.get());
    347347        m_image = svgImage.release();
  • trunk/Source/WebCore/svg/graphics/SVGImage.cpp

    r184874 r185395  
    4949namespace WebCore {
    5050
    51 SVGImage::SVGImage(ImageObserver* observer)
    52     : Image(observer)
     51SVGImage::SVGImage(ImageObserver& observer, const URL& url)
     52    : Image(&observer)
     53    , m_url(url)
    5354{
    5455}
  • trunk/Source/WebCore/svg/graphics/SVGImage.h

    r183536 r185395  
    4646class SVGImage final : public Image {
    4747public:
    48     static Ref<SVGImage> create(ImageObserver* observer)
     48    static Ref<SVGImage> create(ImageObserver& observer, const URL& url)
    4949    {
    50         return adoptRef(*new SVGImage(observer));
     50        return adoptRef(*new SVGImage(observer, url));
    5151    }
    5252
     
    9494    virtual bool currentFrameKnownToBeOpaque() override { return false; }
    9595
    96     SVGImage(ImageObserver*);
     96    SVGImage(ImageObserver&, const URL&);
    9797    virtual void draw(GraphicsContext*, const FloatRect& fromRect, const FloatRect& toRect, ColorSpace styleColorSpace, CompositeOperator, BlendMode, ImageOrientationDescription) override;
    9898    void drawForContainer(GraphicsContext*, const FloatSize, float, const FloatRect&, const FloatRect&, ColorSpace, CompositeOperator, BlendMode);
  • trunk/Source/WebCore/svg/graphics/SVGImageCache.cpp

    r174225 r185395  
    2424#include "FrameView.h"
    2525#include "GraphicsContext.h"
    26 #include "HTMLImageElement.h"
    2726#include "ImageBuffer.h"
    2827#include "LayoutSize.h"
     
    6463}
    6564
     65Image* SVGImageCache::findImageForRenderer(const RenderObject* renderer) const
     66{
     67    return renderer ? m_imageForContainerMap.get(renderer) : nullptr;
     68}
     69
    6670FloatSize SVGImageCache::imageSizeForRenderer(const RenderObject* renderer) const
    6771{
    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();
    7974}
    8075
    8176// FIXME: This doesn't take into account the animation timeline so animations will not
    8277// restart on page load, nor will two animations in different pages have different timelines.
    83 Image* SVGImageCache::imageForRenderer(const RenderObject* renderer)
     78Image* SVGImageCache::imageForRenderer(const RenderObject* renderer) const
    8479{
    85     if (!renderer)
     80    auto* image = findImageForRenderer(renderer);
     81    if (!image)
    8682        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;
    10385}
    10486
  • trunk/Source/WebCore/svg/graphics/SVGImageCache.h

    r166642 r185395  
    4848    FloatSize imageSizeForRenderer(const RenderObject*) const;
    4949
    50     Image* imageForRenderer(const RenderObject*);
     50    Image* imageForRenderer(const RenderObject*) const;
    5151
    5252private:
     53    Image* findImageForRenderer(const RenderObject*) const;
     54
    5355    typedef HashMap<const CachedImageClient*, RefPtr<SVGImageForContainer>> ImageForContainerMap;
    5456
  • trunk/Source/WebCore/svg/graphics/SVGImageForContainer.cpp

    r166582 r185395  
    2424#include "FloatRect.h"
    2525#include "FloatSize.h"
    26 #include "FrameView.h"
    2726#include "Image.h"
    2827
Note: See TracChangeset for help on using the changeset viewer.