Title: [264269] trunk
Revision
264269
Author
[email protected]
Date
2020-07-11 10:55:01 -0700 (Sat, 11 Jul 2020)

Log Message

REGRESSION(r260276): Overflow scrolling layers misplaced inside SVG foreign object
https://bugs.webkit.org/show_bug.cgi?id=213788
<rdar://problem/65039637>

Reviewed by Zalan Bujtas.
Source/WebCore:

RenderLayers inside SVG <foreignObject> don't display correctly, so don't use
accelerated overflow scroll (which requires layers) inside <foreignObject>.

This reverts behavior to macOS Catalina behavior (i.e. as soon as the overflow
becomes scrollable, rendering problems appear), and to pre-iOS 13 behavior.

Test: fast/scrolling/overflow-inside-foreignobject.html

* dom/Document.h:
(WebCore::Document::mayHaveRenderedSVGForeignObjects const):
(WebCore::Document::setMayHaveRenderedSVGForeignObjects):
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::RenderLayer):
(WebCore::RenderLayer::addChild):
(WebCore::RenderLayer::updateAncestorDependentState):
(WebCore::RenderLayer::canUseCompositedScrolling const):
* rendering/RenderLayer.h:
* rendering/svg/RenderSVGForeignObject.h:
* svg/SVGForeignObjectElement.cpp:
(WebCore::SVGForeignObjectElement::createElementRenderer):

LayoutTests:

* fast/scrolling/overflow-inside-foreignobject-expected.html: Added.
* fast/scrolling/overflow-inside-foreignobject.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (264268 => 264269)


--- trunk/LayoutTests/ChangeLog	2020-07-11 17:21:00 UTC (rev 264268)
+++ trunk/LayoutTests/ChangeLog	2020-07-11 17:55:01 UTC (rev 264269)
@@ -1,3 +1,14 @@
+2020-07-11  Simon Fraser  <[email protected]>
+
+        REGRESSION(r260276): Overflow scrolling layers misplaced inside SVG foreign object
+        https://bugs.webkit.org/show_bug.cgi?id=213788
+        <rdar://problem/65039637>
+
+        Reviewed by Zalan Bujtas.
+
+        * fast/scrolling/overflow-inside-foreignobject-expected.html: Added.
+        * fast/scrolling/overflow-inside-foreignobject.html: Added.
+
 2020-07-11  Chris Dumez  <[email protected]>
 
         Unreviewed, mark imported/w3c/web-platform-tests/websockets/cookies/third-party-cookie-accepted.https.html as crashing on iOS WK2 Debug.

Added: trunk/LayoutTests/fast/scrolling/overflow-inside-foreignobject-expected.html (0 => 264269)


--- trunk/LayoutTests/fast/scrolling/overflow-inside-foreignobject-expected.html	                        (rev 0)
+++ trunk/LayoutTests/fast/scrolling/overflow-inside-foreignobject-expected.html	2020-07-11 17:55:01 UTC (rev 264269)
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <style>
+    .content-wrapper {
+      position: relative;
+      width: 760px;
+      height: 560px;
+      border: 1px solid black;
+    }
+
+    .content-wrapper svg {
+      width: 100%;
+      height: 100%;
+      background-color: #eee;
+    }
+    
+    .test {
+      width: 100%;
+      height: 100%;
+      resize: none;
+      box-sizing: border-box;
+      background-color: white;
+      border: 2px solid gray;
+    }
+  </style>
+</head>
+<body>
+<div class="content-wrapper">
+    <svg width="375" height="355" viewbox="0 0 375 355" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <foreignobject x="24" y="160" width="327" height="120">
+        <div class="test" xmlns="http://www.w3.org/1999/xhtml"></div>
+    </foreignobject></svg>
+</div>
+</body>
+</html>
\ No newline at end of file

Added: trunk/LayoutTests/fast/scrolling/overflow-inside-foreignobject.html (0 => 264269)


--- trunk/LayoutTests/fast/scrolling/overflow-inside-foreignobject.html	                        (rev 0)
+++ trunk/LayoutTests/fast/scrolling/overflow-inside-foreignobject.html	2020-07-11 17:55:01 UTC (rev 264269)
@@ -0,0 +1,38 @@
+<!DOCTYPE html><!-- webkit-test-runner [ internal:AsyncOverflowScrollingEnabled=true ] -->
+<html lang="en">
+<head>
+  <style>
+    .content-wrapper {
+      position: relative;
+      width: 760px;
+      height: 560px;
+      border: 1px solid black;
+    }
+
+    .content-wrapper svg {
+      width: 100%;
+      height: 100%;
+      background-color: #eee;
+    }
+    
+    textarea {
+      width: 100%;
+      height: 100%;
+      resize: none;
+      background-color: white;
+      box-sizing: border-box;
+      border: 2px solid gray;
+      border-radius: 0;
+      -webkit-appearance: none;
+    }
+  </style>
+</head>
+<body>
+<div class="content-wrapper">
+    <svg width="375" height="355" viewbox="0 0 375 355" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <foreignobject x="24" y="160" width="327" height="120">
+        <textarea xmlns="http://www.w3.org/1999/xhtml"></textarea>
+    </foreignobject></svg>
+</div>
+</body>
+</html>
\ No newline at end of file

