Index: third_party/WebKit/Source/core/svg/SVGRadialGradientElement.cpp |
diff --git a/third_party/WebKit/Source/core/svg/SVGRadialGradientElement.cpp b/third_party/WebKit/Source/core/svg/SVGRadialGradientElement.cpp |
index b368ba24543eb067e99c6d5e7e7bcdb3ac4659bb..dfafb570089a13bf15101c70a4f23869e1ad9701 100644 |
--- a/third_party/WebKit/Source/core/svg/SVGRadialGradientElement.cpp |
+++ b/third_party/WebKit/Source/core/svg/SVGRadialGradientElement.cpp |
@@ -103,83 +103,51 @@ LayoutObject* SVGRadialGradientElement::createLayoutObject( |
return new LayoutSVGResourceRadialGradient(this); |
} |
-static void setGradientAttributes(SVGGradientElement* element, |
+static void setGradientAttributes(const SVGGradientElement& element, |
RadialGradientAttributes& attributes, |
- bool isRadial = true) { |
- if (!attributes.hasSpreadMethod() && element->spreadMethod()->isSpecified()) |
- attributes.setSpreadMethod( |
- element->spreadMethod()->currentValue()->enumValue()); |
- |
- if (!attributes.hasGradientUnits() && element->gradientUnits()->isSpecified()) |
- attributes.setGradientUnits( |
- element->gradientUnits()->currentValue()->enumValue()); |
- |
- if (!attributes.hasGradientTransform() && |
- element->hasTransform(SVGElement::ExcludeMotionTransform)) { |
- attributes.setGradientTransform( |
- element->calculateTransform(SVGElement::ExcludeMotionTransform)); |
- } |
- |
- if (!attributes.hasStops()) { |
- const Vector<Gradient::ColorStop>& stops(element->buildStops()); |
- if (!stops.isEmpty()) |
- attributes.setStops(stops); |
- } |
+ bool isRadial) { |
+ element.collectCommonAttributes(attributes); |
- if (isRadial) { |
- SVGRadialGradientElement* radial = toSVGRadialGradientElement(element); |
+ if (!isRadial) |
+ return; |
+ const SVGRadialGradientElement& radial = toSVGRadialGradientElement(element); |
- if (!attributes.hasCx() && radial->cx()->isSpecified()) |
- attributes.setCx(radial->cx()->currentValue()); |
+ if (!attributes.hasCx() && radial.cx()->isSpecified()) |
+ attributes.setCx(radial.cx()->currentValue()); |
- if (!attributes.hasCy() && radial->cy()->isSpecified()) |
- attributes.setCy(radial->cy()->currentValue()); |
+ if (!attributes.hasCy() && radial.cy()->isSpecified()) |
+ attributes.setCy(radial.cy()->currentValue()); |
- if (!attributes.hasR() && radial->r()->isSpecified()) |
- attributes.setR(radial->r()->currentValue()); |
+ if (!attributes.hasR() && radial.r()->isSpecified()) |
+ attributes.setR(radial.r()->currentValue()); |
- if (!attributes.hasFx() && radial->fx()->isSpecified()) |
- attributes.setFx(radial->fx()->currentValue()); |
+ if (!attributes.hasFx() && radial.fx()->isSpecified()) |
+ attributes.setFx(radial.fx()->currentValue()); |
- if (!attributes.hasFy() && radial->fy()->isSpecified()) |
- attributes.setFy(radial->fy()->currentValue()); |
+ if (!attributes.hasFy() && radial.fy()->isSpecified()) |
+ attributes.setFy(radial.fy()->currentValue()); |
- if (!attributes.hasFr() && radial->fr()->isSpecified()) |
- attributes.setFr(radial->fr()->currentValue()); |
- } |
+ if (!attributes.hasFr() && radial.fr()->isSpecified()) |
+ attributes.setFr(radial.fr()->currentValue()); |
} |
bool SVGRadialGradientElement::collectGradientAttributes( |
RadialGradientAttributes& attributes) { |
- if (!layoutObject()) |
- return false; |
- |
- HeapHashSet<Member<SVGGradientElement>> processedGradients; |
- SVGGradientElement* current = this; |
+ DCHECK(layoutObject()); |
- setGradientAttributes(current, attributes); |
- processedGradients.insert(current); |
+ VisitedSet visited; |
+ const SVGGradientElement* current = this; |
while (true) { |
- // Respect xlink:href, take attributes from referenced element |
- Node* refNode = SVGURIReference::targetElementFromIRIString( |
- current->href()->currentValue()->value(), treeScope()); |
- if (refNode && isSVGGradientElement(*refNode)) { |
- current = toSVGGradientElement(refNode); |
- |
- // Cycle detection |
- if (processedGradients.contains(current)) |
- break; |
- |
- if (!current->layoutObject()) |
- return false; |
- |
- setGradientAttributes(current, attributes, |
- isSVGRadialGradientElement(*current)); |
- processedGradients.insert(current); |
- } else { |
+ setGradientAttributes(*current, attributes, |
+ isSVGRadialGradientElement(*current)); |
+ visited.insert(current); |
+ |
+ current = current->referencedElement(); |
+ if (!current || visited.contains(current)) |
break; |
- } |
+ if (!current->layoutObject()) |
+ return false; |
} |
// Handle default values for fx/fy |