Title: [256124] releases/WebKitGTK/webkit-2.28
Revision
256124
Author
carlo...@webkit.org
Date
2020-02-10 05:23:16 -0800 (Mon, 10 Feb 2020)

Log Message

Merge r255976 - Nullptr crash in WebCore::findPlaceForCounter with pseudo element that has display:contents host.
https://bugs.webkit.org/show_bug.cgi?id=207241

When the pseudo element's host element does not initiate a renderer
(e.g. display: contents) we need to look further in the DOM tree
for a previous-sibling-or-parent-element candidate.

Patch by Jack Lee <shihchieh_...@apple.com> on 2020-02-06
Reviewed by Zalan Bujtas.

Source/WebCore:

Test: fast/css/counters/findPlaceForCounter-pseudo-element-display-content-host-crash.html

* rendering/RenderCounter.cpp:
(WebCore::previousSiblingOrParentElement):

LayoutTests:

* fast/css/counters/findPlaceForCounter-pseudo-element-display-content-host-crash-expected.txt: Added.
* fast/css/counters/findPlaceForCounter-pseudo-element-display-content-host-crash.html: Added.

Modified Paths

Added Paths

Diff

Modified: releases/WebKitGTK/webkit-2.28/LayoutTests/ChangeLog (256123 => 256124)


--- releases/WebKitGTK/webkit-2.28/LayoutTests/ChangeLog	2020-02-10 13:23:11 UTC (rev 256123)
+++ releases/WebKitGTK/webkit-2.28/LayoutTests/ChangeLog	2020-02-10 13:23:16 UTC (rev 256124)
@@ -1,3 +1,17 @@
+2020-02-06  Jack Lee  <shihchieh_...@apple.com>
+
+        Nullptr crash in WebCore::findPlaceForCounter with pseudo element that has display:contents host.
+        https://bugs.webkit.org/show_bug.cgi?id=207241
+
+        When the pseudo element's host element does not initiate a renderer
+        (e.g. display: contents) we need to look further in the DOM tree 
+        for a previous-sibling-or-parent-element candidate.
+
+        Reviewed by Zalan Bujtas.
+
+        * fast/css/counters/findPlaceForCounter-pseudo-element-display-content-host-crash-expected.txt: Added.
+        * fast/css/counters/findPlaceForCounter-pseudo-element-display-content-host-crash.html: Added.
+
 2020-02-06  Sukolsak Sakshuwong  <sukol...@gmail.com> and Alexey Shvayka  <shvaikal...@gmail.com>
 
         _javascript_ string corruption using RegExp with unicode character

Added: releases/WebKitGTK/webkit-2.28/LayoutTests/fast/css/counters/findPlaceForCounter-pseudo-element-display-content-host-crash-expected.txt (0 => 256124)


--- releases/WebKitGTK/webkit-2.28/LayoutTests/fast/css/counters/findPlaceForCounter-pseudo-element-display-content-host-crash-expected.txt	                        (rev 0)
+++ releases/WebKitGTK/webkit-2.28/LayoutTests/fast/css/counters/findPlaceForCounter-pseudo-element-display-content-host-crash-expected.txt	2020-02-10 13:23:16 UTC (rev 256124)
@@ -0,0 +1 @@
+Tests CSS counter of a pseudo element that has display: contents host. The test passes if WebKit doesn't crash or hit an assertion.

Added: releases/WebKitGTK/webkit-2.28/LayoutTests/fast/css/counters/findPlaceForCounter-pseudo-element-display-content-host-crash.html (0 => 256124)


--- releases/WebKitGTK/webkit-2.28/LayoutTests/fast/css/counters/findPlaceForCounter-pseudo-element-display-content-host-crash.html	                        (rev 0)
+++ releases/WebKitGTK/webkit-2.28/LayoutTests/fast/css/counters/findPlaceForCounter-pseudo-element-display-content-host-crash.html	2020-02-10 13:23:16 UTC (rev 256124)
@@ -0,0 +1,18 @@
+<style>
+html, body {
+  counter-reset: counter;
+}
+
+#outer {
+  display: contents;
+}
+
+#outer::before {
+  content: "text";
+}
+</style><span id=outer><span id=inner>Tests CSS counter of a pseudo element that has display: contents host. The test passes if WebKit doesn't crash or hit an assertion.</span></span><script>
+    if (window.testRunner)
+        testRunner.dumpAsText();
+    document.body.offsetHeight;
+    inner.style.counterIncrement = "counter";
+</script>

