Title: [290934] branches/safari-613-branch
Revision
290934
Author
[email protected]
Date
2022-03-07 14:10:09 -0800 (Mon, 07 Mar 2022)

Log Message

Cherry-pick r290306. rdar://problem/88352589

    Make pointer-events checks for SVG take in account inert subtrees
    https://bugs.webkit.org/show_bug.cgi?id=235836

    Reviewed by Antti Koivisto.

    LayoutTests/imported/w3c:

    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.

    Source/WebCore:

    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):

    LayoutTests:

    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.

    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@290306 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Modified Paths

Added Paths

Diff

Modified: branches/safari-613-branch/LayoutTests/ChangeLog (290933 => 290934)


--- branches/safari-613-branch/LayoutTests/ChangeLog	2022-03-07 22:10:01 UTC (rev 290933)
+++ branches/safari-613-branch/LayoutTests/ChangeLog	2022-03-07 22:10:09 UTC (rev 290934)
@@ -1,5 +1,80 @@
 2022-03-07  Russell Epstein  <[email protected]>
 
+        Cherry-pick r290306. rdar://problem/88352589
+
+    Make pointer-events checks for SVG take in account inert subtrees
+    https://bugs.webkit.org/show_bug.cgi?id=235836
+    
+    Reviewed by Antti Koivisto.
+    
+    LayoutTests/imported/w3c:
+    
+    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.
+    
+    Source/WebCore:
+    
+    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):
+    
+    LayoutTests:
+    
+    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.
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@290306 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    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-03-07  Russell Epstein  <[email protected]>
+
         Cherry-pick r290164. rdar://problem/89162532
 
     Re-import inert and <dialog> WPT

Modified: branches/safari-613-branch/LayoutTests/imported/w3c/ChangeLog (290933 => 290934)


--- branches/safari-613-branch/LayoutTests/imported/w3c/ChangeLog	2022-03-07 22:10:01 UTC (rev 290933)
+++ branches/safari-613-branch/LayoutTests/imported/w3c/ChangeLog	2022-03-07 22:10:09 UTC (rev 290934)
@@ -1,5 +1,82 @@
 2022-03-07  Russell Epstein  <[email protected]>
 
+        Cherry-pick r290306. rdar://problem/88352589
+
+    Make pointer-events checks for SVG take in account inert subtrees
+    https://bugs.webkit.org/show_bug.cgi?id=235836
+    
+    Reviewed by Antti Koivisto.
+    
+    LayoutTests/imported/w3c:
+    
+    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.
+    
+    Source/WebCore:
+    
+    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):
+    
+    LayoutTests:
+    
+    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.
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@290306 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    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-03-07  Russell Epstein  <[email protected]>
+
         Cherry-pick r290232. rdar://problem/88818132
 
     Rebaseline inert-focus-in-frames.html after r290197.

Added: branches/safari-613-branch/LayoutTests/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest-expected.txt (0 => 290934)


--- branches/safari-613-branch/LayoutTests/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest-expected.txt	                        (rev 0)
+++ branches/safari-613-branch/LayoutTests/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest-expected.txt	2022-03-07 22:10:09 UTC (rev 290934)
@@ -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: branches/safari-613-branch/LayoutTests/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest.html (0 => 290934)


--- branches/safari-613-branch/LayoutTests/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest.html	                        (rev 0)
+++ branches/safari-613-branch/LayoutTests/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest.html	2022-03-07 22:10:09 UTC (rev 290934)
@@ -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: branches/safari-613-branch/LayoutTests/imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative-expected.txt (0 => 290934)


--- branches/safari-613-branch/LayoutTests/imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative-expected.txt	                        (rev 0)
+++ branches/safari-613-branch/LayoutTests/imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative-expected.txt	2022-03-07 22:10:09 UTC (rev 290934)
@@ -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: branches/safari-613-branch/LayoutTests/imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative.html (0 => 290934)


--- branches/safari-613-branch/LayoutTests/imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative.html	                        (rev 0)
+++ branches/safari-613-branch/LayoutTests/imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative.html	2022-03-07 22:10:09 UTC (rev 290934)
@@ -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: branches/safari-613-branch/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest-expected.txt (0 => 290934)


--- branches/safari-613-branch/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest-expected.txt	                        (rev 0)
+++ branches/safari-613-branch/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest-expected.txt	2022-03-07 22:10:09 UTC (rev 290934)
@@ -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: branches/safari-613-branch/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative-expected.txt (0 => 290934)


--- branches/safari-613-branch/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative-expected.txt	                        (rev 0)
+++ branches/safari-613-branch/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative-expected.txt	2022-03-07 22:10:09 UTC (rev 290934)
@@ -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: branches/safari-613-branch/Source/WebCore/ChangeLog (290933 => 290934)


--- branches/safari-613-branch/Source/WebCore/ChangeLog	2022-03-07 22:10:01 UTC (rev 290933)
+++ branches/safari-613-branch/Source/WebCore/ChangeLog	2022-03-07 22:10:09 UTC (rev 290934)
@@ -1,5 +1,109 @@
 2022-03-07  Russell Epstein  <[email protected]>
 
+        Cherry-pick r290306. rdar://problem/88352589
+
+    Make pointer-events checks for SVG take in account inert subtrees
+    https://bugs.webkit.org/show_bug.cgi?id=235836
+    
+    Reviewed by Antti Koivisto.
+    
+    LayoutTests/imported/w3c:
+    
+    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.
+    
+    Source/WebCore:
+    
+    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):
+    
+    LayoutTests:
+    
+    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.
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@290306 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    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-03-07  Russell Epstein  <[email protected]>
+
         Cherry-pick r290305. rdar://problem/89287719
 
     Rename RenderStyle::userSelectIncludingInert to RenderStyle::effectiveUserSelect

