| 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 393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 // Set up root SVG element in shadow tree. | 404 // Set up root SVG element in shadow tree. |
| 405 RefPtrWillBeRawPtr<Element> newChild = target->cloneElementWithoutChildren()
; | 405 RefPtrWillBeRawPtr<Element> newChild = target->cloneElementWithoutChildren()
; |
| 406 m_targetElementInstance = toSVGElement(newChild.get()); | 406 m_targetElementInstance = toSVGElement(newChild.get()); |
| 407 ShadowRoot* shadowTreeRootElement = userAgentShadowRoot(); | 407 ShadowRoot* shadowTreeRootElement = userAgentShadowRoot(); |
| 408 shadowTreeRootElement->appendChild(newChild.release()); | 408 shadowTreeRootElement->appendChild(newChild.release()); |
| 409 | 409 |
| 410 // Clone the target subtree into the shadow tree, not handling <use> and <sy
mbol> yet. | 410 // Clone the target subtree into the shadow tree, not handling <use> and <sy
mbol> yet. |
| 411 | 411 |
| 412 // SVG specification does not say a word about <use> & cycles. My view on th
is is: just ignore it! | 412 // SVG specification does not say a word about <use> & cycles. My view on th
is is: just ignore it! |
| 413 // Non-appearing <use> content is easier to debug, then half-appearing conte
nt. | 413 // Non-appearing <use> content is easier to debug, then half-appearing conte
nt. |
| 414 if (!buildShadowTree(target, m_targetElementInstance.get(), false)) { | 414 buildShadowTree(target, m_targetElementInstance.get(), false); |
| 415 clearShadowTree(); | |
| 416 return; | |
| 417 } | |
| 418 | 415 |
| 419 if (instanceTreeIsLoading(m_targetElementInstance.get())) | 416 if (instanceTreeIsLoading(m_targetElementInstance.get())) |
| 420 return; | 417 return; |
| 421 | 418 |
| 422 // Assure shadow tree building was successfull | 419 // Assure shadow tree building was successful. |
| 423 ASSERT(m_targetElementInstance); | 420 ASSERT(m_targetElementInstance); |
| 424 ASSERT(m_targetElementInstance->correspondingUseElement() == this); | 421 ASSERT(m_targetElementInstance->correspondingUseElement() == this); |
| 425 ASSERT(m_targetElementInstance->correspondingElement() == target); | 422 ASSERT(m_targetElementInstance->correspondingElement() == target); |
| 426 | 423 |
| 427 // Expand all <use> elements in the shadow tree. | 424 // Expand all <use> elements in the shadow tree. |
| 428 // Expand means: replace the actual <use> element by what it references. | 425 // Expand means: replace the actual <use> element by what it references. |
| 429 if (!expandUseElementsInShadowTree(m_targetElementInstance.get())) { | 426 if (!expandUseElementsInShadowTree(m_targetElementInstance.get())) { |
| 430 clearShadowTree(); | 427 clearShadowTree(); |
| 431 return; | 428 return; |
| 432 } | 429 } |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 495 // http://dev.w3.org/fxtf/css-masking-1/#the-clip-path | 492 // http://dev.w3.org/fxtf/css-masking-1/#the-clip-path |
| 496 if (!isDirectReference(element)) { | 493 if (!isDirectReference(element)) { |
| 497 // Spec: Indirect references are an error (14.3.5) | 494 // Spec: Indirect references are an error (14.3.5) |
| 498 document().accessSVGExtensions().reportError("Not allowed to use indirec
t reference in <clip-path>"); | 495 document().accessSVGExtensions().reportError("Not allowed to use indirec
t reference in <clip-path>"); |
| 499 return nullptr; | 496 return nullptr; |
| 500 } | 497 } |
| 501 | 498 |
| 502 return &toSVGGraphicsElement(element); | 499 return &toSVGGraphicsElement(element); |
| 503 } | 500 } |
| 504 | 501 |
| 505 bool SVGUseElement::buildShadowTree(SVGElement* target, SVGElement* targetInstan
ce, bool foundUse) | 502 void SVGUseElement::buildShadowTree(SVGElement* target, SVGElement* targetInstan
ce, bool foundUse) |
| 506 { | 503 { |
| 507 ASSERT(target); | 504 ASSERT(target); |
| 508 ASSERT(targetInstance); | 505 ASSERT(targetInstance); |
| 506 ASSERT(!isDisallowedElement(target)); |
| 509 | 507 |
| 510 // Spec: If the referenced object is itself a 'use', or if there are 'use' s
ubelements within the referenced | 508 // Spec: If the referenced object is itself a 'use', or if there are 'use' s
ubelements within the referenced |
| 511 // object, the instance tree will contain recursive expansion of the indirec
t references to form a complete tree. | 509 // object, the instance tree will contain recursive expansion of the indirec
t references to form a complete tree. |
| 512 if (isSVGUseElement(*target)) { | 510 if (isSVGUseElement(*target)) { |
| 513 // We only need to track first degree <use> dependencies. Indirect refer
ences are handled | 511 // We only need to track first degree <use> dependencies. Indirect refer
ences are handled |
| 514 // as the invalidation bubbles up the dependency chain. | 512 // as the invalidation bubbles up the dependency chain. |
| 515 if (!foundUse && !isStructurallyExternal()) { | 513 if (!foundUse && !isStructurallyExternal()) { |
| 516 addReferenceTo(target); | 514 addReferenceTo(target); |
| 517 foundUse = true; | 515 foundUse = true; |
| 518 } | 516 } |
| 519 } else if (isDisallowedElement(target)) { | |
| 520 return false; | |
| 521 } | 517 } |
| 522 | 518 |
| 523 targetInstance->setCorrespondingElement(target); | 519 targetInstance->setCorrespondingElement(target); |
| 524 if (EventTargetData* data = target->eventTargetData()) | 520 if (EventTargetData* data = target->eventTargetData()) |
| 525 data->eventListenerMap.copyEventListenersNotCreatedFromMarkupToTarget(ta
rgetInstance); | 521 data->eventListenerMap.copyEventListenersNotCreatedFromMarkupToTarget(ta
rgetInstance); |
| 526 | 522 |
| 527 for (RefPtrWillBeRawPtr<Node> child = target->firstChild(); child; child = c
hild->nextSibling()) { | 523 for (RefPtrWillBeRawPtr<Node> child = target->firstChild(); child; child = c
hild->nextSibling()) { |
| 528 // Skip any disallowed element. | 524 // Skip any disallowed element. |
| 529 if (isDisallowedElement(child.get())) | 525 if (isDisallowedElement(child.get())) |
| 530 continue; | 526 continue; |
| 531 | 527 |
| 532 RefPtrWillBeRawPtr<Node> newChild = child->cloneNode(false); | 528 RefPtrWillBeRawPtr<Node> newChild = child->cloneNode(false); |
| 533 targetInstance->appendChild(newChild.get()); | 529 targetInstance->appendChild(newChild.get()); |
| 534 if (newChild->isSVGElement()) { | 530 if (newChild->isSVGElement()) { |
| 535 // Enter recursion, appending new instance tree nodes to the "instan
ce" object. | 531 // Enter recursion, appending new instance tree nodes to the "instan
ce" object. |
| 536 if (!buildShadowTree(toSVGElement(child), toSVGElement(newChild), fo
undUse)) | 532 buildShadowTree(toSVGElement(child), toSVGElement(newChild), foundUs
e); |
| 537 return false; | |
| 538 } | 533 } |
| 539 } | 534 } |
| 540 return true; | |
| 541 } | 535 } |
| 542 | 536 |
| 543 bool SVGUseElement::hasCycleUseReferencing(SVGUseElement* use, ContainerNode* ta
rgetInstance, SVGElement*& newTarget) | 537 bool SVGUseElement::hasCycleUseReferencing(SVGUseElement* use, ContainerNode* ta
rgetInstance, SVGElement*& newTarget) |
| 544 { | 538 { |
| 545 ASSERT(referencedScope()); | 539 ASSERT(referencedScope()); |
| 546 Element* targetElement = SVGURIReference::targetElementFromIRIString(use->hr
efString(), *referencedScope()); | 540 Element* targetElement = SVGURIReference::targetElementFromIRIString(use->hr
efString(), *referencedScope()); |
| 547 newTarget = 0; | 541 newTarget = 0; |
| 548 if (targetElement && targetElement->isSVGElement()) | 542 if (targetElement && targetElement->isSVGElement()) |
| 549 newTarget = toSVGElement(targetElement); | 543 newTarget = toSVGElement(targetElement); |
| 550 | 544 |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 835 | 829 |
| 836 if (m_resource) | 830 if (m_resource) |
| 837 m_resource->removeClient(this); | 831 m_resource->removeClient(this); |
| 838 | 832 |
| 839 m_resource = resource; | 833 m_resource = resource; |
| 840 if (m_resource) | 834 if (m_resource) |
| 841 m_resource->addClient(this); | 835 m_resource->addClient(this); |
| 842 } | 836 } |
| 843 | 837 |
| 844 } // namespace blink | 838 } // namespace blink |
| OLD | NEW |