| 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 649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 660 SVGElement* element = instance->correspondingElement(); | 660 SVGElement* element = instance->correspondingElement(); |
| 661 | 661 |
| 662 if (element->hasID() && element->getIdAttribute() == targetId && element
->document() == newTarget->document()) | 662 if (element->hasID() && element->getIdAttribute() == targetId && element
->document() == newTarget->document()) |
| 663 return true; | 663 return true; |
| 664 | 664 |
| 665 instance = instance->parentNode(); | 665 instance = instance->parentNode(); |
| 666 } | 666 } |
| 667 return false; | 667 return false; |
| 668 } | 668 } |
| 669 | 669 |
| 670 static inline void removeDisallowedElementsFromSubtree(Element* subtree) | 670 static inline void removeDisallowedElementsFromSubtree(Element& subtree) |
| 671 { | 671 { |
| 672 ASSERT(!subtree->inDocument()); | 672 ASSERT(!subtree.inDocument()); |
| 673 Element* element = ElementTraversal::firstWithin(subtree); | 673 Element* element = ElementTraversal::firstWithin(subtree); |
| 674 while (element) { | 674 while (element) { |
| 675 if (isDisallowedElement(element)) { | 675 if (isDisallowedElement(element)) { |
| 676 Element* next = ElementTraversal::nextSkippingChildren(element, subt
ree); | 676 Element* next = ElementTraversal::nextSkippingChildren(element, &sub
tree); |
| 677 // The subtree is not in document so this won't generate events that
could mutate the tree. | 677 // The subtree is not in document so this won't generate events that
could mutate the tree. |
| 678 element->parentNode()->removeChild(element); | 678 element->parentNode()->removeChild(element); |
| 679 element = next; | 679 element = next; |
| 680 } else { | 680 } else { |
| 681 element = ElementTraversal::next(*element, subtree); | 681 element = ElementTraversal::next(*element, &subtree); |
| 682 } | 682 } |
| 683 } | 683 } |
| 684 } | 684 } |
| 685 | 685 |
| 686 void SVGUseElement::buildShadowTree(SVGElement* target, SVGElementInstance* targ
etInstance) | 686 void SVGUseElement::buildShadowTree(SVGElement* target, SVGElementInstance* targ
etInstance) |
| 687 { | 687 { |
| 688 // For instance <use> on <foreignObject> (direct case). | 688 // For instance <use> on <foreignObject> (direct case). |
| 689 if (isDisallowedElement(target)) | 689 if (isDisallowedElement(target)) |
| 690 return; | 690 return; |
| 691 | 691 |
| 692 RefPtr<Element> newChild = targetInstance->correspondingElement()->cloneElem
entWithChildren(); | 692 RefPtr<Element> newChild = targetInstance->correspondingElement()->cloneElem
entWithChildren(); |
| 693 | 693 |
| 694 // We don't walk the target tree element-by-element, and clone each element, | 694 // We don't walk the target tree element-by-element, and clone each element, |
| 695 // but instead use cloneElementWithChildren(). This is an optimization for t
he common | 695 // but instead use cloneElementWithChildren(). This is an optimization for t
he common |
| 696 // case where <use> doesn't contain disallowed elements (ie. <foreignObject>
). | 696 // case where <use> doesn't contain disallowed elements (ie. <foreignObject>
). |
| 697 // Though if there are disallowed elements in the subtree, we have to remove
them. | 697 // Though if there are disallowed elements in the subtree, we have to remove
them. |
| 698 // For instance: <use> on <g> containing <foreignObject> (indirect case). | 698 // For instance: <use> on <g> containing <foreignObject> (indirect case). |
| 699 if (subtreeContainsDisallowedElement(newChild.get())) | 699 if (subtreeContainsDisallowedElement(newChild.get())) |
| 700 removeDisallowedElementsFromSubtree(newChild.get()); | 700 removeDisallowedElementsFromSubtree(*newChild); |
| 701 | 701 |
| 702 userAgentShadowRoot()->appendChild(newChild.release()); | 702 userAgentShadowRoot()->appendChild(newChild.release()); |
| 703 } | 703 } |
| 704 | 704 |
| 705 void SVGUseElement::expandUseElementsInShadowTree(Node* element) | 705 void SVGUseElement::expandUseElementsInShadowTree(Node* element) |
| 706 { | 706 { |
| 707 // Why expand the <use> elements in the shadow tree here, and not just | 707 // Why expand the <use> elements in the shadow tree here, and not just |
| 708 // do this directly in buildShadowTree, if we encounter a <use> element? | 708 // do this directly in buildShadowTree, if we encounter a <use> element? |
| 709 // | 709 // |
| 710 // Short answer: Because we may miss to expand some elements. Ie. if a <symb
ol> | 710 // Short answer: Because we may miss to expand some elements. Ie. if a <symb
ol> |
| (...skipping 24 matching lines...) Expand all Loading... |
| 735 ASSERT(newChild->isSVGElement()); | 735 ASSERT(newChild->isSVGElement()); |
| 736 cloneParent->appendChild(newChild.release()); | 736 cloneParent->appendChild(newChild.release()); |
| 737 } | 737 } |
| 738 | 738 |
| 739 // We don't walk the target tree element-by-element, and clone each elem
ent, | 739 // We don't walk the target tree element-by-element, and clone each elem
ent, |
| 740 // but instead use cloneElementWithChildren(). This is an optimization f
or the common | 740 // but instead use cloneElementWithChildren(). This is an optimization f
or the common |
| 741 // case where <use> doesn't contain disallowed elements (ie. <foreignObj
ect>). | 741 // case where <use> doesn't contain disallowed elements (ie. <foreignObj
ect>). |
| 742 // Though if there are disallowed elements in the subtree, we have to re
move them. | 742 // Though if there are disallowed elements in the subtree, we have to re
move them. |
| 743 // For instance: <use> on <g> containing <foreignObject> (indirect case)
. | 743 // For instance: <use> on <g> containing <foreignObject> (indirect case)
. |
| 744 if (subtreeContainsDisallowedElement(cloneParent.get())) | 744 if (subtreeContainsDisallowedElement(cloneParent.get())) |
| 745 removeDisallowedElementsFromSubtree(cloneParent.get()); | 745 removeDisallowedElementsFromSubtree(*cloneParent); |
| 746 | 746 |
| 747 RefPtr<Node> replacingElement(cloneParent.get()); | 747 RefPtr<Node> replacingElement(cloneParent.get()); |
| 748 | 748 |
| 749 // Replace <use> with referenced content. | 749 // Replace <use> with referenced content. |
| 750 ASSERT(use->parentNode()); | 750 ASSERT(use->parentNode()); |
| 751 use->parentNode()->replaceChild(cloneParent.release(), use); | 751 use->parentNode()->replaceChild(cloneParent.release(), use); |
| 752 | 752 |
| 753 // Expand the siblings because the *element* is replaced and we will | 753 // Expand the siblings because the *element* is replaced and we will |
| 754 // lose the sibling chain when we are back from recursion. | 754 // lose the sibling chain when we are back from recursion. |
| 755 element = replacingElement.get(); | 755 element = replacingElement.get(); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 781 RefPtr<Node> newChild = child->cloneNode(true); | 781 RefPtr<Node> newChild = child->cloneNode(true); |
| 782 svgElement->appendChild(newChild.release()); | 782 svgElement->appendChild(newChild.release()); |
| 783 } | 783 } |
| 784 | 784 |
| 785 // We don't walk the target tree element-by-element, and clone each elem
ent, | 785 // We don't walk the target tree element-by-element, and clone each elem
ent, |
| 786 // but instead use cloneNode(deep=true). This is an optimization for the
common | 786 // but instead use cloneNode(deep=true). This is an optimization for the
common |
| 787 // case where <use> doesn't contain disallowed elements (ie. <foreignObj
ect>). | 787 // case where <use> doesn't contain disallowed elements (ie. <foreignObj
ect>). |
| 788 // Though if there are disallowed elements in the subtree, we have to re
move them. | 788 // Though if there are disallowed elements in the subtree, we have to re
move them. |
| 789 // For instance: <use> on <g> containing <foreignObject> (indirect case)
. | 789 // For instance: <use> on <g> containing <foreignObject> (indirect case)
. |
| 790 if (subtreeContainsDisallowedElement(svgElement.get())) | 790 if (subtreeContainsDisallowedElement(svgElement.get())) |
| 791 removeDisallowedElementsFromSubtree(svgElement.get()); | 791 removeDisallowedElementsFromSubtree(*svgElement); |
| 792 | 792 |
| 793 RefPtr<Node> replacingElement(svgElement.get()); | 793 RefPtr<Node> replacingElement(svgElement.get()); |
| 794 | 794 |
| 795 // Replace <symbol> with <svg>. | 795 // Replace <symbol> with <svg>. |
| 796 element->parentNode()->replaceChild(svgElement.release(), element); | 796 element->parentNode()->replaceChild(svgElement.release(), element); |
| 797 | 797 |
| 798 // Expand the siblings because the *element* is replaced and we will | 798 // Expand the siblings because the *element* is replaced and we will |
| 799 // lose the sibling chain when we are back from recursion. | 799 // lose the sibling chain when we are back from recursion. |
| 800 element = replacingElement.get(); | 800 element = replacingElement.get(); |
| 801 for (RefPtr<Node> sibling = element->nextSibling(); sibling; sibling = s
ibling->nextSibling()) | 801 for (RefPtr<Node> sibling = element->nextSibling(); sibling; sibling = s
ibling->nextSibling()) |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 995 | 995 |
| 996 if (m_resource) | 996 if (m_resource) |
| 997 m_resource->removeClient(this); | 997 m_resource->removeClient(this); |
| 998 | 998 |
| 999 m_resource = resource; | 999 m_resource = resource; |
| 1000 if (m_resource) | 1000 if (m_resource) |
| 1001 m_resource->addClient(this); | 1001 m_resource->addClient(this); |
| 1002 } | 1002 } |
| 1003 | 1003 |
| 1004 } | 1004 } |
| OLD | NEW |