OLD | NEW |
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, 2007 Rob Buis <buis@kde.org> | 3 * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org> |
4 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. | 4 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. |
5 * Copyright (C) 2011 Torch Mobile (Beijing) Co. Ltd. All rights reserved. | 5 * Copyright (C) 2011 Torch Mobile (Beijing) Co. Ltd. All rights reserved. |
6 * Copyright (C) 2012 University of Szeged | 6 * Copyright (C) 2012 University of Szeged |
7 * Copyright (C) 2012 Renata Hodovan <reni@webkit.org> | 7 * Copyright (C) 2012 Renata Hodovan <reni@webkit.org> |
8 * | 8 * |
9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
10 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 { | 82 { |
83 visitor->trace(m_x); | 83 visitor->trace(m_x); |
84 visitor->trace(m_y); | 84 visitor->trace(m_y); |
85 visitor->trace(m_width); | 85 visitor->trace(m_width); |
86 visitor->trace(m_height); | 86 visitor->trace(m_height); |
87 visitor->trace(m_targetElementInstance); | 87 visitor->trace(m_targetElementInstance); |
88 SVGGraphicsElement::trace(visitor); | 88 SVGGraphicsElement::trace(visitor); |
89 SVGURIReference::trace(visitor); | 89 SVGURIReference::trace(visitor); |
90 } | 90 } |
91 | 91 |
92 bool SVGUseElement::isSupportedAttribute(const QualifiedName& attrName) | |
93 { | |
94 DEFINE_STATIC_LOCAL(HashSet<QualifiedName>, supportedAttributes, ()); | |
95 if (supportedAttributes.isEmpty()) { | |
96 SVGURIReference::addSupportedAttributes(supportedAttributes); | |
97 supportedAttributes.add(SVGNames::xAttr); | |
98 supportedAttributes.add(SVGNames::yAttr); | |
99 supportedAttributes.add(SVGNames::widthAttr); | |
100 supportedAttributes.add(SVGNames::heightAttr); | |
101 } | |
102 return supportedAttributes.contains<SVGAttributeHashTranslator>(attrName); | |
103 } | |
104 | |
105 #if ENABLE(ASSERT) | 92 #if ENABLE(ASSERT) |
106 static inline bool isWellFormedDocument(Document* document) | 93 static inline bool isWellFormedDocument(Document* document) |
107 { | 94 { |
108 if (document->isXMLDocument()) | 95 if (document->isXMLDocument()) |
109 return static_cast<XMLDocumentParser*>(document->parser())->wellFormed()
; | 96 return static_cast<XMLDocumentParser*>(document->parser())->wellFormed()
; |
110 return true; | 97 return true; |
111 } | 98 } |
112 #endif | 99 #endif |
113 | 100 |
114 Node::InsertionNotificationRequest SVGUseElement::insertedInto(ContainerNode* ro
otParent) | 101 Node::InsertionNotificationRequest SVGUseElement::insertedInto(ContainerNode* ro
otParent) |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 if (property == m_x) | 183 if (property == m_x) |
197 addSVGLengthPropertyToPresentationAttributeStyle(style, CSSPropertyX, *m
_x->currentValue()); | 184 addSVGLengthPropertyToPresentationAttributeStyle(style, CSSPropertyX, *m
_x->currentValue()); |
198 else if (property == m_y) | 185 else if (property == m_y) |
199 addSVGLengthPropertyToPresentationAttributeStyle(style, CSSPropertyY, *m
_y->currentValue()); | 186 addSVGLengthPropertyToPresentationAttributeStyle(style, CSSPropertyY, *m
_y->currentValue()); |
200 else | 187 else |
201 SVGGraphicsElement::collectStyleForPresentationAttribute(name, value, st
yle); | 188 SVGGraphicsElement::collectStyleForPresentationAttribute(name, value, st
yle); |
202 } | 189 } |
203 | 190 |
204 void SVGUseElement::svgAttributeChanged(const QualifiedName& attrName) | 191 void SVGUseElement::svgAttributeChanged(const QualifiedName& attrName) |
205 { | 192 { |
206 if (!isSupportedAttribute(attrName)) { | |
207 SVGGraphicsElement::svgAttributeChanged(attrName); | |
208 return; | |
209 } | |
210 | |
211 SVGElement::InvalidationGuard invalidationGuard(this); | |
212 | |
213 if (attrName == SVGNames::xAttr | 193 if (attrName == SVGNames::xAttr |
214 || attrName == SVGNames::yAttr) { | 194 || attrName == SVGNames::yAttr) { |
215 invalidateSVGPresentationAttributeStyle(); | 195 invalidateSVGPresentationAttributeStyle(); |
216 setNeedsStyleRecalc(LocalStyleChange, | 196 setNeedsStyleRecalc(LocalStyleChange, |
217 StyleChangeReasonForTracing::fromAttribute(attrName)); | 197 StyleChangeReasonForTracing::fromAttribute(attrName)); |
218 } | 198 } |
219 | 199 |
220 LayoutObject* renderer = this->layoutObject(); | 200 LayoutObject* renderer = this->layoutObject(); |
221 if (attrName == SVGNames::xAttr | 201 if (attrName == SVGNames::xAttr |
222 || attrName == SVGNames::yAttr | 202 || attrName == SVGNames::yAttr |
223 || attrName == SVGNames::widthAttr | 203 || attrName == SVGNames::widthAttr |
224 || attrName == SVGNames::heightAttr) { | 204 || attrName == SVGNames::heightAttr) { |
| 205 SVGElement::InvalidationGuard invalidationGuard(this); |
225 updateRelativeLengthsInformation(); | 206 updateRelativeLengthsInformation(); |
226 if (m_targetElementInstance) { | 207 if (m_targetElementInstance) { |
227 ASSERT(m_targetElementInstance->correspondingElement()); | 208 ASSERT(m_targetElementInstance->correspondingElement()); |
228 transferUseWidthAndHeightIfNeeded(*this, m_targetElementInstance.get
(), *m_targetElementInstance->correspondingElement()); | 209 transferUseWidthAndHeightIfNeeded(*this, m_targetElementInstance.get
(), *m_targetElementInstance->correspondingElement()); |
229 } | 210 } |
230 if (renderer) | 211 if (renderer) |
231 markForLayoutAndParentResourceInvalidation(renderer); | 212 markForLayoutAndParentResourceInvalidation(renderer); |
232 return; | 213 return; |
233 } | 214 } |
234 | 215 |
235 if (SVGURIReference::isKnownAttribute(attrName)) { | 216 if (SVGURIReference::isKnownAttribute(attrName)) { |
| 217 SVGElement::InvalidationGuard invalidationGuard(this); |
236 bool isExternalReference = isExternalURIReference(hrefString(), document
()); | 218 bool isExternalReference = isExternalURIReference(hrefString(), document
()); |
237 if (isExternalReference) { | 219 if (isExternalReference) { |
238 KURL url = document().completeURL(hrefString()); | 220 KURL url = document().completeURL(hrefString()); |
239 if (url.hasFragmentIdentifier()) { | 221 if (url.hasFragmentIdentifier()) { |
240 FetchRequest request(ResourceRequest(url), localName()); | 222 FetchRequest request(ResourceRequest(url), localName()); |
241 setDocumentResource(document().fetcher()->fetchSVGDocument(reque
st)); | 223 setDocumentResource(document().fetcher()->fetchSVGDocument(reque
st)); |
242 } | 224 } |
243 } else { | 225 } else { |
244 setDocumentResource(0); | 226 setDocumentResource(0); |
245 } | 227 } |
246 | 228 |
247 invalidateShadowTree(); | 229 invalidateShadowTree(); |
248 | 230 |
249 return; | 231 return; |
250 } | 232 } |
251 | 233 |
252 if (!renderer) | 234 SVGGraphicsElement::svgAttributeChanged(attrName); |
253 return; | |
254 | |
255 ASSERT_NOT_REACHED(); | |
256 } | 235 } |
257 | 236 |
258 static bool isDisallowedElement(Node* node) | 237 static bool isDisallowedElement(Node* node) |
259 { | 238 { |
260 // Spec: "Any 'svg', 'symbol', 'g', graphics element or other 'use' is poten
tially a template object that can be re-used | 239 // Spec: "Any 'svg', 'symbol', 'g', graphics element or other 'use' is poten
tially a template object that can be re-used |
261 // (i.e., "instanced") in the SVG document via a 'use' element." | 240 // (i.e., "instanced") in the SVG document via a 'use' element." |
262 // "Graphics Element" is defined as 'circle', 'ellipse', 'image', 'line', 'p
ath', 'polygon', 'polyline', 'rect', 'text' | 241 // "Graphics Element" is defined as 'circle', 'ellipse', 'image', 'line', 'p
ath', 'polygon', 'polyline', 'rect', 'text' |
263 // Excluded are anything that is used by reference or that only make sense t
o appear once in a document. | 242 // Excluded are anything that is used by reference or that only make sense t
o appear once in a document. |
264 // We must also allow the shadow roots of other use elements. | 243 // We must also allow the shadow roots of other use elements. |
265 if (node->isShadowRoot() || node->isTextNode()) | 244 if (node->isShadowRoot() || node->isTextNode()) |
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
781 | 760 |
782 if (m_resource) | 761 if (m_resource) |
783 m_resource->removeClient(this); | 762 m_resource->removeClient(this); |
784 | 763 |
785 m_resource = resource; | 764 m_resource = resource; |
786 if (m_resource) | 765 if (m_resource) |
787 m_resource->addClient(this); | 766 m_resource->addClient(this); |
788 } | 767 } |
789 | 768 |
790 } | 769 } |
OLD | NEW |