[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