Branch: refs/heads/main Home: https://github.com/WebKit/WebKit Commit: 3bd5bd5c81f2cb45f09ff2c8d004241544ce69aa https://github.com/WebKit/WebKit/commit/3bd5bd5c81f2cb45f09ff2c8d004241544ce69aa Author: Nikolas Zimmermann <nzimmerm...@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 _______________________________________________ webkit-changes mailing list webkit-changes@lists.webkit.org https://lists.webkit.org/mailman/listinfo/webkit-changes