Reviewed by Darin.
authormjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 5 Feb 2006 05:44:29 +0000 (05:44 +0000)
committermjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 5 Feb 2006 05:44:29 +0000 (05:44 +0000)
        - Just return bool from DOM child mutation methods instead of the node
        http://bugzilla.opendarwin.org/show_bug.cgi?id=7076

        * bindings/objc/DOM.mm:
        (-[DOMNode insertBefore::]):
        (-[DOMNode replaceChild::]):
        (-[DOMNode removeChild:]):
        (-[DOMNode appendChild:]):
        * khtml/ecma/kjs_dom.cpp:
        (KJS::DOMNodeProtoFunc::callAsFunction):
        * khtml/html/HTMLOptGroupElementImpl.cpp:
        (WebCore::HTMLOptGroupElementImpl::insertBefore):
        (WebCore::HTMLOptGroupElementImpl::replaceChild):
        (WebCore::HTMLOptGroupElementImpl::removeChild):
        (WebCore::HTMLOptGroupElementImpl::appendChild):
        * khtml/html/HTMLOptGroupElementImpl.h:
        * khtml/html/HTMLSelectElementImpl.cpp:
        (WebCore::HTMLSelectElementImpl::insertBefore):
        (WebCore::HTMLSelectElementImpl::replaceChild):
        (WebCore::HTMLSelectElementImpl::removeChild):
        (WebCore::HTMLSelectElementImpl::appendChild):
        * khtml/html/HTMLSelectElementImpl.h:
        * khtml/html/HTMLTextAreaElementImpl.cpp:
        (WebCore::HTMLTextAreaElementImpl::setDefaultValue):
        * khtml/html/html_tableimpl.cpp:
        (WebCore::HTMLTableElementImpl::createTFoot):
        * khtml/xml/ContainerNodeImpl.cpp:
        (WebCore::ContainerNodeImpl::insertBefore):
        (WebCore::ContainerNodeImpl::replaceChild):
        (WebCore::ContainerNodeImpl::removeChild):
        (WebCore::ContainerNodeImpl::appendChild):
        * khtml/xml/ContainerNodeImpl.h:
        * khtml/xml/NodeImpl.cpp:
        (WebCore::NodeImpl::insertBefore):
        (WebCore::NodeImpl::replaceChild):
        (WebCore::NodeImpl::removeChild):
        (WebCore::NodeImpl::appendChild):
        * khtml/xml/NodeImpl.h:
        * khtml/xml/xml_tokenizer.cpp:
        (WebCore::XMLTokenizer::insertErrorMessageBlock):

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

14 files changed:
WebCore/ChangeLog
WebCore/bindings/objc/DOM.mm
WebCore/khtml/ecma/kjs_dom.cpp
WebCore/khtml/html/HTMLOptGroupElementImpl.cpp
WebCore/khtml/html/HTMLOptGroupElementImpl.h
WebCore/khtml/html/HTMLSelectElementImpl.cpp
WebCore/khtml/html/HTMLSelectElementImpl.h
WebCore/khtml/html/HTMLTextAreaElementImpl.cpp
WebCore/khtml/html/html_tableimpl.cpp
WebCore/khtml/xml/ContainerNodeImpl.cpp
WebCore/khtml/xml/ContainerNodeImpl.h
WebCore/khtml/xml/NodeImpl.cpp
WebCore/khtml/xml/NodeImpl.h
WebCore/khtml/xml/xml_tokenizer.cpp

