| Index: Source/core/rendering/svg/RenderSVGTransformableContainer.cpp
|
| diff --git a/Source/core/rendering/svg/RenderSVGTransformableContainer.cpp b/Source/core/rendering/svg/RenderSVGTransformableContainer.cpp
|
| index e666e2bb71286b7b4fb33d9e33d8f713ed2340da..c55400cd13260b9cac3f6efe4f2b8717cf9afef4 100644
|
| --- a/Source/core/rendering/svg/RenderSVGTransformableContainer.cpp
|
| +++ b/Source/core/rendering/svg/RenderSVGTransformableContainer.cpp
|
| @@ -37,6 +37,37 @@ RenderSVGTransformableContainer::RenderSVGTransformableContainer(SVGGraphicsElem
|
| {
|
| }
|
|
|
| +static bool hasValidPredecessor(const Node* node)
|
| +{
|
| + ASSERT(node);
|
| + while ((node = node->previousSibling())) {
|
| + if (node->isSVGElement() && toSVGElement(node)->isValid())
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +bool RenderSVGTransformableContainer::isChildAllowed(RenderObject* child, RenderStyle* style) const
|
| +{
|
| + if (element()->hasTagName(SVGNames::switchTag)) {
|
| + Node* node = child->node();
|
| + // Reject non-SVG/non-valid elements.
|
| + if (!node->isSVGElement() || !toSVGElement(node)->isValid())
|
| + return false;
|
| + // Reject this child if it isn't the first valid node.
|
| + if (hasValidPredecessor(node))
|
| + return false;
|
| + } else if (element()->hasTagName(SVGNames::aTag)) {
|
| + // http://www.w3.org/2003/01/REC-SVG11-20030114-errata#linking-text-environment
|
| + // The 'a' element may contain any element that its parent may contain, except itself.
|
| + if (child->node()->hasTagName(SVGNames::aTag))
|
| + return false;
|
| + if (parent() && parent()->isSVG())
|
| + return parent()->isChildAllowed(child, style);
|
| + }
|
| + return RenderSVGContainer::isChildAllowed(child, style);
|
| +}
|
| +
|
| bool RenderSVGTransformableContainer::calculateLocalTransform()
|
| {
|
| SVGGraphicsElement* element = toSVGGraphicsElement(this->element());
|
|
|