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 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
236 | 236 |
237 ASSERT_NOT_REACHED(); | 237 ASSERT_NOT_REACHED(); |
238 } | 238 } |
239 | 239 |
240 #ifdef DUMP_INSTANCE_TREE | 240 #ifdef DUMP_INSTANCE_TREE |
241 static void dumpInstanceTree(unsigned int& depth, String& text, SVGElementInstan
ce* targetInstance) | 241 static void dumpInstanceTree(unsigned int& depth, String& text, SVGElementInstan
ce* targetInstance) |
242 { | 242 { |
243 SVGElement* element = targetInstance->correspondingElement(); | 243 SVGElement* element = targetInstance->correspondingElement(); |
244 ASSERT(element); | 244 ASSERT(element); |
245 | 245 |
246 if (element->hasTagName(SVGNames::useTag)) { | 246 if (isSVGUseElement(*element) && toSVGUseElement(*element).resourceIsStillLo
ading()) |
247 if (toSVGUseElement(element)->resourceIsStillLoading()) | 247 return; |
248 return; | |
249 } | |
250 | 248 |
251 SVGElement* shadowTreeElement = targetInstance->shadowTreeElement(); | 249 SVGElement* shadowTreeElement = targetInstance->shadowTreeElement(); |
252 ASSERT(shadowTreeElement); | 250 ASSERT(shadowTreeElement); |
253 | 251 |
254 SVGUseElement* directUseElement = targetInstance->directUseElement(); | 252 SVGUseElement* directUseElement = targetInstance->directUseElement(); |
255 String directUseElementName = directUseElement ? directUseElement->nodeName(
) : "null"; | 253 String directUseElementName = directUseElement ? directUseElement->nodeName(
) : "null"; |
256 | 254 |
257 String elementId = element->getIdAttribute(); | 255 String elementId = element->getIdAttribute(); |
258 String elementNodeName = element->nodeName(); | 256 String elementNodeName = element->nodeName(); |
259 String shadowTreeElementNodeName = shadowTreeElement->nodeName(); | 257 String shadowTreeElementNodeName = shadowTreeElement->nodeName(); |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
550 return 0; | 548 return 0; |
551 } | 549 } |
552 | 550 |
553 void SVGUseElement::buildInstanceTree(SVGElement* target, SVGElementInstance* ta
rgetInstance, bool& foundProblem, bool foundUse) | 551 void SVGUseElement::buildInstanceTree(SVGElement* target, SVGElementInstance* ta
rgetInstance, bool& foundProblem, bool foundUse) |
554 { | 552 { |
555 ASSERT(target); | 553 ASSERT(target); |
556 ASSERT(targetInstance); | 554 ASSERT(targetInstance); |
557 | 555 |
558 // Spec: If the referenced object is itself a 'use', or if there are 'use' s
ubelements within the referenced | 556 // Spec: If the referenced object is itself a 'use', or if there are 'use' s
ubelements within the referenced |
559 // object, the instance tree will contain recursive expansion of the indirec
t references to form a complete tree. | 557 // object, the instance tree will contain recursive expansion of the indirec
t references to form a complete tree. |
560 bool targetHasUseTag = target->hasTagName(SVGNames::useTag); | 558 bool targetIsUseElement = isSVGUseElement(*target); |
561 SVGElement* newTarget = 0; | 559 SVGElement* newTarget = 0; |
562 if (targetHasUseTag) { | 560 if (targetIsUseElement) { |
563 foundProblem = hasCycleUseReferencing(toSVGUseElement(target), targetIns
tance, newTarget); | 561 foundProblem = hasCycleUseReferencing(toSVGUseElement(target), targetIns
tance, newTarget); |
564 if (foundProblem) | 562 if (foundProblem) |
565 return; | 563 return; |
566 | 564 |
567 // We only need to track first degree <use> dependencies. Indirect refer
ences are handled | 565 // We only need to track first degree <use> dependencies. Indirect refer
ences are handled |
568 // as the invalidation bubbles up the dependency chain. | 566 // as the invalidation bubbles up the dependency chain. |
569 if (!foundUse) { | 567 if (!foundUse) { |
570 document().accessSVGExtensions().addElementReferencingTarget(this, t
arget); | 568 document().accessSVGExtensions().addElementReferencingTarget(this, t
arget); |
571 foundUse = true; | 569 foundUse = true; |
572 } | 570 } |
(...skipping 22 matching lines...) Expand all Loading... |
595 RefPtr<SVGElementInstance> instance = SVGElementInstance::create(this, 0
, element); | 593 RefPtr<SVGElementInstance> instance = SVGElementInstance::create(this, 0
, element); |
596 SVGElementInstance* instancePtr = instance.get(); | 594 SVGElementInstance* instancePtr = instance.get(); |
597 targetInstance->appendChild(instance.release()); | 595 targetInstance->appendChild(instance.release()); |
598 | 596 |
599 // Enter recursion, appending new instance tree nodes to the "instance"
object. | 597 // Enter recursion, appending new instance tree nodes to the "instance"
object. |
600 buildInstanceTree(element, instancePtr, foundProblem, foundUse); | 598 buildInstanceTree(element, instancePtr, foundProblem, foundUse); |
601 if (foundProblem) | 599 if (foundProblem) |
602 return; | 600 return; |
603 } | 601 } |
604 | 602 |
605 if (!targetHasUseTag || !newTarget) | 603 if (!targetIsUseElement || !newTarget) |
606 return; | 604 return; |
607 | 605 |
608 RefPtr<SVGElementInstance> newInstance = SVGElementInstance::create(this, to
SVGUseElement(target), newTarget); | 606 RefPtr<SVGElementInstance> newInstance = SVGElementInstance::create(this, to
SVGUseElement(target), newTarget); |
609 SVGElementInstance* newInstancePtr = newInstance.get(); | 607 SVGElementInstance* newInstancePtr = newInstance.get(); |
610 targetInstance->appendChild(newInstance.release()); | 608 targetInstance->appendChild(newInstance.release()); |
611 buildInstanceTree(newTarget, newInstancePtr, foundProblem, foundUse); | 609 buildInstanceTree(newTarget, newInstancePtr, foundProblem, foundUse); |
612 } | 610 } |
613 | 611 |
614 bool SVGUseElement::hasCycleUseReferencing(SVGUseElement* use, SVGElementInstanc
e* targetInstance, SVGElement*& newTarget) | 612 bool SVGUseElement::hasCycleUseReferencing(SVGUseElement* use, SVGElementInstanc
e* targetInstance, SVGElement*& newTarget) |
615 { | 613 { |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
669 // Though if there are disallowed elements in the subtree, we have to remove
them. | 667 // Though if there are disallowed elements in the subtree, we have to remove
them. |
670 // For instance: <use> on <g> containing <foreignObject> (indirect case). | 668 // For instance: <use> on <g> containing <foreignObject> (indirect case). |
671 if (subtreeContainsDisallowedElement(newChild.get())) | 669 if (subtreeContainsDisallowedElement(newChild.get())) |
672 removeDisallowedElementsFromSubtree(*newChild); | 670 removeDisallowedElementsFromSubtree(*newChild); |
673 | 671 |
674 userAgentShadowRoot()->appendChild(newChild.release()); | 672 userAgentShadowRoot()->appendChild(newChild.release()); |
675 } | 673 } |
676 | 674 |
677 void SVGUseElement::expandUseElementsInShadowTree(Node* element) | 675 void SVGUseElement::expandUseElementsInShadowTree(Node* element) |
678 { | 676 { |
| 677 ASSERT(element); |
679 // Why expand the <use> elements in the shadow tree here, and not just | 678 // Why expand the <use> elements in the shadow tree here, and not just |
680 // do this directly in buildShadowTree, if we encounter a <use> element? | 679 // do this directly in buildShadowTree, if we encounter a <use> element? |
681 // | 680 // |
682 // Short answer: Because we may miss to expand some elements. Ie. if a <symb
ol> | 681 // Short answer: Because we may miss to expand some elements. Ie. if a <symb
ol> |
683 // contains <use> tags, we'd miss them. So once we're done with settin' up t
he | 682 // contains <use> tags, we'd miss them. So once we're done with settin' up t
he |
684 // actual shadow tree (after the special case modification for svg/symbol) w
e have | 683 // actual shadow tree (after the special case modification for svg/symbol) w
e have |
685 // to walk it completely and expand all <use> elements. | 684 // to walk it completely and expand all <use> elements. |
686 if (element->hasTagName(SVGNames::useTag)) { | 685 if (isSVGUseElement(*element)) { |
687 SVGUseElement* use = toSVGUseElement(element); | 686 SVGUseElement* use = toSVGUseElement(element); |
688 ASSERT(!use->resourceIsStillLoading()); | 687 ASSERT(!use->resourceIsStillLoading()); |
689 | 688 |
690 ASSERT(referencedDocument()); | 689 ASSERT(referencedDocument()); |
691 Element* targetElement = SVGURIReference::targetElementFromIRIString(use
->hrefString(), *referencedDocument()); | 690 Element* targetElement = SVGURIReference::targetElementFromIRIString(use
->hrefString(), *referencedDocument()); |
692 SVGElement* target = 0; | 691 SVGElement* target = 0; |
693 if (targetElement && targetElement->isSVGElement()) | 692 if (targetElement && targetElement->isSVGElement()) |
694 target = toSVGElement(targetElement); | 693 target = toSVGElement(targetElement); |
695 | 694 |
696 // Don't ASSERT(target) here, it may be "pending", too. | 695 // Don't ASSERT(target) here, it may be "pending", too. |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
974 | 973 |
975 if (m_resource) | 974 if (m_resource) |
976 m_resource->removeClient(this); | 975 m_resource->removeClient(this); |
977 | 976 |
978 m_resource = resource; | 977 m_resource = resource; |
979 if (m_resource) | 978 if (m_resource) |
980 m_resource->addClient(this); | 979 m_resource->addClient(this); |
981 } | 980 } |
982 | 981 |
983 } | 982 } |
OLD | NEW |