Changeset 226168 in webkit


Ignore:
Timestamp:
Dec 19, 2017 5:44:37 PM (6 years ago)
Author:
Antti Koivisto
Message:

Move first-letter building code to RenderTreeBuilder
https://bugs.webkit.org/show_bug.cgi?id=180992

Reviewed by Zalan Bujtas.

All special case tree building logic should go to RenderTreeBuilder.

  • RenderTreeUpdater::FirstLetter -> RenderTreeBuilder::FirstLetter
  • Make the builder non-static and stop using RenderTreeBuilder::current() there.
  • Sources.txt:
  • WebCore.xcodeproj/project.pbxproj:
  • rendering/TextAutoSizing.cpp:

(WebCore::TextAutoSizingValue::adjustTextNodeSizes):

  • rendering/updating/RenderTreeBuilder.cpp:

(WebCore::RenderTreeBuilder::RenderTreeBuilder):
(WebCore::RenderTreeBuilder::insertChild):
(WebCore::RenderTreeBuilder::updateAfterDescendants):

  • rendering/updating/RenderTreeBuilder.h:

(WebCore::RenderTreeBuilder::firstLetterBuilder):
(WebCore::RenderTreeBuilder::tableBuilder):

  • rendering/updating/RenderTreeBuilderFirstLetter.cpp: Copied from rendering/updating/RenderTreeUpdaterFirstLetter.cpp.

(WebCore::supportsFirstLetter):
(WebCore::RenderTreeBuilder::FirstLetter::FirstLetter):
(WebCore::RenderTreeBuilder::FirstLetter::updateAfterDescendants):
(WebCore::RenderTreeBuilder::FirstLetter::updateStyle):
(WebCore::RenderTreeBuilder::FirstLetter::createRenderers):
(WebCore::updateFirstLetterStyle): Deleted.
(WebCore::createFirstLetterRenderer): Deleted.
(WebCore::RenderTreeUpdater::FirstLetter::update): Deleted.

  • rendering/updating/RenderTreeBuilderFirstLetter.h: Copied from rendering/updating/RenderTreeUpdaterFirstLetter.h.
  • rendering/updating/RenderTreeUpdater.cpp:

(WebCore::RenderTreeUpdater::updateAfterDescendants):

  • rendering/updating/RenderTreeUpdater.h:
  • rendering/updating/RenderTreeUpdaterFirstLetter.cpp: Removed.
  • rendering/updating/RenderTreeUpdaterFirstLetter.h: Removed.