index 35298410640b96217ad12d1ee8d60d542d7c07b7..4baeda3d4a29ca532f8e7934d8fe6a8c97175dd4 100644 (file)
@@ -1,3 +1,48 @@
+2006-02-04  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Darin.
+
+        - Just return bool from DOM child mutation methods instead of the node
+        http://bugzilla.opendarwin.org/show_bug.cgi?id=7076
+
+        * bindings/objc/DOM.mm:
+        (-[DOMNode insertBefore::]):
+        (-[DOMNode replaceChild::]):
+        (-[DOMNode removeChild:]):
+        (-[DOMNode appendChild:]):
+        * khtml/ecma/kjs_dom.cpp:
+        (KJS::DOMNodeProtoFunc::callAsFunction):
+        * khtml/html/HTMLOptGroupElementImpl.cpp:
+        (WebCore::HTMLOptGroupElementImpl::insertBefore):
+        (WebCore::HTMLOptGroupElementImpl::replaceChild):
+        (WebCore::HTMLOptGroupElementImpl::removeChild):
+        (WebCore::HTMLOptGroupElementImpl::appendChild):
+        * khtml/html/HTMLOptGroupElementImpl.h:
+        * khtml/html/HTMLSelectElementImpl.cpp:
+        (WebCore::HTMLSelectElementImpl::insertBefore):
+        (WebCore::HTMLSelectElementImpl::replaceChild):
+        (WebCore::HTMLSelectElementImpl::removeChild):
+        (WebCore::HTMLSelectElementImpl::appendChild):
+        * khtml/html/HTMLSelectElementImpl.h:
+        * khtml/html/HTMLTextAreaElementImpl.cpp:
+        (WebCore::HTMLTextAreaElementImpl::setDefaultValue):
+        * khtml/html/html_tableimpl.cpp:
+        (WebCore::HTMLTableElementImpl::createTFoot):
+        * khtml/xml/ContainerNodeImpl.cpp:
+        (WebCore::ContainerNodeImpl::insertBefore):
+        (WebCore::ContainerNodeImpl::replaceChild):
+        (WebCore::ContainerNodeImpl::removeChild):
+        (WebCore::ContainerNodeImpl::appendChild):
+        * khtml/xml/ContainerNodeImpl.h:
+        * khtml/xml/NodeImpl.cpp:
+        (WebCore::NodeImpl::insertBefore):
+        (WebCore::NodeImpl::replaceChild):
+        (WebCore::NodeImpl::removeChild):
+        (WebCore::NodeImpl::appendChild):
+        * khtml/xml/NodeImpl.h:
+        * khtml/xml/xml_tokenizer.cpp:
+        (WebCore::XMLTokenizer::insertErrorMessageBlock):
+
 2006-02-04  Maciej Stachowiak  <mjs@apple.com>
 
         - reverted CSS media queries patch, as it causes random crashes on the
index 90f17a831b3f37dbdbd51b947010196cf3130e29..193e5c55742ecad5f9590d51c2fe0ca8908f0542 100644 (file)
@@ -253,9 +253,10 @@ static ListenerMap *listenerMap;
     ASSERT(refChild);
 
     int exceptionCode = 0;
-    DOMNode *result = [DOMNode _nodeWithImpl:[self _nodeImpl]->insertBefore([newChild _nodeImpl], [refChild _nodeImpl], exceptionCode).get()];
+    if ([self _nodeImpl]->insertBefore([newChild _nodeImpl], [refChild _nodeImpl], exceptionCode))
+        return newChild;
     raiseOnDOMError(exceptionCode);
-    return result;
+    return nil;
 }
 
 - (DOMNode *)replaceChild:(DOMNode *)newChild :(DOMNode *)oldChild
@@ -264,9 +265,10 @@ static ListenerMap *listenerMap;
     ASSERT(oldChild);
 
     int exceptionCode = 0;
-    DOMNode *result = [DOMNode _nodeWithImpl:[self _nodeImpl]->replaceChild([newChild _nodeImpl], [oldChild _nodeImpl], exceptionCode).get()];
+    if ([self _nodeImpl]->replaceChild([newChild _nodeImpl], [oldChild _nodeImpl], exceptionCode))
+        return newChild;
     raiseOnDOMError(exceptionCode);
-    return result;
+    return nil;
 }
 
 - (DOMNode *)removeChild:(DOMNode *)oldChild
@@ -274,9 +276,10 @@ static ListenerMap *listenerMap;
     ASSERT(oldChild);
 
     int exceptionCode = 0;
-    DOMNode *result = [DOMNode _nodeWithImpl:[self _nodeImpl]->removeChild([oldChild _nodeImpl], exceptionCode).get()];
+    if ([self _nodeImpl]->removeChild([oldChild _nodeImpl], exceptionCode))
+        return oldChild;
     raiseOnDOMError(exceptionCode);
-    return result;
+    return nil;
 }
 
 - (DOMNode *)appendChild:(DOMNode *)newChild
@@ -284,9 +287,10 @@ static ListenerMap *listenerMap;
     ASSERT(newChild);
 
     int exceptionCode = 0;
-    DOMNode *result = [DOMNode _nodeWithImpl:[self _nodeImpl]->appendChild([newChild _nodeImpl], exceptionCode).get()];
+    if ([self _nodeImpl]->appendChild([newChild _nodeImpl], exceptionCode))
+        return newChild;
     raiseOnDOMError(exceptionCode);
