Title: [294736] trunk
Revision
294736
Author
[email protected]
Date
2022-05-23 23:00:48 -0700 (Mon, 23 May 2022)

Log Message

REGRESSION (r294291): Another nullptr crash with ::first-letter
https://bugs.webkit.org/show_bug.cgi?id=240795
<rdar://93645746>

Reviewed by Alan Bujtas.

* LayoutTests/fast/css/first-letter-remove-crash-expected.txt: Added.
* LayoutTests/fast/css/first-letter-remove-crash.html: Added.
* LayoutTests/fast/css/first-letter-removed-added-expected.txt:

* Source/WebCore/rendering/updating/RenderTreeBuilderFirstLetter.cpp:
(WebCore::RenderTreeBuilder::FirstLetter::updateStyle):

We should always find :first-letter style when we get here.

* Source/WebCore/style/StyleTreeResolver.cpp:
(WebCore::Style::TreeResolver::resolveElement):

Rebuild the renderer subtree if ::first-letter pseudo-class stops applying.

Canonical link: https://commits.webkit.org/250908@main

Modified Paths

Added Paths

Diff

Added: trunk/LayoutTests/fast/css/first-letter-remove-crash-expected.txt (0 => 294736)


--- trunk/LayoutTests/fast/css/first-letter-remove-crash-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/css/first-letter-remove-crash-expected.txt	2022-05-24 06:00:48 UTC (rev 294736)
@@ -0,0 +1 @@
+aa

Added: trunk/LayoutTests/fast/css/first-letter-remove-crash.html (0 => 294736)


--- trunk/LayoutTests/fast/css/first-letter-remove-crash.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css/first-letter-remove-crash.html	2022-05-24 06:00:48 UTC (rev 294736)
@@ -0,0 +1,17 @@
+<style>
+  html::first-letter {
+    width: 0;
+  }
+</style>
+<script>
+  if (window.testRunner)
+    testRunner.dumpAsText();
+  _onload_ = () => {
+    document.execCommand('SelectAll');
+    document.body.append('aa');
+    document.documentElement.append('');
+    document.body.offsetTop;
+    document.body.style.overflow = 'clip';
+  };
+</script>
+

Modified: trunk/LayoutTests/fast/css/first-letter-removed-added-expected.txt (294735 => 294736)


--- trunk/LayoutTests/fast/css/first-letter-removed-added-expected.txt	2022-05-24 05:38:14 UTC (rev 294735)
+++ trunk/LayoutTests/fast/css/first-letter-removed-added-expected.txt	2022-05-24 06:00:48 UTC (rev 294736)
@@ -34,7 +34,7 @@
 FAIL document.getElementById('test4').offsetWidth == document.getElementById('ref4').offsetWidth should be true. Was false.
 PASS document.getElementById('test5').offsetWidth == document.getElementById('ref5').offsetWidth is true
 PASS document.getElementById('test6').offsetWidth == document.getElementById('ref6').offsetWidth is true
-FAIL document.getElementById('test7').offsetWidth == document.getElementById('ref7').offsetWidth should be true. Was false.
+PASS document.getElementById('test7').offsetWidth == document.getElementById('ref7').offsetWidth is true
 PASS document.getElementById('test8').offsetWidth == document.getElementById('ref8').offsetWidth is true
 PASS successfullyParsed is true
 

Modified: trunk/Source/WebCore/rendering/updating/RenderTreeBuilderFirstLetter.cpp (294735 => 294736)


--- trunk/Source/WebCore/rendering/updating/RenderTreeBuilderFirstLetter.cpp	2022-05-24 05:38:14 UTC (rev 294735)
+++ trunk/Source/WebCore/rendering/updating/RenderTreeBuilderFirstLetter.cpp	2022-05-24 06:00:48 UTC (rev 294736)
@@ -175,7 +175,7 @@
 
     auto pseudoStyle = styleForFirstLetter(firstLetterContainer);
     if (!pseudoStyle) {
-        m_builder.destroy(*firstLetter, CanCollapseAnonymousBlock::No);
+        ASSERT_NOT_REACHED();
         return;
     }
 

Modified: trunk/Source/WebCore/style/StyleTreeResolver.cpp (294735 => 294736)


--- trunk/Source/WebCore/style/StyleTreeResolver.cpp	2022-05-24 05:38:14 UTC (rev 294735)
+++ trunk/Source/WebCore/style/StyleTreeResolver.cpp	2022-05-24 06:00:48 UTC (rev 294736)
@@ -261,10 +261,17 @@
 
     auto resolveAndAddPseudoElementStyle = [&](PseudoId pseudoId) {
         auto pseudoElementUpdate = resolvePseudoElement(element, pseudoId, update);
+        auto pseudoElementChange = [&] {
+            if (pseudoElementUpdate)
+                return pseudoElementUpdate->change == Change::None ? Change::None : Change::NonInherited;
+            if (!existingStyle || !existingStyle->getCachedPseudoStyle(pseudoId))
+                return Change::None;
+            // If ::first-letter goes aways rebuild the renderers.
+            return pseudoId == PseudoId::FirstLetter ? Change::Renderer : Change::NonInherited;
+        }();
+        update.change = std::max(update.change, pseudoElementChange);
         if (!pseudoElementUpdate)
-            return Change::None;
-        if (pseudoElementUpdate->change != Change::None)
-            update.change = std::max(update.change, Change::NonInherited);
+            return pseudoElementChange;
         if (pseudoElementUpdate->recompositeLayer)
             update.recompositeLayer = true;
         update.style->addCachedPseudoStyle(WTFMove(pseudoElementUpdate->style));
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to