Modified: trunk/Source/WebCore/ChangeLog (264268 => 264269)


--- trunk/Source/WebCore/ChangeLog	2020-07-11 17:21:00 UTC (rev 264268)
+++ trunk/Source/WebCore/ChangeLog	2020-07-11 17:55:01 UTC (rev 264269)
@@ -1,3 +1,32 @@
+2020-07-11  Simon Fraser  <[email protected]>
+
+        REGRESSION(r260276): Overflow scrolling layers misplaced inside SVG foreign object
+        https://bugs.webkit.org/show_bug.cgi?id=213788
+        <rdar://problem/65039637>
+
+        Reviewed by Zalan Bujtas.
+        
+        RenderLayers inside SVG <foreignObject> don't display correctly, so don't use
+        accelerated overflow scroll (which requires layers) inside <foreignObject>.
+
+        This reverts behavior to macOS Catalina behavior (i.e. as soon as the overflow
+        becomes scrollable, rendering problems appear), and to pre-iOS 13 behavior.
+
+        Test: fast/scrolling/overflow-inside-foreignobject.html
+
+        * dom/Document.h:
+        (WebCore::Document::mayHaveRenderedSVGForeignObjects const):
+        (WebCore::Document::setMayHaveRenderedSVGForeignObjects):
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::RenderLayer):
+        (WebCore::RenderLayer::addChild):
+        (WebCore::RenderLayer::updateAncestorDependentState):
+        (WebCore::RenderLayer::canUseCompositedScrolling const):
+        * rendering/RenderLayer.h:
+        * rendering/svg/RenderSVGForeignObject.h:
+        * svg/SVGForeignObjectElement.cpp:
+        (WebCore::SVGForeignObjectElement::createElementRenderer):
+
 2020-07-11  Zalan Bujtas  <[email protected]>
 
         [LFC][BFC][Min-Max width] Add support for float avoiders

Modified: trunk/Source/WebCore/dom/Document.h (264268 => 264269)


--- trunk/Source/WebCore/dom/Document.h	2020-07-11 17:21:00 UTC (rev 264268)
+++ trunk/Source/WebCore/dom/Document.h	2020-07-11 17:55:01 UTC (rev 264269)
@@ -1249,6 +1249,9 @@
     void setMayHaveEditableElements() { m_mayHaveEditableElements = true; }
 #endif
 
+    bool mayHaveRenderedSVGForeignObjects() const { return m_mayHaveRenderedSVGForeignObjects; }
+    void setMayHaveRenderedSVGForeignObjects() { m_mayHaveRenderedSVGForeignObjects = true; }
+
     void didAddTouchEventHandler(Node&);
     void didRemoveTouchEventHandler(Node&, EventHandlerRemoval = EventHandlerRemoval::One);
 
@@ -1876,6 +1879,9 @@
 #if ENABLE(EDITABLE_REGION)
     bool m_mayHaveEditableElements { false };
 #endif
+
+    bool m_mayHaveRenderedSVGForeignObjects { false };
+
     std::unique_ptr<EventTargetSet> m_wheelEventTargets;
 
     MonotonicTime m_lastHandledUserGestureTimestamp;

Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (264268 => 264269)


--- trunk/Source/WebCore/rendering/RenderLayer.cpp	2020-07-11 17:21:00 UTC (rev 264268)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp	2020-07-11 17:55:01 UTC (rev 264269)
@@ -87,6 +87,7 @@
 #include "OverlapTestRequestClient.h"
 #include "Page.h"
 #include "PlatformMouseEvent.h"
+#include "RenderAncestorIterator.h"
 #include "RenderFlexibleBox.h"
 #include "RenderFragmentContainer.h"
 #include "RenderFragmentedFlow.h"
@@ -100,6 +101,7 @@
 #include "RenderMarquee.h"
 #include "RenderMultiColumnFlow.h"
 #include "RenderReplica.h"
+#include "RenderSVGForeignObject.h"
 #include "RenderSVGResourceClipper.h"
 #include "RenderSVGRoot.h"
 #include "RenderScrollbar.h"
@@ -324,6 +326,7 @@
     , m_hasCompositedScrollableOverflow(false)
     , m_hasTransformedAncestor(false)
     , m_has3DTransformedAncestor(false)
