Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(237)

Side by Side Diff: Source/core/svg/SVGUseElement.cpp

Issue 23685007: Have SVGURIReference API deal with Document references, not pointers (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/svg/SVGURIReference.cpp ('k') | Source/core/svg/animation/SVGSMILElement.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 182
183 void SVGUseElement::removedFrom(ContainerNode* rootParent) 183 void SVGUseElement::removedFrom(ContainerNode* rootParent)
184 { 184 {
185 SVGGraphicsElement::removedFrom(rootParent); 185 SVGGraphicsElement::removedFrom(rootParent);
186 if (rootParent->inDocument()) 186 if (rootParent->inDocument())
187 clearResourceReferences(); 187 clearResourceReferences();
188 } 188 }
189 189
190 Document* SVGUseElement::referencedDocument() const 190 Document* SVGUseElement::referencedDocument() const
191 { 191 {
192 if (!isExternalURIReference(hrefCurrentValue(), &document())) 192 if (!isExternalURIReference(hrefCurrentValue(), document()))
193 return &document(); 193 return &document();
194 return externalDocument(); 194 return externalDocument();
195 } 195 }
196 196
197 Document* SVGUseElement::externalDocument() const 197 Document* SVGUseElement::externalDocument() const
198 { 198 {
199 if (m_resource && m_resource->isLoaded()) { 199 if (m_resource && m_resource->isLoaded()) {
200 // Gracefully handle error condition. 200 // Gracefully handle error condition.
201 if (m_resource->errorOccurred()) 201 if (m_resource->errorOccurred())
202 return 0; 202 return 0;
(...skipping 20 matching lines...) Expand all
223 updateRelativeLengthsInformation(); 223 updateRelativeLengthsInformation();
224 if (renderer) 224 if (renderer)
225 RenderSVGResource::markForLayoutAndParentResourceInvalidation(render er); 225 RenderSVGResource::markForLayoutAndParentResourceInvalidation(render er);
226 return; 226 return;
227 } 227 }
228 228
229 if (SVGExternalResourcesRequired::handleAttributeChange(this, attrName)) 229 if (SVGExternalResourcesRequired::handleAttributeChange(this, attrName))
230 return; 230 return;
231 231
232 if (SVGURIReference::isKnownAttribute(attrName)) { 232 if (SVGURIReference::isKnownAttribute(attrName)) {
233 bool isExternalReference = isExternalURIReference(hrefCurrentValue(), &d ocument()); 233 bool isExternalReference = isExternalURIReference(hrefCurrentValue(), do cument());
234 if (isExternalReference) { 234 if (isExternalReference) {
235 KURL url = document().completeURL(hrefCurrentValue()); 235 KURL url = document().completeURL(hrefCurrentValue());
236 if (url.hasFragmentIdentifier()) { 236 if (url.hasFragmentIdentifier()) {
237 FetchRequest request(ResourceRequest(url.string()), localName()) ; 237 FetchRequest request(ResourceRequest(url.string()), localName()) ;
238 setDocumentResource(document().fetcher()->fetchSVGDocument(reque st)); 238 setDocumentResource(document().fetcher()->fetchSVGDocument(reque st));
239 } 239 }
240 } else { 240 } else {
241 setDocumentResource(0); 241 setDocumentResource(0);
242 } 242 }
243 243
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 399
400 void SVGUseElement::buildPendingResource() 400 void SVGUseElement::buildPendingResource()
401 { 401 {
402 if (!referencedDocument() || isInShadowTree()) 402 if (!referencedDocument() || isInShadowTree())
403 return; 403 return;
404 clearResourceReferences(); 404 clearResourceReferences();
405 if (!inDocument()) 405 if (!inDocument())
406 return; 406 return;
407 407
408 String id; 408 String id;
409 Element* target = SVGURIReference::targetElementFromIRIString(hrefCurrentVal ue(), &document(), &id, externalDocument()); 409 Element* target = SVGURIReference::targetElementFromIRIString(hrefCurrentVal ue(), document(), &id, externalDocument());
410 if (!target || !target->inDocument()) { 410 if (!target || !target->inDocument()) {
411 // If we can't find the target of an external element, just give up. 411 // If we can't find the target of an external element, just give up.
412 // We can't observe if the target somewhen enters the external document, nor should we do it. 412 // We can't observe if the target somewhen enters the external document, nor should we do it.
413 if (externalDocument()) 413 if (externalDocument())
414 return; 414 return;
415 if (id.isEmpty()) 415 if (id.isEmpty())
416 return; 416 return;
417 417
418 referencedDocument()->accessSVGExtensions()->addPendingResource(id, this ); 418 referencedDocument()->accessSVGExtensions()->addPendingResource(id, this );
419 ASSERT(hasPendingResources()); 419 ASSERT(hasPendingResources());
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
633 return; 633 return;
634 634
635 RefPtr<SVGElementInstance> newInstance = SVGElementInstance::create(this, to SVGUseElement(target), newTarget); 635 RefPtr<SVGElementInstance> newInstance = SVGElementInstance::create(this, to SVGUseElement(target), newTarget);
636 SVGElementInstance* newInstancePtr = newInstance.get(); 636 SVGElementInstance* newInstancePtr = newInstance.get();
637 targetInstance->appendChild(newInstance.release()); 637 targetInstance->appendChild(newInstance.release());
638 buildInstanceTree(newTarget, newInstancePtr, foundProblem, foundUse); 638 buildInstanceTree(newTarget, newInstancePtr, foundProblem, foundUse);
639 } 639 }
640 640
641 bool SVGUseElement::hasCycleUseReferencing(SVGUseElement* use, SVGElementInstanc e* targetInstance, SVGElement*& newTarget) 641 bool SVGUseElement::hasCycleUseReferencing(SVGUseElement* use, SVGElementInstanc e* targetInstance, SVGElement*& newTarget)
642 { 642 {
643 Element* targetElement = SVGURIReference::targetElementFromIRIString(use->hr efCurrentValue(), referencedDocument()); 643 ASSERT(referencedDocument());
644 Element* targetElement = SVGURIReference::targetElementFromIRIString(use->hr efCurrentValue(), *referencedDocument());
644 newTarget = 0; 645 newTarget = 0;
645 if (targetElement && targetElement->isSVGElement()) 646 if (targetElement && targetElement->isSVGElement())
646 newTarget = toSVGElement(targetElement); 647 newTarget = toSVGElement(targetElement);
647 648
648 if (!newTarget) 649 if (!newTarget)
649 return false; 650 return false;
650 651
651 // Shortcut for self-references 652 // Shortcut for self-references
652 if (newTarget == this) 653 if (newTarget == this)
653 return true; 654 return true;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
705 // do this directly in buildShadowTree, if we encounter a <use> element? 706 // do this directly in buildShadowTree, if we encounter a <use> element?
706 // 707 //
707 // Short answer: Because we may miss to expand some elements. Ie. if a <symb ol> 708 // Short answer: Because we may miss to expand some elements. Ie. if a <symb ol>
708 // contains <use> tags, we'd miss them. So once we're done with settin' up t he 709 // contains <use> tags, we'd miss them. So once we're done with settin' up t he
709 // actual shadow tree (after the special case modification for svg/symbol) w e have 710 // actual shadow tree (after the special case modification for svg/symbol) w e have
710 // to walk it completely and expand all <use> elements. 711 // to walk it completely and expand all <use> elements.
711 if (element->hasTagName(SVGNames::useTag)) { 712 if (element->hasTagName(SVGNames::useTag)) {
712 SVGUseElement* use = toSVGUseElement(element); 713 SVGUseElement* use = toSVGUseElement(element);
713 ASSERT(!use->resourceIsStillLoading()); 714 ASSERT(!use->resourceIsStillLoading());
714 715
715 Element* targetElement = SVGURIReference::targetElementFromIRIString(use ->hrefCurrentValue(), referencedDocument()); 716 ASSERT(referencedDocument());
717 Element* targetElement = SVGURIReference::targetElementFromIRIString(use ->hrefCurrentValue(), *referencedDocument());
716 SVGElement* target = 0; 718 SVGElement* target = 0;
717 if (targetElement && targetElement->isSVGElement()) 719 if (targetElement && targetElement->isSVGElement())
718 target = toSVGElement(targetElement); 720 target = toSVGElement(targetElement);
719 721
720 // Don't ASSERT(target) here, it may be "pending", too. 722 // Don't ASSERT(target) here, it may be "pending", too.
721 // Setup sub-shadow tree root node 723 // Setup sub-shadow tree root node
722 RefPtr<SVGGElement> cloneParent = SVGGElement::create(SVGNames::gTag, re ferencedDocument()); 724 RefPtr<SVGGElement> cloneParent = SVGGElement::create(SVGNames::gTag, re ferencedDocument());
723 use->cloneChildNodes(cloneParent.get()); 725 use->cloneChildNodes(cloneParent.get());
724 726
725 // Spec: In the generated content, the 'use' will be replaced by 'g', wh ere all attributes from the 727 // Spec: In the generated content, the 'use' will be replaced by 'g', wh ere all attributes from the
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
990 992
991 if (m_resource) 993 if (m_resource)
992 m_resource->removeClient(this); 994 m_resource->removeClient(this);
993 995
994 m_resource = resource; 996 m_resource = resource;
995 if (m_resource) 997 if (m_resource)
996 m_resource->addClient(this); 998 m_resource->addClient(this);
997 } 999 }
998 1000
999 } 1001 }
OLDNEW
« no previous file with comments | « Source/core/svg/SVGURIReference.cpp ('k') | Source/core/svg/animation/SVGSMILElement.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698