- 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));
}