Changeset 220956 in webkit


Ignore:
Timestamp:
Aug 20, 2017 2:42:09 AM (7 years ago)
Author:
Antti Koivisto
Message:

Factor :before/:after render tree mutations into a RenderTreeUpdater helper class
https://bugs.webkit.org/show_bug.cgi?id=175752

Reviewed by Andreas Kling.

Move code that constructs generated content renderers out from PseudoElement.
Also refactor the related code from RenderTreeUpdater main class into
RenderTreeUpdater::GeneratedContent helper class.

  • WebCore.xcodeproj/project.pbxproj:
  • dom/PseudoElement.cpp:

(WebCore::PseudoElement::resolveCustomStyle): Deleted.

Not needed anymore.

(WebCore::PseudoElement::didAttachRenderers): Deleted.

Moves to createContentRenderers in GeneratedContent.

(WebCore::PseudoElement::didRecalcStyle): Deleted.

Moves to updateStyleForContentRenderers in GeneratedContent.

  • dom/PseudoElement.h:
  • style/RenderTreeUpdater.cpp:

(WebCore::RenderTreeUpdater::RenderTreeUpdater):
(WebCore::RenderTreeUpdater::~RenderTreeUpdater):
(WebCore::RenderTreeUpdater::commit):
(WebCore::RenderTreeUpdater::updateBeforeDescendants):
(WebCore::RenderTreeUpdater::updateAfterDescendants):
(WebCore::needsPseudoElement): Deleted.
(WebCore::RenderTreeUpdater::updateBeforeOrAfterPseudoElement): Deleted.
(WebCore::RenderTreeUpdater::updateQuotesUpTo): Deleted.

Quotes and other :before/:after support moves to GeneratedContent helpwe.

  • style/RenderTreeUpdater.h:

(WebCore::RenderTreeUpdater::generatedContent):

  • style/RenderTreeUpdaterGeneratedContent.cpp: Added.

(WebCore::RenderTreeUpdater::GeneratedContent::GeneratedContent):
(WebCore::RenderTreeUpdater::GeneratedContent::updateBeforePseudoElement):
(WebCore::RenderTreeUpdater::GeneratedContent::updateAfterPseudoElement):
(WebCore::RenderTreeUpdater::GeneratedContent::updateRemainingQuotes):
(WebCore::RenderTreeUpdater::GeneratedContent::updateQuotesUpTo):
(WebCore::createContentRenderers):
(WebCore::updateStyleForContentRenderers):
(WebCore::RenderTreeUpdater::GeneratedContent::updatePseudoElement):
(WebCore::RenderTreeUpdater::GeneratedContent::needsPseudoElement):

  • style/RenderTreeUpdaterGeneratedContent.h: Added.
