Title: [190430] trunk
Revision
190430
Author
[email protected]
Date
2015-10-01 13:36:34 -0700 (Thu, 01 Oct 2015)

Log Message

Slot elements should support fallback contents
https://bugs.webkit.org/show_bug.cgi?id=149701

Reviewed by Antti Koivisto.

Source/WebCore:

Following discussions on Github discussions [1] [2], we're adding the default rule of `display: contents`
on slot elements and making slot elements render its children when there are no assigned nodes [3].

Make these changes by attaching renderers on direct-children of slot elements when there are no assigned
nodes during render tree construction. Note `display: contents` will be aded in webkit.org/b/149439.

[1] https://github.com/w3c/webcomponents/issues/317
[2] https://github.com/w3c/webcomponents/issues/308
[3] https://github.com/w3c/webcomponents/issues/308#issuecomment-143655347

Tests: fast/shadow-dom/css-scoping-shadow-slot-fallback.html
       fast/shadow-dom/shadow-layout-after-slot-fallback-changes.html

* style/StyleResolveTree.cpp:
(WebCore::Style::attachSlotAssignees):
(WebCore::Style::detachSlotAssignees):
(WebCore::Style::resolveSlotAssignees):

LayoutTests:

Added tests for fallback contents in slot elements. One of them could be safely submitted to CSS WG,
and the other one is a style recalc test.

* fast/shadow-dom/css-scoping-shadow-slot-fallback-expected.html: Added.
* fast/shadow-dom/css-scoping-shadow-slot-fallback.html: Added.
* fast/shadow-dom/shadow-layout-after-slot-fallback-changes-expected.html: Added.
* fast/shadow-dom/shadow-layout-after-slot-fallback-changes.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (190429 => 190430)


--- trunk/LayoutTests/ChangeLog	2015-10-01 20:20:10 UTC (rev 190429)
+++ trunk/LayoutTests/ChangeLog	2015-10-01 20:36:34 UTC (rev 190430)
@@ -1,3 +1,18 @@
+2015-10-01  Ryosuke Niwa  <[email protected]>
+
+        Slot elements should support fallback contents
+        https://bugs.webkit.org/show_bug.cgi?id=149701
+
+        Reviewed by Antti Koivisto.
+
+        Added tests for fallback contents in slot elements. One of them could be safely submitted to CSS WG,
+        and the other one is a style recalc test.
+
+        * fast/shadow-dom/css-scoping-shadow-slot-fallback-expected.html: Added.
+        * fast/shadow-dom/css-scoping-shadow-slot-fallback.html: Added.
+        * fast/shadow-dom/shadow-layout-after-slot-fallback-changes-expected.html: Added.
+        * fast/shadow-dom/shadow-layout-after-slot-fallback-changes.html: Added.
+
 2015-10-01  Keith Miller  <[email protected]>
 
         [ES6] Add TypedArray.prototype functionality.

Added: trunk/LayoutTests/fast/shadow-dom/css-scoping-shadow-slot-fallback-expected.html (0 => 190430)


--- trunk/LayoutTests/fast/shadow-dom/css-scoping-shadow-slot-fallback-expected.html	                        (rev 0)
+++ trunk/LayoutTests/fast/shadow-dom/css-scoping-shadow-slot-fallback-expected.html	2015-10-01 20:36:34 UTC (rev 190430)
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<html>
+<body>
+    <p>Test passes if you see a single 100px by 100px green box below.</p>
+    <div style="width: 100px; height: 100px; background: green;"></div>
+</body>
+</html>

Added: trunk/LayoutTests/fast/shadow-dom/css-scoping-shadow-slot-fallback.html (0 => 190430)