-    return result;
+    return nil;
 }
 
 - (BOOL)hasChildNodes
index f9be736dee68262b46498a183b181b8c7c5ca497..0206ef34fdf7a95a6996435fb837e9ef5fafb420 100644 (file)
@@ -656,13 +656,21 @@ JSValue *DOMNodeProtoFunc::callAsFunction(ExecState *exec, JSObject *thisObj, co
     case DOMNode::DispatchEvent:
       return jsBoolean(node.dispatchEvent(toEvent(args[0]), exception));
     case DOMNode::AppendChild:
-      return getDOMNode(exec,node.appendChild(toNode(args[0]), exception));
+      if (node.appendChild(toNode(args[0]), exception))
+        return args[0];
+      return jsNull();
     case DOMNode::RemoveChild:
-      return getDOMNode(exec,node.removeChild(toNode(args[0]), exception));
+      if (node.removeChild(toNode(args[0]), exception))
+        return args[0];
+      return jsNull();
     case DOMNode::InsertBefore:
-      return getDOMNode(exec,node.insertBefore(toNode(args[0]), toNode(args[1]), exception));
+      if (node.insertBefore(toNode(args[0]), toNode(args[1]), exception))
+        return args[0];
+      return jsNull();
     case DOMNode::ReplaceChild:
-      return getDOMNode(exec,node.replaceChild(toNode(args[0]), toNode(args[1]), exception));
+     if (node.replaceChild(toNode(args[0]), toNode(args[1]), exception))
+        return args[0];
+      return jsNull();
     case DOMNode::Contains:
       if (node.isElementNode())
         if (NodeImpl *node0 = toNode(args[0]))
index 1343e53359f688f8e49dbd70fc7ed0da292b1ca7..da1c89d87ce2fcb4cf4d1e27fd01a4d03f6ee0f2 100644 (file)
@@ -53,33 +53,33 @@ DOMString HTMLOptGroupElementImpl::type() const
     return "optgroup";
 }
 
-PassRefPtr<NodeImpl> HTMLOptGroupElementImpl::insertBefore(PassRefPtr<NodeImpl> newChild, NodeImpl* refChild, ExceptionCode& ec)
+bool HTMLOptGroupElementImpl::insertBefore(PassRefPtr<NodeImpl> newChild, NodeImpl* refChild, ExceptionCode& ec)
 {
-    PassRefPtr<NodeImpl> result = HTMLGenericFormElementImpl::insertBefore(newChild, refChild, ec);
+    bool result = HTMLGenericFormElementImpl::insertBefore(newChild, refChild, ec);
     if (result)
         recalcSelectOptions();
     return result;
 }
 
-PassRefPtr<NodeImpl> HTMLOptGroupElementImpl::replaceChild(PassRefPtr<NodeImpl> newChild, NodeImpl* oldChild, ExceptionCode& ec)
+bool HTMLOptGroupElementImpl::replaceChild(PassRefPtr<NodeImpl> newChild, NodeImpl* oldChild, ExceptionCode& ec)
 {
-    PassRefPtr<NodeImpl> result = HTMLGenericFormElementImpl::replaceChild(newChild, oldChild, ec);
+    bool result = HTMLGenericFormElementImpl::replaceChild(newChild, oldChild, ec);
     if (result)
         recalcSelectOptions();
     return result;
 }
 
-PassRefPtr<NodeImpl> HTMLOptGroupElementImpl::removeChild(NodeImpl* oldChild, ExceptionCode& ec)
+bool HTMLOptGroupElementImpl::removeChild(NodeImpl* oldChild, ExceptionCode& ec)
 {
-    PassRefPtr<NodeImpl> result = HTMLGenericFormElementImpl::removeChild(oldChild, ec);
+    bool result = HTMLGenericFormElementImpl::removeChild(oldChild, ec);
     if (result)
         recalcSelectOptions();
     return result;
 }
 