Modified: releases/WebKitGTK/webkit-2.28/Source/WebCore/ChangeLog (256123 => 256124)


--- releases/WebKitGTK/webkit-2.28/Source/WebCore/ChangeLog	2020-02-10 13:23:11 UTC (rev 256123)
+++ releases/WebKitGTK/webkit-2.28/Source/WebCore/ChangeLog	2020-02-10 13:23:16 UTC (rev 256124)
@@ -1,3 +1,19 @@
+2020-02-06  Jack Lee  <shihchieh_...@apple.com>
+
+        Nullptr crash in WebCore::findPlaceForCounter with pseudo element that has display:contents host.
+        https://bugs.webkit.org/show_bug.cgi?id=207241
+
+        When the pseudo element's host element does not initiate a renderer
+        (e.g. display: contents) we need to look further in the DOM tree 
+        for a previous-sibling-or-parent-element candidate.
+
+        Reviewed by Zalan Bujtas.
+
+        Test: fast/css/counters/findPlaceForCounter-pseudo-element-display-content-host-crash.html
+
+        * rendering/RenderCounter.cpp:
+        (WebCore::previousSiblingOrParentElement):
+
 2020-02-06  Ali Juma  <aj...@chromium.org>
 
         Crash in RenderTableCol::willBeRemovedFromTree()

Modified: releases/WebKitGTK/webkit-2.28/Source/WebCore/rendering/RenderCounter.cpp (256123 => 256124)


--- releases/WebKitGTK/webkit-2.28/Source/WebCore/rendering/RenderCounter.cpp	2020-02-10 13:23:11 UTC (rev 256123)
+++ releases/WebKitGTK/webkit-2.28/Source/WebCore/rendering/RenderCounter.cpp	2020-02-10 13:23:16 UTC (rev 256124)
@@ -75,23 +75,28 @@
     return renderer.element() ? renderer.element()->parentElement() : nullptr;
 }
 
-static Element* previousSiblingOrParentElement(const Element* element)
+static Element* previousSiblingOrParentElement(const Element& element)
 {
-    auto* previous = ElementTraversal::pseudoAwarePreviousSibling(*element);
-    while (previous && !previous->renderer())
-        previous = ElementTraversal::pseudoAwarePreviousSibling(*previous);
+    if (auto* previous = ElementTraversal::pseudoAwarePreviousSibling(element)) {
+        while (previous && !previous->renderer())
+            previous = ElementTraversal::pseudoAwarePreviousSibling(*previous);
 
-    if (previous)
-        return previous;
+        if (previous)
+            return previous;
+    }
 
-    auto* renderer = element->renderer();
-    if (renderer && renderer->isPseudoElement())
-        return renderer->generatingElement();
-
-    previous = element->parentElement();
-    if (previous && !previous->renderer())
-        previous = previousSiblingOrParentElement(previous);
-    return previous;
+    if (is<PseudoElement>(element)) {
+        auto* hostElement = downcast<PseudoElement>(element).hostElement();
+        ASSERT(hostElement);
+        if (hostElement->renderer())
+            return hostElement;
+        return previousSiblingOrParentElement(*hostElement);
+    }
+    
+    auto* parent = element.parentElement();
+    if (parent && !parent->renderer())
+        parent = previousSiblingOrParentElement(*parent);
+    return parent;
 }
 
 // This function processes the renderer tree in the order of the DOM tree
@@ -100,7 +105,7 @@
 {
     ASSERT(renderer.element());
 
-    auto* previous = previousSiblingOrParentElement(renderer.element());
+    auto* previous = previousSiblingOrParentElement(*renderer.element());
     return previous ? previous->renderer() : nullptr;
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to