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

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

Issue 1762633002: Use references some more in SVGUseElement (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 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
« no previous file with comments | « third_party/WebKit/Source/core/svg/SVGUseElement.h ('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 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 148
149 Document* SVGUseElement::externalDocument() const 149 Document* SVGUseElement::externalDocument() const
150 { 150 {
151 // Gracefully handle error condition. 151 // Gracefully handle error condition.
152 if (!resourceIsValid()) 152 if (!resourceIsValid())
153 return nullptr; 153 return nullptr;
154 ASSERT(m_resource->document()); 154 ASSERT(m_resource->document());
155 return m_resource->document(); 155 return m_resource->document();
156 } 156 }
157 157
158 void transferUseWidthAndHeightIfNeeded(const SVGUseElement& use, SVGElement* sha dowElement, const SVGElement& originalElement) 158 static void transferUseWidthAndHeightIfNeeded(const SVGUseElement& use, SVGEleme nt& shadowElement, const SVGElement& originalElement)
159 { 159 {
160 DEFINE_STATIC_LOCAL(const AtomicString, hundredPercentString, ("100%", Atomi cString::ConstructFromLiteral)); 160 DEFINE_STATIC_LOCAL(const AtomicString, hundredPercentString, ("100%", Atomi cString::ConstructFromLiteral));
161 ASSERT(shadowElement); 161 if (isSVGSymbolElement(shadowElement)) {
162 if (isSVGSymbolElement(*shadowElement)) {
163 // Spec (<use> on <symbol>): This generated 'svg' will always have expli cit values for attributes width and height. 162 // Spec (<use> on <symbol>): This generated 'svg' will always have expli cit values for attributes width and height.
164 // If attributes width and/or height are provided on the 'use' element, then these attributes 163 // If attributes width and/or height are provided on the 'use' element, then these attributes
165 // will be transferred to the generated 'svg'. If attributes width and/o r height are not specified, 164 // will be transferred to the generated 'svg'. If attributes width and/o r height are not specified,
166 // the generated 'svg' element will use values of 100% for these attribu tes. 165 // the generated 'svg' element will use values of 100% for these attribu tes.
167 shadowElement->setAttribute(SVGNames::widthAttr, use.width()->isSpecifie d() ? AtomicString(use.width()->currentValue()->valueAsString()) : hundredPercen tString); 166 shadowElement.setAttribute(SVGNames::widthAttr, use.width()->isSpecified () ? AtomicString(use.width()->currentValue()->valueAsString()) : hundredPercent String);
168 shadowElement->setAttribute(SVGNames::heightAttr, use.height()->isSpecif ied() ? AtomicString(use.height()->currentValue()->valueAsString()) : hundredPer centString); 167 shadowElement.setAttribute(SVGNames::heightAttr, use.height()->isSpecifi ed() ? AtomicString(use.height()->currentValue()->valueAsString()) : hundredPerc entString);
169 } else if (isSVGSVGElement(*shadowElement)) { 168 } else if (isSVGSVGElement(shadowElement)) {
170 // Spec (<use> on <svg>): If attributes width and/or height are provided on the 'use' element, then these 169 // Spec (<use> on <svg>): If attributes width and/or height are provided on the 'use' element, then these
171 // values will override the corresponding attributes on the 'svg' in the generated tree. 170 // values will override the corresponding attributes on the 'svg' in the generated tree.
172 if (use.width()->isSpecified()) 171 if (use.width()->isSpecified())
173 shadowElement->setAttribute(SVGNames::widthAttr, AtomicString(use.wi dth()->currentValue()->valueAsString())); 172 shadowElement.setAttribute(SVGNames::widthAttr, AtomicString(use.wid th()->currentValue()->valueAsString()));
174 else 173 else
175 shadowElement->setAttribute(SVGNames::widthAttr, originalElement.get Attribute(SVGNames::widthAttr)); 174 shadowElement.setAttribute(SVGNames::widthAttr, originalElement.getA ttribute(SVGNames::widthAttr));
176 if (use.height()->isSpecified()) 175 if (use.height()->isSpecified())
177 shadowElement->setAttribute(SVGNames::heightAttr, AtomicString(use.h eight()->currentValue()->valueAsString())); 176 shadowElement.setAttribute(SVGNames::heightAttr, AtomicString(use.he ight()->currentValue()->valueAsString()));
178 else 177 else
179 shadowElement->setAttribute(SVGNames::heightAttr, originalElement.ge tAttribute(SVGNames::heightAttr)); 178 shadowElement.setAttribute(SVGNames::heightAttr, originalElement.get Attribute(SVGNames::heightAttr));
180 } 179 }
181 } 180 }
182 181
183 bool SVGUseElement::isPresentationAttribute(const QualifiedName& attrName) const 182 bool SVGUseElement::isPresentationAttribute(const QualifiedName& attrName) const
184 { 183 {
185 if (attrName == SVGNames::xAttr || attrName == SVGNames::yAttr) 184 if (attrName == SVGNames::xAttr || attrName == SVGNames::yAttr)
186 return true; 185 return true;
187 return SVGGraphicsElement::isPresentationAttribute(attrName); 186 return SVGGraphicsElement::isPresentationAttribute(attrName);
188 } 187 }
189 188
(...skipping 26 matching lines...) Expand all
216 if (attrName == SVGNames::xAttr 215 if (attrName == SVGNames::xAttr
217 || attrName == SVGNames::yAttr) { 216 || attrName == SVGNames::yAttr) {
218 invalidateSVGPresentationAttributeStyle(); 217 invalidateSVGPresentationAttributeStyle();
219 setNeedsStyleRecalc(LocalStyleChange, 218 setNeedsStyleRecalc(LocalStyleChange,
220 StyleChangeReasonForTracing::fromAttribute(attrName)); 219 StyleChangeReasonForTracing::fromAttribute(attrName));
221 } 220 }
222 221
223 updateRelativeLengthsInformation(); 222 updateRelativeLengthsInformation();
224 if (m_targetElementInstance) { 223 if (m_targetElementInstance) {
225 ASSERT(m_targetElementInstance->correspondingElement()); 224 ASSERT(m_targetElementInstance->correspondingElement());
226 transferUseWidthAndHeightIfNeeded(*this, m_targetElementInstance.get (), *m_targetElementInstance->correspondingElement()); 225 transferUseWidthAndHeightIfNeeded(*this, *m_targetElementInstance, * m_targetElementInstance->correspondingElement());
227 } 226 }
228 227
229 LayoutObject* object = this->layoutObject(); 228 LayoutObject* object = this->layoutObject();
230 if (object) 229 if (object)
231 markForLayoutAndParentResourceInvalidation(object); 230 markForLayoutAndParentResourceInvalidation(object);
232 return; 231 return;
233 } 232 }
234 233
235 if (SVGURIReference::isKnownAttribute(attrName)) { 234 if (SVGURIReference::isKnownAttribute(attrName)) {
236 SVGElement::InvalidationGuard invalidationGuard(this); 235 SVGElement::InvalidationGuard invalidationGuard(this);
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 return; 342 return;
344 if (id.isEmpty()) 343 if (id.isEmpty())
345 return; 344 return;
346 345
347 referencedScope()->document().accessSVGExtensions().addPendingResource(i d, this); 346 referencedScope()->document().accessSVGExtensions().addPendingResource(i d, this);
348 ASSERT(hasPendingResources()); 347 ASSERT(hasPendingResources());
349 return; 348 return;
350 } 349 }
351 350
352 if (target->isSVGElement()) { 351 if (target->isSVGElement()) {
353 buildShadowAndInstanceTree(toSVGElement(target)); 352 buildShadowAndInstanceTree(toSVGElement(*target));
354 invalidateDependentShadowTrees(); 353 invalidateDependentShadowTrees();
355 } 354 }
356 355
357 ASSERT(!m_needsShadowTreeRecreation); 356 ASSERT(!m_needsShadowTreeRecreation);
358 } 357 }
359 358
360 static PassRefPtrWillBeRawPtr<Node> cloneNodeAndAssociate(Node& toClone) 359 static PassRefPtrWillBeRawPtr<Node> cloneNodeAndAssociate(Node& toClone)
361 { 360 {
362 RefPtrWillBeRawPtr<Node> clone = toClone.cloneNode(false); 361 RefPtrWillBeRawPtr<Node> clone = toClone.cloneNode(false);
363 if (!clone->isSVGElement()) 362 if (!clone->isSVGElement())
364 return clone.release(); 363 return clone.release();
365 364
366 SVGElement& svgElement = toSVGElement(toClone); 365 SVGElement& svgElement = toSVGElement(toClone);
367 ASSERT(!svgElement.correspondingElement()); 366 ASSERT(!svgElement.correspondingElement());
368 toSVGElement(clone.get())->setCorrespondingElement(&svgElement); 367 toSVGElement(clone.get())->setCorrespondingElement(&svgElement);
369 TrackExceptionState exceptionState; 368 TrackExceptionState exceptionState;
370 for (RefPtrWillBeRawPtr<Node> node = toClone.firstChild(); node && !exceptio nState.hadException(); node = node->nextSibling()) 369 for (RefPtrWillBeRawPtr<Node> node = toClone.firstChild(); node && !exceptio nState.hadException(); node = node->nextSibling())
371 clone->appendChild(cloneNodeAndAssociate(*node), exceptionState); 370 clone->appendChild(cloneNodeAndAssociate(*node), exceptionState);
372 return clone.release(); 371 return clone.release();
373 } 372 }
374 373
375 void SVGUseElement::buildShadowAndInstanceTree(SVGElement* target) 374 void SVGUseElement::buildShadowAndInstanceTree(SVGElement& target)
376 { 375 {
377 ASSERT(!m_targetElementInstance); 376 ASSERT(!m_targetElementInstance);
378 ASSERT(!m_needsShadowTreeRecreation); 377 ASSERT(!m_needsShadowTreeRecreation);
379 378
380 // <use> creates a "user agent" shadow root. Do not build the shadow/instanc e tree for <use> 379 // <use> creates a "user agent" shadow root. Do not build the shadow/instanc e tree for <use>
381 // elements living in a user agent shadow tree because they will get expande d in a second 380 // elements living in a user agent shadow tree because they will get expande d in a second
382 // pass -- see expandUseElementsInShadowTree(). 381 // pass -- see expandUseElementsInShadowTree().
383 if (inUseShadowTree()) 382 if (inUseShadowTree())
384 return; 383 return;
385 384
386 // Do not allow self-referencing. 385 // Do not allow self-referencing.
387 // 'target' may be null, if it's a non SVG namespaced element. 386 if (&target == this || isDisallowedElement(target))
388 if (!target || target == this || isDisallowedElement(*target))
389 return; 387 return;
390 388
391 // Set up root SVG element in shadow tree. 389 // Set up root SVG element in shadow tree.
392 RefPtrWillBeRawPtr<Element> newChild = target->cloneElementWithoutChildren() ; 390 RefPtrWillBeRawPtr<Element> newChild = target.cloneElementWithoutChildren();
393 m_targetElementInstance = toSVGElement(newChild.get()); 391 m_targetElementInstance = toSVGElement(newChild.get());
394 ShadowRoot* shadowTreeRootElement = userAgentShadowRoot(); 392 ShadowRoot* shadowTreeRootElement = userAgentShadowRoot();
395 shadowTreeRootElement->appendChild(newChild.release()); 393 shadowTreeRootElement->appendChild(newChild.release());
396 394
397 // Clone the target subtree into the shadow tree, not handling <use> and <sy mbol> yet. 395 // Clone the target subtree into the shadow tree, not handling <use> and <sy mbol> yet.
398 396
399 // SVG specification does not say a word about <use> & cycles. My view on th is is: just ignore it! 397 // SVG specification does not say a word about <use> & cycles. My view on th is is: just ignore it!
400 // Non-appearing <use> content is easier to debug, then half-appearing conte nt. 398 // Non-appearing <use> content is easier to debug, then half-appearing conte nt.
401 buildShadowTree(target, m_targetElementInstance.get(), false); 399 buildShadowTree(target, *m_targetElementInstance, false);
402 400
403 if (instanceTreeIsLoading(m_targetElementInstance.get())) { 401 if (instanceTreeIsLoading(m_targetElementInstance.get())) {
404 cloneNonMarkupEventListeners(); 402 cloneNonMarkupEventListeners();
405 return; 403 return;
406 } 404 }
407 405
408 // Assure shadow tree building was successful. 406 // Assure shadow tree building was successful.
409 ASSERT(m_targetElementInstance); 407 ASSERT(m_targetElementInstance);
410 ASSERT(m_targetElementInstance->correspondingUseElement() == this); 408 ASSERT(m_targetElementInstance->correspondingUseElement() == this);
411 ASSERT(m_targetElementInstance->correspondingElement() == target); 409 ASSERT(m_targetElementInstance->correspondingElement() == &target);
412 410
413 // Expand all <use> elements in the shadow tree. 411 // Expand all <use> elements in the shadow tree.
414 // Expand means: replace the actual <use> element by what it references. 412 // Expand means: replace the actual <use> element by what it references.
415 if (!expandUseElementsInShadowTree()) { 413 if (!expandUseElementsInShadowTree()) {
416 clearShadowTree(); 414 clearShadowTree();
417 return; 415 return;
418 } 416 }
419 417
420 // Expand all <symbol> elements in the shadow tree. 418 // Expand all <symbol> elements in the shadow tree.
421 // Expand means: replace the actual <symbol> element by the <svg> element. 419 // Expand means: replace the actual <symbol> element by the <svg> element.
422 expandSymbolElementsInShadowTree(); 420 expandSymbolElementsInShadowTree();
423 421
424 m_targetElementInstance = toSVGElement(shadowTreeRootElement->firstChild()); 422 m_targetElementInstance = toSVGElement(shadowTreeRootElement->firstChild());
425 transferUseWidthAndHeightIfNeeded(*this, m_targetElementInstance.get(), *m_t argetElementInstance->correspondingElement()); 423 transferUseWidthAndHeightIfNeeded(*this, *m_targetElementInstance, *m_target ElementInstance->correspondingElement());
426 cloneNonMarkupEventListeners(); 424 cloneNonMarkupEventListeners();
427 425
428 ASSERT(m_targetElementInstance->parentNode() == shadowTreeRootElement); 426 ASSERT(m_targetElementInstance->parentNode() == shadowTreeRootElement);
429 427
430 // Update relative length information. 428 // Update relative length information.
431 updateRelativeLengthsInformation(); 429 updateRelativeLengthsInformation();
432 } 430 }
433 431
434 LayoutObject* SVGUseElement::createLayoutObject(const ComputedStyle&) 432 LayoutObject* SVGUseElement::createLayoutObject(const ComputedStyle&)
435 { 433 {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
482 // http://dev.w3.org/fxtf/css-masking-1/#the-clip-path 480 // http://dev.w3.org/fxtf/css-masking-1/#the-clip-path
483 if (!isDirectReference(element)) { 481 if (!isDirectReference(element)) {
484 // Spec: Indirect references are an error (14.3.5) 482 // Spec: Indirect references are an error (14.3.5)
485 document().accessSVGExtensions().reportError("Not allowed to use indirec t reference in <clip-path>"); 483 document().accessSVGExtensions().reportError("Not allowed to use indirec t reference in <clip-path>");
486 return nullptr; 484 return nullptr;
487 } 485 }
488 486
489 return &toSVGGraphicsElement(element); 487 return &toSVGGraphicsElement(element);
490 } 488 }
491 489
492 void SVGUseElement::buildShadowTree(SVGElement* target, SVGElement* targetInstan ce, bool foundUse) 490 void SVGUseElement::buildShadowTree(SVGElement& target, SVGElement& targetInstan ce, bool foundUse)
493 { 491 {
494 ASSERT(target); 492 ASSERT(!isDisallowedElement(target));
495 ASSERT(targetInstance);
496 ASSERT(!isDisallowedElement(*target));
497 493
498 // Spec: If the referenced object is itself a 'use', or if there are 'use' s ubelements within the referenced 494 // Spec: If the referenced object is itself a 'use', or if there are 'use' s ubelements within the referenced
499 // object, the instance tree will contain recursive expansion of the indirec t references to form a complete tree. 495 // object, the instance tree will contain recursive expansion of the indirec t references to form a complete tree.
500 if (isSVGUseElement(*target)) { 496 if (isSVGUseElement(target)) {
501 // We only need to track first degree <use> dependencies. Indirect refer ences are handled 497 // We only need to track first degree <use> dependencies. Indirect refer ences are handled
502 // as the invalidation bubbles up the dependency chain. 498 // as the invalidation bubbles up the dependency chain.
503 if (!foundUse && !isStructurallyExternal()) { 499 if (!foundUse && !isStructurallyExternal()) {
504 addReferenceTo(target); 500 addReferenceTo(&target);
505 foundUse = true; 501 foundUse = true;
506 } 502 }
507 } 503 }
508 504
509 targetInstance->setCorrespondingElement(target); 505 targetInstance.setCorrespondingElement(&target);
510 506
511 for (RefPtrWillBeRawPtr<Node> child = target->firstChild(); child; child = c hild->nextSibling()) { 507 for (RefPtrWillBeRawPtr<Node> child = target.firstChild(); child; child = ch ild->nextSibling()) {
512 // Skip any disallowed element. 508 // Skip any disallowed element.
513 if (isDisallowedElement(*child)) 509 if (isDisallowedElement(*child))
514 continue; 510 continue;
515 511
516 RefPtrWillBeRawPtr<Node> newChild = child->cloneNode(false); 512 RefPtrWillBeRawPtr<Node> newChild = child->cloneNode(false);
517 targetInstance->appendChild(newChild.get()); 513 targetInstance.appendChild(newChild.get());
518 if (newChild->isSVGElement()) { 514 if (newChild->isSVGElement()) {
519 // Enter recursion, appending new instance tree nodes to the "instan ce" object. 515 // Enter recursion, appending new instance tree nodes to the "instan ce" object.
520 buildShadowTree(toSVGElement(child), toSVGElement(newChild), foundUs e); 516 buildShadowTree(toSVGElement(*child), toSVGElement(*newChild), found Use);
521 } 517 }
522 } 518 }
523 } 519 }
524 520
525 void SVGUseElement::cloneNonMarkupEventListeners() 521 void SVGUseElement::cloneNonMarkupEventListeners()
526 { 522 {
527 for (SVGElement& element : Traversal<SVGElement>::descendantsOf(*userAgentSh adowRoot())) { 523 for (SVGElement& element : Traversal<SVGElement>::descendantsOf(*userAgentSh adowRoot())) {
528 if (EventTargetData* data = element.correspondingElement()->eventTargetD ata()) 524 if (EventTargetData* data = element.correspondingElement()->eventTargetD ata())
529 data->eventListenerMap.copyEventListenersNotCreatedFromMarkupToTarge t(&element); 525 data->eventListenerMap.copyEventListenersNotCreatedFromMarkupToTarge t(&element);
530 } 526 }
531 } 527 }
532 528
533 bool SVGUseElement::hasCycleUseReferencing(SVGUseElement* use, ContainerNode* ta rgetInstance, SVGElement*& newTarget) 529 bool SVGUseElement::hasCycleUseReferencing(const SVGUseElement& use, const Conta inerNode& targetInstance, SVGElement*& newTarget) const
534 { 530 {
535 ASSERT(referencedScope()); 531 ASSERT(referencedScope());
536 Element* targetElement = SVGURIReference::targetElementFromIRIString(use->hr efString(), *referencedScope()); 532 Element* targetElement = SVGURIReference::targetElementFromIRIString(use.hre fString(), *referencedScope());
537 newTarget = 0; 533 newTarget = 0;
538 if (targetElement && targetElement->isSVGElement()) 534 if (targetElement && targetElement->isSVGElement())
539 newTarget = toSVGElement(targetElement); 535 newTarget = toSVGElement(targetElement);
540 536
541 if (!newTarget) 537 if (!newTarget)
542 return false; 538 return false;
543 539
544 // Shortcut for self-references 540 // Shortcut for self-references
545 if (newTarget == this) 541 if (newTarget == this)
546 return true; 542 return true;
547 543
548 AtomicString targetId = newTarget->getIdAttribute(); 544 AtomicString targetId = newTarget->getIdAttribute();
549 ContainerNode* instance = targetInstance->parentNode(); 545 ContainerNode* instance = targetInstance.parentNode();
550 while (instance && instance->isSVGElement()) { 546 while (instance && instance->isSVGElement()) {
551 SVGElement* element = toSVGElement(instance); 547 SVGElement* element = toSVGElement(instance);
552 if (element->hasID() && element->getIdAttribute() == targetId && element ->document() == newTarget->document()) 548 if (element->hasID() && element->getIdAttribute() == targetId && element ->document() == newTarget->document())
553 return true; 549 return true;
554 550
555 instance = instance->parentNode(); 551 instance = instance->parentNode();
556 } 552 }
557 return false; 553 return false;
558 } 554 }
559 555
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
608 // 604 //
609 // Short answer: Because we may miss to expand some elements. For example, i f a <symbol> 605 // Short answer: Because we may miss to expand some elements. For example, i f a <symbol>
610 // contains <use> tags, we'd miss them. So once we're done with setting up t he 606 // contains <use> tags, we'd miss them. So once we're done with setting up t he
611 // actual shadow tree (after the special case modification for svg/symbol) w e have 607 // actual shadow tree (after the special case modification for svg/symbol) w e have
612 // to walk it completely and expand all <use> elements. 608 // to walk it completely and expand all <use> elements.
613 ShadowRoot* shadowRoot = userAgentShadowRoot(); 609 ShadowRoot* shadowRoot = userAgentShadowRoot();
614 for (RefPtrWillBeRawPtr<SVGUseElement> use = Traversal<SVGUseElement>::first Within(*shadowRoot); use; ) { 610 for (RefPtrWillBeRawPtr<SVGUseElement> use = Traversal<SVGUseElement>::first Within(*shadowRoot); use; ) {
615 ASSERT(!use->resourceIsStillLoading()); 611 ASSERT(!use->resourceIsStillLoading());
616 612
617 SVGElement* target = 0; 613 SVGElement* target = 0;
618 if (hasCycleUseReferencing(toSVGUseElement(use->correspondingElement()), use.get(), target)) 614 if (hasCycleUseReferencing(toSVGUseElement(*use->correspondingElement()) , *use, target))
619 return false; 615 return false;
620 616
621 if (target && isDisallowedElement(*target)) 617 if (target && isDisallowedElement(*target))
622 return false; 618 return false;
623 // Don't ASSERT(target) here, it may be "pending", too. 619 // Don't ASSERT(target) here, it may be "pending", too.
624 // Setup sub-shadow tree root node 620 // Setup sub-shadow tree root node
625 RefPtrWillBeRawPtr<SVGGElement> cloneParent = SVGGElement::create(refere ncedScope()->document()); 621 RefPtrWillBeRawPtr<SVGGElement> cloneParent = SVGGElement::create(refere ncedScope()->document());
626 // Transfer all data (attributes, etc.) from <use> to the new <g> elemen t. 622 // Transfer all data (attributes, etc.) from <use> to the new <g> elemen t.
627 cloneParent->cloneDataFromElement(*use); 623 cloneParent->cloneDataFromElement(*use);
628 cloneParent->setCorrespondingElement(use->correspondingElement()); 624 cloneParent->setCorrespondingElement(use->correspondingElement());
629 625
630 removeAttributesFromReplacementElement(*cloneParent); 626 removeAttributesFromReplacementElement(*cloneParent);
631 627
632 // Move already cloned elements to the new <g> element. 628 // Move already cloned elements to the new <g> element.
633 moveChildrenToReplacementElement(*use, *cloneParent); 629 moveChildrenToReplacementElement(*use, *cloneParent);
634 630
635 if (target) { 631 if (target) {
636 RefPtrWillBeRawPtr<Node> newChild = cloneNodeAndAssociate(*target); 632 RefPtrWillBeRawPtr<Node> newChild = cloneNodeAndAssociate(*target);
637 ASSERT(newChild->isSVGElement()); 633 ASSERT(newChild->isSVGElement());
638 transferUseWidthAndHeightIfNeeded(*use, toSVGElement(newChild.get()) , *target); 634 transferUseWidthAndHeightIfNeeded(*use, toSVGElement(*newChild), *ta rget);
639 cloneParent->appendChild(newChild.release()); 635 cloneParent->appendChild(newChild.release());
640 } 636 }
641 637
642 removeDisallowedElementsFromSubtree(*cloneParent); 638 removeDisallowedElementsFromSubtree(*cloneParent);
643 639
644 RefPtrWillBeRawPtr<SVGElement> replacingElement(cloneParent.get()); 640 RefPtrWillBeRawPtr<SVGElement> replacingElement(cloneParent.get());
645 641
646 // Replace <use> with referenced content. 642 // Replace <use> with referenced content.
647 use->parentNode()->replaceChild(cloneParent.release(), use); 643 use->parentNode()->replaceChild(cloneParent.release(), use);
648 644
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
797 793
798 if (m_resource) 794 if (m_resource)
799 m_resource->removeClient(this); 795 m_resource->removeClient(this);
800 796
801 m_resource = resource; 797 m_resource = resource;
802 if (m_resource) 798 if (m_resource)
803 m_resource->addClient(this); 799 m_resource->addClient(this);
804 } 800 }
805 801
806 } // namespace blink 802 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/svg/SVGUseElement.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698