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 {