Fixed: <rdar://problem/4023566> Stickies: Crash in ReplacementFragment::insertFragme...
authorcblu <cblu@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 28 Feb 2005 17:11:26 +0000 (17:11 +0000)
committercblu <cblu@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 28 Feb 2005 17:11:26 +0000 (17:11 +0000)
        Reviewed by kocienda.

        * khtml/editing/htmlediting.cpp:
        (khtml::ApplyStyleCommand::addInlineStyleIfNeeded): ref and deref the element while it is "floating"
        (khtml::ReplacementFragment::insertFragmentForTestRendering): ditto
        (khtml::floatRefdElement): new, keeps an element alive while its ref count is 0
        (khtml::createDefaultParagraphElement): removed commented out code
        (khtml::createBlockPlaceholderElement): ref the element and return it as "floating"
        (khtml::createFontElement): ditto
        (khtml::createStyleSpanElement): ditto
        * khtml/editing/htmlediting.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@8715 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog-2005-08-23
WebCore/khtml/editing/htmlediting.cpp
WebCore/khtml/editing/htmlediting.h

index 4ca1a0b1f31ccf74ac69d2e4cc3922ccaa35192d..bf5c02da960c0a4f31bb27d8c987037fd2d273cf 100644 (file)
@@ -1,3 +1,19 @@
+2005-02-28  Chris Blumenberg  <cblu@apple.com>
+
+       Fixed: <rdar://problem/4023566> Stickies: Crash in ReplacementFragment::insertFragmentForTestRendering on paste
+
+        Reviewed by kocienda.
+
+        * khtml/editing/htmlediting.cpp:
+        (khtml::ApplyStyleCommand::addInlineStyleIfNeeded): ref and deref the element while it is "floating"
+        (khtml::ReplacementFragment::insertFragmentForTestRendering): ditto
+        (khtml::floatRefdElement): new, keeps an element alive while its ref count is 0
+        (khtml::createDefaultParagraphElement): removed commented out code
+        (khtml::createBlockPlaceholderElement): ref the element and return it as "floating"
+        (khtml::createFontElement): ditto
+        (khtml::createStyleSpanElement): ditto
+        * khtml/editing/htmlediting.h:
+
 2005-02-27  Maciej Stachowiak  <mjs@apple.com>
 
         Reviewed by Vicki.
index 22f6a8563082ad8e4823e30fbec6ebda1b1951f8..aaeeb8e7b1a5ab487df871ea31f0ab7615ee1581 100644 (file)
@@ -2179,8 +2179,10 @@ void ApplyStyleCommand::addInlineStyleIfNeeded(CSSMutableStyleDeclarationImpl *s
 
     if (styleChange.cssStyle().length() > 0) {
         ElementImpl *styleElement = createStyleSpanElement(document());
+        styleElement->ref();
         styleElement->setAttribute(ATTR_STYLE, styleChange.cssStyle());
         insertNodeBefore(styleElement, startNode);
+        styleElement->deref();
         surroundNodeRangeWithElement(startNode, endNode, styleElement);
     }
 
@@ -4250,6 +4252,7 @@ NodeImpl *ReplacementFragment::insertFragmentForTestRendering()
         return 0;
 
     ElementImpl *holder = createDefaultParagraphElement(m_document);
+    holder->ref();
     
     int exceptionCode = 0;
     holder->appendChild(m_fragment, exceptionCode);
@@ -4257,6 +4260,7 @@ NodeImpl *ReplacementFragment::insertFragmentForTestRendering()
     
     body->appendChild(holder, exceptionCode);
     ASSERT(exceptionCode == 0);
+    holder->deref();
     
     m_document->updateLayout();
     
@@ -5548,15 +5552,22 @@ bool TypingCommand::isTypingCommand() const
     return true;
 }
 
+ElementImpl *floatRefdElement(ElementImpl *element)
+{
+    assert(!element->parentNode());
+    element->setParent(element->getDocument());
+    element->deref();
+    element->setParent(0);
+    return element;
+}    
+
 ElementImpl *createDefaultParagraphElement(DocumentImpl *document)
 {
-    // We would need this margin-zeroing and attribute-setter code back if we ever 
-    // return to using <p> elements for default paragraphs.
-    //static const DOMString defaultParagraphStyle("margin-top: 0; margin-bottom: 0");
+    // We would need this margin-zeroing code back if we ever return to using <p> elements for default paragraphs.
+    // static const DOMString defaultParagraphStyle("margin-top: 0; margin-bottom: 0");    
     int exceptionCode = 0;
     ElementImpl *element = document->createHTMLElement("div", exceptionCode);
     ASSERT(exceptionCode == 0);
-    //element->setAttribute(ATTR_STYLE, defaultParagraphStyle);
     return element;
 }
 
@@ -5565,8 +5576,9 @@ ElementImpl *createBlockPlaceholderElement(DocumentImpl *document)
     int exceptionCode = 0;
     ElementImpl *breakNode = document->createHTMLElement("br", exceptionCode);
     ASSERT(exceptionCode == 0);
+    breakNode->ref();
     breakNode->setAttribute(ATTR_CLASS, blockPlaceholderClassString());
-    return breakNode;
+    return floatRefdElement(breakNode);
 }
 
 ElementImpl *createBreakElement(DocumentImpl *document)
@@ -5582,8 +5594,9 @@ ElementImpl *createFontElement(DocumentImpl *document)
     int exceptionCode = 0;
     ElementImpl *fontNode = document->createHTMLElement("font", exceptionCode);
     ASSERT(exceptionCode == 0);
+    fontNode->ref();
     fontNode->setAttribute(ATTR_CLASS, styleSpanClassString());
-    return fontNode;
+    return floatRefdElement(fontNode);
 }
 
 ElementImpl *createStyleSpanElement(DocumentImpl *document)
@@ -5591,8 +5604,9 @@ ElementImpl *createStyleSpanElement(DocumentImpl *document)
     int exceptionCode = 0;
     ElementImpl *styleElement = document->createHTMLElement("SPAN", exceptionCode);
     ASSERT(exceptionCode == 0);
+    styleElement->ref();
     styleElement->setAttribute(ATTR_CLASS, styleSpanClassString());
-    return styleElement;
+    return floatRefdElement(styleElement);
 }
 
 bool isNodeRendered(const NodeImpl *node)
index 5bd86f794f88e827e4dbc39222ec649e2e263cba..09167766f602f0685ac068ab922edf6fc4d8ae46 100644 (file)
@@ -929,6 +929,7 @@ private:
 
 //------------------------------------------------------------------------------------------
 
+DOM::ElementImpl *floatRefdElement(DOM::ElementImpl *element);
 DOM::ElementImpl *createDefaultParagraphElement(DOM::DocumentImpl *document);
 DOM::ElementImpl *createBlockPlaceholderElement(DOM::DocumentImpl *document);
 DOM::ElementImpl *createBreakElement(DOM::DocumentImpl *document);