| Index: third_party/WebKit/WebCore/svg/SVGUseElement.cpp
|
| ===================================================================
|
| --- third_party/WebKit/WebCore/svg/SVGUseElement.cpp (revision 40819)
|
| +++ third_party/WebKit/WebCore/svg/SVGUseElement.cpp (working copy)
|
| @@ -388,7 +388,7 @@
|
| ASSERT(!m_targetElementInstance);
|
|
|
| if (!targetElement) {
|
| - if (m_isPendingResource)
|
| + if (m_isPendingResource || id.isEmpty())
|
| return;
|
|
|
| m_isPendingResource = true;
|
| @@ -408,7 +408,12 @@
|
| {
|
| String id = SVGURIReference::getTarget(href());
|
| Element* targetElement = document()->getElementById(id);
|
| - ASSERT(targetElement);
|
| + if (!targetElement) {
|
| + // The only time we should get here is when the use element has not been
|
| + // given a resource to target.
|
| + ASSERT(m_resourceId.isEmpty());
|
| + return;
|
| + }
|
|
|
| // Do not build the shadow/instance tree for <use> elements living in a shadow tree.
|
| // The will be expanded soon anyway - see expandUseElementsInShadowTree().
|
| @@ -710,27 +715,15 @@
|
| target = static_cast<SVGElement*>(targetElement);
|
|
|
| // Don't ASSERT(target) here, it may be "pending", too.
|
| - if (target) {
|
| - // Setup sub-shadow tree root node
|
| - RefPtr<SVGShadowTreeContainerElement> cloneParent = new SVGShadowTreeContainerElement(document());
|
| + // Setup sub-shadow tree root node
|
| + RefPtr<SVGShadowTreeContainerElement> cloneParent = new SVGShadowTreeContainerElement(document());
|
|
|
| - // Spec: In the generated content, the 'use' will be replaced by 'g', where all attributes from the
|
| - // 'use' element except for x, y, width, height and xlink:href are transferred to the generated 'g' element.
|
| - transferUseAttributesToReplacedElement(use, cloneParent.get());
|
| + // Spec: In the generated content, the 'use' will be replaced by 'g', where all attributes from the
|
| + // 'use' element except for x, y, width, height and xlink:href are transferred to the generated 'g' element.
|
| + transferUseAttributesToReplacedElement(use, cloneParent.get());
|
|
|
| - ExceptionCode ec = 0;
|
| -
|
| - // For instance <use> on <foreignObject> (direct case).
|
| - if (isDisallowedElement(target)) {
|
| - // We still have to setup the <use> replacment (<g>). Otherwhise
|
| - // associateInstancesWithShadowTreeElements() makes wrong assumptions.
|
| - // Replace <use> with referenced content.
|
| - ASSERT(use->parentNode());
|
| - use->parentNode()->replaceChild(cloneParent.release(), use, ec);
|
| - ASSERT(!ec);
|
| - return;
|
| - }
|
| -
|
| + ExceptionCode ec = 0;
|
| + if (target && !isDisallowedElement(target)) {
|
| RefPtr<Element> newChild = target->cloneElementWithChildren();
|
|
|
| // We don't walk the target tree element-by-element, and clone each element,
|
| @@ -748,16 +741,16 @@
|
|
|
| cloneParent->appendChild(newChild.release(), ec);
|
| ASSERT(!ec);
|
| + }
|
|
|
| - // Replace <use> with referenced content.
|
| - ASSERT(use->parentNode());
|
| - use->parentNode()->replaceChild(cloneParent.release(), use, ec);
|
| - ASSERT(!ec);
|
| + // Replace <use> with referenced content.
|
| + ASSERT(use->parentNode());
|
| + use->parentNode()->replaceChild(cloneParent.release(), use, ec);
|
| + ASSERT(!ec);
|
|
|
| - // Immediately stop here, and restart expanding.
|
| - expandUseElementsInShadowTree(shadowRoot, shadowRoot);
|
| - return;
|
| - }
|
| + // Immediately stop here, and restart expanding.
|
| + expandUseElementsInShadowTree(shadowRoot, shadowRoot);
|
| + return;
|
| }
|
|
|
| for (RefPtr<Node> child = element->firstChild(); child; child = child->nextSibling())
|
|
|