Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(72)

Side by Side Diff: Source/core/svg/SVGElement.cpp

Issue 344883007: SVG: Move/rename reference management to SVGElement (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: remove sed script from CL Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/svg/SVGElement.h ('k') | Source/core/svg/SVGElementRareData.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Nikolas Zimmermann <zimmermann@kde .org> 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Nikolas Zimmermann <zimmermann@kde .org>
3 * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org> 3 * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
4 * Copyright (C) 2008 Apple Inc. All rights reserved. 4 * Copyright (C) 2008 Apple Inc. All rights reserved.
5 * Copyright (C) 2008 Alp Toker <alp@atoker.com> 5 * Copyright (C) 2008 Alp Toker <alp@atoker.com>
6 * Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au> 6 * Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au>
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public 9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 // The below teardown is all handled by weak pointer processing in oilpan. 91 // The below teardown is all handled by weak pointer processing in oilpan.
92 #if !ENABLE(OILPAN) 92 #if !ENABLE(OILPAN)
93 if (hasSVGRareData()) { 93 if (hasSVGRareData()) {
94 if (SVGCursorElement* cursorElement = svgRareData()->cursorElement()) 94 if (SVGCursorElement* cursorElement = svgRareData()->cursorElement())
95 cursorElement->removeReferencedElement(this); 95 cursorElement->removeReferencedElement(this);
96 if (CSSCursorImageValue* cursorImageValue = svgRareData()->cursorImageVa lue()) 96 if (CSSCursorImageValue* cursorImageValue = svgRareData()->cursorImageVa lue())
97 cursorImageValue->removeReferencedElement(this); 97 cursorImageValue->removeReferencedElement(this);
98 98
99 // With Oilpan, either removedFrom has been called or the document is de ad 99 // With Oilpan, either removedFrom has been called or the document is de ad
100 // as well and there is no reason to clear out the references. 100 // as well and there is no reason to clear out the references.
101 document().accessSVGExtensions().rebuildAllElementReferencesForTarget(th is); 101 rebuildAllIncomingReferences();
102 document().accessSVGExtensions().removeAllElementReferencesForTarget(thi s); 102 removeAllIncomingReferences();
103 } 103 }
104 #endif 104 #endif
105 } 105 }
106 106
107 void SVGElement::detach(const AttachContext& context) 107 void SVGElement::detach(const AttachContext& context)
108 { 108 {
109 Element::detach(context); 109 Element::detach(context);
110 if (SVGElement* element = correspondingElement()) 110 if (SVGElement* element = correspondingElement())
111 element->removeInstanceMapping(this); 111 element->removeInstanceMapping(this);
112 } 112 }
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 } 310 }
311 311
312 m_elementsWithRelativeLengths.clear(); 312 m_elementsWithRelativeLengths.clear();
313 } 313 }
314 314
315 ASSERT_WITH_SECURITY_IMPLICATION(!rootParent->isSVGElement() || !toSVGElemen t(rootParent)->m_elementsWithRelativeLengths.contains(this)); 315 ASSERT_WITH_SECURITY_IMPLICATION(!rootParent->isSVGElement() || !toSVGElemen t(rootParent)->m_elementsWithRelativeLengths.contains(this));
316 316
317 Element::removedFrom(rootParent); 317 Element::removedFrom(rootParent);
318 318
319 if (wasInDocument) { 319 if (wasInDocument) {
320 document().accessSVGExtensions().rebuildAllElementReferencesForTarget(th is); 320 rebuildAllIncomingReferences();
321 document().accessSVGExtensions().removeAllElementReferencesForTarget(thi s); 321 removeAllIncomingReferences();
322 } 322 }
323 323
324 invalidateInstances(); 324 invalidateInstances();
325 } 325 }
326 326
327 void SVGElement::childrenChanged(bool changedByParser, Node* beforeChange, Node* afterChange, int childCountDelta) 327 void SVGElement::childrenChanged(bool changedByParser, Node* beforeChange, Node* afterChange, int childCountDelta)
328 { 328 {
329 Element::childrenChanged(changedByParser, beforeChange, afterChange, childCo untDelta); 329 Element::childrenChanged(changedByParser, beforeChange, afterChange, childCo untDelta);
330 330
331 // Invalidate all instances associated with us. 331 // Invalidate all instances associated with us.
(...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after
890 { 890 {
891 ASSERT_NOT_REACHED(); 891 ASSERT_NOT_REACHED();
892 return 0; 892 return 0;
893 } 893 }
894 894
895 void SVGElement::attributeChanged(const QualifiedName& name, const AtomicString& newValue, AttributeModificationReason) 895 void SVGElement::attributeChanged(const QualifiedName& name, const AtomicString& newValue, AttributeModificationReason)
896 { 896 {
897 Element::attributeChanged(name, newValue); 897 Element::attributeChanged(name, newValue);
898 898
899 if (isIdAttributeName(name)) 899 if (isIdAttributeName(name))
900 document().accessSVGExtensions().rebuildAllElementReferencesForTarget(th is); 900 rebuildAllIncomingReferences();
901 901
902 // Changes to the style attribute are processed lazily (see Element::getAttr ibute() and related methods), 902 // Changes to the style attribute are processed lazily (see Element::getAttr ibute() and related methods),
903 // so we don't want changes to the style attribute to result in extra work h ere. 903 // so we don't want changes to the style attribute to result in extra work h ere.
904 if (name != HTMLNames::styleAttr) 904 if (name != HTMLNames::styleAttr)
905 svgAttributeChanged(name); 905 svgAttributeChanged(name);
906 } 906 }
907 907
908 void SVGElement::svgAttributeChanged(const QualifiedName& attrName) 908 void SVGElement::svgAttributeChanged(const QualifiedName& attrName)
909 { 909 {
910 CSSPropertyID propId = SVGElement::cssPropertyIdForSVGAttributeName(attrName ); 910 CSSPropertyID propId = SVGElement::cssPropertyIdForSVGAttributeName(attrName );
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
1145 animatableAttributes.add(SVGNames::zAttr); 1145 animatableAttributes.add(SVGNames::zAttr);
1146 } 1146 }
1147 1147
1148 if (name == classAttr) 1148 if (name == classAttr)
1149 return true; 1149 return true;
1150 1150
1151 return animatableAttributes.contains(name); 1151 return animatableAttributes.contains(name);
1152 } 1152 }
1153 #endif 1153 #endif
1154 1154
1155 SVGElementSet* SVGElement::setOfIncomingReferences() const
1156 {
1157 if (!hasSVGRareData())
1158 return 0;
1159 return &svgRareData()->incomingReferences();
1160 }
1161
1162 void SVGElement::addReferenceTo(SVGElement* targetElement)
1163 {
1164 ASSERT(targetElement);
1165
1166 ensureSVGRareData()->outgoingReferences().add(targetElement);
1167 targetElement->ensureSVGRareData()->incomingReferences().add(this);
1168 }
1169
1170 void SVGElement::rebuildAllIncomingReferences()
1171 {
1172 if (!hasSVGRareData())
1173 return;
1174
1175 const SVGElementSet& incomingReferences = svgRareData()->incomingReferences( );
1176
1177 // Iterate on a snapshot as |incomingReferences| may be altered inside loop.
1178 WillBeHeapVector<RawPtrWillBeMember<SVGElement> > incomingReferencesSnapshot ;
1179 copyToVector(incomingReferences, incomingReferencesSnapshot);
1180
1181 // Force rebuilding the |sourceElement| so it knows about this change.
1182 for (WillBeHeapVector<RawPtrWillBeMember<SVGElement> >::iterator it = incomi ngReferencesSnapshot.begin(), itEnd = incomingReferencesSnapshot.end(); it != it End; ++it) {
1183 SVGElement* sourceElement = *it;
1184
1185 // Before rebuilding |sourceElement| ensure it was not removed from unde r us.
1186 if (incomingReferences.contains(sourceElement))
1187 sourceElement->svgAttributeChanged(XLinkNames::hrefAttr);
1188 }
1189 }
1190
1191 void SVGElement::removeAllIncomingReferences()
1192 {
1193 if (!hasSVGRareData())
1194 return;
1195
1196 SVGElementSet& incomingReferences = svgRareData()->incomingReferences();
1197 for (SVGElementSet::iterator it = incomingReferences.begin(), itEnd = incomi ngReferences.end(); it != itEnd; ++it) {
1198 SVGElement* sourceElement = *it;
1199 ASSERT(sourceElement->hasSVGRareData());
1200 sourceElement->ensureSVGRareData()->outgoingReferences().remove(this);
1201 }
1202 incomingReferences.clear();
1203 }
1204
1205 void SVGElement::removeAllOutgoingReferences()
1206 {
1207 if (!hasSVGRareData())
1208 return;
1209
1210 SVGElementSet& outgoingReferences = svgRareData()->outgoingReferences();
1211 for (SVGElementSet::iterator it = outgoingReferences.begin(), itEnd = outgoi ngReferences.end(); it != itEnd; ++it) {
1212 SVGElement* targetElement = *it;
1213 ASSERT(targetElement->hasSVGRareData());
1214 targetElement->ensureSVGRareData()->incomingReferences().remove(this);
1215 }
1216 outgoingReferences.clear();
1217 }
1218
1155 void SVGElement::trace(Visitor* visitor) 1219 void SVGElement::trace(Visitor* visitor)
1156 { 1220 {
1157 visitor->trace(m_elementsWithRelativeLengths); 1221 visitor->trace(m_elementsWithRelativeLengths);
1158 visitor->trace(m_SVGRareData); 1222 visitor->trace(m_SVGRareData);
1159 Element::trace(visitor); 1223 Element::trace(visitor);
1160 } 1224 }
1161 1225
1162 const AtomicString& SVGElement::eventParameterName() 1226 const AtomicString& SVGElement::eventParameterName()
1163 { 1227 {
1164 DEFINE_STATIC_LOCAL(const AtomicString, evtString, ("evt", AtomicString::Con structFromLiteral)); 1228 DEFINE_STATIC_LOCAL(const AtomicString, evtString, ("evt", AtomicString::Con structFromLiteral));
1165 return evtString; 1229 return evtString;
1166 } 1230 }
1167 1231
1168 } 1232 }
OLDNEW
« no previous file with comments | « Source/core/svg/SVGElement.h ('k') | Source/core/svg/SVGElementRareData.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698