-PassRefPtr<NodeImpl> HTMLOptGroupElementImpl::appendChild(PassRefPtr<NodeImpl> newChild, ExceptionCode& ec)
+bool HTMLOptGroupElementImpl::appendChild(PassRefPtr<NodeImpl> newChild, ExceptionCode& ec)
 {
-    PassRefPtr<NodeImpl> result = HTMLGenericFormElementImpl::appendChild(newChild, ec);
+    bool result = HTMLGenericFormElementImpl::appendChild(newChild, ec);
     if (result)
         recalcSelectOptions();
     return result;
index 3417a1b1273a74fea13b06726bec156a5e442cf7..4eefca683126dcc6ca8fe6a05f10da992aa2e6e8 100644 (file)
@@ -39,10 +39,10 @@ public:
     virtual bool checkDTD(const NodeImpl*);
     virtual DOMString type() const;
     virtual bool isFocusable() const;
-    virtual PassRefPtr<NodeImpl> insertBefore(PassRefPtr<NodeImpl> newChild, NodeImpl* refChild, ExceptionCode&);
-    virtual PassRefPtr<NodeImpl> replaceChild(PassRefPtr<NodeImpl> newChild, NodeImpl* oldChild, ExceptionCode&);
-    virtual PassRefPtr<NodeImpl> removeChild(NodeImpl* child, ExceptionCode&);
-    virtual PassRefPtr<NodeImpl> appendChild(PassRefPtr<NodeImpl> newChild, ExceptionCode&);
+    virtual bool insertBefore(PassRefPtr<NodeImpl> newChild, NodeImpl* refChild, ExceptionCode&);
+    virtual bool replaceChild(PassRefPtr<NodeImpl> newChild, NodeImpl* oldChild, ExceptionCode&);
+    virtual bool removeChild(NodeImpl* child, ExceptionCode&);
+    virtual bool appendChild(PassRefPtr<NodeImpl> newChild, ExceptionCode&);
     virtual ContainerNodeImpl* addChild(PassRefPtr<NodeImpl>);
     virtual void parseMappedAttribute(MappedAttributeImpl*);
 
index 314a551d66754d80046aa08afdcd2ab765b14d3a..ce9c6247c8423a03034f6f7fe6d505297ca0abbc 100644 (file)
@@ -217,33 +217,33 @@ void HTMLSelectElementImpl::restoreState(QStringList &_states)
     setChanged(true);
 }
 
-PassRefPtr<NodeImpl> HTMLSelectElementImpl::insertBefore(PassRefPtr<NodeImpl> newChild, NodeImpl* refChild, ExceptionCode& ec)
+bool HTMLSelectElementImpl::insertBefore(PassRefPtr<NodeImpl> newChild, NodeImpl* refChild, ExceptionCode& ec)
 {
-    PassRefPtr<NodeImpl> result = HTMLGenericFormElementImpl::insertBefore(newChild, refChild, ec);
+    bool result = HTMLGenericFormElementImpl::insertBefore(newChild, refChild, ec);
     if (result)
         setRecalcListItems();
     return result;
 }
 
-PassRefPtr<NodeImpl> HTMLSelectElementImpl::replaceChild(PassRefPtr<NodeImpl> newChild, NodeImpl *oldChild, ExceptionCode& ec)
+bool HTMLSelectElementImpl::replaceChild(PassRefPtr<NodeImpl> newChild, NodeImpl *oldChild, ExceptionCode& ec)
 {
-    PassRefPtr<NodeImpl> result = HTMLGenericFormElementImpl::replaceChild(newChild, oldChild, ec);
+    bool result = HTMLGenericFormElementImpl::replaceChild(newChild, oldChild, ec);
     if (result)
         setRecalcListItems();
     return result;
 }
 
-PassRefPtr<NodeImpl> HTMLSelectElementImpl::removeChild(NodeImpl* oldChild, ExceptionCode& ec)
+bool HTMLSelectElementImpl::removeChild(NodeImpl* oldChild, ExceptionCode& ec)
 {
-    PassRefPtr<NodeImpl> result = HTMLGenericFormElementImpl::removeChild(oldChild, ec);
+    bool result = HTMLGenericFormElementImpl::removeChild(oldChild, ec);
     if (result)
         setRecalcListItems();
     return result;
 }
 
