Title: [220523] trunk/Source/WebCore
Revision
220523
Author
an...@apple.com
Date
2017-08-10 03:20:53 -0700 (Thu, 10 Aug 2017)

Log 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:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (220522 => 220523)


--- trunk/Source/WebCore/ChangeLog	2017-08-10 08:37:36 UTC (rev 220522)
+++ trunk/Source/WebCore/ChangeLog	2017-08-10 10:20:53 UTC (rev 220523)
@@ -1,3 +1,41 @@
+2017-08-10  Antti Koivisto  <an...@apple.com>
+
+        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:
+
 2017-08-10  Zan Dobersek  <zdober...@igalia.com>
 
         Unreviewed GTK+ build fix for ENABLE_GLES2=ON.

Modified: trunk/Source/WebCore/dom/Document.cpp (220522 => 220523)


--- trunk/Source/WebCore/dom/Document.cpp	2017-08-10 08:37:36 UTC (rev 220522)
+++ trunk/Source/WebCore/dom/Document.cpp	2017-08-10 10:20:53 UTC (rev 220523)
@@ -1868,13 +1868,13 @@
     // FIXME: Ideally we would ASSERT(!needsStyleRecalc()) here but we have some cases where it is not true.
 }
 
-void Document::updateTextRenderer(Text& text)
+void Document::updateTextRenderer(Text& text, unsigned offsetOfReplacedText, unsigned lengthOfReplacedText)
 {
     ASSERT(!m_inRenderTreeUpdate);
     SetForScope<bool> inRenderTreeUpdate(m_inRenderTreeUpdate, true);
 
     auto textUpdate = std::make_unique<Style::Update>(*this);
-    textUpdate->addText(text);
+    textUpdate->addText(text, { offsetOfReplacedText, lengthOfReplacedText });
 
     RenderTreeUpdater renderTreeUpdater(*this);
     renderTreeUpdater.commit(WTFMove(textUpdate));

Modified: trunk/Source/WebCore/dom/Document.h (220522 => 220523)


--- trunk/Source/WebCore/dom/Document.h	2017-08-10 08:37:36 UTC (rev 220522)
+++ trunk/Source/WebCore/dom/Document.h	2017-08-10 10:20:53 UTC (rev 220523)
@@ -1238,7 +1238,7 @@
     bool inStyleRecalc() const { return m_inStyleRecalc; }
     bool inRenderTreeUpdate() const { return m_inRenderTreeUpdate; }
 
-    void updateTextRenderer(Text&);
+    void updateTextRenderer(Text&, unsigned offsetOfReplacedText, unsigned lengthOfReplacedText);
 
     // Return a Locale for the default locale if the argument is null or empty.
     Locale& getCachedLocale(const AtomicString& locale = nullAtom());

Modified: trunk/Source/WebCore/dom/Text.cpp (220522 => 220523)


--- trunk/Source/WebCore/dom/Text.cpp	2017-08-10 08:37:36 UTC (rev 220522)
+++ trunk/Source/WebCore/dom/Text.cpp	2017-08-10 10:20:53 UTC (rev 220523)
@@ -217,10 +217,7 @@
     if (styleValidity() >= Style::Validity::SubtreeAndRenderersInvalid)
         return;
 
-    document().updateTextRenderer(*this);
-
-    if (auto* renderer = this->renderer())
-        renderer->setTextWithOffset(data(), offsetOfReplacedData, lengthOfReplacedData);
+    document().updateTextRenderer(*this, offsetOfReplacedData, lengthOfReplacedData);
 }
 
 #if ENABLE(TREE_DEBUGGING)

Modified: trunk/Source/WebCore/style/RenderTreeUpdater.cpp (220522 => 220523)


--- trunk/Source/WebCore/style/RenderTreeUpdater.cpp	2017-08-10 08:37:36 UTC (rev 220522)
+++ trunk/Source/WebCore/style/RenderTreeUpdater.cpp	2017-08-10 10:20:53 UTC (rev 220523)
@@ -164,8 +164,9 @@
 
         if (is<Text>(node)) {
             auto& text = downcast<Text>(node);
-            if (parent().styleChange == Style::Detach || m_styleUpdate->textUpdate(text) || m_invalidatedWhitespaceOnlyTextSiblings.contains(&text))
-                updateTextRenderer(text);
+            auto* textUpdate = m_styleUpdate->textUpdate(text);
+            if (parent().styleChange == Style::Detach || textUpdate || m_invalidatedWhitespaceOnlyTextSiblings.contains(&text))
+                updateTextRenderer(text, textUpdate);
 
             it.traverseNextSkippingChildren();
             continue;
@@ -443,13 +444,16 @@
     renderTreePosition.insert(*newRenderer.leakPtr());
 }
 