Location:
trunk/Source/WebCore
Files:
9 edited
2 moved

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r226162 r226168  
     12017-12-19  Antti Koivisto  <antti@apple.com>
     2
     3        Move first-letter building code to RenderTreeBuilder
     4        https://bugs.webkit.org/show_bug.cgi?id=180992
     5
     6        Reviewed by Zalan Bujtas.
     7
     8        All special case tree building logic should go to RenderTreeBuilder.
     9
     10        - RenderTreeUpdater::FirstLetter -> RenderTreeBuilder::FirstLetter
     11        - Make the builder non-static and stop using RenderTreeBuilder::current() there.
     12
     13        * Sources.txt:
     14        * WebCore.xcodeproj/project.pbxproj:
     15        * rendering/TextAutoSizing.cpp:
     16        (WebCore::TextAutoSizingValue::adjustTextNodeSizes):
     17        * rendering/updating/RenderTreeBuilder.cpp:
     18        (WebCore::RenderTreeBuilder::RenderTreeBuilder):
     19        (WebCore::RenderTreeBuilder::insertChild):
     20        (WebCore::RenderTreeBuilder::updateAfterDescendants):
     21        * rendering/updating/RenderTreeBuilder.h:
     22        (WebCore::RenderTreeBuilder::firstLetterBuilder):
     23        (WebCore::RenderTreeBuilder::tableBuilder):
     24        * rendering/updating/RenderTreeBuilderFirstLetter.cpp: Copied from rendering/updating/RenderTreeUpdaterFirstLetter.cpp.
     25        (WebCore::supportsFirstLetter):
     26        (WebCore::RenderTreeBuilder::FirstLetter::FirstLetter):
     27        (WebCore::RenderTreeBuilder::FirstLetter::updateAfterDescendants):
     28        (WebCore::RenderTreeBuilder::FirstLetter::updateStyle):
     29        (WebCore::RenderTreeBuilder::FirstLetter::createRenderers):
     30        (WebCore::updateFirstLetterStyle): Deleted.
     31        (WebCore::createFirstLetterRenderer): Deleted.
     32        (WebCore::RenderTreeUpdater::FirstLetter::update): Deleted.
     33        * rendering/updating/RenderTreeBuilderFirstLetter.h: Copied from rendering/updating/RenderTreeUpdaterFirstLetter.h.
     34        * rendering/updating/RenderTreeUpdater.cpp:
     35        (WebCore::RenderTreeUpdater::updateAfterDescendants):
     36        * rendering/updating/RenderTreeUpdater.h:
     37        * rendering/updating/RenderTreeUpdaterFirstLetter.cpp: Removed.
     38        * rendering/updating/RenderTreeUpdaterFirstLetter.h: Removed.
     39
    1402017-12-19  Chris Dumez  <cdumez@apple.com>
    241
  • trunk/Source/WebCore/Sources.txt

    r226127 r226168  
    19811981
    19821982rendering/updating/RenderTreeBuilder.cpp
     1983rendering/updating/RenderTreeBuilderFirstLetter.cpp
    19831984rendering/updating/RenderTreeBuilderTable.cpp
    19841985rendering/updating/RenderTreePosition.cpp
    19851986rendering/updating/RenderTreeUpdater.cpp
    1986 rendering/updating/RenderTreeUpdaterFirstLetter.cpp
    19871987rendering/updating/RenderTreeUpdaterGeneratedContent.cpp
    19881988rendering/updating/RenderTreeUpdaterListItem.cpp
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r226160 r226168  
    45804580                E47C392E1FE6E0F700BBBC6B /* RenderTreePosition.h in Headers */ = {isa = PBXBuildFile; fileRef = E47C39241FE6E0DB00BBBC6B /* RenderTreePosition.h */; };
    45814581                E47C392F1FE6E0F900BBBC6B /* RenderTreeUpdater.h in Headers */ = {isa = PBXBuildFile; fileRef = E47C392C1FE6E0DF00BBBC6B /* RenderTreeUpdater.h */; };
    4582                 E47C39301FE6E0FD00BBBC6B /* RenderTreeUpdaterFirstLetter.h in Headers */ = {isa = PBXBuildFile; fileRef = E47C39261FE6E0DC00BBBC6B /* RenderTreeUpdaterFirstLetter.h */; };
     4582                E47C39301FE6E0FD00BBBC6B /* RenderTreeBuilderFirstLetter.h in Headers */ = {isa = PBXBuildFile; fileRef = E47C39261FE6E0DC00BBBC6B /* RenderTreeBuilderFirstLetter.h */; };
    45834583                E47C39311FE6E10200BBBC6B /* RenderTreeUpdaterGeneratedContent.h in Headers */ = {isa = PBXBuildFile; fileRef = E47C39251FE6E0DB00BBBC6B /* RenderTreeUpdaterGeneratedContent.h */; };
    45844584                E47C39321FE6E10500BBBC6B /* RenderTreeUpdaterListItem.h in Headers */ = {isa = PBXBuildFile; fileRef = E47C39281FE6E0DD00BBBC6B /* RenderTreeUpdaterListItem.h */; };
     
    1390913909                E47C391F1FE6E0D800BBBC6B /* RenderTreeUpdater.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTreeUpdater.cpp; sourceTree = "<group>"; };
    1391013910                E47C39201FE6E0D900BBBC6B /* RenderTreeBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTreeBuilder.cpp; sourceTree = "<group>"; };
    13911                 E47C39211FE6E0DA00BBBC6B /* RenderTreeUpdaterFirstLetter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTreeUpdaterFirstLetter.cpp; sourceTree = "<group>"; };
     13911                E47C39211FE6E0DA00BBBC6B /* RenderTreeBuilderFirstLetter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTreeBuilderFirstLetter.cpp; sourceTree = "<group>"; };
    1391213912                E47C39221FE6E0DA00BBBC6B /* RenderTreeUpdaterGeneratedContent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTreeUpdaterGeneratedContent.cpp; sourceTree = "<group>"; };
    1391313913                E47C39231FE6E0DA00BBBC6B /* RenderTreeUpdaterMultiColumn.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTreeUpdaterMultiColumn.cpp; sourceTree = "<group>"; };
    1391413914                E47C39241FE6E0DB00BBBC6B /* RenderTreePosition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreePosition.h; sourceTree = "<group>"; };
    1391513915                E47C39251FE6E0DB00BBBC6B /* RenderTreeUpdaterGeneratedContent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreeUpdaterGeneratedContent.h; sourceTree = "<group>"; };
    13916                 E47C39261FE6E0DC00BBBC6B /* RenderTreeUpdaterFirstLetter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreeUpdaterFirstLetter.h; sourceTree = "<group>"; };
     13916                E47C39261FE6E0DC00BBBC6B /* RenderTreeBuilderFirstLetter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreeBuilderFirstLetter.h; sourceTree = "<group>"; };
    1391713917                E47C39271FE6E0DC00BBBC6B /* RenderTreeUpdaterMultiColumn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreeUpdaterMultiColumn.h; sourceTree = "<group>"; };
    1391813918                E47C39281FE6E0DD00BBBC6B /* RenderTreeUpdaterListItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreeUpdaterListItem.h; sourceTree = "<group>"; };
     
    2451724517                                E47C39201FE6E0D900BBBC6B /* RenderTreeBuilder.cpp */,
    2451824518                                E47C392A1FE6E0DE00BBBC6B /* RenderTreeBuilder.h */,
     24519                                E47C39211FE6E0DA00BBBC6B /* RenderTreeBuilderFirstLetter.cpp */,
     24520                                E47C39261FE6E0DC00BBBC6B /* RenderTreeBuilderFirstLetter.h */,
    2451924521                                119340761FE8B92300935F1E /* RenderTreeBuilderTable.cpp */,
    2452024522                                119340771FE8B92300935F1E /* RenderTreeBuilderTable.h */,
     
    2452324525                                E47C391F1FE6E0D800BBBC6B /* RenderTreeUpdater.cpp */,
    2452424526                                E47C392C1FE6E0DF00BBBC6B /* RenderTreeUpdater.h */,
    24525                                 E47C39211FE6E0DA00BBBC6B /* RenderTreeUpdaterFirstLetter.cpp */,
    24526                                 E47C39261FE6E0DC00BBBC6B /* RenderTreeUpdaterFirstLetter.h */,
    2452724527                                E47C39221FE6E0DA00BBBC6B /* RenderTreeUpdaterGeneratedContent.cpp */,
    2452824528                                E47C39251FE6E0DB00BBBC6B /* RenderTreeUpdaterGeneratedContent.h */,
     
    2724327243                                0707568C142262D600414161 /* HTMLTrackElement.h in Headers */,
    2724427244                                977B37261228721700B81FF8 /* HTMLTreeBuilder.h in Headers */,
     27245                                E47C39301FE6E0FD00BBBC6B /* RenderTreeBuilderFirstLetter.h in Headers */,
    2724527246                                A8EA79F20A1916DF00A8EF5F /* HTMLUListElement.h in Headers */,
    2724627247                                AD49914318F0815100BF0092 /* HTMLUnknownElement.h in Headers */,
     
    2893328934                                E47C392E1FE6E0F700BBBC6B /* RenderTreePosition.h in Headers */,
    2893428935                                E47C392F1FE6E0F900BBBC6B /* RenderTreeUpdater.h in Headers */,
    28935                                 E47C39301FE6E0FD00BBBC6B /* RenderTreeUpdaterFirstLetter.h in Headers */,
    2893628936                                E47C39311FE6E10200BBBC6B /* RenderTreeUpdaterGeneratedContent.h in Headers */,
    2893728937                                E47C39321FE6E10500BBBC6B /* RenderTreeUpdaterListItem.h in Headers */,
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj.orig

    r226160 r226168  
    170170                078E094717D16E1C00420AA1 /* RTCVoidRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 07221BB017CF0AD400848E51 /* RTCVoidRequest.h */; settings = {ATTRIBUTES = (Private, ); }; };
    171171                078E094C17D1709600420AA1 /* MediaStreamAudioDestinationNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 078E094917D1709600420AA1 /* MediaStreamAudioDestinationNode.h */; };
     172                078E3CC01FE1C73C00483C1D /* MediaStreamRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 078E3CBE1FE19F3000483C1D /* MediaStreamRequest.h */; settings = {ATTRIBUTES = (Private, ); }; };
    172173                078E43DA1ABB6C7E001C2FA6 /* MediaPlaybackTargetPicker.h in Headers */ = {isa = PBXBuildFile; fileRef = 078E43D81ABB6C7E001C2FA6 /* MediaPlaybackTargetPicker.h */; settings = {ATTRIBUTES = (Private, ); }; };
    173174                078E43DD1ABB6F6F001C2FA6 /* MediaPlaybackTargetPickerMac.h in Headers */ = {isa = PBXBuildFile; fileRef = 078E43DB1ABB6F6F001C2FA6 /* MediaPlaybackTargetPickerMac.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    51755176                078E094917D1709600420AA1 /* MediaStreamAudioDestinationNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaStreamAudioDestinationNode.h; sourceTree = "<group>"; };
    51765177                078E094A17D1709600420AA1 /* MediaStreamAudioDestinationNode.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = MediaStreamAudioDestinationNode.idl; sourceTree = "<group>"; };
     5178                078E3CBE1FE19F3000483C1D /* MediaStreamRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaStreamRequest.h; sourceTree = "<group>"; };
    51775179                078E43D71ABB6C7E001C2FA6 /* MediaPlaybackTargetPicker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaPlaybackTargetPicker.cpp; sourceTree = "<group>"; };
    51785180                078E43D81ABB6C7E001C2FA6 /* MediaPlaybackTargetPicker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaPlaybackTargetPicker.h; sourceTree = "<group>"; };
     
    1471814720                                0711588F17DF633700EDFE2B /* MediaStreamPrivate.cpp */,
    1471914721                                07221B9D17CF0AD400848E51 /* MediaStreamPrivate.h */,
     14722                                078E3CBE1FE19F3000483C1D /* MediaStreamRequest.h */,
    1472014723                                07FFDE66181AED420072D409 /* MediaStreamTrackPrivate.cpp */,
    1472114724                                07FFDE67181AED420072D409 /* MediaStreamTrackPrivate.h */,
     
    2692926932                                4129C9971F59B963009D7403 /* FetchBodySource.h in Headers */,
    2693026933                                41D129DB1F3D143800D15E47 /* FetchHeaders.h in Headers */,
     26934                                4161E2D51FE48DC500EC2E96 /* FetchLoader.h in Headers */,
    2693126935                                517A53581F5889E800DCDC0A /* FetchLoaderClient.h in Headers */,
    2693226936                                41AD753A1CEF6BD100A31486 /* FetchOptions.h in Headers */,
     
    2739027394                                A5B81CAE1FAA44620037D1E6 /* InspectorIndexedDBAgent.h in Headers */,
    2739127395                                20D629271253690B00081543 /* InspectorInstrumentation.h in Headers */,
    27392                                 4161E2D51FE48DC500EC2E96 /* FetchLoader.h in Headers */,
    2739327396                                A5840E1D187B74D500843B10 /* InspectorInstrumentationCookie.h in Headers */,
    2739427397                                A5B81CAF1FAA44620037D1E6 /* InspectorLayerTreeAgent.h in Headers */,
     
    2842128424                                078E093717D16B2C00420AA1 /* MediaStreamPrivate.h in Headers */,
    2842228425                                078E091717D14D1C00420AA1 /* MediaStreamRegistry.h in Headers */,
     28426                                078E3CC01FE1C73C00483C1D /* MediaStreamRequest.h in Headers */,
    2842328427                                078E091817D14D1C00420AA1 /* MediaStreamTrack.h in Headers */,
    2842428428                                078E091917D14D1C00420AA1 /* MediaStreamTrackEvent.h in Headers */,
  • trunk/Source/WebCore/rendering/TextAutoSizing.cpp

    r226007 r226168  
    3838#include "RenderTextFragment.h"
    3939#include "RenderTreeBuilder.h"
    40 #include "RenderTreeUpdaterFirstLetter.h"
     40#include "RenderTreeBuilderFirstLetter.h"
    4141#include "RenderTreeUpdaterListItem.h"
    4242#include "StyleResolver.h"
     
    174174        if (!block)
    175175            continue;
    176         // FIXME: All render tree mutations should be done by RenderTreeUpdater commit.
    177         RenderTreeUpdater::FirstLetter::update(*block);
     176        builder.updateAfterDescendants(*block);
    178177    }
    179178
  • trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp

    r226140 r226168  
    3333#include "RenderTableRow.h"
    3434#include "RenderText.h"
     35#include "RenderTreeBuilderFirstLetter.h"
    3536#include "RenderTreeBuilderTable.h"
    36 #include "RenderTreeUpdater.h"
    3737
    3838namespace WebCore {
     
    4242RenderTreeBuilder::RenderTreeBuilder(RenderView& view)
    4343    : m_view(view)
     44    , m_firstLetterBuilder(std::make_unique<FirstLetter>(*this))
    4445    , m_tableBuilder(std::make_unique<Table>(*this))
    4546{
     
    6465
    6566    if (is<RenderTableRow>(parent)) {
    66         m_tableBuilder->findOrCreateParentForChild(downcast<RenderTableRow>(parent), *child, beforeChild).addChild(*this, WTFMove(child), beforeChild);
     67        tableBuilder().findOrCreateParentForChild(downcast<RenderTableRow>(parent), *child, beforeChild).addChild(*this, WTFMove(child), beforeChild);
    6768        return;
    6869    }
    6970
    7071    if (is<RenderTableSection>(parent)) {
    71         auto& parentCandidate = m_tableBuilder->findOrCreateParentForChild(downcast<RenderTableSection>(parent), *child, beforeChild);
     72        auto& parentCandidate = tableBuilder().findOrCreateParentForChild(downcast<RenderTableSection>(parent), *child, beforeChild);
    7273        if (&parent != &parentCandidate) {
    7374            insertChild(parentCandidate, WTFMove(child), beforeChild);
     
    8990{
    9091    insertChild(position.parent(), WTFMove(child), position.nextSibling());
     92}
     93
     94void RenderTreeBuilder::updateAfterDescendants(RenderElement& renderer)
     95{
     96    if (is<RenderBlock>(renderer))
     97        firstLetterBuilder().updateAfterDescendants(downcast<RenderBlock>(renderer));
    9198}
    9299
  • trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.h

    r226127 r226168  
    4141    void insertChild(RenderTreePosition&, RenderPtr<RenderObject>);
    4242
     43    void updateAfterDescendants(RenderElement&);
     44
    4345    // This avoids having to convert all sites that need RenderTreeBuilder in one go.
    4446    // FIXME: Remove.
     
    4648
    4749private:
     50    class FirstLetter;
    4851    class Table;
    4952
    5053    void rubyRunInsertChild(RenderRubyRun&, RenderPtr<RenderObject> child, RenderObject* beforeChild);
    5154
     55    FirstLetter& firstLetterBuilder() { return *m_firstLetterBuilder; }
     56    Table& tableBuilder() { return *m_tableBuilder; }
     57
    5258    RenderView& m_view;
    5359
    5460    RenderTreeBuilder* m_previous { nullptr };
     61    static RenderTreeBuilder* s_current;
     62
     63    std::unique_ptr<FirstLetter> m_firstLetterBuilder;
    5564    std::unique_ptr<Table> m_tableBuilder;
    56     static RenderTreeBuilder* s_current;
    5765};
    5866
  • trunk/Source/WebCore/rendering/updating/RenderTreeBuilderFirstLetter.cpp

    r226165 r226168  
    2323
    2424#include "config.h"
    25 #include "RenderTreeUpdaterFirstLetter.h"
     25#include "RenderTreeBuilderFirstLetter.h"
    2626
    2727#include "FontCascade.h"
     
    102102}
    103103
    104 static void updateFirstLetterStyle(RenderBlock& firstLetterBlock, RenderObject& currentChild)
     104static bool supportsFirstLetter(RenderBlock& block)
     105{
     106    if (is<RenderButton>(block))
     107        return true;
     108    if (!is<RenderBlockFlow>(block))
     109        return false;
     110    if (is<RenderSVGText>(block))
     111        return false;
     112    if (is<RenderRubyRun>(block))
     113        return false;
     114    return block.canHaveGeneratedChildren();
     115}
     116
     117RenderTreeBuilder::FirstLetter::FirstLetter(RenderTreeBuilder& builder)
     118    : m_builder(builder)
     119{
     120}
     121
     122void RenderTreeBuilder::FirstLetter::updateAfterDescendants(RenderBlock& block)
     123{
     124    if (!block.style().hasPseudoStyle(FIRST_LETTER))
     125        return;
     126    if (!supportsFirstLetter(block))
     127        return;
     128
     129    // FIXME: This should be refactored, firstLetterContainer is not needed.
     130    RenderObject* firstLetterRenderer;
     131    RenderElement* firstLetterContainer;
     132    block.getFirstLetter(firstLetterRenderer, firstLetterContainer);
     133
     134    if (!firstLetterRenderer)
     135        return;
     136
     137    // Other containers are handled when updating their renderers.
     138    if (&block != firstLetterContainer)
     139        return;
     140
     141    // If the child already has style, then it has already been created, so we just want
     142    // to update it.
     143    if (firstLetterRenderer->parent()->style().styleType() == FIRST_LETTER) {
     144        updateStyle(block, *firstLetterRenderer);
     145        return;
     146    }
     147
     148    if (!is<RenderText>(firstLetterRenderer))
     149        return;
     150
     151    createRenderers(block, downcast<RenderText>(*firstLetterRenderer));
     152}
     153
     154void RenderTreeBuilder::FirstLetter::updateStyle(RenderBlock& firstLetterBlock, RenderObject& currentChild)
    105155{
    106156    RenderElement* firstLetter = currentChild.parent();
     
    126176                downcast<RenderText>(*child).removeAndDestroyTextBoxes();
    127177            auto toMove = firstLetter->takeChild(*child);
    128             RenderTreeBuilder::current()->insertChild(*newFirstLetter, WTFMove(toMove));
     178            m_builder.insertChild(*newFirstLetter, WTFMove(toMove));
    129179        }
    130180
     
    137187        }
    138188        firstLetterContainer->removeAndDestroyChild(*firstLetter);
    139         RenderTreeBuilder::current()->insertChild(*firstLetterContainer, WTFMove(newFirstLetter), nextSibling);
    140     } else
    141         firstLetter->setStyle(WTFMove(pseudoStyle));
    142 }
    143 
    144 static void createFirstLetterRenderer(RenderBlock& firstLetterBlock, RenderText& currentTextChild)
     189        m_builder.insertChild(*firstLetterContainer, WTFMove(newFirstLetter), nextSibling);
     190        return;
     191    }
     192
     193    firstLetter->setStyle(WTFMove(pseudoStyle));
     194}
     195
     196void RenderTreeBuilder::FirstLetter::createRenderers(RenderBlock& firstLetterBlock, RenderText& currentTextChild)
    145197{
    146198    RenderElement* firstLetterContainer = currentTextChild.parent();
     
    155207
    156208    auto& firstLetter = *newFirstLetter;
    157     RenderTreeBuilder::current()->insertChild(*firstLetterContainer, WTFMove(newFirstLetter), &currentTextChild);
     209    m_builder.insertChild(*firstLetterContainer, WTFMove(newFirstLetter), &currentTextChild);
    158210
    159211    // The original string is going to be either a generated content string or a DOM node's
     
    199251
    200252        RenderTextFragment& remainingText = *newRemainingText;
    201         RenderTreeBuilder::current()->insertChild(*firstLetterContainer, WTFMove(newRemainingText), beforeChild);
     253        m_builder.insertChild(*firstLetterContainer, WTFMove(newRemainingText), beforeChild);
    202254        remainingText.setFirstLetter(firstLetter);
    203255        firstLetter.setFirstLetterRemainingText(remainingText);
     
    206258        auto letter = createRenderer<RenderTextFragment>(firstLetterBlock.document(), oldText, 0, length);
    207259
    208         RenderTreeBuilder::current()->insertChild(firstLetter, WTFMove(letter));
    209     }
    210 }
    211 
    212 static bool supportsFirstLetter(RenderBlock& block)
    213 {
    214     if (is<RenderButton>(block))
    215         return true;
    216     if (!is<RenderBlockFlow>(block))
    217         return false;
    218     if (is<RenderSVGText>(block))
    219         return false;
    220     if (is<RenderRubyRun>(block))
    221         return false;
    222     return block.canHaveGeneratedChildren();
    223 }
    224 
    225 void RenderTreeUpdater::FirstLetter::update(RenderBlock& block)
    226 {
    227     if (!block.style().hasPseudoStyle(FIRST_LETTER))
    228         return;
    229     if (!supportsFirstLetter(block))
    230         return;
    231 
    232     // FIXME: This should be refactored, firstLetterContainer is not needed.
    233     RenderObject* firstLetterRenderer;
    234     RenderElement* firstLetterContainer;
    235     block.getFirstLetter(firstLetterRenderer, firstLetterContainer);
    236 
    237     if (!firstLetterRenderer)
    238         return;
    239 
    240     // Other containers are handled when updating their renderers.
    241     if (&block != firstLetterContainer)
    242         return;
    243 
    244     // If the child already has style, then it has already been created, so we just want
    245     // to update it.
    246     if (firstLetterRenderer->parent()->style().styleType() == FIRST_LETTER) {
    247         updateFirstLetterStyle(block, *firstLetterRenderer);
    248         return;
    249     }
    250 
    251     if (!is<RenderText>(firstLetterRenderer))
    252         return;
    253 
    254     createFirstLetterRenderer(block, downcast<RenderText>(*firstLetterRenderer));
     260        m_builder.insertChild(firstLetter, WTFMove(letter));
     261    }
    255262}
    256263
  • trunk/Source/WebCore/rendering/updating/RenderTreeBuilderFirstLetter.h

    r226165 r226168  
    2626#pragma once
    2727
    28 #include "RenderTreeUpdater.h"
     28#include "RenderTreeBuilder.h"
    2929
    3030namespace WebCore {
    3131
    32 class RenderBlock;
     32class RenderElement;
    3333
    34 class RenderTreeUpdater::FirstLetter {
     34class RenderTreeBuilder::FirstLetter {
    3535public:
    36     static void update(RenderBlock&);
     36    FirstLetter(RenderTreeBuilder&);
     37
     38    void updateAfterDescendants(RenderBlock&);
     39
     40private:
     41    void updateStyle(RenderBlock& firstLetterBlock, RenderObject& currentChild);
     42    void createRenderers(RenderBlock& firstLetterBlock, RenderText& currentTextChild);
     43
     44    RenderTreeBuilder& m_builder;
    3745};
    3846
  • trunk/Source/WebCore/rendering/updating/RenderTreeUpdater.cpp

    r226013 r226168  
    4242#include "RenderInline.h"
    4343#include "RenderListItem.h"
    44 #include "RenderTreeUpdaterFirstLetter.h"
     44#include "RenderTreeBuilderFirstLetter.h"
    4545#include "RenderTreeUpdaterGeneratedContent.h"
    4646#include "RenderTreeUpdaterListItem.h"
     
    272272        return;
    273273
     274    m_builder.updateAfterDescendants(*renderer);
     275
    274276    // These functions do render tree mutations that require descendant renderers.
    275     if (is<RenderBlock>(*renderer))
    276         FirstLetter::update(downcast<RenderBlock>(*renderer));
    277277    if (is<RenderListItem>(*renderer))
    278278        ListItem::updateMarker(m_builder, downcast<RenderListItem>(*renderer));
  • trunk/Source/WebCore/rendering/updating/RenderTreeUpdater.h

    r226013 r226168  
    5252    static void tearDownRenderer(Text&);
    5353
    54     class FirstLetter;
    5554    class ListItem;
    5655
Note: See TracChangeset for help on using the changeset viewer.