12017-08-23 Said Abou-Hallawa <sabouhallawa@apple.com>
2
3 The SVG fragment identifier is not respected if it is a part of an HTTP URL
4 https://bugs.webkit.org/show_bug.cgi?id=163811
5
6 Reviewed by NOBODY (OOPS!).
7
8 If an image is referenced more than once in a page and the URL to that
9 image is an HTTP URL, one CachedImage is created for all the renderers
10 even if the original URLs have different fragmentIdentifiers. In this
11 case the fragment will be removed from the request which is associated
12 with the shared CachedImage. This CachedImage creates an SVGImage with
13 a URL but without a fragmentIdentifier. So SVGImage::draw() does not call
14 FrameView::scrollToFragment() and therefore the viewport is not setup
15 correctly for displaying the SVG in this case.
16
17 The fix is to move the url from the SVGImage to SVGImageForContainer.
18 Because there is one SVGImageForContainer created for every renderer,
19 we can move the full URL there. The drawing of an SVGImage has to start
20 from the SVGImageForContainer::draw() because the SVGImage may not have
21 an intrinsic size and the SVGImageForContainer is the one which knows
22 the destination rectangle. So SVGImageForContainer can pass the full url
23 to SVGImage::drawForContainer() which can be used to scrollToFragment()
24 before calling SVGImage::draw().
25
26 For clarity and consistency, all setContainerSizeForRenderer() will be
27 changed to setContainerContext() and the pair SizeAndZoom will be replaced
28 by the struct ContainerContext.
29
30 Tests: http/tests/svg/svg-fragment-background.html
31 http/tests/svg/svg-fragment-image.html
32
33 * css/CSSCursorImageValue.h:
34 * css/CSSImageSetValue.cpp:
35 (WebCore::CSSImageSetValue::url):
36 * css/CSSImageSetValue.h:
37 * loader/cache/CachedImage.cpp:
38 (WebCore::CachedImage::didRemoveClient):
39 (WebCore::CachedImage::switchClientsToRevalidatedResource):
40 (WebCore::CachedImage::allClientsRemoved):
41 (WebCore::CachedImage::setContainerContextForClient):
42 (WebCore::CachedImage::clear):
43 (WebCore::CachedImage::createImage):
44 (WebCore::CachedImage::setContainerSizeForRenderer): Deleted.
45 * loader/cache/CachedImage.h:
46 * rendering/RenderBoxModelObject.cpp:
47 (WebCore::RenderBoxModelObject::calculateBackgroundImageGeometry const):
48 (WebCore::RenderBoxModelObject::paintNinePieceImage):
49 * rendering/RenderImage.cpp:
50 (WebCore::RenderImage::updateInnerContentRect):
51 (WebCore::RenderImage::repaintOrMarkForLayout):
52 * rendering/RenderImageResource.cpp:
53 (WebCore::RenderImageResource::setContainerContext):
54 (WebCore::RenderImageResource::setContainerSizeForRenderer): Deleted.
55 * rendering/RenderImageResource.h:
56 * rendering/RenderImageResourceStyleImage.cpp:
57 (WebCore::RenderImageResourceStyleImage::setContainerContext):
58 (WebCore::RenderImageResourceStyleImage::setContainerSizeForRenderer): Deleted.
59 * rendering/RenderImageResourceStyleImage.h:
60 * rendering/RenderListMarker.cpp:
61 (WebCore::RenderListMarker::updateContent):
62 * rendering/shapes/ShapeOutsideInfo.cpp:
63 (WebCore::ShapeOutsideInfo::createShapeForImage const):
64 * rendering/style/StyleCachedImage.cpp:
65 (WebCore::StyleCachedImage::imageSourceURL):
66 (WebCore::StyleCachedImage::setContainerContextForRenderer):
67 (WebCore::StyleCachedImage::setContainerSizeForRenderer): Deleted.
68 * rendering/style/StyleCachedImage.h:
69 * rendering/style/StyleGeneratedImage.h:
70 * rendering/style/StyleImage.h:
71 * rendering/svg/RenderSVGImage.cpp:
72 (WebCore::RenderSVGImage::updateImageViewport):
73 * svg/SVGImageElement.h:
74 * svg/graphics/SVGImage.cpp:
75 (WebCore::SVGImage::SVGImage):
76 (WebCore::SVGImage::drawForContainer):
77 (WebCore::SVGImage::drawPatternForContainer):
78 (WebCore::SVGImage::draw):
79 (WebCore::SVGImage::dump const): Deleted.
80 * svg/graphics/SVGImage.h:
81 * svg/graphics/SVGImageCache.cpp:
82 (WebCore::SVGImageCache::setContainerContextForClient):
83 (WebCore::SVGImageCache::setContainerSizeForRenderer): Deleted.
84 * svg/graphics/SVGImageCache.h:
85 * svg/graphics/SVGImageForContainer.cpp:
86 (WebCore::SVGImageForContainer::size const):
87 (WebCore::SVGImageForContainer::draw):
88 (WebCore::SVGImageForContainer::drawPattern):
89 * svg/graphics/SVGImageForContainer.h:
90