| Index: third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceContainer.cpp | 
| diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceContainer.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceContainer.cpp | 
| index 0d3edd3cd90d08a7564b4c5a0e523ca03ffe124b..3fc824844162e8b2c778f0f81c03ce12890a9b92 100644 | 
| --- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceContainer.cpp | 
| +++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceContainer.cpp | 
| @@ -25,9 +25,7 @@ | 
| #include "core/layout/svg/LayoutSVGResourceMasker.h" | 
| #include "core/layout/svg/SVGResources.h" | 
| #include "core/layout/svg/SVGResourcesCache.h" | 
| -#include "core/paint/PaintLayer.h" | 
| -#include "core/svg/SVGFilterElement.h" | 
| - | 
| +#include "core/svg/SVGElementProxy.h" | 
| #include "wtf/AutoReset.h" | 
|  | 
| namespace blink { | 
| @@ -63,16 +61,17 @@ void LayoutSVGResourceContainer::layout() { | 
| clearInvalidationMask(); | 
| } | 
|  | 
| +void LayoutSVGResourceContainer::notifyContentChanged() { | 
| +  if (SVGElementProxySet* proxySet = elementProxySet()) | 
| +    proxySet->notifyContentChanged(element()->treeScope()); | 
| +} | 
| + | 
| void LayoutSVGResourceContainer::willBeDestroyed() { | 
| // Detach all clients referring to this resource. If the resource itself is | 
| // a client, it will be detached from any such resources by the call to | 
| // LayoutSVGHiddenContainer::willBeDestroyed() below. | 
| detachAllClients(); | 
|  | 
| -  for (SVGResourceClient* client : m_resourceClients) | 
| -    client->filterWillBeDestroyed(toSVGFilterElement(element())); | 
| -  m_resourceClients.clear(); | 
| - | 
| LayoutSVGHiddenContainer::willBeDestroyed(); | 
| if (m_registered) | 
| svgExtensionsFromElement(element()).removeResource(m_id); | 
| @@ -121,9 +120,11 @@ void LayoutSVGResourceContainer::idChanged() { | 
|  | 
| void LayoutSVGResourceContainer::markAllClientsForInvalidation( | 
| InvalidationMode mode) { | 
| -  if ((m_clients.isEmpty() && m_resourceClients.isEmpty()) || m_isInvalidating) | 
| +  if (m_isInvalidating) | 
| +    return; | 
| +  SVGElementProxySet* proxySet = elementProxySet(); | 
| +  if (m_clients.isEmpty() && (!proxySet || proxySet->isEmpty())) | 
| return; | 
| - | 
| if (m_invalidationMask & mode) | 
| return; | 
|  | 
| @@ -132,7 +133,9 @@ void LayoutSVGResourceContainer::markAllClientsForInvalidation( | 
| bool needsLayout = mode == LayoutAndBoundariesInvalidation; | 
| bool markForInvalidation = mode != ParentOnlyInvalidation; | 
|  | 
| +  // Invalidate clients registered on the this object (via SVGResources). | 
| for (auto* client : m_clients) { | 
| +    DCHECK(client->isSVG()); | 
| if (client->isSVGResourceContainer()) { | 
| toLayoutSVGResourceContainer(client)->removeAllClientsFromCache( | 
| markForInvalidation); | 
| @@ -146,16 +149,12 @@ void LayoutSVGResourceContainer::markAllClientsForInvalidation( | 
| client, needsLayout); | 
| } | 
|  | 
| -  markAllResourceClientsForInvalidation(); | 
| +  // Invalidate clients registered via an SVGElementProxy. | 
| +  notifyContentChanged(); | 
|  | 
| m_isInvalidating = false; | 
| } | 
|  | 
| -void LayoutSVGResourceContainer::markAllResourceClientsForInvalidation() { | 
| -  for (SVGResourceClient* client : m_resourceClients) | 
| -    client->filterNeedsInvalidation(); | 
| -} | 
| - | 
| void LayoutSVGResourceContainer::markClientForInvalidation( | 
| LayoutObject* client, | 
| InvalidationMode mode) { | 
| @@ -193,18 +192,6 @@ void LayoutSVGResourceContainer::removeClient(LayoutObject* client) { | 
| m_clients.remove(client); | 
| } | 
|  | 
| -void LayoutSVGResourceContainer::addResourceClient(SVGResourceClient* client) { | 
| -  ASSERT(client); | 
| -  m_resourceClients.add(client); | 
| -  clearInvalidationMask(); | 
| -} | 
| - | 
| -void LayoutSVGResourceContainer::removeResourceClient( | 
| -    SVGResourceClient* client) { | 
| -  ASSERT(client); | 
| -  m_resourceClients.remove(client); | 
| -} | 
| - | 
| void LayoutSVGResourceContainer::invalidateCacheAndMarkForLayout( | 
| SubtreeLayoutScope* layoutScope) { | 
| if (selfNeedsLayout()) | 
| @@ -233,32 +220,18 @@ void LayoutSVGResourceContainer::registerResource() { | 
|  | 
| // Update cached resources of pending clients. | 
| for (const auto& pendingClient : *clients) { | 
| -    ASSERT(pendingClient->hasPendingResources()); | 
| +    DCHECK(pendingClient->hasPendingResources()); | 
| extensions.clearHasPendingResourcesIfPossible(pendingClient); | 
| LayoutObject* layoutObject = pendingClient->layoutObject(); | 
| if (!layoutObject) | 
| continue; | 
| - | 
| -    const ComputedStyle& style = layoutObject->styleRef(); | 
| - | 
| -    // If the client has a layer (is a non-SVGElement) we need to signal | 
| -    // invalidation in the same way as is done in | 
| -    // markAllResourceClientsForInvalidation above. | 
| -    if (layoutObject->hasLayer() && resourceType() == FilterResourceType) { | 
| -      if (!style.hasFilter()) | 
| -        continue; | 
| -      toLayoutBoxModelObject(layoutObject) | 
| -          ->layer() | 
| -          ->filterNeedsPaintInvalidation(); | 
| -      if (!layoutObject->isSVGRoot()) | 
| -        continue; | 
| -      // A root SVG element with a filter, however, still needs to run | 
| -      // the full invalidation step below. | 
| -    } | 
| +    DCHECK(layoutObject->isSVG() && (resourceType() != FilterResourceType || | 
| +                                     !layoutObject->isSVGRoot())); | 
|  | 
| StyleDifference diff; | 
| diff.setNeedsFullLayout(); | 
| -    SVGResourcesCache::clientStyleChanged(layoutObject, diff, style); | 
| +    SVGResourcesCache::clientStyleChanged(layoutObject, diff, | 
| +                                          layoutObject->styleRef()); | 
| layoutObject->setNeedsLayoutAndFullPaintInvalidation( | 
| LayoutInvalidationReason::SvgResourceInvalidated); | 
| } | 
|  |