Chromium Code Reviews| Index: third_party/WebKit/Source/core/svg/SVGUseElement.cpp |
| diff --git a/third_party/WebKit/Source/core/svg/SVGUseElement.cpp b/third_party/WebKit/Source/core/svg/SVGUseElement.cpp |
| index 95b2c3f3603ee4940a646169abb669f15963efd8..0c0d7c0bd3c5401c8e7e1d59916f6e39e5420b8d 100644 |
| --- a/third_party/WebKit/Source/core/svg/SVGUseElement.cpp |
| +++ b/third_party/WebKit/Source/core/svg/SVGUseElement.cpp |
| @@ -32,6 +32,7 @@ |
| #include "core/dom/IdTargetObserver.h" |
| #include "core/dom/StyleChangeReason.h" |
| #include "core/dom/TaskRunnerHelper.h" |
| +#include "core/dom/shadow/ElementShadow.h" |
| #include "core/dom/shadow/ShadowRoot.h" |
| #include "core/events/Event.h" |
| #include "core/layout/svg/LayoutSVGTransformableContainer.h" |
| @@ -80,7 +81,7 @@ inline SVGUseElement::SVGUseElement(Document& document) |
| SVGUseElement* SVGUseElement::create(Document& document) { |
| // Always build a user agent #shadow-root for SVGUseElement. |
| SVGUseElement* use = new SVGUseElement(document); |
| - use->ensureUserAgentShadowRoot(); |
| + use->ensureShadow().addShadowRoot(*use, ShadowRootType::Closed); |
| return use; |
| } |
| @@ -313,7 +314,7 @@ void SVGUseElement::buildPendingResource() { |
| if (inUseShadowTree()) |
| return; |
| // FIXME: We should try to optimize this, to at least allow partial reclones. |
| - userAgentShadowRoot()->removeChildren(OmitSubtreeModifiedEvent); |
| + useShadowRoot().removeChildren(OmitSubtreeModifiedEvent); |
| clearResourceReference(); |
| cancelShadowTreeRecreation(); |
| if (!isConnected()) |
| @@ -420,8 +421,8 @@ void SVGUseElement::buildShadowAndInstanceTree(SVGElement& target) { |
| DCHECK(!m_targetElementInstance); |
| DCHECK(!m_needsShadowTreeRecreation); |
| - // <use> creates a "user agent" shadow root. Do not build the shadow/instance |
| - // tree for <use> elements living in a user agent shadow tree because they |
| + // <use> creates a closed shadow root. Do not build the shadow/instance |
| + // tree for <use> elements living in a closed tree because they |
| // will get expanded in a second pass -- see expandUseElementsInShadowTree(). |
| if (inUseShadowTree()) |
| return; |
| @@ -435,8 +436,8 @@ void SVGUseElement::buildShadowAndInstanceTree(SVGElement& target) { |
| // <symbol> yet. |
| Element* instanceRoot = createInstanceTree(target); |
| m_targetElementInstance = toSVGElement(instanceRoot); |
| - ShadowRoot* shadowTreeRootElement = userAgentShadowRoot(); |
|
hayato
2017/03/15 11:13:00
Since ShadowRoot is not an element, it would be be
|
| - shadowTreeRootElement->appendChild(instanceRoot); |
| + ShadowRoot& shadowRoot = useShadowRoot(); |
| + shadowRoot.appendChild(instanceRoot); |
| addReferencesToFirstDegreeNestedUseElements(target); |
| @@ -451,16 +452,15 @@ void SVGUseElement::buildShadowAndInstanceTree(SVGElement& target) { |
| // Expand all <use> elements in the shadow tree. |
| // Expand means: replace the actual <use> element by what it references. |
| if (!expandUseElementsInShadowTree()) { |
| - shadowTreeRootElement->removeChildren(OmitSubtreeModifiedEvent); |
| + shadowRoot.removeChildren(OmitSubtreeModifiedEvent); |
| clearResourceReference(); |
| return; |
| } |
| // If the instance root was a <use>, it could have been replaced now, so |
| // reset |m_targetElementInstance|. |
| - m_targetElementInstance = |
| - toSVGElementOrDie(shadowTreeRootElement->firstChild()); |
| - DCHECK_EQ(m_targetElementInstance->parentNode(), shadowTreeRootElement); |
| + m_targetElementInstance = toSVGElementOrDie(shadowRoot.firstChild()); |
| + DCHECK_EQ(m_targetElementInstance->parentNode(), shadowRoot); |
| // Update relative length information. |
| updateRelativeLengthsInformation(); |
| @@ -497,7 +497,7 @@ void SVGUseElement::toClipPath(Path& path) const { |
| SVGGraphicsElement* SVGUseElement::visibleTargetGraphicsElementForClipping() |
| const { |
| - Node* n = userAgentShadowRoot()->firstChild(); |
| + Node* n = useShadowRoot().firstChild(); |
| if (!n || !n->isSVGElement()) |
| return nullptr; |
| @@ -585,8 +585,8 @@ bool SVGUseElement::expandUseElementsInShadowTree() { |
| // a <symbol> contains <use> tags, we'd miss them. So once we're done with |
| // setting up the actual shadow tree (after the special case modification for |
| // svg/symbol) we have to walk it completely and expand all <use> elements. |
| - ShadowRoot* shadowRoot = userAgentShadowRoot(); |
| - for (SVGUseElement* use = Traversal<SVGUseElement>::firstWithin(*shadowRoot); |
| + ShadowRoot& shadowRoot = useShadowRoot(); |
| + for (SVGUseElement* use = Traversal<SVGUseElement>::firstWithin(shadowRoot); |
| use;) { |
| DCHECK(!use->resourceIsStillLoading()); |
| @@ -617,7 +617,7 @@ bool SVGUseElement::expandUseElementsInShadowTree() { |
| // Replace <use> with referenced content. |
| use->parentNode()->replaceChild(cloneParent, use); |
| - use = Traversal<SVGUseElement>::next(*replacingElement, shadowRoot); |
| + use = Traversal<SVGUseElement>::next(*replacingElement, &shadowRoot); |
| } |
| return true; |
| } |
| @@ -718,7 +718,7 @@ bool SVGUseElement::resourceIsValid() const { |
| bool SVGUseElement::instanceTreeIsLoading() const { |
| for (const SVGUseElement& useElement : |
| - Traversal<SVGUseElement>::descendantsOf(*userAgentShadowRoot())) { |
| + Traversal<SVGUseElement>::descendantsOf(useShadowRoot())) { |
| if (useElement.resourceIsStillLoading()) |
| return true; |
| } |