Modified: branches/safari-613-branch/Source/WebCore/rendering/RenderElement.cpp (290933 => 290934)


--- branches/safari-613-branch/Source/WebCore/rendering/RenderElement.cpp	2022-03-07 22:10:01 UTC (rev 290933)
+++ branches/safari-613-branch/Source/WebCore/rendering/RenderElement.cpp	2022-03-07 22:10:09 UTC (rev 290934)
@@ -847,10 +847,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: branches/safari-613-branch/Source/WebCore/rendering/RenderElement.h (290933 => 290934)


--- branches/safari-613-branch/Source/WebCore/rendering/RenderElement.h	2022-03-07 22:10:01 UTC (rev 290933)
+++ branches/safari-613-branch/Source/WebCore/rendering/RenderElement.h	2022-03-07 22:10:09 UTC (rev 290934)
@@ -157,13 +157,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: branches/safari-613-branch/Source/WebCore/rendering/RenderLayerCompositor.cpp (290933 => 290934)


--- branches/safari-613-branch/Source/WebCore/rendering/RenderLayerCompositor.cpp	2022-03-07 22:10:01 UTC (rev 290933)
+++ branches/safari-613-branch/Source/WebCore/rendering/RenderLayerCompositor.cpp	2022-03-07 22:10:09 UTC (rev 290934)
@@ -1730,7 +1730,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: branches/safari-613-branch/Source/WebCore/rendering/style/RenderStyle.h (290933 => 290934)


--- branches/safari-613-branch/Source/WebCore/rendering/style/RenderStyle.h	2022-03-07 22:10:01 UTC (rev 290933)
+++ branches/safari-613-branch/Source/WebCore/rendering/style/RenderStyle.h	2022-03-07 22:10:09 UTC (rev 290934)
@@ -708,6 +708,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: branches/safari-613-branch/Source/WebCore/rendering/svg/LegacyRenderSVGModelObject.cpp (290933 => 290934)


--- branches/safari-613-branch/Source/WebCore/rendering/svg/LegacyRenderSVGModelObject.cpp	2022-03-07 22:10:01 UTC (rev 290933)
+++ branches/safari-613-branch/Source/WebCore/rendering/svg/LegacyRenderSVGModelObject.cpp	2022-03-07 22:10:09 UTC (rev 290934)
@@ -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: branches/safari-613-branch/Source/WebCore/rendering/svg/LegacyRenderSVGShape.cpp (290933 => 290934)


--- branches/safari-613-branch/Source/WebCore/rendering/svg/LegacyRenderSVGShape.cpp	2022-03-07 22:10:01 UTC (rev 290933)
+++ branches/safari-613-branch/Source/WebCore/rendering/svg/LegacyRenderSVGShape.cpp	2022-03-07 22:10:09 UTC (rev 290934)
@@ -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: branches/safari-613-branch/Source/WebCore/rendering/svg/RenderSVGImage.cpp (290933 => 290934)


--- branches/safari-613-branch/Source/WebCore/rendering/svg/RenderSVGImage.cpp	2022-03-07 22:10:01 UTC (rev 290933)
+++ branches/safari-613-branch/Source/WebCore/rendering/svg/RenderSVGImage.cpp	2022-03-07 22:10:09 UTC (rev 290934)
@@ -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: branches/safari-613-branch/Source/WebCore/rendering/svg/RenderSVGModelObject.cpp (290933 => 290934)


--- branches/safari-613-branch/Source/WebCore/rendering/svg/RenderSVGModelObject.cpp	2022-03-07 22:10:01 UTC (rev 290933)
+++ branches/safari-613-branch/Source/WebCore/rendering/svg/RenderSVGModelObject.cpp	2022-03-07 22:10:09 UTC (rev 290934)
@@ -253,7 +253,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;
@@ -265,7 +265,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: branches/safari-613-branch/Source/WebCore/rendering/svg/RenderSVGShape.cpp (290933 => 290934)


--- branches/safari-613-branch/Source/WebCore/rendering/svg/RenderSVGShape.cpp	2022-03-07 22:10:01 UTC (rev 290933)
+++ branches/safari-613-branch/Source/WebCore/rendering/svg/RenderSVGShape.cpp	2022-03-07 22:10:09 UTC (rev 290934)
@@ -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: branches/safari-613-branch/Source/WebCore/rendering/svg/RenderSVGText.cpp (290933 => 290934)


--- branches/safari-613-branch/Source/WebCore/rendering/svg/RenderSVGText.cpp	2022-03-07 22:10:01 UTC (rev 290933)
+++ branches/safari-613-branch/Source/WebCore/rendering/svg/RenderSVGText.cpp	2022-03-07 22:10:09 UTC (rev 290934)
@@ -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: branches/safari-613-branch/Source/WebCore/rendering/svg/SVGInlineTextBox.cpp (290933 => 290934)


--- branches/safari-613-branch/Source/WebCore/rendering/svg/SVGInlineTextBox.cpp	2022-03-07 22:10:01 UTC (rev 290933)
+++ branches/safari-613-branch/Source/WebCore/rendering/svg/SVGInlineTextBox.cpp	2022-03-07 22:10:09 UTC (rev 290934)
@@ -634,7 +634,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))
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to