Reviewed and landed by Darin.
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 14 Aug 2005 08:07:23 +0000 (08:07 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 14 Aug 2005 08:07:23 +0000 (08:07 +0000)
        Test cases added:
        * layout-tests/dom/html/level2/html/HTMLSelectElement20-expected.txt:
This passes now.

        * khtml/ecma/kjs_html.cpp:
        (KJS::KJS::HTMLElementFunction::callAsFunction):
        (KJS::KJS::HTMLSelectCollection::put):
Handle exceptions.

        * khtml/html/html_formimpl.cpp:
        (DOM::HTMLSelectElementImpl::add):
        * khtml/html/html_formimpl.h:
Make ::add raise an exception if before isn't a descendant
of the select element.

        * kwq/DOMHTML.mm:
        (-[DOMHTMLSelectElement add::]):
Handle the exception.

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

LayoutTests/dom/html/level2/html/HTMLSelectElement20-expected.txt
WebCore/ChangeLog-2005-08-23
WebCore/Makefile.am
WebCore/khtml/ecma/kjs_html.cpp
WebCore/khtml/html/html_formimpl.cpp
WebCore/khtml/html/html_formimpl.h
WebCore/kwq/DOMHTML.mm

index a4eeffcab99efda08b78b2856347856440947f48..2129655cb185c55abb7672efadb7452a704c1f98 100644 (file)
@@ -1,3 +1,2 @@
-Test:  http://www.w3.org/2001/DOM-Test-Suite/level2/html/HTMLSelectElement20   
-Status:        failure
-Detail:        throw_NOT_FOUND_ERR: assertTrue failed
+Test:  http://www.w3.org/2001/DOM-Test-Suite/level2/html/HTMLSelectElement20
+Status:        Success
index 2d5f3189a26086a5f1dc72156f12f81d3dd34497..687277fa353112f6ddf39f2ff09ce72c8bac23fb 100644 (file)
@@ -1,3 +1,26 @@
+2005-08-14  Anders Carlsson  <andersca@mac.com>
+
+        Reviewed and landed by Darin.
+
+        Test cases added:
+        * layout-tests/dom/html/level2/html/HTMLSelectElement20-expected.txt:
+       This passes now.
+
+        * khtml/ecma/kjs_html.cpp:
+        (KJS::KJS::HTMLElementFunction::callAsFunction):
+        (KJS::KJS::HTMLSelectCollection::put):
+       Handle exceptions.
+
+        * khtml/html/html_formimpl.cpp:
+        (DOM::HTMLSelectElementImpl::add):
+        * khtml/html/html_formimpl.h:
+       Make ::add raise an exception if before isn't a descendant
+       of the select element.
+
+        * kwq/DOMHTML.mm:
+        (-[DOMHTMLSelectElement add::]):
+       Handle the exception.
+
 2005-08-12  Geoffrey Garen  <ggaren@apple.com>
 
         Reviewed by adele.
index 667eb9427ef84c06f105b0bcf6c44fe6f50dd267..2276b429318df8621148cfc278f5a8e13a7c6a00 100644 (file)
@@ -1,8 +1,10 @@
 all-am:
        defaults write com.apple.Xcode PBXProductDirectory "$(SYMROOTS)"
        defaults write com.apple.Xcode PBXIntermediatesDirectory "$(SYMROOTS)"
+       ../WebKitTools/Scripts/set-webkit-configuration --$(BUILDSTYLE)
        xcodebuild -configuration $(BUILDSTYLE)
 clean-am:
        defaults write com.apple.Xcode PBXProductDirectory "$(SYMROOTS)"
        defaults write com.apple.Xcode PBXIntermediatesDirectory "$(SYMROOTS)"
-       xcodebuild clean -configuration ${BUILDSTYLE}
+       ../WebKitTools/Scripts/set-webkit-configuration --$(BUILDSTYLE)
+       xcodebuild clean -configuration $(BUILDSTYLE)
index 4c8e9c4ef191d3656988130f51c6e82bfdfa6736..26dc853db5d194d1672f161583d34a92e1dd950e 100644 (file)
@@ -2352,7 +2352,7 @@ ValueImp *KJS::HTMLElementFunction::callAsFunction(ExecState *exec, ObjectImp *t
     else if (element.hasLocalName(selectTag)) {
         HTMLSelectElementImpl &select = static_cast<HTMLSelectElementImpl &>(element);
         if (id == KJS::HTMLElement::SelectAdd) {
-            select.add(toHTMLElement(args[0]), toHTMLElement(args[1]));
+            select.add(toHTMLElement(args[0]), toHTMLElement(args[1]), exception);
             return Undefined();
         }
         else if (id == KJS::HTMLElement::SelectRemove) {
@@ -3498,7 +3498,9 @@ void KJS::HTMLSelectCollection::put(ExecState *exec, const Identifier &propertyN
     if (diff < 0) { // add dummy elements
       do {
         ElementImpl *option = m_element->ownerDocument()->createElement("option", exception);
-        m_element->add(static_cast<HTMLElementImpl *>(option), 0);
+        if (exception)
+          break;         
+        m_element->add(static_cast<HTMLElementImpl *>(option), 0, exception);
         if (exception)
           break;
       } while (++diff);
@@ -3535,8 +3537,10 @@ void KJS::HTMLSelectCollection::put(ExecState *exec, const Identifier &propertyN
     while (diff--) {
       ElementImpl *dummyOption = m_element->ownerDocument()->createElement("option", exception);
       if (!dummyOption)
-        break;
-      m_element->add(static_cast<HTMLElementImpl *>(dummyOption), 0);
+        break;      
+      m_element->add(static_cast<HTMLElementImpl *>(dummyOption), 0, exception);
+      if (exception) 
+          break;
     }
     // replace an existing entry ?
   } else if (diff < 0) {
@@ -3545,7 +3549,7 @@ void KJS::HTMLSelectCollection::put(ExecState *exec, const Identifier &propertyN
   }
   // finally add the new element
   if (exception == 0)
-    m_element->add(static_cast<HTMLOptionElementImpl *>(option), before);
+    m_element->add(static_cast<HTMLOptionElementImpl *>(option), before, exception);
 
   setDOMException(exec, exception);
 }
index 5ca97a6f1ec2fcb5596011a04d81c8d788df38c6..4c96e8c540373a29c34d5b3956c95d28386ca3f8 100644 (file)
@@ -2800,12 +2800,13 @@ long HTMLSelectElementImpl::length() const
     return len;
 }
 
-void HTMLSelectElementImpl::add( HTMLElementImpl *element, HTMLElementImpl *before )
+void HTMLSelectElementImpl::add( HTMLElementImpl *element, HTMLElementImpl *before, int &exceptioncode )
 {
+    SharedPtr<HTMLElementImpl> protectNewChild(element); // make sure the element is ref'd and deref'd so we don't leak it
+
     if (!element || !element->hasLocalName(optionTag))
         return;
 
-    int exceptioncode = 0;
     insertBefore(element, before, exceptioncode);
     if (!exceptioncode)
         setRecalcListItems();
index 8474802957a56cad265de69c96f28787f50405e7..7b6fa3626a20bd83fcdbbd2a0f14973f559d12ac 100644 (file)
@@ -563,7 +563,7 @@ public:
 
     bool multiple() const { return m_multiple; }
 
-    void add ( HTMLElementImpl *element, HTMLElementImpl *before );
+    void add ( HTMLElementImpl *element, HTMLElementImpl *before, int &exceptioncode );
     void remove ( long index );
     void blur();
     void focus();
index 33cf7285edb9162340241406a3834cfa34ac8f8c..02ebe64971c8f63f9486dc0bc5ce83e3a3a6c2ec 100644 (file)
@@ -1133,7 +1133,9 @@ using DOM::NodeImpl;
 
 - (void)add:(DOMHTMLElement *)element :(DOMHTMLElement *)before
 {
-    [self _selectElementImpl]->add([element _HTMLElementImpl], [before _HTMLElementImpl]);
+    int exceptionCode = 0;
+    [self _selectElementImpl]->add([element _HTMLElementImpl], [before _HTMLElementImpl], exceptionCode);
+    raiseOnDOMError(exceptionCode);
 }
 
 - (void)remove:(long)index