[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