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 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 void SVGResourcesCache::RemoveResourcesFromLayoutObject(LayoutObject* object) { | 63 void SVGResourcesCache::RemoveResourcesFromLayoutObject(LayoutObject* object) { |
64 std::unique_ptr<SVGResources> resources = cache_.Take(object); | 64 std::unique_ptr<SVGResources> resources = cache_.Take(object); |
65 if (!resources) | 65 if (!resources) |
66 return; | 66 return; |
67 | 67 |
68 // Walk resources and unregister the layout object as a client of each | 68 // Walk resources and unregister the layout object as a client of each |
69 // resource. | 69 // resource. |
70 HashSet<LayoutSVGResourceContainer*> resource_set; | 70 HashSet<LayoutSVGResourceContainer*> resource_set; |
71 resources->BuildSetOfResources(resource_set); | 71 resources->BuildSetOfResources(resource_set); |
72 | 72 |
| 73 bool did_empty_client_set = false; |
73 for (auto* resource_container : resource_set) | 74 for (auto* resource_container : resource_set) |
74 resource_container->RemoveClient(object); | 75 did_empty_client_set |= resource_container->RemoveClient(object); |
| 76 |
| 77 // Remove any registrations that became empty after the above. |
| 78 if (did_empty_client_set) |
| 79 SVGResources::RemoveUnreferencedResources(*object); |
75 } | 80 } |
76 | 81 |
77 static inline SVGResourcesCache& ResourcesCache(Document& document) { | 82 static inline SVGResourcesCache& ResourcesCache(Document& document) { |
78 return document.AccessSVGExtensions().ResourcesCache(); | 83 return document.AccessSVGExtensions().ResourcesCache(); |
79 } | 84 } |
80 | 85 |
81 SVGResources* SVGResourcesCache::CachedResourcesForLayoutObject( | 86 SVGResources* SVGResourcesCache::CachedResourcesForLayoutObject( |
82 const LayoutObject* layout_object) { | 87 const LayoutObject* layout_object) { |
83 DCHECK(layout_object); | 88 DCHECK(layout_object); |
84 return ResourcesCache(layout_object->GetDocument()).cache_.at(layout_object); | 89 return ResourcesCache(layout_object->GetDocument()).cache_.at(layout_object); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 // If this layoutObject is the child of ResourceContainer and it require | 148 // If this layoutObject is the child of ResourceContainer and it require |
144 // repainting that changes of CSS properties such as 'visibility', | 149 // repainting that changes of CSS properties such as 'visibility', |
145 // request repainting. | 150 // request repainting. |
146 bool needs_layout = diff.NeedsFullPaintInvalidation() && | 151 bool needs_layout = diff.NeedsFullPaintInvalidation() && |
147 IsLayoutObjectOfResourceContainer(layout_object); | 152 IsLayoutObjectOfResourceContainer(layout_object); |
148 | 153 |
149 LayoutSVGResourceContainer::MarkForLayoutAndParentResourceInvalidation( | 154 LayoutSVGResourceContainer::MarkForLayoutAndParentResourceInvalidation( |
150 layout_object, needs_layout); | 155 layout_object, needs_layout); |
151 } | 156 } |
152 | 157 |
| 158 void SVGResourcesCache::ResourceReferenceChanged(LayoutObject& layout_object) { |
| 159 DCHECK(layout_object.IsSVG()); |
| 160 DCHECK(layout_object.GetNode()); |
| 161 DCHECK(layout_object.GetNode()->IsSVGElement()); |
| 162 |
| 163 if (!layout_object.Parent()) |
| 164 return; |
| 165 |
| 166 // Only LayoutObjects that can actually have resources should be pending and |
| 167 // hence be able to call this method. |
| 168 DCHECK(LayoutObjectCanHaveResources(&layout_object)); |
| 169 |
| 170 SVGResourcesCache& cache = ResourcesCache(layout_object.GetDocument()); |
| 171 cache.RemoveResourcesFromLayoutObject(&layout_object); |
| 172 cache.AddResourcesFromLayoutObject(&layout_object, layout_object.StyleRef()); |
| 173 |
| 174 LayoutSVGResourceContainer::MarkForLayoutAndParentResourceInvalidation( |
| 175 &layout_object, true); |
| 176 } |
| 177 |
153 void SVGResourcesCache::ClientWasAddedToTree(LayoutObject* layout_object, | 178 void SVGResourcesCache::ClientWasAddedToTree(LayoutObject* layout_object, |
154 const ComputedStyle& new_style) { | 179 const ComputedStyle& new_style) { |
155 if (!layout_object->GetNode()) | 180 if (!layout_object->GetNode()) |
156 return; | 181 return; |
157 LayoutSVGResourceContainer::MarkForLayoutAndParentResourceInvalidation( | 182 LayoutSVGResourceContainer::MarkForLayoutAndParentResourceInvalidation( |
158 layout_object, false); | 183 layout_object, false); |
159 | 184 |
160 if (!LayoutObjectCanHaveResources(layout_object)) | 185 if (!LayoutObjectCanHaveResources(layout_object)) |
161 return; | 186 return; |
162 SVGResourcesCache& cache = ResourcesCache(layout_object->GetDocument()); | 187 SVGResourcesCache& cache = ResourcesCache(layout_object->GetDocument()); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 const ComputedStyle& style) { | 225 const ComputedStyle& style) { |
201 DCHECK(LayoutObjectCanHaveResources(&layout_object_)); | 226 DCHECK(LayoutObjectCanHaveResources(&layout_object_)); |
202 if (styles_are_equal_) | 227 if (styles_are_equal_) |
203 return; | 228 return; |
204 SVGResourcesCache& cache = ResourcesCache(layout_object_.GetDocument()); | 229 SVGResourcesCache& cache = ResourcesCache(layout_object_.GetDocument()); |
205 cache.RemoveResourcesFromLayoutObject(&layout_object_); | 230 cache.RemoveResourcesFromLayoutObject(&layout_object_); |
206 cache.AddResourcesFromLayoutObject(&layout_object_, style); | 231 cache.AddResourcesFromLayoutObject(&layout_object_, style); |
207 } | 232 } |
208 | 233 |
209 } // namespace blink | 234 } // namespace blink |
OLD | NEW |