| 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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 SVGElementProxySet* LayoutSVGResourceContainer::elementProxySet() { | 60 SVGElementProxySet* LayoutSVGResourceContainer::elementProxySet() { |
| 61 return element()->elementProxySet(); | 61 return element()->elementProxySet(); |
| 62 } | 62 } |
| 63 | 63 |
| 64 void LayoutSVGResourceContainer::notifyContentChanged() { | 64 void LayoutSVGResourceContainer::notifyContentChanged() { |
| 65 if (SVGElementProxySet* proxySet = elementProxySet()) | 65 if (SVGElementProxySet* proxySet = elementProxySet()) |
| 66 proxySet->notifyContentChanged(element()->treeScope()); | 66 proxySet->notifyContentChanged(element()->treeScope()); |
| 67 } | 67 } |
| 68 | 68 |
| 69 void LayoutSVGResourceContainer::willBeDestroyed() { | 69 void LayoutSVGResourceContainer::willBeDestroyed() { |
| 70 // Detach all clients referring to this resource. If the resource itself is | |
| 71 // a client, it will be detached from any such resources by the call to | |
| 72 // LayoutSVGHiddenContainer::willBeDestroyed() below. | |
| 73 detachAllClients(); | |
| 74 | |
| 75 LayoutSVGHiddenContainer::willBeDestroyed(); | 70 LayoutSVGHiddenContainer::willBeDestroyed(); |
| 76 if (!m_registered) | |
| 77 return; | |
| 78 svgTreeScopeResourcesFromElement(element()).removeResource( | 71 svgTreeScopeResourcesFromElement(element()).removeResource( |
| 79 element()->getIdAttribute()); | 72 element()->getIdAttribute(), this); |
| 73 DCHECK(m_clients.isEmpty()); |
| 80 } | 74 } |
| 81 | 75 |
| 82 void LayoutSVGResourceContainer::styleDidChange(StyleDifference diff, | 76 void LayoutSVGResourceContainer::styleDidChange(StyleDifference diff, |
| 83 const ComputedStyle* oldStyle) { | 77 const ComputedStyle* oldStyle) { |
| 84 LayoutSVGHiddenContainer::styleDidChange(diff, oldStyle); | 78 LayoutSVGHiddenContainer::styleDidChange(diff, oldStyle); |
| 85 | |
| 86 if (m_registered) | |
| 87 return; | |
| 88 m_registered = true; | |
| 89 svgTreeScopeResourcesFromElement(element()).updateResource( | 79 svgTreeScopeResourcesFromElement(element()).updateResource( |
| 90 element()->getIdAttribute(), this); | 80 element()->getIdAttribute(), this); |
| 91 } | 81 } |
| 92 | 82 |
| 93 void LayoutSVGResourceContainer::detachAllClients() { | 83 void LayoutSVGResourceContainer::detachAllClients(const AtomicString& toId) { |
| 94 const AtomicString& id = element()->getIdAttribute(); | 84 removeAllClientsFromCache(); |
| 85 |
| 95 for (auto* client : m_clients) { | 86 for (auto* client : m_clients) { |
| 96 // Unlink the resource from the client's SVGResources. (The actual | 87 // Unlink the resource from the client's SVGResources. (The actual |
| 97 // removal will be signaled after processing all the clients.) | 88 // removal will be signaled after processing all the clients.) |
| 98 SVGResources* resources = | 89 SVGResources* resources = |
| 99 SVGResourcesCache::cachedResourcesForLayoutObject(client); | 90 SVGResourcesCache::cachedResourcesForLayoutObject(client); |
| 100 // Or else the client wouldn't be in the list in the first place. | 91 // Or else the client wouldn't be in the list in the first place. |
| 101 DCHECK(resources); | 92 DCHECK(resources); |
| 102 resources->resourceDestroyed(this); | 93 resources->resourceDestroyed(this); |
| 103 | 94 |
| 104 // Add a pending resolution based on the id of the old resource. | 95 // Add a pending resolution based on the id of the old resource. |
| 105 Element* clientElement = toElement(client->node()); | 96 Element* clientElement = toElement(client->node()); |
| 106 svgTreeScopeResourcesFromElement(clientElement) | 97 svgTreeScopeResourcesFromElement(clientElement) |
| 107 .addPendingResource(id, *clientElement); | 98 .addPendingResource(toId, *clientElement); |
| 108 } | 99 } |
| 109 | 100 m_clients.clear(); |
| 110 removeAllClientsFromCache(); | |
| 111 } | 101 } |
| 112 | 102 |
| 113 void LayoutSVGResourceContainer::idChanged(const AtomicString& oldId, | 103 void LayoutSVGResourceContainer::idChanged(const AtomicString& oldId, |
| 114 const AtomicString& newId) { | 104 const AtomicString& newId) { |
| 115 // Invalidate all our current clients. | 105 svgTreeScopeResourcesFromElement(element()).updateResource(oldId, newId, |
| 116 removeAllClientsFromCache(); | 106 this); |
| 117 | |
| 118 // Remove old id, that is guaranteed to be present in cache. | |
| 119 SVGTreeScopeResources& treeScopeResources = | |
| 120 svgTreeScopeResourcesFromElement(element()); | |
| 121 treeScopeResources.removeResource(oldId); | |
| 122 treeScopeResources.updateResource(newId, this); | |
| 123 } | 107 } |
| 124 | 108 |
| 125 void LayoutSVGResourceContainer::markAllClientsForInvalidation( | 109 void LayoutSVGResourceContainer::markAllClientsForInvalidation( |
| 126 InvalidationMode mode) { | 110 InvalidationMode mode) { |
| 127 if (m_isInvalidating) | 111 if (m_isInvalidating) |
| 128 return; | 112 return; |
| 129 SVGElementProxySet* proxySet = elementProxySet(); | 113 SVGElementProxySet* proxySet = elementProxySet(); |
| 130 if (m_clients.isEmpty() && (!proxySet || proxySet->isEmpty())) | 114 if (m_clients.isEmpty() && (!proxySet || proxySet->isEmpty())) |
| 131 return; | 115 return; |
| 132 if (m_invalidationMask & mode) | 116 if (m_invalidationMask & mode) |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 // This will process the rest of the ancestors. | 255 // This will process the rest of the ancestors. |
| 272 toLayoutSVGResourceContainer(current)->removeAllClientsFromCache(); | 256 toLayoutSVGResourceContainer(current)->removeAllClientsFromCache(); |
| 273 break; | 257 break; |
| 274 } | 258 } |
| 275 | 259 |
| 276 current = current->parent(); | 260 current = current->parent(); |
| 277 } | 261 } |
| 278 } | 262 } |
| 279 | 263 |
| 280 } // namespace blink | 264 } // namespace blink |
| OLD | NEW |