⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 294736 in webkit


Ignore:
Timestamp:
May 23, 2022, 11:00:48 PM (4 years ago)
Author:
Antti Koivisto
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

Location:
trunk
Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/fast/css/first-letter-removed-added-expected.txt

    r145296 r294736  
    3535PASS document.getElementById('test5').offsetWidth == document.getElementById('ref5').offsetWidth is true
    3636PASS document.getElementById('test6').offsetWidth == document.getElementById('ref6').offsetWidth is true
    37 FAIL document.getElementById('test7').offsetWidth == document.getElementById('ref7').offsetWidth should be true. Was false.
     37PASS document.getElementById('test7').offsetWidth == document.getElementById('ref7').offsetWidth is true
    3838PASS document.getElementById('test8').offsetWidth == document.getElementById('ref8').offsetWidth is true
    3939PASS successfullyParsed is true
  • trunk/Source/WebCore/rendering/updating/RenderTreeBuilderFirstLetter.cpp

    r294485 r294736  
    176176    auto pseudoStyle = styleForFirstLetter(firstLetterContainer);
    177177    if (!pseudoStyle) {
    178         m_builder.destroy(*firstLetter, CanCollapseAnonymousBlock::No);
     178        ASSERT_NOT_REACHED();
    179179        return;
    180180    }
  • trunk/Source/WebCore/style/StyleTreeResolver.cpp

    r294291 r294736  
    262262    auto resolveAndAddPseudoElementStyle = [&](PseudoId pseudoId) {
    263263        auto pseudoElementUpdate = resolvePseudoElement(element, pseudoId, update);
     264        auto pseudoElementChange = [&] {
     265            if (pseudoElementUpdate)
     266                return pseudoElementUpdate->change == Change::None ? Change::None : Change::NonInherited;
     267            if (!existingStyle || !existingStyle->getCachedPseudoStyle(pseudoId))
     268                return Change::None;
     269            // If ::first-letter goes aways rebuild the renderers.
     270            return pseudoId == PseudoId::FirstLetter ? Change::Renderer : Change::NonInherited;
     271        }();
     272        update.change = std::max(update.change, pseudoElementChange);
    264273        if (!pseudoElementUpdate)
    265             return Change::None;
    266         if (pseudoElementUpdate->change != Change::None)
    267             update.change = std::max(update.change, Change::NonInherited);
     274            return pseudoElementChange;
    268275        if (pseudoElementUpdate->recompositeLayer)
    269276            update.recompositeLayer = true;
Note: See TracChangeset for help on using the changeset viewer.