Changeset 220523 in webkit


Ignore:
Timestamp:
Aug 10, 2017 3:20:53 AM (7 years ago)
Author:
Antti Koivisto
Message:

Text renderer updates should be done by RenderTreeUpdater
https://bugs.webkit.org/show_bug.cgi?id=175417

Reviewed by Andreas Kling.

All render tree mutations should be done by RenderTreeUpdater. Currently
Text::updateRendererAfterContentChange calls RenderText::setTextWithOffset directly.

  • dom/Document.cpp:

(WebCore::Document::updateTextRenderer):

Add range argument.

  • dom/Document.h:
  • dom/Text.cpp:

(WebCore::Text::updateRendererAfterContentChange):

Remove call to setTextWithOffset and pass the range to updateTextRenderer

  • style/RenderTreeUpdater.cpp:

(WebCore::RenderTreeUpdater::updateRenderTree):
(WebCore::RenderTreeUpdater::updateTextRenderer):

Call setTextWithOffset here.

  • style/RenderTreeUpdater.h:
  • style/StyleTreeResolver.cpp:

(WebCore::Style::TreeResolver::resolveComposedTree):

  • style/StyleUpdate.cpp:

(WebCore::Style::Update::textUpdate const):
(WebCore::Style::Update::addText):

Add TextUpdate struct similar to ElementUpdate to pass the range to the RenderTreeUpdater.

  • style/StyleUpdate.h:
Location:
trunk/Source/WebCore
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r220522 r220523  
     12017-08-10  Antti Koivisto  <antti@apple.com>
     2
     3        Text renderer updates should be done by RenderTreeUpdater
     4        https://bugs.webkit.org/show_bug.cgi?id=175417
     5
     6        Reviewed by Andreas Kling.
     7
     8        All render tree mutations should be done by RenderTreeUpdater. Currently
     9        Text::updateRendererAfterContentChange calls RenderText::setTextWithOffset directly.
     10
     11        * dom/Document.cpp:
     12        (WebCore::Document::updateTextRenderer):
     13
     14            Add range argument.
     15
     16        * dom/Document.h:
     17        * dom/Text.cpp:
     18        (WebCore::Text::updateRendererAfterContentChange):
     19
     20            Remove call to setTextWithOffset and pass the range to updateTextRenderer
     21
     22        * style/RenderTreeUpdater.cpp:
     23        (WebCore::RenderTreeUpdater::updateRenderTree):
     24        (WebCore::RenderTreeUpdater::updateTextRenderer):
     25
     26            Call setTextWithOffset here.
     27
     28        * style/RenderTreeUpdater.h:
     29        * style/StyleTreeResolver.cpp:
     30        (WebCore::Style::TreeResolver::resolveComposedTree):
     31        * style/StyleUpdate.cpp:
     32        (WebCore::Style::Update::textUpdate const):
     33        (WebCore::Style::Update::addText):
     34
     35            Add TextUpdate struct similar to ElementUpdate to pass the range to the RenderTreeUpdater.
     36
     37        * style/StyleUpdate.h:
     38
    1392017-08-10  Zan Dobersek  <zdobersek@igalia.com>
    240
  • trunk/Source/WebCore/dom/Document.cpp

    r220475 r220523  
    18691869}
    18701870
    1871 void Document::updateTextRenderer(Text& text)
     1871void Document::updateTextRenderer(Text& text, unsigned offsetOfReplacedText, unsigned lengthOfReplacedText)
    18721872{
    18731873    ASSERT(!m_inRenderTreeUpdate);
     
    18751875
    18761876    auto textUpdate = std::make_unique<Style::Update>(*this);
    1877     textUpdate->addText(text);
     1877    textUpdate->addText(text, { offsetOfReplacedText, lengthOfReplacedText });
    18781878
    18791879    RenderTreeUpdater renderTreeUpdater(*this);
  • trunk/Source/WebCore/dom/Document.h

    r220475 r220523  
    12391239    bool inRenderTreeUpdate() const { return m_inRenderTreeUpdate; }
    12401240
    1241     void updateTextRenderer(Text&);
     1241    void updateTextRenderer(Text&, unsigned offsetOfReplacedText, unsigned lengthOfReplacedText);
    12421242
    12431243    // Return a Locale for the default locale if the argument is null or empty.
  • trunk/Source/WebCore/dom/Text.cpp

    r220447 r220523  
    218218        return;
    219219
    220     document().updateTextRenderer(*this);
    221 
    222     if (auto* renderer = this->renderer())
    223         renderer->setTextWithOffset(data(), offsetOfReplacedData, lengthOfReplacedData);
     220    document().updateTextRenderer(*this, offsetOfReplacedData, lengthOfReplacedData);
    224221}
    225222
  • trunk/Source/WebCore/style/RenderTreeUpdater.cpp

    r220447 r220523  
    165165        if (is<Text>(node)) {
    166166            auto& text = downcast<Text>(node);
    167             if (parent().styleChange == Style::Detach || m_styleUpdate->textUpdate(text) || m_invalidatedWhitespaceOnlyTextSiblings.contains(&text))
    168                 updateTextRenderer(text);
     167            auto* textUpdate = m_styleUpdate->textUpdate(text);
     168            if (parent().styleChange == Style::Detach || textUpdate || m_invalidatedWhitespaceOnlyTextSiblings.contains(&text))
     169                updateTextRenderer(text, textUpdate);
    169170
    170171            it.traverseNextSkippingChildren();
     
    444445}
    445446
    446 void RenderTreeUpdater::updateTextRenderer(Text& text)
    447 {
    448     bool hasRenderer = text.renderer();
     447void RenderTreeUpdater::updateTextRenderer(Text& text, const Style::TextUpdate* textUpdate)
     448{
     449    auto* existingRenderer = text.renderer();
    449450    bool needsRenderer = textRendererIsNeeded(text, renderTreePosition());
    450     if (hasRenderer) {
    451         if (needsRenderer)
     451    if (existingRenderer) {
     452        if (needsRenderer) {
     453            if (textUpdate)
     454                existingRenderer->setTextWithOffset(text.data(), textUpdate->offset, textUpdate->length);
    452455            return;
     456        }
    453457        tearDownRenderer(text);
    454458        invalidateWhitespaceOnlyTextSiblingsAfterAttachIfNeeded(text);
  • trunk/Source/WebCore/style/RenderTreeUpdater.h

    r218793 r220523  
    5353private:
    5454    void updateRenderTree(ContainerNode& root);
    55     void updateTextRenderer(Text&);
     55    void updateTextRenderer(Text&, const Style::TextUpdate*);
    5656    void updateElementRenderer(Element&, const Style::ElementUpdate&);
    5757    void createRenderer(Element&, RenderStyle&&);
  • trunk/Source/WebCore/style/StyleTreeResolver.cpp

    r220202 r220523  
    407407            auto& text = downcast<Text>(node);
    408408            if (text.styleValidity() >= Validity::SubtreeAndRenderersInvalid && parent.change != Detach)
    409                 m_update->addText(text, parent.element);
     409                m_update->addText(text, parent.element, { });
    410410
    411411            text.setHasValidStyle();
  • trunk/Source/WebCore/style/StyleUpdate.cpp

    r202167 r220523  
    5858}
    5959
    60 bool Update::textUpdate(const Text& text) const
     60const TextUpdate* Update::textUpdate(const Text& text) const
    6161{
    62     return m_texts.contains(&text);
     62    auto it = m_texts.find(&text);
     63    if (it == m_texts.end())
     64        return nullptr;
     65    return &it->value;
    6366}
    6467
     
    9295}
    9396
    94 void Update::addText(Text& text, Element* parent)
     97void Update::addText(Text& text, Element* parent, TextUpdate&& textUpdate)
    9598{
    9699    ASSERT(!m_texts.contains(&text));
     
    98101
    99102    addPossibleRoot(parent);
    100     m_texts.add(&text);
     103    m_texts.add(&text, WTFMove(textUpdate));
    101104}
    102105
    103 void Update::addText(Text& text)
     106void Update::addText(Text& text, TextUpdate&& textUpdate)
    104107{
    105     addText(text, composedTreeAncestors(text).first());
     108    addText(text, composedTreeAncestors(text).first(), WTFMove(textUpdate));
    106109}
    107110
  • trunk/Source/WebCore/style/StyleUpdate.h

    r218793 r220523  
    5555};
    5656
     57struct TextUpdate {
     58    unsigned offset { 0 };
     59    unsigned length { std::numeric_limits<unsigned>::max() };
     60};
     61
    5762class Update {
    5863    WTF_MAKE_FAST_ALLOCATED;
     
    6570    ElementUpdate* elementUpdate(const Element&);
    6671
    67     bool textUpdate(const Text&) const;
     72    const TextUpdate* textUpdate(const Text&) const;
    6873
    6974    const RenderStyle* elementStyle(const Element&) const;
     
    7580
    7681    void addElement(Element&, Element* parent, ElementUpdate&&);
    77     void addText(Text&, Element* parent);
    78     void addText(Text&);
     82    void addText(Text&, Element* parent, TextUpdate&&);
     83    void addText(Text&, TextUpdate&&);
    7984
    8085private:
     
    8489    ListHashSet<ContainerNode*> m_roots;
    8590    HashMap<const Element*, ElementUpdate> m_elements;
    86     HashSet<const Text*> m_texts;
     91    HashMap<const Text*, TextUpdate> m_texts;
    8792};
    8893
Note: See TracChangeset for help on using the changeset viewer.