| Index: third_party/WebKit/Source/core/layout/svg/LayoutSVGViewportContainer.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGViewportContainer.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGViewportContainer.cpp
|
| index 3b5b2fef87910c939e18b3d55e4e35c695400b76..eeb53b13625b2112d8e1689689b3750aa1c92868 100644
|
| --- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGViewportContainer.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGViewportContainer.cpp
|
| @@ -32,10 +32,28 @@ LayoutSVGViewportContainer::LayoutSVGViewportContainer(SVGSVGElement* node)
|
| m_isLayoutSizeChanged(false),
|
| m_needsTransformUpdate(true) {}
|
|
|
| -void LayoutSVGViewportContainer::determineIfLayoutSizeChanged() {
|
| +void LayoutSVGViewportContainer::layout() {
|
| + DCHECK(needsLayout());
|
| DCHECK(isSVGSVGElement(element()));
|
| - m_isLayoutSizeChanged =
|
| - toSVGSVGElement(element())->hasRelativeLengths() && selfNeedsLayout();
|
| +
|
| + const SVGSVGElement* svg = toSVGSVGElement(element());
|
| + m_isLayoutSizeChanged = selfNeedsLayout() && svg->hasRelativeLengths();
|
| +
|
| + if (selfNeedsLayout()) {
|
| + SVGLengthContext lengthContext(svg);
|
| + FloatRect oldViewport = m_viewport;
|
| + m_viewport = FloatRect(svg->x()->currentValue()->value(lengthContext),
|
| + svg->y()->currentValue()->value(lengthContext),
|
| + svg->width()->currentValue()->value(lengthContext),
|
| + svg->height()->currentValue()->value(lengthContext));
|
| + if (oldViewport != m_viewport) {
|
| + setNeedsBoundariesUpdate();
|
| + // The transform depends on viewport values.
|
| + setNeedsTransformUpdate();
|
| + }
|
| + }
|
| +
|
| + LayoutSVGContainer::layout();
|
| }
|
|
|
| void LayoutSVGViewportContainer::setNeedsTransformUpdate() {
|
| @@ -49,26 +67,11 @@ void LayoutSVGViewportContainer::setNeedsTransformUpdate() {
|
| }
|
|
|
| SVGTransformChange LayoutSVGViewportContainer::calculateLocalTransform() {
|
| - DCHECK(isSVGSVGElement(element()));
|
| - const SVGSVGElement* svg = toSVGSVGElement(element());
|
| -
|
| - FloatRect oldViewport = m_viewport;
|
| - SVGLengthContext lengthContext(svg);
|
| - m_viewport = FloatRect(svg->x()->currentValue()->value(lengthContext),
|
| - svg->y()->currentValue()->value(lengthContext),
|
| - svg->width()->currentValue()->value(lengthContext),
|
| - svg->height()->currentValue()->value(lengthContext));
|
| -
|
| - // TODO(pdr): Mark this object as needing updates when the viewport values
|
| - // change instead of waiting for layout.
|
| - if (m_viewport != oldViewport) {
|
| - setNeedsBoundariesUpdate();
|
| - setNeedsTransformUpdate();
|
| - }
|
| -
|
| if (!m_needsTransformUpdate)
|
| return SVGTransformChange::None;
|
|
|
| + DCHECK(isSVGSVGElement(element()));
|
| + const SVGSVGElement* svg = toSVGSVGElement(element());
|
| SVGTransformChangeDetector changeDetector(m_localToParentTransform);
|
| m_localToParentTransform =
|
| AffineTransform::translation(m_viewport.x(), m_viewport.y()) *
|
|
|