-PassRefPtr<NodeImpl> HTMLSelectElementImpl::appendChild(PassRefPtr<NodeImpl> newChild, ExceptionCode& ec)
+bool HTMLSelectElementImpl::appendChild(PassRefPtr<NodeImpl> newChild, ExceptionCode& ec)
 {
-    PassRefPtr<NodeImpl> result = HTMLGenericFormElementImpl::appendChild(newChild, ec);
+    bool result = HTMLGenericFormElementImpl::appendChild(newChild, ec);
     if (result)
         setRecalcListItems();
     return result;
index 82e3e272198ffe91eb572621891ee43fc7e7ae2d..69138b42cc2ce4f8adf705a87923190c7c996426 100644 (file)
@@ -81,10 +81,10 @@ public:
     virtual QString state();
     virtual void restoreState(QStringList &);
 
-    virtual PassRefPtr<NodeImpl> insertBefore(PassRefPtr<NodeImpl> newChild, NodeImpl* refChild, ExceptionCode&);
-    virtual PassRefPtr<NodeImpl> replaceChild(PassRefPtr<NodeImpl> newChild, NodeImpl* oldChild, ExceptionCode&);
-    virtual PassRefPtr<NodeImpl> removeChild(NodeImpl* child, ExceptionCode&);
-    virtual PassRefPtr<NodeImpl> appendChild(PassRefPtr<NodeImpl> newChild, ExceptionCode&);
+    virtual bool insertBefore(PassRefPtr<NodeImpl> newChild, NodeImpl* refChild, ExceptionCode&);
+    virtual bool replaceChild(PassRefPtr<NodeImpl> newChild, NodeImpl* oldChild, ExceptionCode&);
+    virtual bool removeChild(NodeImpl* child, ExceptionCode&);
+    virtual bool appendChild(PassRefPtr<NodeImpl> newChild, ExceptionCode&);
     virtual ContainerNodeImpl* addChild(PassRefPtr<NodeImpl>);
 
     virtual void childrenChanged();
index 679e9579abde521386877a558a1da05fa23fa521..f303dc12a02dc91f60c997f5c2f2bcdd10d8f1fb 100644 (file)
@@ -236,7 +236,7 @@ void HTMLTextAreaElementImpl::setDefaultValue(const DOMString &defaultValue)
         RefPtr<NodeImpl> n = it.current();
         removeChild(n.get(), exceptioncode);
     }
-    insertBefore(getDocument()->createTextNode(defaultValue),firstChild(), exceptioncode);
+    insertBefore(getDocument()->createTextNode(defaultValue), firstChild(), exceptioncode);
     setValue(defaultValue);
 }
 
