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 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 ThreadState::current()->registerPreFinalizer(this); | 67 ThreadState::current()->registerPreFinalizer(this); |
68 | 68 |
69 addToPropertyMap(m_x); | 69 addToPropertyMap(m_x); |
70 addToPropertyMap(m_y); | 70 addToPropertyMap(m_y); |
71 addToPropertyMap(m_width); | 71 addToPropertyMap(m_width); |
72 addToPropertyMap(m_height); | 72 addToPropertyMap(m_height); |
73 } | 73 } |
74 | 74 |
75 SVGUseElement* SVGUseElement::create(Document& document) | 75 SVGUseElement* SVGUseElement::create(Document& document) |
76 { | 76 { |
77 // Always build a user agent #shadow-root for SVGUseElement. | 77 // Always build a closed #shadow-root for SVGUseElement. |
78 SVGUseElement* use = new SVGUseElement(document); | 78 SVGUseElement* use = new SVGUseElement(document); |
79 use->ensureUserAgentShadowRoot(); | 79 use->ensureShadow().addShadowRoot(*use, ShadowRootType::Open); |
80 return use; | 80 return use; |
81 } | 81 } |
82 | 82 |
83 SVGUseElement::~SVGUseElement() | 83 SVGUseElement::~SVGUseElement() |
84 { | 84 { |
85 } | 85 } |
86 | 86 |
87 void SVGUseElement::dispose() | 87 void SVGUseElement::dispose() |
88 { | 88 { |
89 setDocumentResource(nullptr); | 89 setDocumentResource(nullptr); |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
295 { | 295 { |
296 if (m_targetElementInstance) | 296 if (m_targetElementInstance) |
297 m_targetElementInstance = nullptr; | 297 m_targetElementInstance = nullptr; |
298 } | 298 } |
299 | 299 |
300 void SVGUseElement::clearShadowTree() | 300 void SVGUseElement::clearShadowTree() |
301 { | 301 { |
302 clearInstanceRoot(); | 302 clearInstanceRoot(); |
303 | 303 |
304 // FIXME: We should try to optimize this, to at least allow partial reclones
. | 304 // FIXME: We should try to optimize this, to at least allow partial reclones
. |
305 if (ShadowRoot* shadowTreeRootElement = userAgentShadowRoot()) | 305 if (ShadowRoot* shadowTreeRootElement = openShadowRoot()) |
306 shadowTreeRootElement->removeChildren(OmitSubtreeModifiedEvent); | 306 shadowTreeRootElement->removeChildren(OmitSubtreeModifiedEvent); |
307 | 307 |
308 removeAllOutgoingReferences(); | 308 removeAllOutgoingReferences(); |
309 } | 309 } |
310 | 310 |
311 Element* SVGUseElement::resolveTargetElement() | 311 Element* SVGUseElement::resolveTargetElement() |
312 { | 312 { |
313 if (m_elementIdentifier.isEmpty()) | 313 if (m_elementIdentifier.isEmpty()) |
314 return nullptr; | 314 return nullptr; |
315 const TreeScope* lookupScope = nullptr; | 315 const TreeScope* lookupScope = nullptr; |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
430 return; | 430 return; |
431 | 431 |
432 // Do not allow self-referencing. | 432 // Do not allow self-referencing. |
433 if (&target == this || isDisallowedElement(target)) | 433 if (&target == this || isDisallowedElement(target)) |
434 return; | 434 return; |
435 | 435 |
436 // Set up root SVG element in shadow tree. | 436 // Set up root SVG element in shadow tree. |
437 // Clone the target subtree into the shadow tree, not handling <use> and <sy
mbol> yet. | 437 // Clone the target subtree into the shadow tree, not handling <use> and <sy
mbol> yet. |
438 Element* instanceRoot = createInstanceTree(target); | 438 Element* instanceRoot = createInstanceTree(target); |
439 m_targetElementInstance = toSVGElement(instanceRoot); | 439 m_targetElementInstance = toSVGElement(instanceRoot); |
440 ShadowRoot* shadowTreeRootElement = userAgentShadowRoot(); | 440 ShadowRoot* shadowTreeRootElement = openShadowRoot(); |
441 shadowTreeRootElement->appendChild(instanceRoot); | 441 shadowTreeRootElement->appendChild(instanceRoot); |
442 | 442 |
443 addReferencesToFirstDegreeNestedUseElements(target); | 443 addReferencesToFirstDegreeNestedUseElements(target); |
444 | 444 |
445 if (instanceTreeIsLoading()) { | 445 if (instanceTreeIsLoading()) { |
446 cloneNonMarkupEventListeners(); | 446 cloneNonMarkupEventListeners(); |
447 return; | 447 return; |
448 } | 448 } |
449 | 449 |
450 // Assure shadow tree building was successful. | 450 // Assure shadow tree building was successful. |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
499 toSVGGeometryElement(*element).toClipPath(path); | 499 toSVGGeometryElement(*element).toClipPath(path); |
500 // FIXME: Avoid manual resolution of x/y here. Its potentially harmful. | 500 // FIXME: Avoid manual resolution of x/y here. Its potentially harmful. |
501 SVGLengthContext lengthContext(this); | 501 SVGLengthContext lengthContext(this); |
502 path.translate(FloatSize(m_x->currentValue()->value(lengthContext), m_y-
>currentValue()->value(lengthContext))); | 502 path.translate(FloatSize(m_x->currentValue()->value(lengthContext), m_y-
>currentValue()->value(lengthContext))); |
503 path.transform(calculateAnimatedLocalTransform()); | 503 path.transform(calculateAnimatedLocalTransform()); |
504 } | 504 } |
505 } | 505 } |
506 | 506 |
507 SVGGraphicsElement* SVGUseElement::visibleTargetGraphicsElementForClipping() con
st | 507 SVGGraphicsElement* SVGUseElement::visibleTargetGraphicsElementForClipping() con
st |
508 { | 508 { |
509 Node* n = userAgentShadowRoot()->firstChild(); | 509 Node* n = openShadowRoot()->firstChild(); |
510 if (!n || !n->isSVGElement()) | 510 if (!n || !n->isSVGElement()) |
511 return nullptr; | 511 return nullptr; |
512 | 512 |
513 SVGElement& element = toSVGElement(*n); | 513 SVGElement& element = toSVGElement(*n); |
514 | 514 |
515 if (!element.isSVGGraphicsElement()) | 515 if (!element.isSVGGraphicsElement()) |
516 return nullptr; | 516 return nullptr; |
517 | 517 |
518 if (!element.layoutObject()) | 518 if (!element.layoutObject()) |
519 return nullptr; | 519 return nullptr; |
(...skipping 23 matching lines...) Expand all Loading... |
543 // references are handled as the invalidation bubbles up the dependency | 543 // references are handled as the invalidation bubbles up the dependency |
544 // chain. | 544 // chain. |
545 SVGUseElement* useElement = | 545 SVGUseElement* useElement = |
546 isSVGUseElement(target) ? toSVGUseElement(&target) : Traversal<SVGUseEle
ment>::firstWithin(target); | 546 isSVGUseElement(target) ? toSVGUseElement(&target) : Traversal<SVGUseEle
ment>::firstWithin(target); |
547 for (; useElement; useElement = Traversal<SVGUseElement>::nextSkippingChildr
en(*useElement, &target)) | 547 for (; useElement; useElement = Traversal<SVGUseElement>::nextSkippingChildr
en(*useElement, &target)) |
548 addReferenceTo(useElement); | 548 addReferenceTo(useElement); |
549 } | 549 } |
550 | 550 |
551 void SVGUseElement::cloneNonMarkupEventListeners() | 551 void SVGUseElement::cloneNonMarkupEventListeners() |
552 { | 552 { |
553 for (SVGElement& element : Traversal<SVGElement>::descendantsOf(*userAgentSh
adowRoot())) { | 553 for (SVGElement& element : Traversal<SVGElement>::descendantsOf(*openShadowR
oot())) { |
554 if (EventTargetData* data = element.correspondingElement()->eventTargetD
ata()) | 554 if (EventTargetData* data = element.correspondingElement()->eventTargetD
ata()) |
555 data->eventListenerMap.copyEventListenersNotCreatedFromMarkupToTarge
t(&element); | 555 data->eventListenerMap.copyEventListenersNotCreatedFromMarkupToTarge
t(&element); |
556 } | 556 } |
557 } | 557 } |
558 | 558 |
559 bool SVGUseElement::hasCycleUseReferencing(const SVGUseElement& use, const Conta
inerNode& targetInstance, SVGElement*& newTarget) const | 559 bool SVGUseElement::hasCycleUseReferencing(const SVGUseElement& use, const Conta
inerNode& targetInstance, SVGElement*& newTarget) const |
560 { | 560 { |
561 Element* targetElement = targetElementFromIRIString(use.hrefString(), use.tr
eeScope()); | 561 Element* targetElement = targetElementFromIRIString(use.hrefString(), use.tr
eeScope()); |
562 newTarget = 0; | 562 newTarget = 0; |
563 if (targetElement && targetElement->isSVGElement()) | 563 if (targetElement && targetElement->isSVGElement()) |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
597 | 597 |
598 bool SVGUseElement::expandUseElementsInShadowTree() | 598 bool SVGUseElement::expandUseElementsInShadowTree() |
599 { | 599 { |
600 // Why expand the <use> elements in the shadow tree here, and not just | 600 // Why expand the <use> elements in the shadow tree here, and not just |
601 // do this directly in buildShadowTree, if we encounter a <use> element? | 601 // do this directly in buildShadowTree, if we encounter a <use> element? |
602 // | 602 // |
603 // Short answer: Because we may miss to expand some elements. For example, i
f a <symbol> | 603 // Short answer: Because we may miss to expand some elements. For example, i
f a <symbol> |
604 // contains <use> tags, we'd miss them. So once we're done with setting up t
he | 604 // contains <use> tags, we'd miss them. So once we're done with setting up t
he |
605 // actual shadow tree (after the special case modification for svg/symbol) w
e have | 605 // actual shadow tree (after the special case modification for svg/symbol) w
e have |
606 // to walk it completely and expand all <use> elements. | 606 // to walk it completely and expand all <use> elements. |
607 ShadowRoot* shadowRoot = userAgentShadowRoot(); | 607 ShadowRoot* shadowRoot = openShadowRoot(); |
608 for (SVGUseElement* use = Traversal<SVGUseElement>::firstWithin(*shadowRoot)
; use; ) { | 608 for (SVGUseElement* use = Traversal<SVGUseElement>::firstWithin(*shadowRoot)
; use; ) { |
609 ASSERT(!use->resourceIsStillLoading()); | 609 ASSERT(!use->resourceIsStillLoading()); |
610 | 610 |
611 SVGUseElement& originalUse = toSVGUseElement(*use->correspondingElement(
)); | 611 SVGUseElement& originalUse = toSVGUseElement(*use->correspondingElement(
)); |
612 SVGElement* target = nullptr; | 612 SVGElement* target = nullptr; |
613 if (hasCycleUseReferencing(originalUse, *use, target)) | 613 if (hasCycleUseReferencing(originalUse, *use, target)) |
614 return false; | 614 return false; |
615 | 615 |
616 if (target && isDisallowedElement(*target)) | 616 if (target && isDisallowedElement(*target)) |
617 return false; | 617 return false; |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
735 bool SVGUseElement::resourceIsValid() const | 735 bool SVGUseElement::resourceIsValid() const |
736 { | 736 { |
737 return m_resource | 737 return m_resource |
738 && m_resource->isLoaded() | 738 && m_resource->isLoaded() |
739 && !m_resource->errorOccurred() | 739 && !m_resource->errorOccurred() |
740 && m_resource->document(); | 740 && m_resource->document(); |
741 } | 741 } |
742 | 742 |
743 bool SVGUseElement::instanceTreeIsLoading() const | 743 bool SVGUseElement::instanceTreeIsLoading() const |
744 { | 744 { |
745 for (const SVGUseElement& useElement : Traversal<SVGUseElement>::descendants
Of(*userAgentShadowRoot())) { | 745 for (const SVGUseElement& useElement : Traversal<SVGUseElement>::descendants
Of(*openShadowRoot())) { |
746 if (useElement.resourceIsStillLoading()) | 746 if (useElement.resourceIsStillLoading()) |
747 return true; | 747 return true; |
748 } | 748 } |
749 return false; | 749 return false; |
750 } | 750 } |
751 | 751 |
752 void SVGUseElement::setDocumentResource(DocumentResource* resource) | 752 void SVGUseElement::setDocumentResource(DocumentResource* resource) |
753 { | 753 { |
754 if (m_resource == resource) | 754 if (m_resource == resource) |
755 return; | 755 return; |
756 | 756 |
757 if (m_resource) | 757 if (m_resource) |
758 m_resource->removeClient(this); | 758 m_resource->removeClient(this); |
759 | 759 |
760 m_resource = resource; | 760 m_resource = resource; |
761 if (m_resource) | 761 if (m_resource) |
762 m_resource->addClient(this); | 762 m_resource->addClient(this); |
763 } | 763 } |
764 | 764 |
765 } // namespace blink | 765 } // namespace blink |
OLD | NEW |