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 13 matching lines...) Expand all Loading... |
24 #include "core/layout/svg/LayoutSVGResourceFilter.h" | 24 #include "core/layout/svg/LayoutSVGResourceFilter.h" |
25 #include "core/layout/svg/LayoutSVGResourceMasker.h" | 25 #include "core/layout/svg/LayoutSVGResourceMasker.h" |
26 #include "core/layout/svg/SVGResources.h" | 26 #include "core/layout/svg/SVGResources.h" |
27 #include "core/layout/svg/SVGResourcesCache.h" | 27 #include "core/layout/svg/SVGResourcesCache.h" |
28 #include "core/paint/DeprecatedPaintLayer.h" | 28 #include "core/paint/DeprecatedPaintLayer.h" |
29 | 29 |
30 #include "wtf/TemporaryChange.h" | 30 #include "wtf/TemporaryChange.h" |
31 | 31 |
32 namespace blink { | 32 namespace blink { |
33 | 33 |
34 static inline SVGDocumentExtensions& svgExtensionsFromElement(SVGElement* elemen
t) | 34 static inline SVGDocumentExtensions& svgExtensionsFromElement(Element* element) |
35 { | 35 { |
36 ASSERT(element); | 36 ASSERT(element); |
37 return element->document().accessSVGExtensions(); | 37 return element->document().accessSVGExtensions(); |
38 } | 38 } |
39 | 39 |
40 LayoutSVGResourceContainer::LayoutSVGResourceContainer(SVGElement* node) | 40 LayoutSVGResourceContainer::LayoutSVGResourceContainer(SVGElement* node) |
41 : LayoutSVGHiddenContainer(node) | 41 : LayoutSVGHiddenContainer(node) |
42 , m_isInLayout(false) | 42 , m_isInLayout(false) |
43 , m_id(node->getIdAttribute()) | 43 , m_id(node->getIdAttribute()) |
44 , m_invalidationMask(0) | 44 , m_invalidationMask(0) |
(...skipping 16 matching lines...) Expand all Loading... |
61 | 61 |
62 TemporaryChange<bool> inLayoutChange(m_isInLayout, true); | 62 TemporaryChange<bool> inLayoutChange(m_isInLayout, true); |
63 | 63 |
64 LayoutSVGHiddenContainer::layout(); | 64 LayoutSVGHiddenContainer::layout(); |
65 | 65 |
66 clearInvalidationMask(); | 66 clearInvalidationMask(); |
67 } | 67 } |
68 | 68 |
69 void LayoutSVGResourceContainer::willBeDestroyed() | 69 void LayoutSVGResourceContainer::willBeDestroyed() |
70 { | 70 { |
71 SVGResourcesCache::resourceDestroyed(this); | 71 // Detach all clients referring to this resource. If the resource itself is |
| 72 // a client, it will be detached from any such resources by the call to |
| 73 // LayoutSVGHiddenContainer::willBeDestroyed() below. |
| 74 detachAllClients(); |
| 75 |
72 LayoutSVGHiddenContainer::willBeDestroyed(); | 76 LayoutSVGHiddenContainer::willBeDestroyed(); |
73 if (m_registered) | 77 if (m_registered) |
74 svgExtensionsFromElement(element()).removeResource(m_id); | 78 svgExtensionsFromElement(element()).removeResource(m_id); |
75 } | 79 } |
76 | 80 |
77 void LayoutSVGResourceContainer::styleDidChange(StyleDifference diff, const Comp
utedStyle* oldStyle) | 81 void LayoutSVGResourceContainer::styleDidChange(StyleDifference diff, const Comp
utedStyle* oldStyle) |
78 { | 82 { |
79 LayoutSVGHiddenContainer::styleDidChange(diff, oldStyle); | 83 LayoutSVGHiddenContainer::styleDidChange(diff, oldStyle); |
80 | 84 |
81 if (!m_registered) { | 85 if (!m_registered) { |
82 m_registered = true; | 86 m_registered = true; |
83 registerResource(); | 87 registerResource(); |
84 } | 88 } |
85 } | 89 } |
86 | 90 |
| 91 void LayoutSVGResourceContainer::detachAllClients() |
| 92 { |
| 93 for (auto* client : m_clients) { |
| 94 // Unlink the resource from the client's SVGResources. (The actual |
| 95 // removal will be signaled after processing all the clients.) |
| 96 SVGResources* resources = SVGResourcesCache::cachedResourcesForLayoutObj
ect(client); |
| 97 ASSERT(resources); // Or else the client wouldn't be in the list in the
first place. |
| 98 resources->resourceDestroyed(this); |
| 99 |
| 100 // Add a pending resolution based on the id of the old resource. |
| 101 Element* clientElement = toElement(client->node()); |
| 102 svgExtensionsFromElement(clientElement).addPendingResource(m_id, clientE
lement); |
| 103 } |
| 104 |
| 105 removeAllClientsFromCache(); |
| 106 } |
| 107 |
87 void LayoutSVGResourceContainer::idChanged() | 108 void LayoutSVGResourceContainer::idChanged() |
88 { | 109 { |
89 // Invalidate all our current clients. | 110 // Invalidate all our current clients. |
90 removeAllClientsFromCache(); | 111 removeAllClientsFromCache(); |
91 | 112 |
92 // Remove old id, that is guaranteed to be present in cache. | 113 // Remove old id, that is guaranteed to be present in cache. |
93 SVGDocumentExtensions& extensions = svgExtensionsFromElement(element()); | 114 SVGDocumentExtensions& extensions = svgExtensionsFromElement(element()); |
94 extensions.removeResource(m_id); | 115 extensions.removeResource(m_id); |
95 m_id = element()->getIdAttribute(); | 116 m_id = element()->getIdAttribute(); |
96 | 117 |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 // This will process the rest of the ancestors. | 314 // This will process the rest of the ancestors. |
294 toLayoutSVGResourceContainer(current)->removeAllClientsFromCache(); | 315 toLayoutSVGResourceContainer(current)->removeAllClientsFromCache(); |
295 break; | 316 break; |
296 } | 317 } |
297 | 318 |
298 current = current->parent(); | 319 current = current->parent(); |
299 } | 320 } |
300 } | 321 } |
301 | 322 |
302 } | 323 } |
OLD | NEW |