<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[286672] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/286672">286672</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2021-12-08 12:02:41 -0800 (Wed, 08 Dec 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>[css-contain] Prevent various kinds of propagation to RenderView
https://bugs.webkit.org/show_bug.cgi?id=233535

Patch by Rob Buis <rbuis@igalia.com> on 2021-12-08
Reviewed by Alan Bujtas.

Source/WebCore:

Prevent direction/background/writing-mode propagation to RenderView
in cases where contain is used. The reason is in the github issue
and latest draft specification has been updated [1, 2].

[1] https://github.com/w3c/csswg-drafts/issues/5913
[2] https://drafts.csswg.org/css-contain-2/

* rendering/RenderBox.cpp:
(WebCore::RenderBox::styleDidChange):
(WebCore::RenderBox::updateFromStyle):
* rendering/RenderObject.cpp:
(WebCore::shouldApplyAnyContainment):
* rendering/RenderObject.h:
* rendering/RenderView.cpp:
(WebCore::RenderView::rendererForRootBackground const):

LayoutTests:

* TestExpectations:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsTestExpectations">trunk/LayoutTests/TestExpectations</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBoxcpp">trunk/Source/WebCore/rendering/RenderBox.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderObjectcpp">trunk/Source/WebCore/rendering/RenderObject.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderObjecth">trunk/Source/WebCore/rendering/RenderObject.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderViewcpp">trunk/Source/WebCore/rendering/RenderView.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (286671 => 286672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog      2021-12-08 19:58:13 UTC (rev 286671)
+++ trunk/LayoutTests/ChangeLog 2021-12-08 20:02:41 UTC (rev 286672)
</span><span class="lines">@@ -1,3 +1,12 @@
</span><ins>+2021-12-08  Rob Buis  <rbuis@igalia.com>
+
+        [css-contain] Prevent various kinds of propagation to RenderView
+        https://bugs.webkit.org/show_bug.cgi?id=233535
+
+        Reviewed by Alan Bujtas.
+
+        * TestExpectations:
+
</ins><span class="cx"> 2021-12-08  Youenn Fablet  <youenn@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Same-site lax cookies not sent by fetch event handler after page reload
</span></span></pre></div>
<a id="trunkLayoutTestsTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/TestExpectations (286671 => 286672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/TestExpectations       2021-12-08 19:58:13 UTC (rev 286671)
+++ trunk/LayoutTests/TestExpectations  2021-12-08 20:02:41 UTC (rev 286672)
</span><span class="lines">@@ -4758,37 +4758,13 @@
</span><span class="cx"> imported/w3c/web-platform-tests/css/css-contain/quote-scoping-002.html [ ImageOnlyFailure ]
</span><span class="cx"> imported/w3c/web-platform-tests/css/css-contain/quote-scoping-003.html [ ImageOnlyFailure ]
</span><span class="cx"> imported/w3c/web-platform-tests/css/css-contain/quote-scoping-004.html [ ImageOnlyFailure ]
</span><del>-imported/w3c/web-platform-tests/css/css-contain/contain-body-bg-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-body-bg-002.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-body-bg-003.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-body-bg-004.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-body-dir-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-body-dir-002.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-body-dir-003.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-body-dir-004.html [ ImageOnlyFailure ]
</del><span class="cx"> imported/w3c/web-platform-tests/css/css-contain/contain-body-overflow-001.html [ ImageOnlyFailure ]
</span><span class="cx"> imported/w3c/web-platform-tests/css/css-contain/contain-body-overflow-002.html [ ImageOnlyFailure ]
</span><span class="cx"> imported/w3c/web-platform-tests/css/css-contain/contain-body-overflow-003.html [ ImageOnlyFailure ]
</span><span class="cx"> imported/w3c/web-platform-tests/css/css-contain/contain-body-overflow-004.html [ ImageOnlyFailure ]
</span><del>-imported/w3c/web-platform-tests/css/css-contain/contain-body-w-m-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-body-w-m-002.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-body-w-m-003.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-body-w-m-004.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-html-bg-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-html-bg-002.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-html-bg-003.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-html-bg-004.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-html-dir-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-html-dir-002.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-html-dir-003.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-html-dir-004.html [ ImageOnlyFailure ]
</del><span class="cx"> imported/w3c/web-platform-tests/css/css-contain/contain-html-overflow-001.html [ ImageOnlyFailure ]
</span><span class="cx"> imported/w3c/web-platform-tests/css/css-contain/contain-html-overflow-003.html [ ImageOnlyFailure ]
</span><span class="cx"> imported/w3c/web-platform-tests/css/css-contain/contain-html-overflow-004.html [ ImageOnlyFailure ]
</span><del>-imported/w3c/web-platform-tests/css/css-contain/contain-html-w-m-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-html-w-m-002.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-html-w-m-003.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-html-w-m-004.html [ ImageOnlyFailure ]
</del><span class="cx"> 
</span><span class="cx"> # Flaky css-contain test
</span><span class="cx"> imported/w3c/web-platform-tests/css/css-contain/content-visibility/animation-display-lock.html [ Failure Pass ]
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (286671 => 286672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2021-12-08 19:58:13 UTC (rev 286671)
+++ trunk/Source/WebCore/ChangeLog      2021-12-08 20:02:41 UTC (rev 286672)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2021-12-08  Rob Buis  <rbuis@igalia.com>
+
+        [css-contain] Prevent various kinds of propagation to RenderView
+        https://bugs.webkit.org/show_bug.cgi?id=233535
+
+        Reviewed by Alan Bujtas.
+
+        Prevent direction/background/writing-mode propagation to RenderView
+        in cases where contain is used. The reason is in the github issue
+        and latest draft specification has been updated [1, 2].
+
+        [1] https://github.com/w3c/csswg-drafts/issues/5913
+        [2] https://drafts.csswg.org/css-contain-2/
+
+        * rendering/RenderBox.cpp:
+        (WebCore::RenderBox::styleDidChange):
+        (WebCore::RenderBox::updateFromStyle):
+        * rendering/RenderObject.cpp:
+        (WebCore::shouldApplyAnyContainment):
+        * rendering/RenderObject.h:
+        * rendering/RenderView.cpp:
+        (WebCore::RenderView::rendererForRootBackground const):
+
</ins><span class="cx"> 2021-12-08  Eric Carlson  <eric.carlson@apple.com>
</span><span class="cx"> 
</span><span class="cx">         [iOS] Always set audio session preferred input after changing the category
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBoxcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBox.cpp (286671 => 286672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBox.cpp     2021-12-08 19:58:13 UTC (rev 286671)
+++ trunk/Source/WebCore/rendering/RenderBox.cpp        2021-12-08 20:02:41 UTC (rev 286672)
</span><span class="lines">@@ -345,35 +345,37 @@
</span><span class="cx">     bool isDocElementRenderer = isDocumentElementRenderer();
</span><span class="cx"> 
</span><span class="cx">     if (isDocElementRenderer || isBodyRenderer) {
</span><del>-        // Propagate the new writing mode and direction up to the RenderView.
</del><span class="cx">         auto* documentElementRenderer = document().documentElement()->renderer();
</span><span class="cx">         auto& viewStyle = view().mutableStyle();
</span><span class="cx">         bool rootStyleChanged = false;
</span><span class="cx">         bool viewDirectionOrWritingModeChanged = false;
</span><span class="cx">         auto* rootRenderer = isBodyRenderer ? documentElementRenderer : nullptr;
</span><del>-        if (viewStyle.direction() != newStyle.direction() && (isDocElementRenderer || !documentElementRenderer->style().hasExplicitlySetDirection())) {
-            viewStyle.setDirection(newStyle.direction());
-            viewDirectionOrWritingModeChanged = true;
-            if (isBodyRenderer) {
-                rootRenderer->mutableStyle().setDirection(newStyle.direction());
-                rootStyleChanged = true;
</del><ins>+        if (!isBodyRenderer || !(shouldApplyAnyContainment(*this) || shouldApplyAnyContainment(*documentElementRenderer))) {
+            // Propagate the new writing mode and direction up to the RenderView.
+            if (viewStyle.direction() != newStyle.direction() && (isDocElementRenderer || !documentElementRenderer->style().hasExplicitlySetDirection())) {
+                viewStyle.setDirection(newStyle.direction());
+                viewDirectionOrWritingModeChanged = true;
+                if (isBodyRenderer) {
+                    rootRenderer->mutableStyle().setDirection(newStyle.direction());
+                    rootStyleChanged = true;
+                }
+                setNeedsLayoutAndPrefWidthsRecalc();
+
+                view().frameView().topContentDirectionDidChange();
</ins><span class="cx">             }
</span><del>-            setNeedsLayoutAndPrefWidthsRecalc();
</del><span class="cx"> 
</span><del>-            view().frameView().topContentDirectionDidChange();
-        }
-
-        if (viewStyle.writingMode() != newStyle.writingMode() && (isDocElementRenderer || !documentElementRenderer->style().hasExplicitlySetWritingMode())) {
-            viewStyle.setWritingMode(newStyle.writingMode());
-            viewDirectionOrWritingModeChanged = true;
-            view().setHorizontalWritingMode(newStyle.isHorizontalWritingMode());
-            view().markAllDescendantsWithFloatsForLayout();
-            if (isBodyRenderer) {
-                rootStyleChanged = true;
-                rootRenderer->mutableStyle().setWritingMode(newStyle.writingMode());
-                rootRenderer->setHorizontalWritingMode(newStyle.isHorizontalWritingMode());
</del><ins>+            if (viewStyle.writingMode() != newStyle.writingMode() && (isDocElementRenderer || !documentElementRenderer->style().hasExplicitlySetWritingMode())) {
+                viewStyle.setWritingMode(newStyle.writingMode());
+                viewDirectionOrWritingModeChanged = true;
+                view().setHorizontalWritingMode(newStyle.isHorizontalWritingMode());
+                view().markAllDescendantsWithFloatsForLayout();
+                if (isBodyRenderer) {
+                    rootStyleChanged = true;
+                    rootRenderer->mutableStyle().setWritingMode(newStyle.writingMode());
+                    rootRenderer->setHorizontalWritingMode(newStyle.isHorizontalWritingMode());
+                }
+                setNeedsLayoutAndPrefWidthsRecalc();
</ins><span class="cx">             }
</span><del>-            setNeedsLayoutAndPrefWidthsRecalc();
</del><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(DARK_MODE_CSS)
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderObject.cpp (286671 => 286672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderObject.cpp  2021-12-08 19:58:13 UTC (rev 286671)
+++ trunk/Source/WebCore/rendering/RenderObject.cpp     2021-12-08 20:02:41 UTC (rev 286672)
</span><span class="lines">@@ -2559,3 +2559,12 @@
</span><span class="cx">     return renderer.style().containsPaint() && (!renderer.isInline() || renderer.isAtomicInlineLevelBox()) && !renderer.isRubyText() && (!renderer.isTablePart() || renderer.isRenderBlockFlow());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool WebCore::shouldApplyAnyContainment(const WebCore::RenderObject& renderer)
+{
+    if (renderer.style().contain().isEmpty())
+        return false;
+    if ((renderer.style().containsLayout() || renderer.style().containsPaint()) && (!renderer.isInline() || renderer.isAtomicInlineLevelBox()) && !renderer.isRubyText() && (!renderer.isTablePart() || renderer.isRenderBlockFlow()))
+        return true;
+    return (renderer.style().containsSize() || renderer.style().containsStyle()) && (!renderer.isInline() || renderer.isAtomicInlineLevelBox()) && !renderer.isRubyText() && (!renderer.isTablePart() || renderer.isTableCaption()) && !renderer.isTable();
+}
+
</ins></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderObject.h (286671 => 286672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderObject.h    2021-12-08 19:58:13 UTC (rev 286671)
+++ trunk/Source/WebCore/rendering/RenderObject.h       2021-12-08 20:02:41 UTC (rev 286672)
</span><span class="lines">@@ -1215,6 +1215,7 @@
</span><span class="cx"> bool shouldApplySizeContainment(const RenderObject&);
</span><span class="cx"> bool shouldApplyStyleContainment(const RenderObject&);
</span><span class="cx"> bool shouldApplyPaintContainment(const RenderObject&);
</span><ins>+bool shouldApplyAnyContainment(const RenderObject&);
</ins><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderView.cpp (286671 => 286672)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderView.cpp    2021-12-08 19:58:13 UTC (rev 286671)
+++ trunk/Source/WebCore/rendering/RenderView.cpp       2021-12-08 20:02:41 UTC (rev 286672)
</span><span class="lines">@@ -329,9 +329,14 @@
</span><span class="cx">     if (!is<HTMLHtmlElement>(documentRenderer.element()))
</span><span class="cx">         return &documentRenderer;
</span><span class="cx"> 
</span><ins>+    if (shouldApplyAnyContainment(documentRenderer))
+        return nullptr;
+
</ins><span class="cx">     if (auto* body = document().body()) {
</span><del>-        if (auto* renderer = body->renderer())
-            return renderer;
</del><ins>+        if (auto* renderer = body->renderer()) {
+            if (!shouldApplyAnyContainment(*renderer))
+                return renderer;
+        }
</ins><span class="cx">     }
</span><span class="cx">     return &documentRenderer;
</span><span class="cx"> }
</span></span></pre>
</div>
</div>

</body>
</html>