OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 2 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
3 * | 3 * |
4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
8 * | 8 * |
9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 18 matching lines...) Expand all Loading... |
29 namespace blink { | 29 namespace blink { |
30 | 30 |
31 SVGResourcesCache::SVGResourcesCache() | 31 SVGResourcesCache::SVGResourcesCache() |
32 { | 32 { |
33 } | 33 } |
34 | 34 |
35 SVGResourcesCache::~SVGResourcesCache() | 35 SVGResourcesCache::~SVGResourcesCache() |
36 { | 36 { |
37 } | 37 } |
38 | 38 |
39 void SVGResourcesCache::addResourcesFromRenderObject(RenderObject* object, const
RenderStyle* style) | 39 void SVGResourcesCache::addResourcesFromLayoutObject(LayoutObject* object, const
RenderStyle* style) |
40 { | 40 { |
41 ASSERT(object); | 41 ASSERT(object); |
42 ASSERT(style); | 42 ASSERT(style); |
43 ASSERT(!m_cache.contains(object)); | 43 ASSERT(!m_cache.contains(object)); |
44 | 44 |
45 const SVGRenderStyle& svgStyle = style->svgStyle(); | 45 const SVGRenderStyle& svgStyle = style->svgStyle(); |
46 | 46 |
47 // Build a list of all resources associated with the passed RenderObject | 47 // Build a list of all resources associated with the passed LayoutObject |
48 OwnPtr<SVGResources> newResources = SVGResources::buildResources(object, svg
Style); | 48 OwnPtr<SVGResources> newResources = SVGResources::buildResources(object, svg
Style); |
49 if (!newResources) | 49 if (!newResources) |
50 return; | 50 return; |
51 | 51 |
52 // Put object in cache. | 52 // Put object in cache. |
53 SVGResources* resources = m_cache.set(object, newResources.release()).stored
Value->value.get(); | 53 SVGResources* resources = m_cache.set(object, newResources.release()).stored
Value->value.get(); |
54 | 54 |
55 // Run cycle-detection _afterwards_, so self-references can be caught as wel
l. | 55 // Run cycle-detection _afterwards_, so self-references can be caught as wel
l. |
56 SVGResourcesCycleSolver solver(object, resources); | 56 SVGResourcesCycleSolver solver(object, resources); |
57 solver.resolveCycles(); | 57 solver.resolveCycles(); |
58 | 58 |
59 // Walk resources and register the render object at each resources. | 59 // Walk resources and register the render object at each resources. |
60 HashSet<RenderSVGResourceContainer*> resourceSet; | 60 HashSet<RenderSVGResourceContainer*> resourceSet; |
61 resources->buildSetOfResources(resourceSet); | 61 resources->buildSetOfResources(resourceSet); |
62 | 62 |
63 for (auto* resourceContainer : resourceSet) | 63 for (auto* resourceContainer : resourceSet) |
64 resourceContainer->addClient(object); | 64 resourceContainer->addClient(object); |
65 } | 65 } |
66 | 66 |
67 void SVGResourcesCache::removeResourcesFromRenderObject(RenderObject* object) | 67 void SVGResourcesCache::removeResourcesFromLayoutObject(LayoutObject* object) |
68 { | 68 { |
69 OwnPtr<SVGResources> resources = m_cache.take(object); | 69 OwnPtr<SVGResources> resources = m_cache.take(object); |
70 if (!resources) | 70 if (!resources) |
71 return; | 71 return; |
72 | 72 |
73 // Walk resources and register the render object at each resources. | 73 // Walk resources and register the render object at each resources. |
74 HashSet<RenderSVGResourceContainer*> resourceSet; | 74 HashSet<RenderSVGResourceContainer*> resourceSet; |
75 resources->buildSetOfResources(resourceSet); | 75 resources->buildSetOfResources(resourceSet); |
76 | 76 |
77 for (auto* resourceContainer : resourceSet) | 77 for (auto* resourceContainer : resourceSet) |
78 resourceContainer->removeClient(object); | 78 resourceContainer->removeClient(object); |
79 } | 79 } |
80 | 80 |
81 static inline SVGResourcesCache* resourcesCacheFromRenderObject(const RenderObje
ct* renderer) | 81 static inline SVGResourcesCache* resourcesCacheFromLayoutObject(const LayoutObje
ct* renderer) |
82 { | 82 { |
83 Document& document = renderer->document(); | 83 Document& document = renderer->document(); |
84 | 84 |
85 SVGDocumentExtensions& extensions = document.accessSVGExtensions(); | 85 SVGDocumentExtensions& extensions = document.accessSVGExtensions(); |
86 SVGResourcesCache* cache = extensions.resourcesCache(); | 86 SVGResourcesCache* cache = extensions.resourcesCache(); |
87 ASSERT(cache); | 87 ASSERT(cache); |
88 | 88 |
89 return cache; | 89 return cache; |
90 } | 90 } |
91 | 91 |
92 SVGResources* SVGResourcesCache::cachedResourcesForRenderObject(const RenderObje
ct* renderer) | 92 SVGResources* SVGResourcesCache::cachedResourcesForLayoutObject(const LayoutObje
ct* renderer) |
93 { | 93 { |
94 ASSERT(renderer); | 94 ASSERT(renderer); |
95 return resourcesCacheFromRenderObject(renderer)->m_cache.get(renderer); | 95 return resourcesCacheFromLayoutObject(renderer)->m_cache.get(renderer); |
96 } | 96 } |
97 | 97 |
98 void SVGResourcesCache::clientLayoutChanged(RenderObject* object) | 98 void SVGResourcesCache::clientLayoutChanged(LayoutObject* object) |
99 { | 99 { |
100 SVGResources* resources = SVGResourcesCache::cachedResourcesForRenderObject(
object); | 100 SVGResources* resources = SVGResourcesCache::cachedResourcesForLayoutObject(
object); |
101 if (!resources) | 101 if (!resources) |
102 return; | 102 return; |
103 | 103 |
104 // Invalidate the resources if either the RenderObject itself changed, | 104 // Invalidate the resources if either the LayoutObject itself changed, |
105 // or we have filter resources, which could depend on the layout of children
. | 105 // or we have filter resources, which could depend on the layout of children
. |
106 if (object->selfNeedsLayout() || resources->filter()) | 106 if (object->selfNeedsLayout() || resources->filter()) |
107 resources->removeClientFromCache(object); | 107 resources->removeClientFromCache(object); |
108 } | 108 } |
109 | 109 |
110 static inline bool rendererCanHaveResources(RenderObject* renderer) | 110 static inline bool rendererCanHaveResources(LayoutObject* renderer) |
111 { | 111 { |
112 ASSERT(renderer); | 112 ASSERT(renderer); |
113 return renderer->node() && renderer->node()->isSVGElement() && !renderer->is
SVGInlineText(); | 113 return renderer->node() && renderer->node()->isSVGElement() && !renderer->is
SVGInlineText(); |
114 } | 114 } |
115 | 115 |
116 void SVGResourcesCache::clientStyleChanged(RenderObject* renderer, StyleDifferen
ce diff, const RenderStyle* newStyle) | 116 void SVGResourcesCache::clientStyleChanged(LayoutObject* renderer, StyleDifferen
ce diff, const RenderStyle* newStyle) |
117 { | 117 { |
118 ASSERT(renderer); | 118 ASSERT(renderer); |
119 ASSERT(renderer->node()); | 119 ASSERT(renderer->node()); |
120 ASSERT(renderer->node()->isSVGElement()); | 120 ASSERT(renderer->node()->isSVGElement()); |
121 | 121 |
122 if (!diff.hasDifference() || !renderer->parent()) | 122 if (!diff.hasDifference() || !renderer->parent()) |
123 return; | 123 return; |
124 | 124 |
125 // In this case the proper SVGFE*Element will decide whether the modified CS
S properties require a relayout or paintInvalidation. | 125 // In this case the proper SVGFE*Element will decide whether the modified CS
S properties require a relayout or paintInvalidation. |
126 if (renderer->isSVGResourceFilterPrimitive() && !diff.needsLayout()) | 126 if (renderer->isSVGResourceFilterPrimitive() && !diff.needsLayout()) |
127 return; | 127 return; |
128 | 128 |
129 // Dynamic changes of CSS properties like 'clip-path' may require us to reco
mpute the associated resources for a renderer. | 129 // Dynamic changes of CSS properties like 'clip-path' may require us to reco
mpute the associated resources for a renderer. |
130 // FIXME: Avoid passing in a useless StyleDifference, but instead compare ol
dStyle/newStyle to see which resources changed | 130 // FIXME: Avoid passing in a useless StyleDifference, but instead compare ol
dStyle/newStyle to see which resources changed |
131 // to be able to selectively rebuild individual resources, instead of all of
them. | 131 // to be able to selectively rebuild individual resources, instead of all of
them. |
132 if (rendererCanHaveResources(renderer)) { | 132 if (rendererCanHaveResources(renderer)) { |
133 SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); | 133 SVGResourcesCache* cache = resourcesCacheFromLayoutObject(renderer); |
134 cache->removeResourcesFromRenderObject(renderer); | 134 cache->removeResourcesFromLayoutObject(renderer); |
135 cache->addResourcesFromRenderObject(renderer, newStyle); | 135 cache->addResourcesFromLayoutObject(renderer, newStyle); |
136 } | 136 } |
137 | 137 |
138 RenderSVGResourceContainer::markForLayoutAndParentResourceInvalidation(rende
rer, false); | 138 RenderSVGResourceContainer::markForLayoutAndParentResourceInvalidation(rende
rer, false); |
139 } | 139 } |
140 | 140 |
141 void SVGResourcesCache::clientWasAddedToTree(RenderObject* renderer, const Rende
rStyle* newStyle) | 141 void SVGResourcesCache::clientWasAddedToTree(LayoutObject* renderer, const Rende
rStyle* newStyle) |
142 { | 142 { |
143 if (!renderer->node()) | 143 if (!renderer->node()) |
144 return; | 144 return; |
145 RenderSVGResourceContainer::markForLayoutAndParentResourceInvalidation(rende
rer, false); | 145 RenderSVGResourceContainer::markForLayoutAndParentResourceInvalidation(rende
rer, false); |
146 | 146 |
147 if (!rendererCanHaveResources(renderer)) | 147 if (!rendererCanHaveResources(renderer)) |
148 return; | 148 return; |
149 SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); | 149 SVGResourcesCache* cache = resourcesCacheFromLayoutObject(renderer); |
150 cache->addResourcesFromRenderObject(renderer, newStyle); | 150 cache->addResourcesFromLayoutObject(renderer, newStyle); |
151 } | 151 } |
152 | 152 |
153 void SVGResourcesCache::clientWillBeRemovedFromTree(RenderObject* renderer) | 153 void SVGResourcesCache::clientWillBeRemovedFromTree(LayoutObject* renderer) |
154 { | 154 { |
155 if (!renderer->node()) | 155 if (!renderer->node()) |
156 return; | 156 return; |
157 RenderSVGResourceContainer::markForLayoutAndParentResourceInvalidation(rende
rer, false); | 157 RenderSVGResourceContainer::markForLayoutAndParentResourceInvalidation(rende
rer, false); |
158 | 158 |
159 if (!rendererCanHaveResources(renderer)) | 159 if (!rendererCanHaveResources(renderer)) |
160 return; | 160 return; |
161 SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); | 161 SVGResourcesCache* cache = resourcesCacheFromLayoutObject(renderer); |
162 cache->removeResourcesFromRenderObject(renderer); | 162 cache->removeResourcesFromLayoutObject(renderer); |
163 } | 163 } |
164 | 164 |
165 void SVGResourcesCache::clientDestroyed(RenderObject* renderer) | 165 void SVGResourcesCache::clientDestroyed(LayoutObject* renderer) |
166 { | 166 { |
167 ASSERT(renderer); | 167 ASSERT(renderer); |
168 | 168 |
169 SVGResources* resources = SVGResourcesCache::cachedResourcesForRenderObject(
renderer); | 169 SVGResources* resources = SVGResourcesCache::cachedResourcesForLayoutObject(
renderer); |
170 if (resources) | 170 if (resources) |
171 resources->removeClientFromCache(renderer); | 171 resources->removeClientFromCache(renderer); |
172 | 172 |
173 SVGResourcesCache* cache = resourcesCacheFromRenderObject(renderer); | 173 SVGResourcesCache* cache = resourcesCacheFromLayoutObject(renderer); |
174 cache->removeResourcesFromRenderObject(renderer); | 174 cache->removeResourcesFromLayoutObject(renderer); |
175 } | 175 } |
176 | 176 |
177 void SVGResourcesCache::resourceDestroyed(RenderSVGResourceContainer* resource) | 177 void SVGResourcesCache::resourceDestroyed(RenderSVGResourceContainer* resource) |
178 { | 178 { |
179 ASSERT(resource); | 179 ASSERT(resource); |
180 SVGResourcesCache* cache = resourcesCacheFromRenderObject(resource); | 180 SVGResourcesCache* cache = resourcesCacheFromLayoutObject(resource); |
181 | 181 |
182 // The resource itself may have clients, that need to be notified. | 182 // The resource itself may have clients, that need to be notified. |
183 cache->removeResourcesFromRenderObject(resource); | 183 cache->removeResourcesFromLayoutObject(resource); |
184 | 184 |
185 for (auto& objectResources : cache->m_cache) { | 185 for (auto& objectResources : cache->m_cache) { |
186 objectResources.value->resourceDestroyed(resource); | 186 objectResources.value->resourceDestroyed(resource); |
187 | 187 |
188 // Mark users of destroyed resources as pending resolution based on the
id of the old resource. | 188 // Mark users of destroyed resources as pending resolution based on the
id of the old resource. |
189 Element* resourceElement = resource->element(); | 189 Element* resourceElement = resource->element(); |
190 Element* clientElement = toElement(objectResources.key->node()); | 190 Element* clientElement = toElement(objectResources.key->node()); |
191 SVGDocumentExtensions& extensions = clientElement->document().accessSVGE
xtensions(); | 191 SVGDocumentExtensions& extensions = clientElement->document().accessSVGE
xtensions(); |
192 | 192 |
193 extensions.addPendingResource(resourceElement->fastGetAttribute(HTMLName
s::idAttr), clientElement); | 193 extensions.addPendingResource(resourceElement->fastGetAttribute(HTMLName
s::idAttr), clientElement); |
194 } | 194 } |
195 } | 195 } |
196 | 196 |
197 } | 197 } |
OLD | NEW |