Location:
trunk/Source/WebCore
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/CMakeLists.txt

    r220949 r220956  
    27902790    style/RenderTreeUpdater.cpp
    27912791    style/RenderTreeUpdaterFirstLetter.cpp
     2792    style/RenderTreeUpdaterGeneratedContent.cpp
    27922793    style/RenderTreeUpdaterListItem.cpp
    27932794    style/StyleChange.cpp
  • trunk/Source/WebCore/ChangeLog

    r220955 r220956  
     12017-08-20  Antti Koivisto  <antti@apple.com>
     2
     3        Factor :before/:after render tree mutations into a RenderTreeUpdater helper class
     4        https://bugs.webkit.org/show_bug.cgi?id=175752
     5
     6        Reviewed by Andreas Kling.
     7
     8        Move code that constructs generated content renderers out from PseudoElement.
     9        Also refactor the related code from RenderTreeUpdater main class into
     10        RenderTreeUpdater::GeneratedContent helper class.
     11
     12        * WebCore.xcodeproj/project.pbxproj:
     13        * dom/PseudoElement.cpp:
     14        (WebCore::PseudoElement::resolveCustomStyle): Deleted.
     15
     16            Not needed anymore.
     17
     18        (WebCore::PseudoElement::didAttachRenderers): Deleted.
     19
     20            Moves to createContentRenderers in GeneratedContent.
     21
     22        (WebCore::PseudoElement::didRecalcStyle): Deleted.
     23
     24            Moves to updateStyleForContentRenderers in GeneratedContent.
     25
     26        * dom/PseudoElement.h:
     27        * style/RenderTreeUpdater.cpp:
     28        (WebCore::RenderTreeUpdater::RenderTreeUpdater):
     29        (WebCore::RenderTreeUpdater::~RenderTreeUpdater):
     30        (WebCore::RenderTreeUpdater::commit):
     31        (WebCore::RenderTreeUpdater::updateBeforeDescendants):
     32        (WebCore::RenderTreeUpdater::updateAfterDescendants):
     33        (WebCore::needsPseudoElement): Deleted.
     34        (WebCore::RenderTreeUpdater::updateBeforeOrAfterPseudoElement): Deleted.
     35        (WebCore::RenderTreeUpdater::updateQuotesUpTo): Deleted.
     36
     37            Quotes and other :before/:after support moves to GeneratedContent helpwe.
     38
     39        * style/RenderTreeUpdater.h:
     40        (WebCore::RenderTreeUpdater::generatedContent):
     41        * style/RenderTreeUpdaterGeneratedContent.cpp: Added.
     42        (WebCore::RenderTreeUpdater::GeneratedContent::GeneratedContent):
     43        (WebCore::RenderTreeUpdater::GeneratedContent::updateBeforePseudoElement):
     44        (WebCore::RenderTreeUpdater::GeneratedContent::updateAfterPseudoElement):
     45        (WebCore::RenderTreeUpdater::GeneratedContent::updateRemainingQuotes):
     46        (WebCore::RenderTreeUpdater::GeneratedContent::updateQuotesUpTo):
     47        (WebCore::createContentRenderers):
     48        (WebCore::updateStyleForContentRenderers):
     49        (WebCore::RenderTreeUpdater::GeneratedContent::updatePseudoElement):
     50        (WebCore::RenderTreeUpdater::GeneratedContent::needsPseudoElement):
     51        * style/RenderTreeUpdaterGeneratedContent.h: Added.
     52
    1532017-08-19  Andy Estes  <aestes@apple.com>
    254
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r220955 r220956  
    68256825                E48E332D1F47038000BAB0EF /* RenderTreeUpdaterListItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E48E332A1F46C98000BAB0EF /* RenderTreeUpdaterListItem.cpp */; };
    68266826                E48E332E1F47038000BAB0EF /* RenderTreeUpdaterListItem.h in Headers */ = {isa = PBXBuildFile; fileRef = E48E33281F46C97F00BAB0EF /* RenderTreeUpdaterListItem.h */; };
     6827                E48E33311F47437000BAB0EF /* RenderTreeUpdaterGeneratedContent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E48E332F1F47436500BAB0EF /* RenderTreeUpdaterGeneratedContent.cpp */; };
     6828                E48E33321F47437300BAB0EF /* RenderTreeUpdaterGeneratedContent.h in Headers */ = {isa = PBXBuildFile; fileRef = E48E33301F47436700BAB0EF /* RenderTreeUpdaterGeneratedContent.h */; };
    68276829                E4916FF7195DF6A0005AB349 /* LayerFlushThrottleState.h in Headers */ = {isa = PBXBuildFile; fileRef = E4916FF6195DF6A0005AB349 /* LayerFlushThrottleState.h */; settings = {ATTRIBUTES = (Private, ); }; };
    68286830                E4946EAE156E64DD00D3297F /* StyleRuleImport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4946EAC156E64DD00D3297F /* StyleRuleImport.cpp */; };
     
    1548415486                E48E33281F46C97F00BAB0EF /* RenderTreeUpdaterListItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreeUpdaterListItem.h; sourceTree = "<group>"; };
    1548515487                E48E332A1F46C98000BAB0EF /* RenderTreeUpdaterListItem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTreeUpdaterListItem.cpp; sourceTree = "<group>"; };
     15488                E48E332F1F47436500BAB0EF /* RenderTreeUpdaterGeneratedContent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTreeUpdaterGeneratedContent.cpp; sourceTree = "<group>"; };
     15489                E48E33301F47436700BAB0EF /* RenderTreeUpdaterGeneratedContent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreeUpdaterGeneratedContent.h; sourceTree = "<group>"; };
    1548615490                E4916FF6195DF6A0005AB349 /* LayerFlushThrottleState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LayerFlushThrottleState.h; sourceTree = "<group>"; };
    1548715491                E4946EAC156E64DD00D3297F /* StyleRuleImport.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StyleRuleImport.cpp; sourceTree = "<group>"; };
     
    2506425068                                E48284061F44594B00863AC3 /* RenderTreeUpdaterFirstLetter.cpp */,
    2506525069                                E48284091F44595600863AC3 /* RenderTreeUpdaterFirstLetter.h */,
     25070                                E48E332F1F47436500BAB0EF /* RenderTreeUpdaterGeneratedContent.cpp */,
     25071                                E48E33301F47436700BAB0EF /* RenderTreeUpdaterGeneratedContent.h */,
    2506625072                                E48E332A1F46C98000BAB0EF /* RenderTreeUpdaterListItem.cpp */,
    2506725073                                E48E33281F46C97F00BAB0EF /* RenderTreeUpdaterListItem.h */,
     
    2962129627                                FD45A95B175D41EE00C21EC8 /* ShapeInterval.h in Headers */,
    2962229628                                FD45A952175D3F3E00C21EC8 /* ShapeOutsideInfo.h in Headers */,
     29629                                E48E33321F47437300BAB0EF /* RenderTreeUpdaterGeneratedContent.h in Headers */,
    2962329630                                FD1AF1501656F15100C6D4F7 /* ShapeValue.h in Headers */,
    2962429631                                1A4A954E0B4EDCCB002D8C3C /* SharedBuffer.h in Headers */,
     
    3126931276                                62CD32591157E57C0063B0A7 /* CustomEvent.cpp in Sources */,
    3127031277                                97BC6A201505F081001B74AC /* Database.cpp in Sources */,
     31278                                E48E33311F47437000BAB0EF /* RenderTreeUpdaterGeneratedContent.cpp in Sources */,
    3127131279                                97BC6A231505F081001B74AC /* DatabaseAuthorizer.cpp in Sources */,
    3127231280                                97BC6A271505F081001B74AC /* DatabaseContext.cpp in Sources */,
  • trunk/Source/WebCore/dom/PseudoElement.cpp

    r219237 r220956  
    7979}
    8080
    81 std::optional<ElementStyle> PseudoElement::resolveCustomStyle(const RenderStyle& parentStyle, const RenderStyle*)
    82 {
    83     auto* style = m_hostElement->renderer()->getCachedPseudoStyle(m_pseudoId, &parentStyle);
    84     if (!style)
    85         return std::nullopt;
    86     return ElementStyle(RenderStyle::clonePtr(*style));
    87 }
    88 
    89 void PseudoElement::didAttachRenderers()
    90 {
    91     RenderElement* renderer = this->renderer();
    92     if (!renderer || renderer->style().hasFlowFrom())
    93         return;
    94 
    95     const RenderStyle& style = renderer->style();
    96     ASSERT(style.contentData());
    97 
    98     for (const ContentData* content = style.contentData(); content; content = content->next()) {
    99         auto child = content->createContentRenderer(document(), style);
    100         if (renderer->isChildAllowed(*child, style))
    101             renderer->addChild(child.leakPtr());
    102     }
    103 }
    104 
    10581bool PseudoElement::rendererIsNeeded(const RenderStyle& style)
    10682{
     
    10884}
    10985
    110 void PseudoElement::didRecalcStyle(Style::Change)
    111 {
    112     if (!renderer())
    113         return;
    114 
    115     // The renderers inside pseudo elements are anonymous so they don't get notified of recalcStyle and must have
    116     // the style propagated downward manually similar to RenderObject::propagateStyleToAnonymousChildren.
    117     RenderElement& renderer = *this->renderer();
    118     for (RenderObject* child = renderer.nextInPreOrder(&renderer); child; child = child->nextInPreOrder(&renderer)) {
    119         // We only manage the style for the generated content which must be images or text.
    120         if (!is<RenderImage>(*child) && !is<RenderQuote>(*child))
    121             continue;
    122         auto createdStyle = RenderStyle::createStyleInheritingFromPseudoStyle(renderer.style());
    123         downcast<RenderElement>(*child).setStyle(WTFMove(createdStyle));
    124     }
    125 }
    126 
    12786} // namespace
  • trunk/Source/WebCore/dom/PseudoElement.h

    r218593 r220956  
    4343    void clearHostElement();
    4444
    45     std::optional<ElementStyle> resolveCustomStyle(const RenderStyle& parentStyle, const RenderStyle* shadowHostStyle) override;
    46     void didAttachRenderers() override;
    47     void didRecalcStyle(Style::Change) override;
    4845    bool rendererIsNeeded(const RenderStyle&) override;
    4946
  • trunk/Source/WebCore/style/RenderTreeUpdater.cpp

    r220916 r220956  
    4242#include "RenderListItem.h"
    4343#include "RenderNamedFlowThread.h"
    44 #include "RenderQuote.h"
    4544#include "RenderTreeUpdaterFirstLetter.h"
     45#include "RenderTreeUpdaterGeneratedContent.h"
    4646#include "RenderTreeUpdaterListItem.h"
    4747#include "StyleResolver.h"
     
    8383}
    8484
    85 
    8685RenderTreeUpdater::RenderTreeUpdater(Document& document)
    8786    : m_document(document)
     87    , m_generatedContent(std::make_unique<GeneratedContent>(*this))
     88{
     89}
     90
     91RenderTreeUpdater::~RenderTreeUpdater()
    8892{
    8993}
     
    130134        updateRenderTree(*root);
    131135
    132     if (m_document.renderView()->hasQuotesNeedingUpdate()) {
    133         updateQuotesUpTo(nullptr);
    134         m_previousUpdatedQuote = nullptr;
    135         m_document.renderView()->setHasQuotesNeedingUpdate(false);
    136     }
     136    generatedContent().updateRemainingQuotes();
    137137
    138138    m_styleUpdate = nullptr;
     
    248248void RenderTreeUpdater::updateBeforeDescendants(Element& element)
    249249{
    250     updateBeforeOrAfterPseudoElement(element, BEFORE);
     250    generatedContent().updateBeforePseudoElement(element);
    251251}
    252252
    253253void RenderTreeUpdater::updateAfterDescendants(Element& element, Style::Change styleChange)
    254254{
    255     updateBeforeOrAfterPseudoElement(element, AFTER);
     255    generatedContent().updateAfterPseudoElement(element);
    256256
    257257    auto* renderer = element.renderer();
     
    348348    if (!element.shouldMoveToFlowThread(style))
    349349        return;
    350     FlowThreadController& flowThreadController = element.document().renderView()->flowThreadController();
     350    FlowThreadController& flowThreadController = renderView().flowThreadController();
    351351    flowThreadController.registerNamedFlowContentElement(element, flowThreadController.ensureRenderFlowThreadWithName(style.flowThread()));
    352352}
     
    519519}
    520520
    521 static bool needsPseudoElement(Element& current, PseudoId pseudoId)
    522 {
    523     if (!current.renderer() || !current.renderer()->canHaveGeneratedChildren())
    524         return false;
    525     if (current.isPseudoElement())
    526         return false;
    527     if (!pseudoElementRendererIsNeeded(current.renderer()->getCachedPseudoStyle(pseudoId)))
    528         return false;
    529     return true;
    530 }
    531 
    532 void RenderTreeUpdater::updateBeforeOrAfterPseudoElement(Element& current, PseudoId pseudoId)
    533 {
    534     PseudoElement* pseudoElement = pseudoId == BEFORE ? current.beforePseudoElement() : current.afterPseudoElement();
    535 
    536     if (auto* renderer = pseudoElement ? pseudoElement->renderer() : nullptr)
    537         renderTreePosition().invalidateNextSibling(*renderer);
    538 
    539     bool needsPseudoElement = WebCore::needsPseudoElement(current, pseudoId);
    540     if (!needsPseudoElement) {
    541         if (pseudoElement) {
    542             if (pseudoId == BEFORE)
    543                 current.clearBeforePseudoElement();
    544             else
    545                 current.clearAfterPseudoElement();
    546         }
    547         return;
    548     }
    549 
    550     RefPtr<PseudoElement> newPseudoElement;
    551     if (!pseudoElement) {
    552         newPseudoElement = PseudoElement::create(current, pseudoId);
    553         pseudoElement = newPseudoElement.get();
    554     }
    555 
    556     auto newStyle = RenderStyle::clonePtr(*current.renderer()->getCachedPseudoStyle(pseudoId, &current.renderer()->style()));
    557 
    558     auto elementUpdate = Style::TreeResolver::createAnimatedElementUpdate(WTFMove(newStyle), *pseudoElement, Style::NoChange);
    559 
    560     if (elementUpdate.change == Style::NoChange)
    561         return;
    562 
    563     if (newPseudoElement) {
    564         InspectorInstrumentation::pseudoElementCreated(m_document.page(), *newPseudoElement);
    565         if (pseudoId == BEFORE)
    566             current.setBeforePseudoElement(newPseudoElement.releaseNonNull());
    567         else
    568             current.setAfterPseudoElement(newPseudoElement.releaseNonNull());
    569     }
    570 
    571     updateElementRenderer(*pseudoElement, elementUpdate);
    572 
    573     auto* pseudoRenderer = pseudoElement->renderer();
    574     if (!pseudoRenderer)
    575         return;
    576 
    577     if (elementUpdate.change == Style::Detach)
    578         pseudoElement->didAttachRenderers();
    579     else
    580         pseudoElement->didRecalcStyle(elementUpdate.change);
    581 
    582     if (m_document.renderView()->hasQuotesNeedingUpdate()) {
    583         for (auto& child : descendantsOfType<RenderQuote>(*pseudoRenderer))
    584             updateQuotesUpTo(&child);
    585     }
    586     if (is<RenderListItem>(*pseudoRenderer))
    587         ListItem::updateMarker(downcast<RenderListItem>(*pseudoRenderer));
    588 }
    589 
    590521void RenderTreeUpdater::tearDownRenderers(Element& root, TeardownType teardownType)
    591522{
     
    643574}
    644575
    645 void RenderTreeUpdater::updateQuotesUpTo(RenderQuote* lastQuote)
    646 {
    647     auto quoteRenderers = descendantsOfType<RenderQuote>(*m_document.renderView());
    648     auto it = m_previousUpdatedQuote ? ++quoteRenderers.at(*m_previousUpdatedQuote) : quoteRenderers.begin();
    649     auto end = quoteRenderers.end();
    650     for (; it != end; ++it) {
    651         auto& quote = *it;
    652         // Quote character depends on quote depth so we chain the updates.
    653         quote.updateRenderer(m_previousUpdatedQuote);
    654         m_previousUpdatedQuote = &quote;
    655         if (&quote == lastQuote)
    656             return;
    657     }
    658     ASSERT(!lastQuote);
     576RenderView& RenderTreeUpdater::renderView()
     577{
     578    return *m_document.renderView();
    659579}
    660580
  • trunk/Source/WebCore/style/RenderTreeUpdater.h

    r220916 r220956  
    3838class Element;
    3939class Node;
    40 class RenderQuote;
    4140class RenderStyle;
    4241class Text;
     
    4544public:
    4645    RenderTreeUpdater(Document&);
     46    ~RenderTreeUpdater();
    4747
    4848    void commit(std::unique_ptr<const Style::Update>);
     
    5656
    5757private:
     58    class GeneratedContent;
     59
    5860    void updateRenderTree(ContainerNode& root);
    5961    void updateTextRenderer(Text&, const Style::TextUpdate*);
     
    6365    void updateBeforeDescendants(Element&);
    6466    void updateAfterDescendants(Element&, Style::Change);
    65     void updateBeforeOrAfterPseudoElement(Element&, PseudoId);
    6667
    6768    struct Parent {
     
    7677    RenderTreePosition& renderTreePosition();
    7778
     79    GeneratedContent& generatedContent() { return *m_generatedContent; }
     80
    7881    void pushParent(Element&, Style::Change);
    7982    void popParent();
    8083    void popParentsToDepth(unsigned depth);
    8184
    82     void updateQuotesUpTo(RenderQuote*);
     85    RenderView& renderView();
    8386
    8487    Document& m_document;
     
    8891
    8992    HashSet<Text*> m_invalidatedWhitespaceOnlyTextSiblings;
    90     RenderQuote* m_previousUpdatedQuote { nullptr };
     93
     94    std::unique_ptr<GeneratedContent> m_generatedContent;
    9195};
    9296
Note: See TracChangeset for help on using the changeset viewer.