index ec8e1a4d60ab2ae20544baac83b4922428c0d9db..ecb991fc69f0311565050e5d8721567c1891cdfb 100644 (file)
@@ -158,11 +158,11 @@ void HTMLTableElementImpl::deleteTHead(  )
 
 HTMLElementImpl *HTMLTableElementImpl::createTFoot(  )
 {
-    if(!foot)
+    if (!foot)
     {
         int exceptioncode = 0;
         foot = new HTMLTableSectionElementImpl(tfootTag, getDocument(), true /*implicit */);
-        if(firstBody)
+        if (firstBody)
             insertBefore( foot, firstBody, exceptioncode );
         else
             appendChild(foot, exceptioncode);
index 18d1d7325ffe6f5696c3b5560625c734be83f0f8..6b7835a9929827ac12a85ed37b3d37ea15b62765 100644 (file)
@@ -118,7 +118,7 @@ NodeImpl* ContainerNodeImpl::lastChild() const
     return m_lastChild;
 }
 
-PassRefPtr<NodeImpl> ContainerNodeImpl::insertBefore(PassRefPtr<NodeImpl> newChild, NodeImpl* refChild, ExceptionCode& ec)
+bool ContainerNodeImpl::insertBefore(PassRefPtr<NodeImpl> newChild, NodeImpl* refChild, ExceptionCode& ec)
 {
     ec = 0;
 
@@ -129,30 +129,30 @@ PassRefPtr<NodeImpl> ContainerNodeImpl::insertBefore(PassRefPtr<NodeImpl> newChi
     // Make sure adding the new child is OK.
     checkAddChild(newChild.get(), ec);
     if (ec)
-        return 0;
+        return false;
 
     // NOT_FOUND_ERR: Raised if refChild is not a child of this node
     if (refChild->parentNode() != this) {
         ec = DOMException::NOT_FOUND_ERR;
-        return 0;
+        return false;
     }
 
     bool isFragment = newChild->nodeType() == Node::DOCUMENT_FRAGMENT_NODE;
 
     // If newChild is a DocumentFragment with no children; there's nothing to do.
-    // Just return the document fragment.
+    // Just return true
     if (isFragment && !newChild->firstChild())
-        return newChild;
+        return true;
 
     // Now actually add the child(ren)
     if (refChild->previousSibling() == newChild || refChild == newChild) // nothing to do
-        return newChild;
+        return true;
 
     RefPtr<NodeImpl> next = refChild;
 
-    RefPtr<NodeImpl> child = isFragment ? newChild->firstChild() : newChild.get();
+    RefPtr<NodeImpl> child = isFragment ? newChild->firstChild() : newChild;
     while (child) {
-        PassRefPtr<NodeImpl> nextChild = isFragment ? child->nextSibling() : 0;
+        RefPtr<NodeImpl> nextChild = isFragment ? child->nextSibling() : 0;
 
         // If child is already present in the tree, first remove it from the old location.
         if (NodeImpl* oldParent = child->parentNode())
@@ -202,38 +202,39 @@ PassRefPtr<NodeImpl> ContainerNodeImpl::insertBefore(PassRefPtr<NodeImpl> newChi
         // Dispatch the mutation events.
         dispatchChildInsertionEvents(child.get(), ec);
 
-        child = nextChild;
+        child = nextChild.release();
     }
 
     getDocument()->setDocumentChanged(true);
     dispatchSubtreeModifiedEvent();
-    return newChild;
+    return true;
 }
 
-PassRefPtr<NodeImpl> ContainerNodeImpl::replaceChild(PassRefPtr<NodeImpl> newChild, NodeImpl* oldChild, ExceptionCode& ec)
+bool ContainerNodeImpl::replaceChild(PassRefPtr<NodeImpl> newChild, NodeImpl* oldChild, ExceptionCode& ec)
 {
     ec = 0;
 
     if (oldChild == newChild) // nothing to do
-        return newChild;
+        return true;
     
     // Make sure adding the new child is ok
     checkAddChild(newChild.get(), ec);
     if (ec)
-        return 0;
+        return false;
 
     // NOT_FOUND_ERR: Raised if oldChild is not a child of this node.
     if (!oldChild || oldChild->parentNode() != this) {
         ec = DOMException::NOT_FOUND_ERR;
-        return 0;
+        return false;
     }
 
     RefPtr<NodeImpl> prev = oldChild->previousSibling();
 
     // Remove the node we're replacing
-    PassRefPtr<NodeImpl> removedChild = removeChild(oldChild, ec);
+    RefPtr<NodeImpl> removedChild = oldChild;
+    removeChild(oldChild, ec);
     if (ec)
-        return 0;
+        return false;
 
     // FIXME: After sending the mutation events, "this" could be destroyed.
     // We can prevent that by doing a "ref", but first we have to make sure
@@ -243,7 +244,7 @@ PassRefPtr<NodeImpl> ContainerNodeImpl::replaceChild(PassRefPtr<NodeImpl> newChi
     bool isFragment = newChild->nodeType() == Node::DOCUMENT_FRAGMENT_NODE;
 
     // Add the new child(ren)
-    RefPtr<NodeImpl> child = isFragment ? newChild->firstChild() : newChild.get();
+    RefPtr<NodeImpl> child = isFragment ? newChild->firstChild() : newChild;
     while (child) {
         // If the new child is already in the right place, we're done.
         if (prev && (prev == child || prev == child->previousSibling()))
@@ -302,13 +303,13 @@ PassRefPtr<NodeImpl> ContainerNodeImpl::replaceChild(PassRefPtr<NodeImpl> newChi
         dispatchChildInsertionEvents(child.get(), ec);
 
         prev = child;
-        child = nextChild;
+        child = nextChild.release();
     }
 
     // ### set style in case it's attached
     getDocument()->setDocumentChanged(true);
     dispatchSubtreeModifiedEvent();
-    return removedChild;
+    return true;
 }
 
 void ContainerNodeImpl::willRemove()
@@ -332,40 +333,40 @@ static ExceptionCode willRemoveChild(NodeImpl *child)
     return 0;
 }
 
-PassRefPtr<NodeImpl> ContainerNodeImpl::removeChild(NodeImpl* oldChild, ExceptionCode& ec)
+bool ContainerNodeImpl::removeChild(NodeImpl* oldChild, ExceptionCode& ec)
 {
     ec = 0;
 
     // NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
     if (isReadOnly()) {
         ec = DOMException::NO_MODIFICATION_ALLOWED_ERR;
-        return 0;
+        return false;
     }
 
     // NOT_FOUND_ERR: Raised if oldChild is not a child of this node.
     if (!oldChild || oldChild->parentNode() != this) {
         ec = DOMException::NOT_FOUND_ERR;
-        return 0;
+        return false;
     }
 
-    PassRefPtr<NodeImpl> child = oldChild;
+    RefPtr<NodeImpl> child = oldChild;
     
     // dispatch pre-removal mutation events
     if (getDocument()->hasListenerType(DocumentImpl::DOMNODEREMOVED_LISTENER)) {
         child->dispatchEvent(new MutationEventImpl(DOMNodeRemovedEvent, true, false,
             this, DOMString(), DOMString(), DOMString(), 0), ec, true);
         if (ec)
-            return 0;
+            return false;
     }
 
     ec = willRemoveChild(child.get());
     if (ec)
-        return 0;
+        return false;
 
     // Mutation events might have moved this child into a different parent.
     if (child->parentNode() != this) {
         ec = DOMException::NOT_FOUND_ERR;
-        return 0;
+        return false;
     }
 
     // FIXME: After sending the mutation events, "this" could be destroyed.
@@ -453,7 +454,7 @@ void ContainerNodeImpl::removeChildren()
 }
 
 
-PassRefPtr<NodeImpl> ContainerNodeImpl::appendChild(PassRefPtr<NodeImpl> newChild, ExceptionCode& ec)
+bool ContainerNodeImpl::appendChild(PassRefPtr<NodeImpl> newChild, ExceptionCode& ec)
 {
     ec = 0;
 
@@ -470,10 +471,10 @@ PassRefPtr<NodeImpl> ContainerNodeImpl::appendChild(PassRefPtr<NodeImpl> newChil
     // If newChild is a DocumentFragment with no children.... there's nothing to do.
     // Just return the document fragment
     if (isFragment && !newChild->firstChild())
-        return newChild;
+        return true;
 
     // Now actually add the child(ren)
-    RefPtr<NodeImpl> child = isFragment ? newChild->firstChild() : newChild.get();
+    RefPtr<NodeImpl> child = isFragment ? newChild->firstChild() : newChild;
     while (child) {
         // For a fragment we have more children to do.
         RefPtr<NodeImpl> nextChild = isFragment ? child->nextSibling() : 0;
@@ -510,13 +511,12 @@ PassRefPtr<NodeImpl> ContainerNodeImpl::appendChild(PassRefPtr<NodeImpl> newChil
         // Dispatch the mutation events
         dispatchChildInsertionEvents(child.get(), ec);
 
-        child = nextChild;
+        child = nextChild.release();
     }
 
     getDocument()->setDocumentChanged(true);
-    // ### set style in case it's attached
     dispatchSubtreeModifiedEvent();
-    return newChild;
+    return true;
 }
 
 bool ContainerNodeImpl::hasChildNodes() const
index a8796340e68d23e2997161fb0f3a71479db5b79d..eede574678cdf8dd7774fe52d6a66981e489739d 100644 (file)
@@ -38,10 +38,12 @@ public:
 
     virtual NodeImpl* firstChild() const;
     virtual NodeImpl* lastChild() const;
-    virtual PassRefPtr<NodeImpl> insertBefore(PassRefPtr<NodeImpl> newChild, NodeImpl* refChild, ExceptionCode&);
-    virtual PassRefPtr<NodeImpl> replaceChild(PassRefPtr<NodeImpl> newChild, NodeImpl* oldChild, ExceptionCode&);
-    virtual PassRefPtr<NodeImpl> removeChild(NodeImpl* child, ExceptionCode&);
-    virtual PassRefPtr<NodeImpl> appendChild(PassRefPtr<NodeImpl> newChild, ExceptionCode&);
+
+    virtual bool insertBefore(PassRefPtr<NodeImpl> newChild, NodeImpl* refChild, ExceptionCode&);
+    virtual bool replaceChild(PassRefPtr<NodeImpl> newChild, NodeImpl* oldChild, ExceptionCode&);
+    virtual bool removeChild(NodeImpl* child, ExceptionCode&);
+    virtual bool appendChild(PassRefPtr<NodeImpl> newChild, ExceptionCode&);
+
     virtual ContainerNodeImpl* addChild(PassRefPtr<NodeImpl>);
     virtual bool hasChildNodes() const;
     virtual void attach();
index c988a11409dcc24841182a43bcd814807f41602b..69a9f6fa5e494b193a519188f298a4fa4e52f892 100644 (file)
@@ -207,28 +207,28 @@ NodeImpl *NodeImpl::lastDescendant() const
     return n;
 }
 
-PassRefPtr<NodeImpl> NodeImpl::insertBefore(PassRefPtr<NodeImpl>, NodeImpl*, ExceptionCode& ec)
+bool NodeImpl::insertBefore(PassRefPtr<NodeImpl>, NodeImpl*, ExceptionCode& ec)
 {
     ec = DOMException::HIERARCHY_REQUEST_ERR;
-    return 0;
+    return false;
 }
 
-PassRefPtr<NodeImpl> NodeImpl::replaceChild(PassRefPtr<NodeImpl>, NodeImpl*, ExceptionCode& ec)
+bool NodeImpl::replaceChild(PassRefPtr<NodeImpl>, NodeImpl*, ExceptionCode& ec)
 {
     ec = DOMException::HIERARCHY_REQUEST_ERR;
-    return 0;
+    return false;
 }
 
-PassRefPtr<NodeImpl> NodeImpl::removeChild(NodeImpl*, ExceptionCode& ec)
+bool NodeImpl::removeChild(NodeImpl*, ExceptionCode& ec)
 {
     ec = DOMException::NOT_FOUND_ERR;
-    return 0;
+    return false;
 }
 
-PassRefPtr<NodeImpl> NodeImpl::appendChild(PassRefPtr<NodeImpl>, ExceptionCode& ec)
+bool NodeImpl::appendChild(PassRefPtr<NodeImpl>, ExceptionCode& ec)
 {
     ec = DOMException::HIERARCHY_REQUEST_ERR;
-    return 0;
+    return false;
 }
 
 void NodeImpl::remove(int &exceptioncode)
index 1bf31d2947b332aba866ee9097656f4fe3bd7daa..4888faf481b6f6b4b6f779231e8dc18e92fb3e58 100644 (file)
@@ -83,10 +83,15 @@ public:
     virtual bool hasAttributes() const;
     virtual NamedAttrMapImpl* attributes() const;
     virtual DocumentImpl* ownerDocument() const;
-    virtual PassRefPtr<NodeImpl> insertBefore(PassRefPtr<NodeImpl> newChild, NodeImpl* refChild, ExceptionCode&);
-    virtual PassRefPtr<NodeImpl> replaceChild(PassRefPtr<NodeImpl> newChild, NodeImpl* oldChild, ExceptionCode&);
-    virtual PassRefPtr<NodeImpl> removeChild(NodeImpl* child, ExceptionCode&);
-    virtual PassRefPtr<NodeImpl> appendChild(PassRefPtr<NodeImpl> newChild, ExceptionCode&);
+
+    // These should all actually return a node, but this is only important for language bindings,
+    // which will already know and hold a ref on the right node to return. Returning bool allows
+    // these methods to be more efficient since they don't need to return a ref
+    virtual bool insertBefore(PassRefPtr<NodeImpl> newChild, NodeImpl* refChild, ExceptionCode&);
+    virtual bool replaceChild(PassRefPtr<NodeImpl> newChild, NodeImpl* oldChild, ExceptionCode&);
+    virtual bool removeChild(NodeImpl* child, ExceptionCode&);
+    virtual bool appendChild(PassRefPtr<NodeImpl> newChild, ExceptionCode&);
+
     virtual void remove(ExceptionCode&);
     virtual bool hasChildNodes() const;
     virtual PassRefPtr<NodeImpl> cloneNode(bool deep) = 0;
index 0c33c30fd9afb4c8edbc433408f9923cf5c4f3aa..0a6971a8220b4d36c99a0cbfc83eddef52122144 100644 (file)
@@ -818,7 +818,7 @@ void XMLTokenizer::insertErrorMessageBlock()
 #endif
 
     RefPtr<ElementImpl> reportElement = createXHTMLParserErrorHeader(doc, m_errorMessages);
-    documentElement->insertBefore(reportElement.get(), documentElement->firstChild(), exceptioncode);
+    documentElement->insertBefore(reportElement, documentElement->firstChild(), exceptioncode);
 #ifdef KHTML_XSLT
     if (doc->transformSourceDocument()) {
         ElementImpl* par = doc->createElementNS(xhtmlNamespaceURI, "p", exceptioncode);