Fixed: <rdar://problem/4023566> Stickies: Crash in ReplacementFragment::insertFragme...
[WebKit-https.git] / WebCore / khtml / editing / htmlediting.cpp
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)