Chromium Code Reviews| 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 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 357 } | 357 } |
| 358 | 358 |
| 359 if (target->isSVGElement()) { | 359 if (target->isSVGElement()) { |
| 360 buildShadowAndInstanceTree(toSVGElement(target)); | 360 buildShadowAndInstanceTree(toSVGElement(target)); |
| 361 invalidateDependentShadowTrees(); | 361 invalidateDependentShadowTrees(); |
| 362 } | 362 } |
| 363 | 363 |
| 364 ASSERT(!m_needsShadowTreeRecreation); | 364 ASSERT(!m_needsShadowTreeRecreation); |
| 365 } | 365 } |
| 366 | 366 |
| 367 namespace { | |
| 368 | |
| 369 void rebuildNonUseElementReferencesForTree(SVGElement* shadowTreeTargetElement) | |
| 370 { | |
| 371 shadowTreeTargetElement->document().accessSVGExtensions().rebuildAllElementR eferencesForTarget(shadowTreeTargetElement, SVGDocumentExtensions::ExcludeUseEle ments); | |
| 372 | |
| 373 for (SVGElement* child = Traversal<SVGElement>::firstChild(*shadowTreeTarget Element); child; child = Traversal<SVGElement>::nextSibling(*child)) | |
| 374 rebuildNonUseElementReferencesForTree(child); | |
| 375 } | |
| 376 | |
| 377 } // namespace | |
| 378 | |
| 367 void SVGUseElement::buildShadowAndInstanceTree(SVGElement* target) | 379 void SVGUseElement::buildShadowAndInstanceTree(SVGElement* target) |
| 368 { | 380 { |
| 369 ASSERT(!m_targetElementInstance); | 381 ASSERT(!m_targetElementInstance); |
| 370 | 382 |
| 371 // <use> creates a "user agent" shadow root. Do not build the shadow/instanc e tree for <use> | 383 // <use> creates a "user agent" shadow root. Do not build the shadow/instanc e tree for <use> |
| 372 // elements living in a user agent shadow tree because they will get expande d in a second | 384 // elements living in a user agent shadow tree because they will get expande d in a second |
| 373 // pass -- see expandUseElementsInShadowTree(). | 385 // pass -- see expandUseElementsInShadowTree(). |
| 374 if (inUseShadowTree()) | 386 if (inUseShadowTree()) |
| 375 return; | 387 return; |
| 376 | 388 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 444 ASSERT(shadowTreeTargetElement->correspondingElement()); | 456 ASSERT(shadowTreeTargetElement->correspondingElement()); |
| 445 transferUseWidthAndHeightIfNeeded(*this, shadowTreeTargetElement, *shadowTre eTargetElement->correspondingElement()); | 457 transferUseWidthAndHeightIfNeeded(*this, shadowTreeTargetElement, *shadowTre eTargetElement->correspondingElement()); |
| 446 | 458 |
| 447 ASSERT(shadowTreeTargetElement->parentNode() == shadowTreeRootElement); | 459 ASSERT(shadowTreeTargetElement->parentNode() == shadowTreeRootElement); |
| 448 | 460 |
| 449 // Transfer event listeners assigned to the referenced element to our shadow tree elements. | 461 // Transfer event listeners assigned to the referenced element to our shadow tree elements. |
| 450 transferEventListenersToShadowTree(shadowTreeTargetElement); | 462 transferEventListenersToShadowTree(shadowTreeTargetElement); |
| 451 | 463 |
| 452 // Update relative length information. | 464 // Update relative length information. |
| 453 updateRelativeLengthsInformation(); | 465 updateRelativeLengthsInformation(); |
| 466 | |
| 467 // Element references need to be rebuilt to include the new shadow tree. | |
| 468 // <use> elements are excluded from notification to avoid infinite loop. | |
| 469 rebuildNonUseElementReferencesForTree(target); | |
|
kouhei (in TOK)
2014/05/26 04:35:45
here.
| |
| 454 } | 470 } |
| 455 | 471 |
| 456 RenderObject* SVGUseElement::createRenderer(RenderStyle*) | 472 RenderObject* SVGUseElement::createRenderer(RenderStyle*) |
| 457 { | 473 { |
| 458 return new RenderSVGTransformableContainer(this); | 474 return new RenderSVGTransformableContainer(this); |
| 459 } | 475 } |
| 460 | 476 |
| 461 static bool isDirectReference(const Node& node) | 477 static bool isDirectReference(const Node& node) |
| 462 { | 478 { |
| 463 return isSVGPathElement(node) | 479 return isSVGPathElement(node) |
| (...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 910 m_resource->addClient(this); | 926 m_resource->addClient(this); |
| 911 } | 927 } |
| 912 | 928 |
| 913 void SVGUseElement::trace(Visitor* visitor) | 929 void SVGUseElement::trace(Visitor* visitor) |
| 914 { | 930 { |
| 915 visitor->trace(m_targetElementInstance); | 931 visitor->trace(m_targetElementInstance); |
| 916 SVGGraphicsElement::trace(visitor); | 932 SVGGraphicsElement::trace(visitor); |
| 917 } | 933 } |
| 918 | 934 |
| 919 } | 935 } |
| OLD | NEW |