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

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

Issue 1287243003: Don't require a valid reference scope for a <use> shadow tree update (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Drop referenceScope check from scheduleShadowTreeRecreation. Created 5 years, 4 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 | « LayoutTests/svg/custom/use-href-change-local-to-invalid-remote-expected.html ('k') | no next file » | 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 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 119
120 void SVGUseElement::removedFrom(ContainerNode* rootParent) 120 void SVGUseElement::removedFrom(ContainerNode* rootParent)
121 { 121 {
122 SVGGraphicsElement::removedFrom(rootParent); 122 SVGGraphicsElement::removedFrom(rootParent);
123 if (rootParent->inDocument()) 123 if (rootParent->inDocument())
124 clearResourceReferences(); 124 clearResourceReferences();
125 } 125 }
126 126
127 TreeScope* SVGUseElement::referencedScope() const 127 TreeScope* SVGUseElement::referencedScope() const
128 { 128 {
129 if (!isExternalURIReference(hrefString(), document())) 129 if (isStructurallyExternal())
130 return &treeScope(); 130 return externalDocument();
131 return externalDocument(); 131 return &treeScope();
132 } 132 }
133 133
134 Document* SVGUseElement::externalDocument() const 134 Document* SVGUseElement::externalDocument() const
135 { 135 {
136 if (m_resource && m_resource->isLoaded()) { 136 if (m_resource && m_resource->isLoaded()) {
137 // Gracefully handle error condition. 137 // Gracefully handle error condition.
138 if (m_resource->errorOccurred()) 138 if (m_resource->errorOccurred())
139 return nullptr; 139 return nullptr;
140 ASSERT(m_resource->document()); 140 ASSERT(m_resource->document());
141 return m_resource->document(); 141 return m_resource->document();
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 } 215 }
216 216
217 LayoutObject* object = this->layoutObject(); 217 LayoutObject* object = this->layoutObject();
218 if (object) 218 if (object)
219 markForLayoutAndParentResourceInvalidation(object); 219 markForLayoutAndParentResourceInvalidation(object);
220 return; 220 return;
221 } 221 }
222 222
223 if (SVGURIReference::isKnownAttribute(attrName)) { 223 if (SVGURIReference::isKnownAttribute(attrName)) {
224 SVGElement::InvalidationGuard invalidationGuard(this); 224 SVGElement::InvalidationGuard invalidationGuard(this);
225 bool isExternalReference = isExternalURIReference(hrefString(), document ()); 225 if (isStructurallyExternal()) {
226 if (isExternalReference) {
227 KURL url = document().completeURL(hrefString()); 226 KURL url = document().completeURL(hrefString());
228 if (url.hasFragmentIdentifier()) { 227 if (url.hasFragmentIdentifier()) {
229 FetchRequest request(ResourceRequest(url), localName()); 228 FetchRequest request(ResourceRequest(url), localName());
230 setDocumentResource(DocumentResource::fetchSVGDocument(request, document().fetcher())); 229 setDocumentResource(DocumentResource::fetchSVGDocument(request, document().fetcher()));
231 } 230 }
232 } else { 231 } else {
233 setDocumentResource(0); 232 setDocumentResource(0);
234 } 233 }
235 234
236 invalidateShadowTree(); 235 invalidateShadowTree();
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 for (Node* cur = start->firstChild(); cur; cur = cur->nextSibling()) { 289 for (Node* cur = start->firstChild(); cur; cur = cur->nextSibling()) {
291 if (subtreeContainsDisallowedElement(cur)) 290 if (subtreeContainsDisallowedElement(cur))
292 return true; 291 return true;
293 } 292 }
294 293
295 return false; 294 return false;
296 } 295 }
297 296
298 void SVGUseElement::scheduleShadowTreeRecreation() 297 void SVGUseElement::scheduleShadowTreeRecreation()
299 { 298 {
300 if (!referencedScope() || inUseShadowTree()) 299 if (inUseShadowTree())
301 return; 300 return;
302 m_needsShadowTreeRecreation = true; 301 m_needsShadowTreeRecreation = true;
303 document().scheduleUseShadowTreeUpdate(*this); 302 document().scheduleUseShadowTreeUpdate(*this);
304 } 303 }
305 304
306 void SVGUseElement::clearResourceReferences() 305 void SVGUseElement::clearResourceReferences()
307 { 306 {
308 if (m_targetElementInstance) 307 if (m_targetElementInstance)
309 m_targetElementInstance = nullptr; 308 m_targetElementInstance = nullptr;
310 309
311 // FIXME: We should try to optimize this, to at least allow partial reclones . 310 // FIXME: We should try to optimize this, to at least allow partial reclones .
312 if (ShadowRoot* shadowTreeRootElement = userAgentShadowRoot()) 311 if (ShadowRoot* shadowTreeRootElement = userAgentShadowRoot())
313 shadowTreeRootElement->removeChildren(OmitSubtreeModifiedEvent); 312 shadowTreeRootElement->removeChildren(OmitSubtreeModifiedEvent);
314 313
315 m_needsShadowTreeRecreation = false; 314 m_needsShadowTreeRecreation = false;
316 document().unscheduleUseShadowTreeUpdate(*this); 315 document().unscheduleUseShadowTreeUpdate(*this);
317 316
318 removeAllOutgoingReferences(); 317 removeAllOutgoingReferences();
319 } 318 }
320 319
321 void SVGUseElement::buildPendingResource() 320 void SVGUseElement::buildPendingResource()
322 { 321 {
323 if (!referencedScope() || inUseShadowTree()) 322 if (inUseShadowTree())
324 return; 323 return;
325 clearResourceReferences(); 324 clearResourceReferences();
326 if (!inDocument()) 325 if (!referencedScope() || !inDocument())
327 return; 326 return;
328 327
329 AtomicString id; 328 AtomicString id;
330 Element* target = SVGURIReference::targetElementFromIRIString(hrefString(), treeScope(), &id, externalDocument()); 329 Element* target = SVGURIReference::targetElementFromIRIString(hrefString(), treeScope(), &id, externalDocument());
331 if (!target || !target->inDocument()) { 330 if (!target || !target->inDocument()) {
332 // If we can't find the target of an external element, just give up. 331 // If we can't find the target of an external element, just give up.
333 // We can't observe if the target somewhen enters the external document, nor should we do it. 332 // We can't observe if the target somewhen enters the external document, nor should we do it.
334 if (externalDocument()) 333 if (externalDocument())
335 return; 334 return;
336 if (id.isEmpty()) 335 if (id.isEmpty())
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after
783 782
784 if (m_resource) 783 if (m_resource)
785 m_resource->removeClient(this); 784 m_resource->removeClient(this);
786 785
787 m_resource = resource; 786 m_resource = resource;
788 if (m_resource) 787 if (m_resource)
789 m_resource->addClient(this); 788 m_resource->addClient(this);
790 } 789 }
791 790
792 } 791 }
OLDNEW
« no previous file with comments | « LayoutTests/svg/custom/use-href-change-local-to-invalid-remote-expected.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698