--- trunk/LayoutTests/fast/shadow-dom/css-scoping-shadow-slot-fallback.html	                        (rev 0)
+++ trunk/LayoutTests/fast/shadow-dom/css-scoping-shadow-slot-fallback.html	2015-10-01 20:36:34 UTC (rev 190430)
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>CSS Scoping - slot element without distributed nodes must render its fallback content</title>
+    <link rel="author" title="Ryosuke Niwa" href=""
+    <link rel="match" href=""
+</head>
+<body>
+    <style>
+    my-host {
+        display: block;
+        background-color: red;
+        width: 100px;
+        height: 50px;
+    }
+    .red {
+        background-color: red;
+    }
+    .green {
+        background-color: green;
+    }
+    div {
+        width: 100px;
+        height: 50px;
+    }
+    slot {
+        border: solid 10px red;
+    }
+    </style>
+    <p>Test passes if you see a single 100px by 100px green box below.</p>
+    <my-host></my-host>
+    <div class="red"><slot><div class="green"></div></slot></div>
+    <script>
+
+    try {
+        var shadowHost = document.querySelector('my-host');
+        shadowRoot = shadowHost.attachShadow({mode: 'open'});
+        shadowRoot.innerHTML = '<slot style="border: solid 10px red;">'
+            + '<div style="width: 100%; height: 100%; background-color: green;"></div></slot>';
+    } catch (exception) {
+        document.body.appendChild(document.createTextNode(exception));
+    }
+
+    </script>
+</body>
+</html>

Added: trunk/LayoutTests/fast/shadow-dom/shadow-layout-after-slot-fallback-changes-expected.html (0 => 190430)


--- trunk/LayoutTests/fast/shadow-dom/shadow-layout-after-slot-fallback-changes-expected.html	                        (rev 0)
+++ trunk/LayoutTests/fast/shadow-dom/shadow-layout-after-slot-fallback-changes-expected.html	2015-10-01 20:36:34 UTC (rev 190430)
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<html>
+<body>
+    <p>Test passes if you see a single 100px by 100px green box below.</p>
+    <div style="width: 100px; height: 100px; background: green;"></div>
+</body>
+</html>

Added: trunk/LayoutTests/fast/shadow-dom/shadow-layout-after-slot-fallback-changes.html (0 => 190430)


--- trunk/LayoutTests/fast/shadow-dom/shadow-layout-after-slot-fallback-changes.html	                        (rev 0)
+++ trunk/LayoutTests/fast/shadow-dom/shadow-layout-after-slot-fallback-changes.html	2015-10-01 20:36:34 UTC (rev 190430)
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html>
+<body>
+<p>Test passes if you see a single 100px by 100px green box below.</p> 
+<my-host id="host1"><div style="background: red;">FAIL</div></my-host>
+<my-host id="host2"><div slot="foo" style="background: red;">FAIL</div></my-host>
+<my-host id="host3"></my-host>
+<my-host id="host4" style="background: red;"><slot></slot></my-host>
+<my-host id="host5" style="background: green;"><slot><div style="background: red;"></div></slot></my-host>
+<style>
+
+my-host {
+    display: block;
+    width: 100px;
+    height: 20px;
+    overflow: hidden;
+}
+
+my-host div {
+    width: 100%;
+    height: 100%;
+}
+
+</style>
+<script>
+
+function forceLayout() {
+    if (window.internals)
+        internals.updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks();
+    else
+        document.querySelector('p').getBoundingClientRect();
+}
+
+try {
+    var host1 = document.getElementById('host1');
+    host1.attachShadow({mode: 'open'}).innerHTML = '<slot><div style="width: 100%; height: 100%; background-color: green;"></div></slot>';
+
+    var host2 = document.getElementById('host2');
+    host2.attachShadow({mode: 'open'}).innerHTML = '<slot name="foo"><div style="width: 100%; height: 100%; background-color: green;"></div></slot>';
+
+    var host3 = document.getElementById('host3');
+    host3.attachShadow({mode: 'open'}).innerHTML = '<slot>FAIL</slot>';
+
+    forceLayout();
+
+    host1.removeChild(host1.firstChild);
+    forceLayout();
+
+    host2.firstChild.slot = 'bar';
+    forceLayout();
+
+    var child3 = document.createElement('div');
+    child3.style.backgroundColor = 'green';
+    host3.appendChild(child3);
+    forceLayout();
+
+    var host4 = document.getElementById('host4');
+    var child4 = document.createElement('div');
+    child4.style.backgroundColor = 'green';
+    host4.firstChild.appendChild(child4);
+
+    var host5 = document.getElementById('host5');
+    host5.firstChild.removeChild(host5.firstChild.firstChild);
+
+} catch (exception) {
+    document.body.appendChild(document.createTextNode(exception));
+}
+
+</script>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (190429 => 190430)