+    , m_insideSVGForeignObject(false)
     , m_indirectCompositingReason(static_cast<unsigned>(IndirectCompositingReason::None))
     , m_viewportConstrainedNotCompositedReason(NoNotCompositedReason)
 #if PLATFORM(IOS_FAMILY)
@@ -435,6 +438,7 @@
 
     dirtyPaintOrderListsOnChildChange(child);
 
+    child.updateAncestorDependentState();
     child.updateDescendantDependentFlags();
     if (child.m_hasVisibleContent || child.m_hasVisibleDescendant)
         setAncestorChainHasVisibleDescendant();
@@ -1517,6 +1521,16 @@
     }
 }
 
+void RenderLayer::updateAncestorDependentState()
+{
+    bool insideSVGForeignObject = renderer().document().mayHaveRenderedSVGForeignObjects() && ancestorsOfType<RenderSVGForeignObject>(renderer()).first();
+    if (insideSVGForeignObject == m_insideSVGForeignObject)
+        return;
+
+    m_insideSVGForeignObject = insideSVGForeignObject;
+    updateSelfPaintingLayer();
+}
+
 void RenderLayer::updateDescendantDependentFlags()
 {
     if (m_visibleDescendantStatusDirty || m_hasSelfPaintingLayerDescendantDirty || hasNotIsolatedBlendingDescendantsStatusDirty()) {
@@ -2434,7 +2448,7 @@
 {
     bool isVisible = renderer().style().visibility() == Visibility::Visible;
     if (renderer().settings().asyncOverflowScrollingEnabled())
-        return isVisible && scrollsOverflow();
+        return isVisible && scrollsOverflow() && !isInsideSVGForeignObject();
 
 #if PLATFORM(IOS_FAMILY) && ENABLE(OVERFLOW_SCROLLING_TOUCH)
     return isVisible && scrollsOverflow() && (renderer().style().useTouchOverflowScrolling() || renderer().settings().alwaysUseAcceleratedOverflowScroll());

Modified: trunk/Source/WebCore/rendering/RenderLayer.h (264268 => 264269)


--- trunk/Source/WebCore/rendering/RenderLayer.h	2020-07-11 17:21:00 UTC (rev 264268)
+++ trunk/Source/WebCore/rendering/RenderLayer.h	2020-07-11 17:55:01 UTC (rev 264269)
@@ -939,7 +939,9 @@
     void setParent(RenderLayer*);
     void setFirstChild(RenderLayer* first) { m_first = first; }
     void setLastChild(RenderLayer* last) { m_last = last; }
-    
+
+    void updateAncestorDependentState();
+
     void dirtyPaintOrderListsOnChildChange(RenderLayer&);
 
     bool shouldBeNormalFlowOnly() const;
@@ -1166,6 +1168,8 @@
     void dirty3DTransformedDescendantStatus();
     // Both updates the status, and returns true if descendants of this have 3d.
     bool update3DTransformedDescendantStatus();
+    
+    bool isInsideSVGForeignObject() const { return m_insideSVGForeignObject; }
 
     void createReflection();
     void removeReflection();
@@ -1278,6 +1282,8 @@
     bool m_hasTransformedAncestor : 1;
     bool m_has3DTransformedAncestor : 1;
 
+    bool m_insideSVGForeignObject : 1;
+
     unsigned m_indirectCompositingReason : 4; // IndirectCompositingReason
     unsigned m_viewportConstrainedNotCompositedReason : 2; // ViewportConstrainedNotCompositedReason
 

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGForeignObject.h (264268 => 264269)


--- trunk/Source/WebCore/rendering/svg/RenderSVGForeignObject.h	2020-07-11 17:21:00 UTC (rev 264268)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGForeignObject.h	2020-07-11 17:55:01 UTC (rev 264269)
@@ -75,3 +75,5 @@
 };
 
 } // namespace WebCore
+
+SPECIALIZE_TYPE_TRAITS_RENDER_OBJECT(RenderSVGForeignObject, isSVGForeignObject())

Modified: trunk/Source/WebCore/svg/SVGForeignObjectElement.cpp (264268 => 264269)


--- trunk/Source/WebCore/svg/SVGForeignObjectElement.cpp	2020-07-11 17:21:00 UTC (rev 264268)
+++ trunk/Source/WebCore/svg/SVGForeignObjectElement.cpp	2020-07-11 17:55:01 UTC (rev 264269)
@@ -90,6 +90,7 @@
 
 RenderPtr<RenderElement> SVGForeignObjectElement::createElementRenderer(RenderStyle&& style, const RenderTreePosition&)
 {
+    document().setMayHaveRenderedSVGForeignObjects();
     return createRenderer<RenderSVGForeignObject>(*this, WTFMove(style));
 }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to