| 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 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 | 181 |
| 182 void SVGUseElement::removedFrom(ContainerNode* rootParent) | 182 void SVGUseElement::removedFrom(ContainerNode* rootParent) |
| 183 { | 183 { |
| 184 SVGGraphicsElement::removedFrom(rootParent); | 184 SVGGraphicsElement::removedFrom(rootParent); |
| 185 if (rootParent->inDocument()) | 185 if (rootParent->inDocument()) |
| 186 clearResourceReferences(); | 186 clearResourceReferences(); |
| 187 } | 187 } |
| 188 | 188 |
| 189 Document* SVGUseElement::referencedDocument() const | 189 Document* SVGUseElement::referencedDocument() const |
| 190 { | 190 { |
| 191 if (!isExternalURIReference(href(), document())) | 191 if (!isExternalURIReference(hrefCurrentValue(), document())) |
| 192 return document(); | 192 return document(); |
| 193 return externalDocument(); | 193 return externalDocument(); |
| 194 } | 194 } |
| 195 | 195 |
| 196 Document* SVGUseElement::externalDocument() const | 196 Document* SVGUseElement::externalDocument() const |
| 197 { | 197 { |
| 198 if (m_cachedDocument && m_cachedDocument->isLoaded()) { | 198 if (m_cachedDocument && m_cachedDocument->isLoaded()) { |
| 199 // Gracefully handle error condition. | 199 // Gracefully handle error condition. |
| 200 if (m_cachedDocument->errorOccurred()) | 200 if (m_cachedDocument->errorOccurred()) |
| 201 return 0; | 201 return 0; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 222 updateRelativeLengthsInformation(); | 222 updateRelativeLengthsInformation(); |
| 223 if (renderer) | 223 if (renderer) |
| 224 RenderSVGResource::markForLayoutAndParentResourceInvalidation(render
er); | 224 RenderSVGResource::markForLayoutAndParentResourceInvalidation(render
er); |
| 225 return; | 225 return; |
| 226 } | 226 } |
| 227 | 227 |
| 228 if (SVGExternalResourcesRequired::handleAttributeChange(this, attrName)) | 228 if (SVGExternalResourcesRequired::handleAttributeChange(this, attrName)) |
| 229 return; | 229 return; |
| 230 | 230 |
| 231 if (SVGURIReference::isKnownAttribute(attrName)) { | 231 if (SVGURIReference::isKnownAttribute(attrName)) { |
| 232 bool isExternalReference = isExternalURIReference(href(), document()); | 232 bool isExternalReference = isExternalURIReference(hrefCurrentValue(), do
cument()); |
| 233 if (isExternalReference) { | 233 if (isExternalReference) { |
| 234 KURL url = document()->completeURL(href()); | 234 KURL url = document()->completeURL(hrefCurrentValue()); |
| 235 if (url.hasFragmentIdentifier()) { | 235 if (url.hasFragmentIdentifier()) { |
| 236 CachedResourceRequest request(ResourceRequest(url.string()), loc
alName()); | 236 CachedResourceRequest request(ResourceRequest(url.string()), loc
alName()); |
| 237 setCachedDocument(document()->cachedResourceLoader()->requestSVG
Document(request)); | 237 setCachedDocument(document()->cachedResourceLoader()->requestSVG
Document(request)); |
| 238 } | 238 } |
| 239 } else | 239 } else |
| 240 setCachedDocument(0); | 240 setCachedDocument(0); |
| 241 | 241 |
| 242 if (!m_wasInsertedByParser) | 242 if (!m_wasInsertedByParser) |
| 243 buildPendingResource(); | 243 buildPendingResource(); |
| 244 | 244 |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 | 391 |
| 392 void SVGUseElement::buildPendingResource() | 392 void SVGUseElement::buildPendingResource() |
| 393 { | 393 { |
| 394 if (!referencedDocument() || isInShadowTree()) | 394 if (!referencedDocument() || isInShadowTree()) |
| 395 return; | 395 return; |
| 396 clearResourceReferences(); | 396 clearResourceReferences(); |
| 397 if (!inDocument()) | 397 if (!inDocument()) |
| 398 return; | 398 return; |
| 399 | 399 |
| 400 String id; | 400 String id; |
| 401 Element* target = SVGURIReference::targetElementFromIRIString(href(), docume
nt(), &id, externalDocument()); | 401 Element* target = SVGURIReference::targetElementFromIRIString(hrefCurrentVal
ue(), document(), &id, externalDocument()); |
| 402 if (!target || !target->inDocument()) { | 402 if (!target || !target->inDocument()) { |
| 403 // If we can't find the target of an external element, just give up. | 403 // If we can't find the target of an external element, just give up. |
| 404 // We can't observe if the target somewhen enters the external document,
nor should we do it. | 404 // We can't observe if the target somewhen enters the external document,
nor should we do it. |
| 405 if (externalDocument()) | 405 if (externalDocument()) |
| 406 return; | 406 return; |
| 407 if (id.isEmpty()) | 407 if (id.isEmpty()) |
| 408 return; | 408 return; |
| 409 | 409 |
| 410 referencedDocument()->accessSVGExtensions()->addPendingResource(id, this
); | 410 referencedDocument()->accessSVGExtensions()->addPendingResource(id, this
); |
| 411 ASSERT(hasPendingResources()); | 411 ASSERT(hasPendingResources()); |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 544 return; | 544 return; |
| 545 | 545 |
| 546 if (n->isSVGElement() && toSVGElement(n)->isSVGGraphicsElement()) { | 546 if (n->isSVGElement() && toSVGElement(n)->isSVGGraphicsElement()) { |
| 547 if (!isDirectReference(n)) | 547 if (!isDirectReference(n)) |
| 548 // Spec: Indirect references are an error (14.3.5) | 548 // Spec: Indirect references are an error (14.3.5) |
| 549 document()->accessSVGExtensions()->reportError("Not allowed to use i
ndirect reference in <clip-path>"); | 549 document()->accessSVGExtensions()->reportError("Not allowed to use i
ndirect reference in <clip-path>"); |
| 550 else { | 550 else { |
| 551 toSVGGraphicsElement(n)->toClipPath(path); | 551 toSVGGraphicsElement(n)->toClipPath(path); |
| 552 // FIXME: Avoid manual resolution of x/y here. Its potentially harmf
ul. | 552 // FIXME: Avoid manual resolution of x/y here. Its potentially harmf
ul. |
| 553 SVGLengthContext lengthContext(this); | 553 SVGLengthContext lengthContext(this); |
| 554 path.translate(FloatSize(x().value(lengthContext), y().value(lengthC
ontext))); | 554 path.translate(FloatSize(xCurrentValue().value(lengthContext), yCurr
entValue().value(lengthContext))); |
| 555 path.transform(animatedLocalTransform()); | 555 path.transform(animatedLocalTransform()); |
| 556 } | 556 } |
| 557 } | 557 } |
| 558 } | 558 } |
| 559 | 559 |
| 560 RenderObject* SVGUseElement::rendererClipChild() const | 560 RenderObject* SVGUseElement::rendererClipChild() const |
| 561 { | 561 { |
| 562 Node* n = m_targetElementInstance ? m_targetElementInstance->shadowTreeEleme
nt() : 0; | 562 Node* n = m_targetElementInstance ? m_targetElementInstance->shadowTreeEleme
nt() : 0; |
| 563 if (!n) | 563 if (!n) |
| 564 return 0; | 564 return 0; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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, st
atic_cast<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
ef(), 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()) |
| 639 newTarget = toSVGElement(targetElement); | 639 newTarget = toSVGElement(targetElement); |
| 640 | 640 |
| 641 if (!newTarget) | 641 if (!newTarget) |
| 642 return false; | 642 return false; |
| 643 | 643 |
| 644 // Shortcut for self-references | 644 // Shortcut for self-references |
| 645 if (newTarget == this) | 645 if (newTarget == this) |
| 646 return true; | 646 return true; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 = static_cast<SVGUseElement*>(element); |
| 706 ASSERT(!use->cachedDocumentIsStillLoading()); | 706 ASSERT(!use->cachedDocumentIsStillLoading()); |
| 707 | 707 |
| 708 Element* targetElement = SVGURIReference::targetElementFromIRIString(use
->href(), 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()); |
| 716 use->cloneChildNodes(cloneParent.get()); | 716 use->cloneChildNodes(cloneParent.get()); |
| 717 | 717 |
| 718 // Spec: In the generated content, the 'use' will be replaced by 'g', wh
ere all attributes from the | 718 // Spec: In the generated content, the 'use' will be replaced by 'g', wh
ere all attributes from the |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 911 | 911 |
| 912 to->removeAttribute(SVGNames::xAttr); | 912 to->removeAttribute(SVGNames::xAttr); |
| 913 to->removeAttribute(SVGNames::yAttr); | 913 to->removeAttribute(SVGNames::yAttr); |
| 914 to->removeAttribute(SVGNames::widthAttr); | 914 to->removeAttribute(SVGNames::widthAttr); |
| 915 to->removeAttribute(SVGNames::heightAttr); | 915 to->removeAttribute(SVGNames::heightAttr); |
| 916 to->removeAttribute(XLinkNames::hrefAttr); | 916 to->removeAttribute(XLinkNames::hrefAttr); |
| 917 } | 917 } |
| 918 | 918 |
| 919 bool SVGUseElement::selfHasRelativeLengths() const | 919 bool SVGUseElement::selfHasRelativeLengths() const |
| 920 { | 920 { |
| 921 if (x().isRelative() | 921 if (xCurrentValue().isRelative() |
| 922 || y().isRelative() | 922 || yCurrentValue().isRelative() |
| 923 || width().isRelative() | 923 || widthCurrentValue().isRelative() |
| 924 || height().isRelative()) | 924 || heightCurrentValue().isRelative()) |
| 925 return true; | 925 return true; |
| 926 | 926 |
| 927 if (!m_targetElementInstance) | 927 if (!m_targetElementInstance) |
| 928 return false; | 928 return false; |
| 929 | 929 |
| 930 SVGElement* element = m_targetElementInstance->correspondingElement(); | 930 SVGElement* element = m_targetElementInstance->correspondingElement(); |
| 931 if (!element || !element->isSVGStyledElement()) | 931 if (!element || !element->isSVGStyledElement()) |
| 932 return false; | 932 return false; |
| 933 | 933 |
| 934 return toSVGStyledElement(element)->hasRelativeLengths(); | 934 return toSVGStyledElement(element)->hasRelativeLengths(); |
| (...skipping 48 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 |