[webkit-changes] [WebKit/WebKit] 3bd5bd: Unify cycle detection logic for legacy & LBSE

Nikolas Zimmermann noreply at github.com
Fri Feb 9 15:06:48 PST 2024


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 3bd5bd5c81f2cb45f09ff2c8d004241544ce69aa
      https://github.com/WebKit/WebKit/commit/3bd5bd5c81f2cb45f09ff2c8d004241544ce69aa
  Author: Nikolas Zimmermann <nzimmermann at igalia.com>
  Date:   2024-02-09 (Fri, 09 Feb 2024)

  Changed paths:
    M LayoutTests/platform/mac-sonoma-wk2-lbse-text/TestExpectations
    M Source/WebCore/WebCore.xcodeproj/project.pbxproj
    M Source/WebCore/rendering/RenderLayer.cpp
    M Source/WebCore/rendering/RenderLayerModelObject.cpp
    M Source/WebCore/rendering/RenderLayerModelObject.h
    M Source/WebCore/rendering/svg/RenderSVGContainer.cpp
    M Source/WebCore/rendering/svg/RenderSVGImage.cpp
    M Source/WebCore/rendering/svg/RenderSVGPath.cpp
    M Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp
    M Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp
    M Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp
    M Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp
    M Source/WebCore/rendering/svg/RenderSVGRoot.cpp
    M Source/WebCore/rendering/svg/RenderSVGShape.cpp
    M Source/WebCore/rendering/svg/RenderSVGText.cpp
    M Source/WebCore/rendering/svg/SVGRenderSupport.cpp
    M Source/WebCore/rendering/svg/SVGRenderSupport.h
    A Source/WebCore/rendering/svg/SVGVisitedRendererTracking.h
    M Source/WebCore/rendering/svg/legacy/LegacyRenderSVGContainer.cpp
    M Source/WebCore/rendering/svg/legacy/LegacyRenderSVGImage.cpp
    M Source/WebCore/rendering/svg/legacy/LegacyRenderSVGResourceClipper.cpp
    M Source/WebCore/rendering/svg/legacy/LegacyRenderSVGRoot.cpp
    M Source/WebCore/rendering/svg/legacy/LegacyRenderSVGShape.cpp
    A Source/WebCore/svg/SVGVisitedElementTracking.h
    M Source/WebCore/svg/animation/SVGSMILElement.cpp

  Log Message:
  -----------
  Unify cycle detection logic for legacy & LBSE
https://bugs.webkit.org/show_bug.cgi?id=268909

Reviewed by Rob Buis.

Provide one unique way to prevent recursion in SVG: SVGVisitedRendererTracking.
We already had SVGHitTestCycleDetectionScope to prevent cycles in the legacy
SVG engine during hit-testing, and custom code in SVGSMILElement that provided
the same functionality, but SVGElement, not RenderElement based.

Unify the logic in SVGVisitedRenderingTracking / SVGVisitedElementTracking
and make use of them throughout the legacy SVG engine & LBSE.

It's used like this:

<example>
bool RenderSVGSomething::someMethod()
{
    static NeverDestroyed<SVGVisitedRendererTracking::VisitedSet> s_visitedSet;

    SVGVisitedRendererTracking recursionTracking(s_visitedSet);
    if (recursionTracking.isVisiting(*this))
        return false;

    SVGVisitedRendererTracking::Scope recursionScope(recursionTracking, *this);

    // We can be sure that if someMethod() is entered again - we'll gracefully exit as
    // SVGVisitedRendererTracking::isVisiting(const RenderElement&) returns true above.
    performActionThatPotententiallyEntersThisMethodAgain();
    return true;
}
</example>

Unlike SVGHitTestCycleDetectionScope there is no single static HashSet
shared between all instances of SVGVisitedRendererTracking::Scope - instead
it is passed in as reference to the SVGVisitedRendererTracking constructor.
This allows to seperate the different cylce detection scopes in a fine-grained
way, e.g. per method, per type, etc.

Covered by existing tests.

