diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/rendering/RenderQuote.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/rendering/RenderQuote.cpp')
-rw-r--r-- | Source/WebCore/rendering/RenderQuote.cpp | 65 |
1 files changed, 42 insertions, 23 deletions
diff --git a/Source/WebCore/rendering/RenderQuote.cpp b/Source/WebCore/rendering/RenderQuote.cpp index a11d9ca7f..d7900df9d 100644 --- a/Source/WebCore/rendering/RenderQuote.cpp +++ b/Source/WebCore/rendering/RenderQuote.cpp @@ -31,29 +31,35 @@ using namespace WTF::Unicode; namespace WebCore { -RenderQuote::RenderQuote(Document& document, PassRef<RenderStyle> style, QuoteType quote) - : RenderInline(document, std::move(style)) +RenderQuote::RenderQuote(Document& document, RenderStyle&& style, QuoteType quote) + : RenderInline(document, WTFMove(style)) , m_type(quote) - , m_depth(-1) - , m_next(0) - , m_previous(0) - , m_isAttached(false) + , m_text(emptyString()) { } RenderQuote::~RenderQuote() { - ASSERT(!m_isAttached); - ASSERT(!m_next); - ASSERT(!m_previous); + // Do not add any code here. Add it to willBeDestroyed() instead. } void RenderQuote::willBeDestroyed() { detachQuote(); + + ASSERT(!m_isAttached); + ASSERT(!m_next); + ASSERT(!m_previous); + RenderInline::willBeDestroyed(); } +void RenderQuote::insertedIntoTree() +{ + RenderInline::insertedIntoTree(); + attachQuote(); +} + void RenderQuote::willBeRemovedFromTree() { RenderInline::willBeRemovedFromTree(); @@ -337,24 +343,31 @@ static inline StringImpl* apostropheString() return apostropheString; } +static RenderTextFragment* quoteTextRenderer(RenderObject* lastChild) +{ + if (!lastChild) + return nullptr; + + if (!is<RenderTextFragment>(lastChild)) + return nullptr; + + return downcast<RenderTextFragment>(lastChild); +} + void RenderQuote::updateText() { String text = computeText(); if (m_text == text) return; - - while (RenderObject* child = lastChild()) - child->destroy(); - - if (text == emptyString() || text == String()) { - m_text = String(); + m_text = text; + // Start from the end of the child list because, if we've had a first-letter + // renderer inserted then the remaining text will be at the end. + if (auto* renderText = quoteTextRenderer(lastChild())) { + renderText->setContentString(m_text); + renderText->dirtyLineBoxes(false); return; } - - m_text = text; - - RenderTextFragment* fragment = new RenderTextFragment(document(), m_text.impl()); - addChild(fragment); + addChild(new RenderTextFragment(document(), m_text)); } String RenderQuote::computeText() const @@ -383,6 +396,9 @@ String RenderQuote::computeText() const void RenderQuote::attachQuote() { + if (view().renderTreeIsBeingMutatedInternally()) + return; + ASSERT(!m_isAttached); ASSERT(!m_next); ASSERT(!m_previous); @@ -393,9 +409,9 @@ void RenderQuote::attachQuote() for (RenderObject* predecessor = previousInPreOrder(); predecessor; predecessor = predecessor->previousInPreOrder()) { // Skip unattached predecessors to avoid having stale m_previous pointers // if the previous node is never attached and is then destroyed. - if (!predecessor->isQuote() || !toRenderQuote(predecessor)->m_isAttached) + if (!is<RenderQuote>(*predecessor) || !downcast<RenderQuote>(*predecessor).m_isAttached) continue; - m_previous = toRenderQuote(predecessor); + m_previous = downcast<RenderQuote>(predecessor); m_next = m_previous->m_next; m_previous->m_next = this; if (m_next) @@ -424,6 +440,9 @@ void RenderQuote::attachQuote() void RenderQuote::detachQuote() { + if (view().renderTreeIsBeingMutatedInternally()) + return; + ASSERT(!m_next || m_next->m_isAttached); ASSERT(!m_previous || m_previous->m_isAttached); if (!m_isAttached) @@ -434,7 +453,7 @@ void RenderQuote::detachQuote() view().setRenderQuoteHead(m_next); if (m_next) m_next->m_previous = m_previous; - if (!documentBeingDestroyed()) { + if (!renderTreeBeingDestroyed()) { for (RenderQuote* quote = m_next; quote; quote = quote->m_next) quote->updateDepth(); } |