Changeset 220523 in webkit
- Timestamp:
- Aug 10, 2017 3:20:53 AM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r220522 r220523 1 2017-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 1 39 2017-08-10 Zan Dobersek <zdobersek@igalia.com> 2 40 -
trunk/Source/WebCore/dom/Document.cpp
r220475 r220523 1869 1869 } 1870 1870 1871 void Document::updateTextRenderer(Text& text )1871 void Document::updateTextRenderer(Text& text, unsigned offsetOfReplacedText, unsigned lengthOfReplacedText) 1872 1872 { 1873 1873 ASSERT(!m_inRenderTreeUpdate); … … 1875 1875 1876 1876 auto textUpdate = std::make_unique<Style::Update>(*this); 1877 textUpdate->addText(text );1877 textUpdate->addText(text, { offsetOfReplacedText, lengthOfReplacedText }); 1878 1878 1879 1879 RenderTreeUpdater renderTreeUpdater(*this); -
trunk/Source/WebCore/dom/Document.h
r220475 r220523 1239 1239 bool inRenderTreeUpdate() const { return m_inRenderTreeUpdate; } 1240 1240 1241 void updateTextRenderer(Text& );1241 void updateTextRenderer(Text&, unsigned offsetOfReplacedText, unsigned lengthOfReplacedText); 1242 1242 1243 1243 // Return a Locale for the default locale if the argument is null or empty. -
trunk/Source/WebCore/dom/Text.cpp
r220447 r220523 218 218 return; 219 219 220 document().updateTextRenderer(*this); 221 222 if (auto* renderer = this->renderer()) 223 renderer->setTextWithOffset(data(), offsetOfReplacedData, lengthOfReplacedData); 220 document().updateTextRenderer(*this, offsetOfReplacedData, lengthOfReplacedData); 224 221 } 225 222 -
trunk/Source/WebCore/style/RenderTreeUpdater.cpp
r220447 r220523 165 165 if (is<Text>(node)) { 166 166 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); 169 170 170 171 it.traverseNextSkippingChildren(); … … 444 445 } 445 446 446 void RenderTreeUpdater::updateTextRenderer(Text& text )447 { 448 bool hasRenderer = text.renderer();447 void RenderTreeUpdater::updateTextRenderer(Text& text, const Style::TextUpdate* textUpdate) 448 { 449 auto* existingRenderer = text.renderer(); 449 450 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); 452 455 return; 456 } 453 457 tearDownRenderer(text); 454 458 invalidateWhitespaceOnlyTextSiblingsAfterAttachIfNeeded(text); -
trunk/Source/WebCore/style/RenderTreeUpdater.h
r218793 r220523 53 53 private: 54 54 void updateRenderTree(ContainerNode& root); 55 void updateTextRenderer(Text& );55 void updateTextRenderer(Text&, const Style::TextUpdate*); 56 56 void updateElementRenderer(Element&, const Style::ElementUpdate&); 57 57 void createRenderer(Element&, RenderStyle&&); -
trunk/Source/WebCore/style/StyleTreeResolver.cpp
r220202 r220523 407 407 auto& text = downcast<Text>(node); 408 408 if (text.styleValidity() >= Validity::SubtreeAndRenderersInvalid && parent.change != Detach) 409 m_update->addText(text, parent.element );409 m_update->addText(text, parent.element, { }); 410 410 411 411 text.setHasValidStyle(); -
trunk/Source/WebCore/style/StyleUpdate.cpp
r202167 r220523 58 58 } 59 59 60 boolUpdate::textUpdate(const Text& text) const60 const TextUpdate* Update::textUpdate(const Text& text) const 61 61 { 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; 63 66 } 64 67 … … 92 95 } 93 96 94 void Update::addText(Text& text, Element* parent )97 void Update::addText(Text& text, Element* parent, TextUpdate&& textUpdate) 95 98 { 96 99 ASSERT(!m_texts.contains(&text)); … … 98 101 99 102 addPossibleRoot(parent); 100 m_texts.add(&text );103 m_texts.add(&text, WTFMove(textUpdate)); 101 104 } 102 105 103 void Update::addText(Text& text )106 void Update::addText(Text& text, TextUpdate&& textUpdate) 104 107 { 105 addText(text, composedTreeAncestors(text).first() );108 addText(text, composedTreeAncestors(text).first(), WTFMove(textUpdate)); 106 109 } 107 110 -
trunk/Source/WebCore/style/StyleUpdate.h
r218793 r220523 55 55 }; 56 56 57 struct TextUpdate { 58 unsigned offset { 0 }; 59 unsigned length { std::numeric_limits<unsigned>::max() }; 60 }; 61 57 62 class Update { 58 63 WTF_MAKE_FAST_ALLOCATED; … … 65 70 ElementUpdate* elementUpdate(const Element&); 66 71 67 booltextUpdate(const Text&) const;72 const TextUpdate* textUpdate(const Text&) const; 68 73 69 74 const RenderStyle* elementStyle(const Element&) const; … … 75 80 76 81 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&&); 79 84 80 85 private: … … 84 89 ListHashSet<ContainerNode*> m_roots; 85 90 HashMap<const Element*, ElementUpdate> m_elements; 86 Hash Set<const Text*> m_texts;91 HashMap<const Text*, TextUpdate> m_texts; 87 92 }; 88 93
Note: See TracChangeset
for help on using the changeset viewer.