Changeset 233055 in webkit


Ignore:
Timestamp:
Jun 21, 2018 1:34:14 PM (6 years ago)
Author:
Alan Bujtas
Message:

Do not reuse generated inline renderer for the first letter.
https://bugs.webkit.org/show_bug.cgi?id=186657
<rdar://problem/41157892>

Reviewed by Simon Fraser.

Source/WebCore:

When the first letter pseudo element is present, we construct a dedicated subtree for its content like this:

<div><span>foobar</span></div> -> with ::first-letter on the <div>
DIV RenderBlock

SPAN RenderInline

RenderInline (generated wrapper for the first letter content)

RenderText (fist letter content)

RenderText (remaining text content)

"display: contents" on the <span> forces us not to construct a RenderInline for the <span> (or just come up with a wrapper at best).
FirstLetter::createRenderers logic needs to check for such cases and pick the correct parent for the first letter subtree accordingly.

Test: fast/text/first-letter-with-display-contents-crash.html

imported/w3c/web-platform-tests/css/css-display/display-contents-first-letter-002.html is not crashing anymore either.

  • rendering/updating/RenderTreeBuilderFirstLetter.cpp:

(WebCore::RenderTreeBuilder::FirstLetter::createRenderers):

LayoutTests:

  • fast/text/first-letter-with-display-contents-crash-expected.txt: Added.
  • fast/text/first-letter-with-display-contents-crash.html: Added.
Location:
trunk
Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r233053 r233055  
     12018-06-20  Zalan Bujtas  <zalan@apple.com>
     2
     3        Do not reuse generated inline renderer for the first letter.
     4        https://bugs.webkit.org/show_bug.cgi?id=186657
     5        <rdar://problem/41157892>
     6
     7        Reviewed by Simon Fraser.
     8
     9        * fast/text/first-letter-with-display-contents-crash-expected.txt: Added.
     10        * fast/text/first-letter-with-display-contents-crash.html: Added.
     11
    1122018-06-21  Chris Dumez  <cdumez@apple.com>
    213
  • trunk/Source/WebCore/ChangeLog

    r233053 r233055  
     12018-06-20  Zalan Bujtas  <zalan@apple.com>
     2
     3        Do not reuse generated inline renderer for the first letter.
     4        https://bugs.webkit.org/show_bug.cgi?id=186657
     5        <rdar://problem/41157892>
     6
     7        Reviewed by Simon Fraser.
     8
     9        When the first letter pseudo element is present, we construct a dedicated subtree for its content like this:
     10
     11        <div><span>foobar</span></div> -> with ::first-letter on the <div>
     12        DIV RenderBlock
     13            SPAN RenderInline
     14                RenderInline (generated wrapper for the first letter content)
     15                    RenderText (fist letter content)
     16                RenderText (remaining text content)
     17
     18        "display: contents" on the <span> forces us not to construct a RenderInline for the <span> (or just come up with a wrapper at best).
     19        FirstLetter::createRenderers logic needs to check for such cases and pick the correct parent for the first letter subtree accordingly.
     20
     21        Test: fast/text/first-letter-with-display-contents-crash.html
     22              imported/w3c/web-platform-tests/css/css-display/display-contents-first-letter-002.html is not crashing anymore either.
     23
     24        * rendering/updating/RenderTreeBuilderFirstLetter.cpp:
     25        (WebCore::RenderTreeBuilder::FirstLetter::createRenderers):
     26
    1272018-06-21  Chris Dumez  <cdumez@apple.com>
    228
  • trunk/Source/WebCore/rendering/updating/RenderTreeBuilderFirstLetter.cpp

    r232178 r233055  
    203203void RenderTreeBuilder::FirstLetter::createRenderers(RenderBlock& firstLetterBlock, RenderText& currentTextChild)
    204204{
    205     RenderElement* firstLetterContainer = currentTextChild.parent();
     205    RenderElement* textContentParent = currentTextChild.parent();
     206    RenderElement* firstLetterContainer = nullptr;
     207    if (auto* wrapperInlineForDisplayContents = currentTextChild.inlineWrapperForDisplayContents())
     208        firstLetterContainer = wrapperInlineForDisplayContents->parent();
     209    else
     210        firstLetterContainer = textContentParent;
    206211    auto pseudoStyle = styleForFirstLetter(firstLetterBlock, *firstLetterContainer);
    207212    RenderPtr<RenderBoxModelObject> newFirstLetter;
     
    261266
    262267        RenderTextFragment& remainingText = *newRemainingText;
    263         m_builder.attach(*firstLetterContainer, WTFMove(newRemainingText), beforeChild);
     268        m_builder.attach(*textContentParent, WTFMove(newRemainingText), beforeChild);
    264269        remainingText.setFirstLetter(firstLetter);
    265270        firstLetter.setFirstLetterRemainingText(remainingText);
Note: See TracChangeset for help on using the changeset viewer.