[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdelibs/khtml/rendering
From: Maks Orlovich <maksim () kde ! org>
Date: 2010-08-16 16:52:05
Message-ID: 20100816165205.5249EAC854 () svn ! kde ! org
[Download RAW message or body]
SVN commit 1164387 by orlovich:
Merged revision:r1164385 | orlovich | 2010-08-16 12:47:57 -0400 (Mon, 16 Aug 2010) | 11 lines
Fix problems with ghost first-letter RenderTextFragments staying around
(and keeping dangling pointers w/them) when the inline containing their
text has changed by keeping a link from the main text's RenderTextFragment
to the letter's, to permit invalidating it (Stolen from WebCore).
This fixes the crashes, but on change first-letter isn't reapplied properly
as still keeps a useless anonymous inline wrapper and RenderBlock::updateFirstLetter
isn't smart enough to walk past it or reuse it.
BUG: 161989
M +2 -0 render_block.cpp
M +24 -3 render_text.cpp
M +12 -2 render_text.h
--- trunk/KDE/kdelibs/khtml/rendering/render_block.cpp #1164386:1164387
@@ -269,6 +269,8 @@
letter->setStyle(newStyle);
firstLetterObject->addChild(letter);
oldText->deref();
+
+ remainingText->setFirstLetter(letter);
}
firstLetterObject->close();
}
--- trunk/KDE/kdelibs/khtml/rendering/render_text.cpp #1164386:1164387
@@ -3,7 +3,7 @@
*
* Copyright (C) 1999-2003 Lars Knoll (knoll@kde.org)
* (C) 2000-2003 Dirk Mueller (mueller@kde.org)
- * (C) 2003 Apple Computer, Inc.
+ * (C) 2003, 2006 Apple Computer, Inc.
* (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com)
* (C) 2008 Germain Garand (germain@ebooksfrance.org)
*
@@ -1382,7 +1382,11 @@
void RenderText::setText(DOMStringImpl *text, bool force)
{
if( !force && str == text ) return;
+ setTextInternal(text);
+}
+void RenderText::setTextInternal(DOMStringImpl *text)
+{
DOMStringImpl *oldstr = str;
if(text && style())
str = text->collapseWhiteSpace(style()->preserveLF(), style()->preserveWS());
@@ -1740,11 +1744,11 @@
RenderTextFragment::RenderTextFragment(DOM::NodeImpl* _node, DOM::DOMStringImpl* _str,
int startOffset, int endOffset)
:RenderText(_node, _str->substring(startOffset, endOffset)),
-m_start(startOffset), m_end(endOffset), m_generatedContentStr(0)
+m_start(startOffset), m_end(endOffset), m_generatedContentStr(0), m_firstLetter(0)
{}
RenderTextFragment::RenderTextFragment(DOM::NodeImpl* _node, DOM::DOMStringImpl* _str)
-:RenderText(_node, _str), m_start(0)
+:RenderText(_node, _str), m_start(0), m_firstLetter(0)
{
m_generatedContentStr = _str;
if (_str) {
@@ -1761,6 +1765,14 @@
m_generatedContentStr->deref();
}
+void RenderTextFragment::detach()
+{
+ if (m_firstLetter)
+ m_firstLetter->detach();
+
+ RenderText::detach();
+}
+
bool RenderTextFragment::isTextFragment() const
{
return true;
@@ -1778,5 +1790,14 @@
return result;
}
+void RenderTextFragment::setTextInternal(DOM::DOMStringImpl *text)
+{
+ if (m_firstLetter) {
+ m_firstLetter->detach();
+ m_firstLetter = 0;
+ }
+ RenderText::setTextInternal(text);
+}
+
#undef BIDI_DEBUG
#undef DEBUG_LAYOUT
--- trunk/KDE/kdelibs/khtml/rendering/render_text.h #1164386:1164387
@@ -3,7 +3,7 @@
*
* Copyright (C) 1999-2003 Lars Knoll <knoll@kde.org>
* Copyright (C) 2000-2003 Dirk Mueller <mueller@kde.org>
- * Copyright (C) 2003 Apple Computer, Inc.
+ * Copyright (C) 2003, 2006 Apple Computer, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -281,8 +281,10 @@
// (takes into account space collapsing)
unsigned convertToDOMPosition(unsigned position) const;
unsigned convertToRenderedPosition(unsigned position) const;
+protected:
+ virtual void setTextInternal(DOM::DOMStringImpl *text);
-protected: // members
+ // members
InlineTextBox* m_firstTextBox;
InlineTextBox* m_lastTextBox;
@@ -333,10 +335,18 @@
DOM::DOMStringImpl* contentString() const { return m_generatedContentStr; }
virtual DOM::DOMStringImpl* originalString() const;
+ RenderObject* firstLetter() const { return m_firstLetter; }
+ void setFirstLetter(RenderObject* firstLetter) { m_firstLetter = firstLetter; }
+
+ // overrides
+ virtual void detach();
private:
+ virtual void setTextInternal(DOM::DOMStringImpl *text);
+
uint m_start;
uint m_end;
DOM::DOMStringImpl* m_generatedContentStr;
+ RenderObject* m_firstLetter;
};
} // end namespace
#endif
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic