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;
};
}