-void RenderTreeUpdater::updateTextRenderer(Text& text)
+void RenderTreeUpdater::updateTextRenderer(Text& text, const Style::TextUpdate* textUpdate)
 {
-    bool hasRenderer = text.renderer();
+    auto* existingRenderer = text.renderer();
     bool needsRenderer = textRendererIsNeeded(text, renderTreePosition());
-    if (hasRenderer) {
-        if (needsRenderer)
+    if (existingRenderer) {
+        if (needsRenderer) {
+            if (textUpdate)
+                existingRenderer->setTextWithOffset(text.data(), textUpdate->offset, textUpdate->length);
             return;
+        }
         tearDownRenderer(text);
         invalidateWhitespaceOnlyTextSiblingsAfterAttachIfNeeded(text);
         return;

Modified: trunk/Source/WebCore/style/RenderTreeUpdater.h (220522 => 220523)


--- trunk/Source/WebCore/style/RenderTreeUpdater.h	2017-08-10 08:37:36 UTC (rev 220522)
+++ trunk/Source/WebCore/style/RenderTreeUpdater.h	2017-08-10 10:20:53 UTC (rev 220523)
@@ -52,7 +52,7 @@
 
 private:
     void updateRenderTree(ContainerNode& root);
-    void updateTextRenderer(Text&);
+    void updateTextRenderer(Text&, const Style::TextUpdate*);
     void updateElementRenderer(Element&, const Style::ElementUpdate&);
     void createRenderer(Element&, RenderStyle&&);
     void invalidateWhitespaceOnlyTextSiblingsAfterAttachIfNeeded(Node&);

Modified: trunk/Source/WebCore/style/StyleTreeResolver.cpp (220522 => 220523)


--- trunk/Source/WebCore/style/StyleTreeResolver.cpp	2017-08-10 08:37:36 UTC (rev 220522)
+++ trunk/Source/WebCore/style/StyleTreeResolver.cpp	2017-08-10 10:20:53 UTC (rev 220523)
@@ -406,7 +406,7 @@
         if (is<Text>(node)) {
             auto& text = downcast<Text>(node);
             if (text.styleValidity() >= Validity::SubtreeAndRenderersInvalid && parent.change != Detach)
-                m_update->addText(text, parent.element);
+                m_update->addText(text, parent.element, { });
 
             text.setHasValidStyle();
             it.traverseNextSkippingChildren();

Modified: trunk/Source/WebCore/style/StyleUpdate.cpp (220522 => 220523)


--- trunk/Source/WebCore/style/StyleUpdate.cpp	2017-08-10 08:37:36 UTC (rev 220522)
+++ trunk/Source/WebCore/style/StyleUpdate.cpp	2017-08-10 10:20:53 UTC (rev 220523)
@@ -57,9 +57,12 @@
     return &it->value;
 }
 
-bool Update::textUpdate(const Text& text) const
+const TextUpdate* Update::textUpdate(const Text& text) const
 {
-    return m_texts.contains(&text);
+    auto it = m_texts.find(&text);
+    if (it == m_texts.end())
+        return nullptr;
+    return &it->value;
 }
 
 const RenderStyle* Update::elementStyle(const Element& element) const
@@ -91,18 +94,18 @@
     m_elements.add(&element, WTFMove(elementUpdate));
 }
 
-void Update::addText(Text& text, Element* parent)
+void Update::addText(Text& text, Element* parent, TextUpdate&& textUpdate)
 {
     ASSERT(!m_texts.contains(&text));
     ASSERT(composedTreeAncestors(text).first() == parent);
 
     addPossibleRoot(parent);
-    m_texts.add(&text);
+    m_texts.add(&text, WTFMove(textUpdate));
 }
 
-void Update::addText(Text& text)
+void Update::addText(Text& text, TextUpdate&& textUpdate)
 {
-    addText(text, composedTreeAncestors(text).first());
+    addText(text, composedTreeAncestors(text).first(), WTFMove(textUpdate));
 }
 
 void Update::addPossibleRoot(Element* element)

Modified: trunk/Source/WebCore/style/StyleUpdate.h (220522 => 220523)


--- trunk/Source/WebCore/style/StyleUpdate.h	2017-08-10 08:37:36 UTC (rev 220522)
+++ trunk/Source/WebCore/style/StyleUpdate.h	2017-08-10 10:20:53 UTC (rev 220523)
@@ -54,6 +54,11 @@
     bool recompositeLayer { false };
 };
 
+struct TextUpdate {
+    unsigned offset { 0 };
+    unsigned length { std::numeric_limits<unsigned>::max() };
+};
+
 class Update {
     WTF_MAKE_FAST_ALLOCATED;
 public:
@@ -64,7 +69,7 @@
     const ElementUpdate* elementUpdate(const Element&) const;
     ElementUpdate* elementUpdate(const Element&);
 
-    bool textUpdate(const Text&) const;
+    const TextUpdate* textUpdate(const Text&) const;
 
     const RenderStyle* elementStyle(const Element&) const;
     RenderStyle* elementStyle(const Element&);
@@ -74,8 +79,8 @@
     unsigned size() const { return m_elements.size() + m_texts.size(); }
 
     void addElement(Element&, Element* parent, ElementUpdate&&);
-    void addText(Text&, Element* parent);
-    void addText(Text&);
+    void addText(Text&, Element* parent, TextUpdate&&);
+    void addText(Text&, TextUpdate&&);
 
 private:
     void addPossibleRoot(Element*);
@@ -83,7 +88,7 @@
     Document& m_document;
     ListHashSet<ContainerNode*> m_roots;
     HashMap<const Element*, ElementUpdate> m_elements;
-    HashSet<const Text*> m_texts;
+    HashMap<const Text*, TextUpdate> m_texts;
 };
 
 }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to