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 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 buildPendingResource(); | 263 buildPendingResource(); |
264 } | 264 } |
265 | 265 |
266 #ifdef DUMP_INSTANCE_TREE | 266 #ifdef DUMP_INSTANCE_TREE |
267 static void dumpInstanceTree(unsigned int& depth, String& text, SVGElementInstan
ce* targetInstance) | 267 static void dumpInstanceTree(unsigned int& depth, String& text, SVGElementInstan
ce* targetInstance) |
268 { | 268 { |
269 SVGElement* element = targetInstance->correspondingElement(); | 269 SVGElement* element = targetInstance->correspondingElement(); |
270 ASSERT(element); | 270 ASSERT(element); |
271 | 271 |
272 if (element->hasTagName(SVGNames::useTag)) { | 272 if (element->hasTagName(SVGNames::useTag)) { |
273 if (static_cast<SVGUseElement*>(element)->cachedDocumentIsStillLoading()
) | 273 if (toSVGUseElement(element)->cachedDocumentIsStillLoading()) |
274 return; | 274 return; |
275 } | 275 } |
276 | 276 |
277 SVGElement* shadowTreeElement = targetInstance->shadowTreeElement(); | 277 SVGElement* shadowTreeElement = targetInstance->shadowTreeElement(); |
278 ASSERT(shadowTreeElement); | 278 ASSERT(shadowTreeElement); |
279 | 279 |
280 SVGUseElement* directUseElement = targetInstance->directUseElement(); | 280 SVGUseElement* directUseElement = targetInstance->directUseElement(); |
281 String directUseElementName = directUseElement ? directUseElement->nodeName(
) : "null"; | 281 String directUseElementName = directUseElement ? directUseElement->nodeName(
) : "null"; |
282 | 282 |
283 String elementId = element->getIdAttribute(); | 283 String elementId = element->getIdAttribute(); |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
572 void SVGUseElement::buildInstanceTree(SVGElement* target, SVGElementInstance* ta
rgetInstance, bool& foundProblem, bool foundUse) | 572 void SVGUseElement::buildInstanceTree(SVGElement* target, SVGElementInstance* ta
rgetInstance, bool& foundProblem, bool foundUse) |
573 { | 573 { |
574 ASSERT(target); | 574 ASSERT(target); |
575 ASSERT(targetInstance); | 575 ASSERT(targetInstance); |
576 | 576 |
577 // Spec: If the referenced object is itself a 'use', or if there are 'use' s
ubelements within the referenced | 577 // Spec: If the referenced object is itself a 'use', or if there are 'use' s
ubelements within the referenced |
578 // object, the instance tree will contain recursive expansion of the indirec
t references to form a complete tree. | 578 // object, the instance tree will contain recursive expansion of the indirec
t references to form a complete tree. |
579 bool targetHasUseTag = target->hasTagName(SVGNames::useTag); | 579 bool targetHasUseTag = target->hasTagName(SVGNames::useTag); |
580 SVGElement* newTarget = 0; | 580 SVGElement* newTarget = 0; |
581 if (targetHasUseTag) { | 581 if (targetHasUseTag) { |
582 foundProblem = hasCycleUseReferencing(static_cast<SVGUseElement*>(target
), targetInstance, newTarget); | 582 foundProblem = hasCycleUseReferencing(toSVGUseElement(target), targetIns
tance, newTarget); |
583 if (foundProblem) | 583 if (foundProblem) |
584 return; | 584 return; |
585 | 585 |
586 // We only need to track first degree <use> dependencies. Indirect refer
ences are handled | 586 // We only need to track first degree <use> dependencies. Indirect refer
ences are handled |
587 // as the invalidation bubbles up the dependency chain. | 587 // as the invalidation bubbles up the dependency chain. |
588 if (!foundUse) { | 588 if (!foundUse) { |
589 ASSERT(document()); | 589 ASSERT(document()); |
590 document()->accessSVGExtensions()->addElementReferencingTarget(this,
target); | 590 document()->accessSVGExtensions()->addElementReferencingTarget(this,
target); |
591 foundUse = true; | 591 foundUse = true; |
592 } | 592 } |
(...skipping 25 matching lines...) Expand all Loading... |
618 | 618 |
619 // Enter recursion, appending new instance tree nodes to the "instance"
object. | 619 // Enter recursion, appending new instance tree nodes to the "instance"
object. |
620 buildInstanceTree(element, instancePtr, foundProblem, foundUse); | 620 buildInstanceTree(element, instancePtr, foundProblem, foundUse); |
621 if (foundProblem) | 621 if (foundProblem) |
622 return; | 622 return; |
623 } | 623 } |
624 | 624 |
625 if (!targetHasUseTag || !newTarget) | 625 if (!targetHasUseTag || !newTarget) |
626 return; | 626 return; |
627 | 627 |
628 RefPtr<SVGElementInstance> newInstance = SVGElementInstance::create(this, st
atic_cast<SVGUseElement*>(target), newTarget); | 628 RefPtr<SVGElementInstance> newInstance = SVGElementInstance::create(this, to
SVGUseElement(target), newTarget); |
629 SVGElementInstance* newInstancePtr = newInstance.get(); | 629 SVGElementInstance* newInstancePtr = newInstance.get(); |
630 targetInstance->appendChild(newInstance.release()); | 630 targetInstance->appendChild(newInstance.release()); |
631 buildInstanceTree(newTarget, newInstancePtr, foundProblem, foundUse); | 631 buildInstanceTree(newTarget, newInstancePtr, foundProblem, foundUse); |
632 } | 632 } |
633 | 633 |
634 bool SVGUseElement::hasCycleUseReferencing(SVGUseElement* use, SVGElementInstanc
e* targetInstance, SVGElement*& newTarget) | 634 bool SVGUseElement::hasCycleUseReferencing(SVGUseElement* use, SVGElementInstanc
e* targetInstance, SVGElement*& newTarget) |
635 { | 635 { |
636 Element* targetElement = SVGURIReference::targetElementFromIRIString(use->hr
efCurrentValue(), referencedDocument()); | 636 Element* targetElement = SVGURIReference::targetElementFromIRIString(use->hr
efCurrentValue(), referencedDocument()); |
637 newTarget = 0; | 637 newTarget = 0; |
638 if (targetElement && targetElement->isSVGElement()) | 638 if (targetElement && targetElement->isSVGElement()) |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
695 void SVGUseElement::expandUseElementsInShadowTree(Node* element) | 695 void SVGUseElement::expandUseElementsInShadowTree(Node* element) |
696 { | 696 { |
697 // Why expand the <use> elements in the shadow tree here, and not just | 697 // Why expand the <use> elements in the shadow tree here, and not just |
698 // do this directly in buildShadowTree, if we encounter a <use> element? | 698 // do this directly in buildShadowTree, if we encounter a <use> element? |
699 // | 699 // |
700 // Short answer: Because we may miss to expand some elements. Ie. if a <symb
ol> | 700 // Short answer: Because we may miss to expand some elements. Ie. if a <symb
ol> |
701 // contains <use> tags, we'd miss them. So once we're done with settin' up t
he | 701 // contains <use> tags, we'd miss them. So once we're done with settin' up t
he |
702 // actual shadow tree (after the special case modification for svg/symbol) w
e have | 702 // actual shadow tree (after the special case modification for svg/symbol) w
e have |
703 // to walk it completely and expand all <use> elements. | 703 // to walk it completely and expand all <use> elements. |
704 if (element->hasTagName(SVGNames::useTag)) { | 704 if (element->hasTagName(SVGNames::useTag)) { |
705 SVGUseElement* use = static_cast<SVGUseElement*>(element); | 705 SVGUseElement* use = toSVGUseElement(element); |
706 ASSERT(!use->cachedDocumentIsStillLoading()); | 706 ASSERT(!use->cachedDocumentIsStillLoading()); |
707 | 707 |
708 Element* targetElement = SVGURIReference::targetElementFromIRIString(use
->hrefCurrentValue(), referencedDocument()); | 708 Element* targetElement = SVGURIReference::targetElementFromIRIString(use
->hrefCurrentValue(), referencedDocument()); |
709 SVGElement* target = 0; | 709 SVGElement* target = 0; |
710 if (targetElement && targetElement->isSVGElement()) | 710 if (targetElement && targetElement->isSVGElement()) |
711 target = toSVGElement(targetElement); | 711 target = toSVGElement(targetElement); |
712 | 712 |
713 // Don't ASSERT(target) here, it may be "pending", too. | 713 // Don't ASSERT(target) here, it may be "pending", too. |
714 // Setup sub-shadow tree root node | 714 // Setup sub-shadow tree root node |
715 RefPtr<SVGGElement> cloneParent = SVGGElement::create(SVGNames::gTag, re
ferencedDocument()); | 715 RefPtr<SVGGElement> cloneParent = SVGGElement::create(SVGNames::gTag, re
ferencedDocument()); |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
983 | 983 |
984 if (m_cachedDocument) | 984 if (m_cachedDocument) |
985 m_cachedDocument->removeClient(this); | 985 m_cachedDocument->removeClient(this); |
986 | 986 |
987 m_cachedDocument = cachedDocument; | 987 m_cachedDocument = cachedDocument; |
988 if (m_cachedDocument) | 988 if (m_cachedDocument) |
989 m_cachedDocument->addClient(this); | 989 m_cachedDocument->addClient(this); |
990 } | 990 } |
991 | 991 |
992 } | 992 } |
OLD | NEW |