Diff
Modified: trunk/LayoutTests/ChangeLog (290305 => 290306)
--- trunk/LayoutTests/ChangeLog 2022-02-22 15:42:48 UTC (rev 290305)
+++ trunk/LayoutTests/ChangeLog 2022-02-22 15:45:55 UTC (rev 290306)
@@ -1,3 +1,15 @@
+2022-02-22 Tim Nguyen <[email protected]>
+
+ Make pointer-events checks for SVG take in account inert subtrees
+ https://bugs.webkit.org/show_bug.cgi?id=235836
+
+ Reviewed by Antti Koivisto.
+
+ iOS doesn't support test_actions, so it needs different baselines.
+
+ * platform/ios-wk2/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest-expected.txt: Added.
+ * platform/ios-wk2/imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative-expected.txt: Added.
+
2022-02-22 Jonathan Bedard <[email protected]>
Unreviewed, reverting r290220.
Modified: trunk/LayoutTests/imported/w3c/ChangeLog (290305 => 290306)
--- trunk/LayoutTests/imported/w3c/ChangeLog 2022-02-22 15:42:48 UTC (rev 290305)
+++ trunk/LayoutTests/imported/w3c/ChangeLog 2022-02-22 15:45:55 UTC (rev 290306)
@@ -1,3 +1,17 @@
+2022-02-22 Tim Nguyen <[email protected]>
+
+ Make pointer-events checks for SVG take in account inert subtrees
+ https://bugs.webkit.org/show_bug.cgi?id=235836
+
+ Reviewed by Antti Koivisto.
+
+ Added tests for both inert attribute & modal dialog cases.
+
+ * web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest-expected.txt: Added.
+ * web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest.html: Added.
+ * web-platform-tests/inert/inert-svg-hittest.tentative-expected.txt: Added.
+ * web-platform-tests/inert/inert-svg-hittest.tentative.html: Added.
+
2022-02-22 Marcos Caceres <[email protected]>
Permission API: handle non-fully active documents
Added: trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest-expected.txt (0 => 290306)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest-expected.txt (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest-expected.txt 2022-02-22 15:45:55 UTC (rev 290306)
@@ -0,0 +1,4 @@
+
+PASS Hit-testing doesn't reach contents of an inert SVG
+PASS Hit-testing can reach contents of a no longer inert SVG
+
Added: trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest.html (0 => 290306)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest.html (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest.html 2022-02-22 15:45:55 UTC (rev 290306)
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Hit-testing with SVG made inert by modal dialog</title>
+<link rel="author" title="Tim Nguyen" href=""
+<link rel="help" href=""
+<meta assert="assert" content="SVG made inert by modal dialog should be unreachable with hit-testing">
+<script src=""
+<script src=""
+<script src=""
+<script src=""
+<script src=""
+
+<div id="wrapper">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
+ <rect width="500" height="500" id="target" fill="red">
+ </svg>
+</div>
+
+<dialog id="dialog">Content behind the open modal dialog should not be clickable</dialog>
+
+<style>
+dialog::backdrop {
+ display: none;
+}
+</style>
+
+<script>
+const dialog = document.getElementById("dialog");
+const wrapper = document.getElementById("wrapper");
+const target = document.getElementById("target");
+
+promise_test(async function() {
+ dialog.showModal();
+ this.add_cleanup(() => dialog.close());
+
+ let reachedTarget = false;
+ target.addEventListener("mousedown", () => {
+ reachedTarget = true;
+ }, { once: true });
+
+ await new test_driver.Actions()
+ .pointerMove(0, 0, { origin: wrapper })
+ .pointerDown()
+ .send();
+ this.add_cleanup(() => test_driver.click(document.body));
+
+ assert_false(target.matches(":active"), "target is not active");
+ assert_false(target.matches(":hover"), "target is not hovered");
+ assert_false(reachedTarget, "target didn't get event");
+}, "Hit-testing doesn't reach contents of an inert SVG");
+
+promise_test(async function() {
+ assert_false(dialog.open, "dialog is closed");
+
+ let reachedTarget = false;
+ target.addEventListener("mousedown", () => {
+ reachedTarget = true;
+ }, { once: true });
+
+ await new test_driver.Actions()
+ .pointerMove(0, 0, { origin: wrapper })
+ .pointerDown()
+ .send();
+ this.add_cleanup(() => test_driver.click(document.body));
+
+ assert_true(target.matches(":active"), "target is active");
+ assert_true(reachedTarget, "target got event");
+}, "Hit-testing can reach contents of a no longer inert SVG");
+</script>
Added: trunk/LayoutTests/imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative-expected.txt (0 => 290306)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative-expected.txt (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative-expected.txt 2022-02-22 15:45:55 UTC (rev 290306)
@@ -0,0 +1,4 @@
+
+PASS Hit-testing doesn't reach contents of an inert SVG
+PASS Hit-testing can reach contents of a no longer inert SVG
+
Added: trunk/LayoutTests/imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative.html (0 => 290306)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative.html (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative.html 2022-02-22 15:45:55 UTC (rev 290306)
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Hit-testing with inert SVG</title>
+<link rel="author" title="Tim Nguyen" href=""
+<link rel="help" href=""
+<meta assert="assert" content="SVG inside element with inert attribute should be unreachable with hit-testing">
+<script src=""
+<script src=""
+<script src=""
+<script src=""
+<script src=""
+
+<div id="wrapper">
+ <div inert id="svg-container">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
+ <rect width="500" height="500" id="target" fill="red">
+ </svg>
+ </div>
+</div>
+
+<script>
+const wrapper = document.getElementById("wrapper");
+const target = document.getElementById("target");
+
+promise_test(async function() {
+ let reachedTarget = false;
+ target.addEventListener("mousedown", () => {
+ reachedTarget = true;
+ }, { once: true });
+
+ let reachedWrapper = false;
+ wrapper.addEventListener("mousedown", () => {
+ reachedWrapper = true;
+ }, { once: true });
+
+ await new test_driver.Actions()
+ .pointerMove(0, 0, { origin: wrapper })
+ .pointerDown()
+ .send();
+ this.add_cleanup(() => test_driver.click(document.body));
+
+ assert_false(target.matches(":active"), "target is not active");
+ assert_false(target.matches(":hover"), "target is not hovered");
+ assert_false(reachedTarget, "target didn't get event");
+
+ assert_true(wrapper.matches(":hover"), "wrapper is hovered");
+ assert_true(reachedWrapper, "wrapper got event");
+}, "Hit-testing doesn't reach contents of an inert SVG");
+
+promise_test(async function() {
+ document.querySelector("#svg-container").inert = false;
+
+ let reachedTarget = false;
+ target.addEventListener("mousedown", () => {
+ reachedTarget = true;
+ }, { once: true });
+
+ await new test_driver.Actions()
+ .pointerMove(0, 0, { origin: wrapper })
+ .pointerDown()
+ .send();
+ this.add_cleanup(() => test_driver.click(document.body));
+
+ assert_true(target.matches(":active"), "target is active");
+ assert_true(target.matches(":hover"), "target is hovered");
+ assert_true(reachedTarget, "target got event");
+
+ assert_true(wrapper.matches(":hover"), "wrapper is hovered");
+}, "Hit-testing can reach contents of a no longer inert SVG");
+</script>
Added: trunk/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest-expected.txt (0 => 290306)
--- trunk/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest-expected.txt (rev 0)
+++ trunk/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest-expected.txt 2022-02-22 15:45:55 UTC (rev 290306)
@@ -0,0 +1,4 @@
+
+PASS Hit-testing doesn't reach contents of an inert SVG
+FAIL Hit-testing can reach contents of a no longer inert SVG assert_true: target is active expected true got false
+
Added: trunk/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative-expected.txt (0 => 290306)
--- trunk/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative-expected.txt (rev 0)
+++ trunk/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative-expected.txt 2022-02-22 15:45:55 UTC (rev 290306)
@@ -0,0 +1,4 @@
+
+FAIL Hit-testing doesn't reach contents of an inert SVG assert_true: wrapper is hovered expected true got false
+FAIL Hit-testing can reach contents of a no longer inert SVG assert_true: target is active expected true got false
+
Modified: trunk/Source/WebCore/ChangeLog (290305 => 290306)
--- trunk/Source/WebCore/ChangeLog 2022-02-22 15:42:48 UTC (rev 290305)
+++ trunk/Source/WebCore/ChangeLog 2022-02-22 15:45:55 UTC (rev 290306)
@@ -1,5 +1,46 @@
2022-02-22 Tim Nguyen <[email protected]>
+ Make pointer-events checks for SVG take in account inert subtrees
+ https://bugs.webkit.org/show_bug.cgi?id=235836
+
+ Reviewed by Antti Koivisto.
+
+ Re-using visibleToHitTesting in SVG code isn't possible, because visibleToHitTesting removes visibility: hidden;
+ content from hit-testing, which we do not want to here, since pointer-events has values for SVG which still
+ allow clicking content regardless of their visibility value (pointer-events: painted/fill/stroke/all).
+
+ Instead, we add an inert-aware effectivePointerEvents, similar to effectiveUserSelect and re-use that across the codebase.
+
+ Tests: imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest.html
+ imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative.html
+
+ * rendering/RenderElement.cpp:
+ (WebCore::RenderElement::styleWillChange):
+ * rendering/RenderElement.h:
+ (WebCore::RenderElement::visibleToHitTesting const):
+ * rendering/RenderLayerCompositor.cpp:
+ (WebCore::RenderLayerCompositor::layerStyleChanged):
+ * rendering/style/RenderStyle.h:
+ (WebCore::RenderStyle::effectivePointerEvents const):
+ * rendering/svg/LegacyRenderSVGModelObject.cpp:
+ (WebCore::LegacyRenderSVGModelObject::checkIntersection):
+ (WebCore::LegacyRenderSVGModelObject::checkEnclosure):
+ * rendering/svg/LegacyRenderSVGShape.cpp:
+ (WebCore::LegacyRenderSVGShape::nodeAtFloatPoint):
+ * rendering/svg/RenderSVGImage.cpp:
+ (WebCore::RenderSVGImage::nodeAtFloatPoint):
+ * rendering/svg/RenderSVGModelObject.cpp:
+ (WebCore::RenderSVGModelObject::checkIntersection):
+ (WebCore::RenderSVGModelObject::checkEnclosure):
+ * rendering/svg/RenderSVGShape.cpp:
+ (WebCore::RenderSVGShape::nodeAtPoint):
+ * rendering/svg/RenderSVGText.cpp:
+ (WebCore::RenderSVGText::nodeAtFloatPoint):
+ * rendering/svg/SVGInlineTextBox.cpp:
+ (WebCore::SVGInlineTextBox::nodeAtPoint):
+
+2022-02-22 Tim Nguyen <[email protected]>
+
Rename RenderStyle::userSelectIncludingInert to RenderStyle::effectiveUserSelect
https://bugs.webkit.org/show_bug.cgi?id=237033
Modified: trunk/Source/WebCore/rendering/RenderElement.cpp (290305 => 290306)
--- trunk/Source/WebCore/rendering/RenderElement.cpp 2022-02-22 15:42:48 UTC (rev 290305)
+++ trunk/Source/WebCore/rendering/RenderElement.cpp 2022-02-22 15:45:55 UTC (rev 290306)
@@ -844,10 +844,8 @@
}
auto needsInvalidateEventRegion = [&] {
- if (m_style.effectiveInert() != newStyle.effectiveInert())
+ if (m_style.effectivePointerEvents() != newStyle.effectivePointerEvents())
return true;
- if (m_style.pointerEvents() != newStyle.pointerEvents())
- return true;
#if ENABLE(TOUCH_ACTION_REGIONS)
if (m_style.effectiveTouchActions() != newStyle.effectiveTouchActions())
return true;
Modified: trunk/Source/WebCore/rendering/RenderElement.h (290305 => 290306)
--- trunk/Source/WebCore/rendering/RenderElement.h 2022-02-22 15:42:48 UTC (rev 290305)
+++ trunk/Source/WebCore/rendering/RenderElement.h 2022-02-22 15:45:55 UTC (rev 290306)
@@ -159,13 +159,10 @@
bool visibleToHitTesting(std::optional<HitTestRequest> hitTestRequest = std::nullopt) const
{
- if (style().effectiveInert())
- return false;
-
if (style().visibility() != Visibility::Visible)
return false;
- if ((!hitTestRequest || !hitTestRequest->ignoreCSSPointerEventsProperty()) && style().pointerEvents() == PointerEvents::None)
+ if ((!hitTestRequest || !hitTestRequest->ignoreCSSPointerEventsProperty()) && style().effectivePointerEvents() == PointerEvents::None)
return false;
return true;
Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (290305 => 290306)
--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2022-02-22 15:42:48 UTC (rev 290305)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2022-02-22 15:45:55 UTC (rev 290306)
@@ -1731,7 +1731,7 @@
if (diff >= StyleDifference::RecompositeLayer) {
if (layer.isComposited()) {
- bool hitTestingStateChanged = oldStyle && (oldStyle->pointerEvents() != newStyle.pointerEvents() || oldStyle->effectiveInert() != newStyle.effectiveInert());
+ bool hitTestingStateChanged = oldStyle && (oldStyle->effectivePointerEvents() != newStyle.effectivePointerEvents());
if (is<RenderWidget>(layer.renderer()) || hitTestingStateChanged) {
// For RenderWidgets this is necessary to get iframe layers hooked up in response to scheduleInvalidateStyleAndLayerComposition().
layer.setNeedsCompositingConfigurationUpdate();
Modified: trunk/Source/WebCore/rendering/style/RenderStyle.h (290305 => 290306)
--- trunk/Source/WebCore/rendering/style/RenderStyle.h 2022-02-22 15:42:48 UTC (rev 290305)
+++ trunk/Source/WebCore/rendering/style/RenderStyle.h 2022-02-22 15:45:55 UTC (rev 290306)
@@ -713,6 +713,7 @@
LineAlign lineAlign() const { return static_cast<LineAlign>(m_rareInheritedData->lineAlign); }
PointerEvents pointerEvents() const { return static_cast<PointerEvents>(m_inheritedFlags.pointerEvents); }
+ PointerEvents effectivePointerEvents() const { return effectiveInert() ? PointerEvents::None : pointerEvents(); }
const AnimationList* animations() const { return m_rareNonInheritedData->animations.get(); }
const AnimationList* transitions() const { return m_rareNonInheritedData->transitions.get(); }
Modified: trunk/Source/WebCore/rendering/svg/LegacyRenderSVGModelObject.cpp (290305 => 290306)
--- trunk/Source/WebCore/rendering/svg/LegacyRenderSVGModelObject.cpp 2022-02-22 15:42:48 UTC (rev 290305)
+++ trunk/Source/WebCore/rendering/svg/LegacyRenderSVGModelObject.cpp 2022-02-22 15:45:55 UTC (rev 290306)
@@ -169,7 +169,7 @@
bool LegacyRenderSVGModelObject::checkIntersection(RenderElement* renderer, const FloatRect& rect)
{
- if (!renderer || renderer->style().pointerEvents() == PointerEvents::None)
+ if (!renderer || renderer->style().effectivePointerEvents() == PointerEvents::None)
return false;
if (!isGraphicsElement(*renderer))
return false;
@@ -182,7 +182,7 @@
bool LegacyRenderSVGModelObject::checkEnclosure(RenderElement* renderer, const FloatRect& rect)
{
- if (!renderer || renderer->style().pointerEvents() == PointerEvents::None)
+ if (!renderer || renderer->style().effectivePointerEvents() == PointerEvents::None)
return false;
if (!isGraphicsElement(*renderer))
return false;
Modified: trunk/Source/WebCore/rendering/svg/LegacyRenderSVGShape.cpp (290305 => 290306)
--- trunk/Source/WebCore/rendering/svg/LegacyRenderSVGShape.cpp 2022-02-22 15:42:48 UTC (rev 290305)
+++ trunk/Source/WebCore/rendering/svg/LegacyRenderSVGShape.cpp 2022-02-22 15:45:55 UTC (rev 290306)
@@ -354,7 +354,7 @@
SVGHitTestCycleDetectionScope hitTestScope(*this);
- PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_PATH_HITTESTING, request, style().pointerEvents());
+ PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_PATH_HITTESTING, request, style().effectivePointerEvents());
bool isVisible = (style().visibility() == Visibility::Visible);
if (isVisible || !hitRules.requireVisible) {
const SVGRenderStyle& svgStyle = style().svgStyle();
Modified: trunk/Source/WebCore/rendering/svg/RenderSVGImage.cpp (290305 => 290306)
--- trunk/Source/WebCore/rendering/svg/RenderSVGImage.cpp 2022-02-22 15:42:48 UTC (rev 290305)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGImage.cpp 2022-02-22 15:45:55 UTC (rev 290306)
@@ -216,7 +216,7 @@
if (hitTestAction != HitTestForeground)
return false;
- PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_IMAGE_HITTESTING, request, style().pointerEvents());
+ PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_IMAGE_HITTESTING, request, style().effectivePointerEvents());
bool isVisible = (style().visibility() == Visibility::Visible);
if (isVisible || !hitRules.requireVisible) {
FloatPoint localPoint = valueOrDefault(localToParentTransform().inverse()).mapPoint(pointInParent);
Modified: trunk/Source/WebCore/rendering/svg/RenderSVGModelObject.cpp (290305 => 290306)
--- trunk/Source/WebCore/rendering/svg/RenderSVGModelObject.cpp 2022-02-22 15:42:48 UTC (rev 290305)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGModelObject.cpp 2022-02-22 15:45:55 UTC (rev 290306)
@@ -254,7 +254,7 @@
bool RenderSVGModelObject::checkIntersection(RenderElement* renderer, const FloatRect& rect)
{
- if (!renderer || renderer->style().pointerEvents() == PointerEvents::None)
+ if (!renderer || renderer->style().effectivePointerEvents() == PointerEvents::None)
return false;
if (!isGraphicsElement(*renderer))
return false;
@@ -266,7 +266,7 @@
bool RenderSVGModelObject::checkEnclosure(RenderElement* renderer, const FloatRect& rect)
{
- if (!renderer || renderer->style().pointerEvents() == PointerEvents::None)
+ if (!renderer || renderer->style().effectivePointerEvents() == PointerEvents::None)
return false;
if (!isGraphicsElement(*renderer))
return false;
Modified: trunk/Source/WebCore/rendering/svg/RenderSVGShape.cpp (290305 => 290306)
--- trunk/Source/WebCore/rendering/svg/RenderSVGShape.cpp 2022-02-22 15:42:48 UTC (rev 290305)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGShape.cpp 2022-02-22 15:45:55 UTC (rev 290306)
@@ -358,7 +358,7 @@
SVGHitTestCycleDetectionScope hitTestScope(*this);
- PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_PATH_HITTESTING, request, style().pointerEvents());
+ PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_PATH_HITTESTING, request, style().effectivePointerEvents());
bool isVisible = (style().visibility() == Visibility::Visible);
if (isVisible || !hitRules.requireVisible) {
const SVGRenderStyle& svgStyle = style().svgStyle();
Modified: trunk/Source/WebCore/rendering/svg/RenderSVGText.cpp (290305 => 290306)
--- trunk/Source/WebCore/rendering/svg/RenderSVGText.cpp 2022-02-22 15:42:48 UTC (rev 290305)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGText.cpp 2022-02-22 15:45:55 UTC (rev 290306)
@@ -404,7 +404,7 @@
bool RenderSVGText::nodeAtFloatPoint(const HitTestRequest& request, HitTestResult& result, const FloatPoint& pointInParent, HitTestAction hitTestAction)
{
- PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_TEXT_HITTESTING, request, style().pointerEvents());
+ PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_TEXT_HITTESTING, request, style().effectivePointerEvents());
bool isVisible = (style().visibility() == Visibility::Visible);
if (isVisible || !hitRules.requireVisible) {
if ((hitRules.canHitStroke && (style().svgStyle().hasStroke() || !hitRules.requireStroke))
Modified: trunk/Source/WebCore/rendering/svg/SVGInlineTextBox.cpp (290305 => 290306)
--- trunk/Source/WebCore/rendering/svg/SVGInlineTextBox.cpp 2022-02-22 15:42:48 UTC (rev 290305)
+++ trunk/Source/WebCore/rendering/svg/SVGInlineTextBox.cpp 2022-02-22 15:45:55 UTC (rev 290306)
@@ -635,7 +635,7 @@
// FIXME: integrate with LegacyInlineTextBox::nodeAtPoint better.
ASSERT(!isLineBreak());
- PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_TEXT_HITTESTING, request, renderer().style().pointerEvents());
+ PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_TEXT_HITTESTING, request, renderer().style().effectivePointerEvents());
bool isVisible = renderer().style().visibility() == Visibility::Visible;
if (isVisible || !hitRules.requireVisible) {
if ((hitRules.canHitStroke && (renderer().style().svgStyle().hasStroke() || !hitRules.requireStroke))