Changeset 290306 in webkit


Ignore:
Timestamp:
Feb 22, 2022 7:45:55 AM (5 months ago)
Author:
ntim@apple.com
Message:

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.
Location:
trunk
Files:
6 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r290303 r290306  
     12022-02-22  Tim Nguyen  <ntim@apple.com>
     2
     3        Make pointer-events checks for SVG take in account inert subtrees
     4        https://bugs.webkit.org/show_bug.cgi?id=235836
     5
     6        Reviewed by Antti Koivisto.
     7
     8        iOS doesn't support test_actions, so it needs different baselines.
     9
     10        * platform/ios-wk2/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest-expected.txt: Added.
     11        * platform/ios-wk2/imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative-expected.txt: Added.
     12
    1132022-02-22  Jonathan Bedard  <jbedard@apple.com>
    214
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r290301 r290306  
     12022-02-22  Tim Nguyen  <ntim@apple.com>
     2
     3        Make pointer-events checks for SVG take in account inert subtrees
     4        https://bugs.webkit.org/show_bug.cgi?id=235836
     5
     6        Reviewed by Antti Koivisto.
     7
     8        Added tests for both inert attribute & modal dialog cases.
     9
     10        * web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest-expected.txt: Added.
     11        * web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest.html: Added.
     12        * web-platform-tests/inert/inert-svg-hittest.tentative-expected.txt: Added.
     13        * web-platform-tests/inert/inert-svg-hittest.tentative.html: Added.
     14
    1152022-02-22  Marcos Caceres  <marcos@marcosc.com>
    216
  • trunk/Source/WebCore/ChangeLog

    r290305 r290306  
     12022-02-22  Tim Nguyen  <ntim@apple.com>
     2
     3        Make pointer-events checks for SVG take in account inert subtrees
     4        https://bugs.webkit.org/show_bug.cgi?id=235836
     5
     6        Reviewed by Antti Koivisto.
     7
     8        Re-using visibleToHitTesting in SVG code isn't possible, because visibleToHitTesting removes visibility: hidden;
     9        content from hit-testing, which we do not want to here, since pointer-events has values for SVG which still
     10        allow clicking content regardless of their visibility value (pointer-events: painted/fill/stroke/all).
     11
     12        Instead, we add an inert-aware effectivePointerEvents, similar to effectiveUserSelect and re-use that across the codebase.
     13
     14        Tests: imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest.html
     15               imported/w3c/web-platform-tests/inert/inert-svg-hittest.tentative.html
     16
     17        * rendering/RenderElement.cpp:
     18        (WebCore::RenderElement::styleWillChange):
     19        * rendering/RenderElement.h:
     20        (WebCore::RenderElement::visibleToHitTesting const):
     21        * rendering/RenderLayerCompositor.cpp:
     22        (WebCore::RenderLayerCompositor::layerStyleChanged):
     23        * rendering/style/RenderStyle.h:
     24        (WebCore::RenderStyle::effectivePointerEvents const):
     25        * rendering/svg/LegacyRenderSVGModelObject.cpp:
     26        (WebCore::LegacyRenderSVGModelObject::checkIntersection):
     27        (WebCore::LegacyRenderSVGModelObject::checkEnclosure):
     28        * rendering/svg/LegacyRenderSVGShape.cpp:
     29        (WebCore::LegacyRenderSVGShape::nodeAtFloatPoint):
     30        * rendering/svg/RenderSVGImage.cpp:
     31        (WebCore::RenderSVGImage::nodeAtFloatPoint):
     32        * rendering/svg/RenderSVGModelObject.cpp:
     33        (WebCore::RenderSVGModelObject::checkIntersection):
     34        (WebCore::RenderSVGModelObject::checkEnclosure):
     35        * rendering/svg/RenderSVGShape.cpp:
     36        (WebCore::RenderSVGShape::nodeAtPoint):
     37        * rendering/svg/RenderSVGText.cpp:
     38        (WebCore::RenderSVGText::nodeAtFloatPoint):
     39        * rendering/svg/SVGInlineTextBox.cpp:
     40        (WebCore::SVGInlineTextBox::nodeAtPoint):
     41
    1422022-02-22  Tim Nguyen  <ntim@apple.com>
    243
  • trunk/Source/WebCore/rendering/RenderElement.cpp

    r290305 r290306  
    845845
    846846        auto needsInvalidateEventRegion = [&] {
    847             if (m_style.effectiveInert() != newStyle.effectiveInert())
    848                 return true;
    849             if (m_style.pointerEvents() != newStyle.pointerEvents())
     847            if (m_style.effectivePointerEvents() != newStyle.effectivePointerEvents())
    850848                return true;
    851849#if ENABLE(TOUCH_ACTION_REGIONS)
  • trunk/Source/WebCore/rendering/RenderElement.h

    r289157 r290306  
    160160    bool visibleToHitTesting(std::optional<HitTestRequest> hitTestRequest = std::nullopt) const
    161161    {
    162         if (style().effectiveInert())
    163             return false;
    164 
    165162        if (style().visibility() != Visibility::Visible)
    166163            return false;
    167164
    168         if ((!hitTestRequest || !hitTestRequest->ignoreCSSPointerEventsProperty()) && style().pointerEvents() == PointerEvents::None)
     165        if ((!hitTestRequest || !hitTestRequest->ignoreCSSPointerEventsProperty()) && style().effectivePointerEvents() == PointerEvents::None)
    169166            return false;
    170167
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp

    r290285 r290306  
    17321732    if (diff >= StyleDifference::RecompositeLayer) {
    17331733        if (layer.isComposited()) {
    1734             bool hitTestingStateChanged = oldStyle && (oldStyle->pointerEvents() != newStyle.pointerEvents() || oldStyle->effectiveInert() != newStyle.effectiveInert());
     1734            bool hitTestingStateChanged = oldStyle && (oldStyle->effectivePointerEvents() != newStyle.effectivePointerEvents());
    17351735            if (is<RenderWidget>(layer.renderer()) || hitTestingStateChanged) {
    17361736                // For RenderWidgets this is necessary to get iframe layers hooked up in response to scheduleInvalidateStyleAndLayerComposition().
  • trunk/Source/WebCore/rendering/style/RenderStyle.h

    r290305 r290306  
    714714
    715715    PointerEvents pointerEvents() const { return static_cast<PointerEvents>(m_inheritedFlags.pointerEvents); }
     716    PointerEvents effectivePointerEvents() const { return effectiveInert() ? PointerEvents::None : pointerEvents(); }
    716717    const AnimationList* animations() const { return m_rareNonInheritedData->animations.get(); }
    717718    const AnimationList* transitions() const { return m_rareNonInheritedData->transitions.get(); }
  • trunk/Source/WebCore/rendering/svg/LegacyRenderSVGModelObject.cpp

    r287834 r290306  
    170170bool LegacyRenderSVGModelObject::checkIntersection(RenderElement* renderer, const FloatRect& rect)
    171171{
    172     if (!renderer || renderer->style().pointerEvents() == PointerEvents::None)
     172    if (!renderer || renderer->style().effectivePointerEvents() == PointerEvents::None)
    173173        return false;
    174174    if (!isGraphicsElement(*renderer))
     
    183183bool LegacyRenderSVGModelObject::checkEnclosure(RenderElement* renderer, const FloatRect& rect)
    184184{
    185     if (!renderer || renderer->style().pointerEvents() == PointerEvents::None)
     185    if (!renderer || renderer->style().effectivePointerEvents() == PointerEvents::None)
    186186        return false;
    187187    if (!isGraphicsElement(*renderer))
  • trunk/Source/WebCore/rendering/svg/LegacyRenderSVGShape.cpp

    r287731 r290306  
    355355    SVGHitTestCycleDetectionScope hitTestScope(*this);
    356356
    357     PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_PATH_HITTESTING, request, style().pointerEvents());
     357    PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_PATH_HITTESTING, request, style().effectivePointerEvents());
    358358    bool isVisible = (style().visibility() == Visibility::Visible);
    359359    if (isVisible || !hitRules.requireVisible) {
  • trunk/Source/WebCore/rendering/svg/RenderSVGImage.cpp

    r287731 r290306  
    217217        return false;
    218218
    219     PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_IMAGE_HITTESTING, request, style().pointerEvents());
     219    PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_IMAGE_HITTESTING, request, style().effectivePointerEvents());
    220220    bool isVisible = (style().visibility() == Visibility::Visible);
    221221    if (isVisible || !hitRules.requireVisible) {
  • trunk/Source/WebCore/rendering/svg/RenderSVGModelObject.cpp

    r289606 r290306  
    255255bool RenderSVGModelObject::checkIntersection(RenderElement* renderer, const FloatRect& rect)
    256256{
    257     if (!renderer || renderer->style().pointerEvents() == PointerEvents::None)
     257    if (!renderer || renderer->style().effectivePointerEvents() == PointerEvents::None)
    258258        return false;
    259259    if (!isGraphicsElement(*renderer))
     
    267267bool RenderSVGModelObject::checkEnclosure(RenderElement* renderer, const FloatRect& rect)
    268268{
    269     if (!renderer || renderer->style().pointerEvents() == PointerEvents::None)
     269    if (!renderer || renderer->style().effectivePointerEvents() == PointerEvents::None)
    270270        return false;
    271271    if (!isGraphicsElement(*renderer))
  • trunk/Source/WebCore/rendering/svg/RenderSVGShape.cpp

    r287873 r290306  
    359359    SVGHitTestCycleDetectionScope hitTestScope(*this);
    360360
    361     PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_PATH_HITTESTING, request, style().pointerEvents());
     361    PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_PATH_HITTESTING, request, style().effectivePointerEvents());
    362362    bool isVisible = (style().visibility() == Visibility::Visible);
    363363    if (isVisible || !hitRules.requireVisible) {
  • trunk/Source/WebCore/rendering/svg/RenderSVGText.cpp

    r287731 r290306  
    405405bool RenderSVGText::nodeAtFloatPoint(const HitTestRequest& request, HitTestResult& result, const FloatPoint& pointInParent, HitTestAction hitTestAction)
    406406{
    407     PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_TEXT_HITTESTING, request, style().pointerEvents());
     407    PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_TEXT_HITTESTING, request, style().effectivePointerEvents());
    408408    bool isVisible = (style().visibility() == Visibility::Visible);
    409409    if (isVisible || !hitRules.requireVisible) {
  • trunk/Source/WebCore/rendering/svg/SVGInlineTextBox.cpp

    r288942 r290306  
    636636    ASSERT(!isLineBreak());
    637637
    638     PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_TEXT_HITTESTING, request, renderer().style().pointerEvents());
     638    PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_TEXT_HITTESTING, request, renderer().style().effectivePointerEvents());
    639639    bool isVisible = renderer().style().visibility() == Visibility::Visible;
    640640    if (isVisible || !hitRules.requireVisible) {
Note: See TracChangeset for help on using the changeset viewer.