--- trunk/Source/WebCore/ChangeLog	2015-10-01 20:20:10 UTC (rev 190429)
+++ trunk/Source/WebCore/ChangeLog	2015-10-01 20:36:34 UTC (rev 190430)
@@ -1,3 +1,28 @@
+2015-10-01  Ryosuke Niwa  <[email protected]>
+
+        Slot elements should support fallback contents
+        https://bugs.webkit.org/show_bug.cgi?id=149701
+
+        Reviewed by Antti Koivisto.
+
+        Following discussions on Github discussions [1] [2], we're adding the default rule of `display: contents`
+        on slot elements and making slot elements render its children when there are no assigned nodes [3].
+
+        Make these changes by attaching renderers on direct-children of slot elements when there are no assigned
+        nodes during render tree construction. Note `display: contents` will be aded in webkit.org/b/149439.
+
+        [1] https://github.com/w3c/webcomponents/issues/317
+        [2] https://github.com/w3c/webcomponents/issues/308
+        [3] https://github.com/w3c/webcomponents/issues/308#issuecomment-143655347
+
+        Tests: fast/shadow-dom/css-scoping-shadow-slot-fallback.html
+               fast/shadow-dom/shadow-layout-after-slot-fallback-changes.html
+
+        * style/StyleResolveTree.cpp:
+        (WebCore::Style::attachSlotAssignees):
+        (WebCore::Style::detachSlotAssignees):
+        (WebCore::Style::resolveSlotAssignees):
+
 2015-10-01  Brent Fulgham  <[email protected]>
 
         Latch does not clear when a scroll snap animation is triggered

Modified: trunk/Source/WebCore/style/StyleResolveTree.cpp (190429 => 190430)


--- trunk/Source/WebCore/style/StyleResolveTree.cpp	2015-10-01 20:20:10 UTC (rev 190429)
+++ trunk/Source/WebCore/style/StyleResolveTree.cpp	2015-10-01 20:36:34 UTC (rev 190430)
@@ -480,6 +480,13 @@
             else if (is<Element>(*child))
                 attachRenderTree(downcast<Element>(*child), inheritedStyle, renderTreePosition, nullptr);
         }
+    } else {
+        for (Node* child = slot.firstChild(); child; child = child->nextSibling()) {
+            if (is<Text>(*child))
+                attachTextRenderer(downcast<Text>(*child), renderTreePosition);
+            else if (is<Element>(*child))
+                attachRenderTree(downcast<Element>(*child), inheritedStyle, renderTreePosition, nullptr);
+        }
     }
     slot.clearNeedsStyleRecalc();
     slot.clearChildNeedsStyleRecalc();
@@ -581,6 +588,13 @@
             else if (is<Element>(*child))
                 detachRenderTree(downcast<Element>(*child), detachType);
         }
+    } else {
+        for (Node* child = slot.firstChild(); child; child = child->nextSibling()) {
+            if (is<Text>(*child))
+                detachTextRenderer(downcast<Text>(*child));
+            else if (is<Element>(*child))
+                detachRenderTree(downcast<Element>(*child), detachType);
+        }
     }
     slot.clearNeedsStyleRecalc();
     slot.clearChildNeedsStyleRecalc();
@@ -852,6 +866,13 @@
             else if (is<Element>(*child))
                 resolveTree(downcast<Element>(*child), inheritedStyle, renderTreePosition, change);
         }
+    } else {
+        for (Node* child = slot.firstChild(); child; child = child->nextSibling()) {
+            if (is<Text>(*child))
+                resolveTextNode(downcast<Text>(*child), renderTreePosition);
+            else if (is<Element>(*child))
+                resolveTree(downcast<Element>(*child), inheritedStyle, renderTreePosition, change);
+        }
     }
     slot.clearNeedsStyleRecalc();
     slot.clearChildNeedsStyleRecalc();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to