summaryrefslogtreecommitdiff
path: root/Source/WebCore/rendering/RenderQuote.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/rendering/RenderQuote.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebCore/rendering/RenderQuote.cpp')
-rw-r--r--Source/WebCore/rendering/RenderQuote.cpp65
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();
}