* LayoutTests/platform/mac-sonoma-wk2-lbse-text/TestExpectations:
Some gardening - cleanup duplicated entries so lint passes again.
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/rendering/RenderLayer.cpp:
(WebCore::RenderLayer::paintSVGResourceLayer):
* Source/WebCore/rendering/RenderLayerModelObject.cpp:
(WebCore::RenderLayerModelObject::pointInSVGClippingArea const):
* Source/WebCore/rendering/RenderLayerModelObject.h:
* Source/WebCore/rendering/svg/RenderSVGContainer.cpp:
(WebCore::RenderSVGContainer::nodeAtPoint):
* Source/WebCore/rendering/svg/RenderSVGImage.cpp:
(WebCore::RenderSVGImage::nodeAtPoint):
* Source/WebCore/rendering/svg/RenderSVGPath.cpp:
(WebCore::RenderSVGPath::drawMarkers):
(WebCore::RenderSVGPath::computeMarkerBoundingBox const):
* Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp:
(WebCore::RenderSVGResourceClipper::applyMaskClipping):
(WebCore::RenderSVGResourceClipper::hitTestClipContent):
(WebCore::RenderSVGResourceClipper::resourceBoundingBox):
* Source/WebCore/rendering/svg/RenderSVGResourceContainer.cpp:
(WebCore::notifyResourceChanged):
(WebCore::RenderSVGResourceContainer::registerResource):
(WebCore::RenderSVGResourceContainer::repaintAllClients const):
* Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp:
(WebCore::RenderSVGResourceMasker::applyMask):
(WebCore::RenderSVGResourceMasker::resourceBoundingBox):
* Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp:
(WebCore::RenderSVGResourcePattern::createTileImage const):
* Source/WebCore/rendering/svg/RenderSVGRoot.cpp:
(WebCore::RenderSVGRoot::nodeAtPoint):
* Source/WebCore/rendering/svg/RenderSVGShape.cpp:
(WebCore::RenderSVGShape::nodeAtPoint):
* Source/WebCore/rendering/svg/RenderSVGText.cpp:
(WebCore::RenderSVGText::nodeAtFloatPoint):
(WebCore::RenderSVGText::nodeAtPoint):
* Source/WebCore/rendering/svg/SVGRenderSupport.cpp:
(WebCore::SVGRenderSupport::pointInClippingArea):
(WebCore::SVGHitTestCycleDetectionScope::SVGHitTestCycleDetectionScope): Deleted.
(WebCore::SVGHitTestCycleDetectionScope::~SVGHitTestCycleDetectionScope): Deleted.
(WebCore::SVGHitTestCycleDetectionScope::visitedElements): Deleted.
(WebCore::SVGHitTestCycleDetectionScope::isEmpty): Deleted.
(WebCore::SVGHitTestCycleDetectionScope::isVisiting): Deleted.
* Source/WebCore/rendering/svg/SVGRenderSupport.h:
* Source/WebCore/rendering/svg/SVGVisitedRendererTracking.h: Added.
(WebCore::SVGVisitedRendererTracking::SVGVisitedRendererTracking):
(WebCore::SVGVisitedRendererTracking::isEmpty const):
(WebCore::SVGVisitedRendererTracking::isVisiting):
(WebCore::SVGVisitedRendererTracking::Scope::Scope):
(WebCore::SVGVisitedRendererTracking::Scope::~Scope):
(WebCore::SVGVisitedRendererTracking::addUnique):
(WebCore::SVGVisitedRendererTracking::removeUnique):
* Source/WebCore/rendering/svg/legacy/LegacyRenderSVGContainer.cpp:
(WebCore::LegacyRenderSVGContainer::nodeAtFloatPoint):
* Source/WebCore/rendering/svg/legacy/LegacyRenderSVGImage.cpp:
(WebCore::LegacyRenderSVGImage::nodeAtFloatPoint):
* Source/WebCore/rendering/svg/legacy/LegacyRenderSVGResourceClipper.cpp:
(WebCore::LegacyRenderSVGResourceClipper::hitTestClipContent):
* Source/WebCore/rendering/svg/legacy/LegacyRenderSVGRoot.cpp:
(WebCore::LegacyRenderSVGRoot::nodeAtPoint):
* Source/WebCore/rendering/svg/legacy/LegacyRenderSVGShape.cpp:
(WebCore::LegacyRenderSVGShape::nodeAtFloatPoint):
* Source/WebCore/svg/SVGVisitedElementTracking.h: Added.
(WebCore::SVGVisitedElementTracking::SVGVisitedElementTracking):
(WebCore::SVGVisitedElementTracking::isEmpty const):
(WebCore::SVGVisitedElementTracking::isVisiting):
(WebCore::SVGVisitedElementTracking::Scope::Scope):
(WebCore::SVGVisitedElementTracking::Scope::~Scope):
(WebCore::SVGVisitedElementTracking::addUnique):
(WebCore::SVGVisitedElementTracking::removeUnique):
* Source/WebCore/svg/animation/SVGSMILElement.cpp:
(WebCore::SVGSMILElement::notifyDependentsIntervalChanged):

Canonical link: https://commits.webkit.org/274392@main




More information about the webkit-changes mailing list