Rubber-stamped by Adele.
authorbdakin <bdakin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 15 Mar 2007 19:07:15 +0000 (19:07 +0000)
committerbdakin <bdakin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 15 Mar 2007 19:07:15 +0000 (19:07 +0000)
        Rolling out http://trac.webkit.org/projects/webkit/changeset/20148
        (which is a fix for http://bugs.webkit.org/show_bug.cgi?id=12595
        and rdar://4722863) because it causes a horrible memory-trasher.

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

21 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/forms/old-names-expected.txt [deleted file]
LayoutTests/fast/forms/old-names.html [deleted file]
WebCore/ChangeLog
WebCore/bindings/js/JSHTMLFormElementCustom.cpp
WebCore/bindings/js/kjs_dom.cpp
WebCore/bindings/js/kjs_dom.h
WebCore/bindings/js/kjs_html.cpp
WebCore/dom/ChildNodeList.cpp
WebCore/dom/ChildNodeList.h
WebCore/dom/NameNodeList.cpp
WebCore/dom/NameNodeList.h
WebCore/dom/Node.cpp
WebCore/dom/Node.h
WebCore/dom/NodeList.cpp
WebCore/dom/NodeList.h
WebCore/html/HTMLFormElement.cpp
WebCore/html/HTMLFormElement.h
WebCore/html/HTMLGenericFormElement.cpp
WebCore/html/HTMLGenericFormElement.h
WebCore/html/HTMLInputElement.cpp

index d1526e314f5130f9c41c5aef5a9a13771b6a683b..e4a728520214e6f60601e53e7d5f60b3ef6eeb08 100644 (file)
@@ -1,3 +1,14 @@
+2007-03-15  Beth Dakin  <bdakin@apple.com>
+
+        Rubber-stamped by Adele.
+
+        Rolling out http://trac.webkit.org/projects/webkit/changeset/20148 
+        (which is a fix for http://bugs.webkit.org/show_bug.cgi?id=12595 
+        and rdar://4722863) because it causes a horrible memory-trasher.
+
+        * fast/forms/old-names-expected.txt: Removed.
+        * fast/forms/old-names.html: Removed.
+
 2007-03-14  Oliver Hunt  <oliver@apple.com>
 
         Reviewed by Adele.
diff --git a/LayoutTests/fast/forms/old-names-expected.txt b/LayoutTests/fast/forms/old-names-expected.txt
deleted file mode 100644 (file)
index 72a6008..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-This tests accessing form elements by name. IE only lets you look up names under the first name the element had and does not respond to name changes. Firefox will let each element be looked up under its original name as long as no actual element has that name. This test has been written to expect the Firefox behavior. This original name quirk applies only to the syntax form.name and not to the form.elements collection.
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-PASS form.length is 2
-PASS form.original is a
-PASS form.originalB is b
-PASS form.second is undefined
-PASS form.third is undefined
-PASS form.elements.original is a
-PASS form.elements.originalB is b
-PASS form.elements.second is undefined
-PASS form.elements.third is undefined
-
-now change the form item a's name to second
-
-PASS form.length is 2
-PASS form.original is a
-PASS form.originalB is b
-PASS form.second is a
-PASS form.third is undefined
-PASS form.elements.original is undefined
-PASS form.elements.originalB is b
-PASS form.elements.second is a
-PASS form.elements.third is undefined
-
-now change the form item a's name to third
-
-PASS form.length is 2
-PASS form.original is a
-PASS form.originalB is b
-PASS form.second is a
-PASS form.third is a
-PASS form.elements.original is undefined
-PASS form.elements.originalB is b
-PASS form.elements.second is undefined
-PASS form.elements.third is a
-
-now change form item b's name to second
-
-PASS form.length is 2
-PASS form.original is a
-PASS form.originalB is b
-PASS form.second is b
-PASS form.elements.original is undefined
-PASS form.elements.originalB is undefined
-PASS form.elements.second is b
-
-now change a form item b's name to third
-
-PASS form.length is 2
-PASS form.original is a
-PASS form.originalB is b
-PASS form.second is b
-PASS form.third.length is 2
-PASS form.third.item(0) is a
-PASS form.third.item(1) is b
-PASS form.elements.original is undefined
-PASS form.elements.originalB is undefined
-PASS form.elements.second is undefined
-PASS form.elements.third.length is 2
-PASS form.elements.third.item(0) is a
-PASS form.elements.third.item(1) is b
-
-now remove element a
-
-PASS form.length is 1
-PASS form.original is a
-PASS form.originalB is b
-PASS form.second is b
-PASS form.third is b
-PASS form.elements.original is undefined
-PASS form.elements.originalB is undefined
-PASS form.elements.second is undefined
-PASS form.elements.third is b
-
diff --git a/LayoutTests/fast/forms/old-names.html b/LayoutTests/fast/forms/old-names.html
deleted file mode 100644 (file)
index e8a7c0b..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-<html>
-<head>
-<link rel="stylesheet" type="text/css" href="../js/resources/js-test-style.css">
-<script src="../js/resources/js-test-pre.js"></script>
-<script>
-function runTest()
-{
-    description("This tests accessing form elements by name. "
-        + "IE only lets you look up names under the first name the element had and "
-        + "does not respond to name changes. Firefox will let each element be looked "
-        + "up under its original name as long as no actual element has that name. "
-        + "This test has been written to expect the Firefox behavior. "
-        + "This original name quirk applies only to the syntax form.name and not to "
-        + "the form.elements collection.");
-
-    form = document.getElementById('form');
-    a = document.getElementById('a');
-    b = document.getElementById('b');
-
-    shouldBe('form.length', '2');
-    shouldBe('form.original', 'a');
-    shouldBe('form.originalB', 'b');
-    shouldBe('form.second', 'undefined');
-    shouldBe('form.third', 'undefined');
-    shouldBe('form.elements.original', 'a');
-    shouldBe('form.elements.originalB', 'b');
-    shouldBe('form.elements.second', 'undefined');
-    shouldBe('form.elements.third', 'undefined');
-
-    debug('');
-    debug("now change the form item a's name to second");
-    debug('');
-
-    a.name="second";
-
-    shouldBe('form.length', '2');
-    shouldBe('form.original', 'a');
-    shouldBe('form.originalB', 'b');
-    shouldBe('form.second', 'a');
-    shouldBe('form.third', 'undefined');
-    shouldBe('form.elements.original', 'undefined');
-    shouldBe('form.elements.originalB', 'b');
-    shouldBe('form.elements.second', 'a');
-    shouldBe('form.elements.third', 'undefined');
-
-    debug('');
-    debug("now change the form item a's name to third");
-    debug('');
-
-    a.name="third";
-
-    shouldBe('form.length', '2');
-    shouldBe('form.original', 'a');
-    shouldBe('form.originalB', 'b');
-    shouldBe('form.second', 'a');
-    shouldBe('form.third', 'a');
-    shouldBe('form.elements.original', 'undefined');
-    shouldBe('form.elements.originalB', 'b');
-    shouldBe('form.elements.second', 'undefined');
-    shouldBe('form.elements.third', 'a');
-
-    debug('');
-    debug("now change form item b's name to second");
-    debug('');
-
-    b.name="second";
-
-    shouldBe('form.length', '2');
-    shouldBe('form.original', 'a');
-    shouldBe('form.originalB', 'b');
-    shouldBe('form.second', 'b');
-    shouldBe('form.elements.original', 'undefined');
-    shouldBe('form.elements.originalB', 'undefined');
-    shouldBe('form.elements.second', 'b');
-
-    debug('');
-    debug("now change a form item b's name to third");
-    debug('');
-
-    form.originalB.name="third";
-
-    shouldBe('form.length', '2');
-    shouldBe('form.original', 'a');
-    shouldBe('form.originalB', 'b');
-    shouldBe('form.second', 'b');
-    shouldBe('form.third.length', '2');
-    shouldBe('form.third.item(0)', 'a');
-    shouldBe('form.third.item(1)', 'b');
-    shouldBe('form.elements.original', 'undefined');
-    shouldBe('form.elements.originalB', 'undefined');
-    shouldBe('form.elements.second', 'undefined');
-    shouldBe('form.elements.third.length', '2');
-    shouldBe('form.elements.third.item(0)', 'a');
-    shouldBe('form.elements.third.item(1)', 'b');
-
-    debug('');
-    debug("now remove element a");
-    debug('');
-
-    form.removeChild(a);
-
-    shouldBe('form.length', '1');
-    shouldBe('form.original', 'a');
-    shouldBe('form.originalB', 'b');
-    shouldBe('form.second', 'b');
-    shouldBe('form.third', 'b');
-    shouldBe('form.elements.original', 'undefined');
-    shouldBe('form.elements.originalB', 'undefined');
-    shouldBe('form.elements.second', 'undefined');
-    shouldBe('form.elements.third', 'b');
-}
-</script>
-</head>
-<body onload="runTest()">
-<form id='form'>
-<input type='hidden' id='a' name='original'>
-<input type='hidden' id='b' name='originalB'>
-</form>
-<p id="description"></p>
-<div id="console"></div>
-</body>
-</html>
index 30898c08f93ea5f3dd510b4453c6a9b59f1a5cad..2d0e76650d9f95e19cbfa3bc6c0c5c3b298b2bd9 100644 (file)
@@ -1,3 +1,67 @@
+2007-03-15  Beth Dakin  <bdakin@apple.com>
+
+        Rubber-stamped by Adele.
+
+        Rolling out http://trac.webkit.org/projects/webkit/changeset/20148 
+        (which is a fix for http://bugs.webkit.org/show_bug.cgi?id=12595 
+        and rdar://4722863) because it causes a horrible memory-trasher. 
+
+        * bindings/js/JSHTMLFormElementCustom.cpp:
+        (WebCore::JSHTMLFormElement::canGetItemsForName):
+        (WebCore::JSHTMLFormElement::nameGetter):
+        * bindings/js/kjs_dom.cpp:
+        (KJS::):
+        (KJS::DOMNamedNodesCollection::DOMNamedNodesCollection):
+        (KJS::DOMNamedNodesCollection::lengthGetter):
+        (KJS::DOMNamedNodesCollection::indexGetter):
+        (KJS::DOMNamedNodesCollection::getOwnPropertySlot):
+        * bindings/js/kjs_dom.h:
+        (KJS::DOMNamedNodesCollection::classInfo):
+        * bindings/js/kjs_html.cpp:
+        (KJS::JSHTMLCollection::getNamedItems):
+        * dom/ChildNodeList.cpp:
+        (WebCore::ChildNodeList::ChildNodeList):
+        (WebCore::ChildNodeList::length):
+        (WebCore::ChildNodeList::item):
+        (WebCore::ChildNodeList::nodeMatches):
+        * dom/ChildNodeList.h:
+        * dom/NameNodeList.cpp:
+        (WebCore::NameNodeList::NameNodeList):
+        (WebCore::NameNodeList::item):
+        (WebCore::NameNodeList::nodeMatches):
+        * dom/NameNodeList.h:
+        (WebCore::NameNodeList::rootNodeAttributeChanged):
+        * dom/Node.cpp:
+        (WebCore::TagNodeList::TagNodeList):
+        (WebCore::TagNodeList::nodeMatches):
+        (WebCore::Node::registerNodeList):
+        (WebCore::Node::unregisterNodeList):
+        * dom/Node.h:
+        * dom/NodeList.cpp:
+        (WebCore::NodeList::NodeList):
+        (WebCore::NodeList::~NodeList):
+        (WebCore::NodeList::recursiveLength):
+        (WebCore::NodeList::itemForwardsFromCurrent):
+        (WebCore::NodeList::itemBackwardsFromCurrent):
+        (WebCore::NodeList::recursiveItem):
+        (WebCore::NodeList::itemWithName):
+        (WebCore::NodeList::rootNodeChildrenChanged):
+        * dom/NodeList.h:
+        (WebCore::NodeList::rootNodeAttributeChanged):
+        * html/HTMLFormElement.cpp:
+        (WebCore::HTMLFormElement::HTMLFormElement):
+        (WebCore::HTMLFormElement::~HTMLFormElement):
+        (WebCore::HTMLFormElement::formData):
+        (WebCore::HTMLFormElement::parseMappedAttribute):
+        (WebCore::HTMLFormElement::removeFormElement):
+        * html/HTMLFormElement.h:
+        * html/HTMLGenericFormElement.cpp:
+        (WebCore::HTMLGenericFormElement::parseMappedAttribute):
+        (WebCore::HTMLGenericFormElement::insertedIntoTree):
+        * html/HTMLGenericFormElement.h:
+        * html/HTMLInputElement.cpp:
+        (WebCore::HTMLInputElement::parseMappedAttribute):
+
 2007-03-15  Geoffrey Garen  <ggaren@apple.com>
 
         Added an assert to help catch a bug. Hopefully someone will hit it!
index d0922a0c1a51a8f12cfb2b9781e2abf2e98a8acb..51df9456070ea24da6dc583beb5f29df0bb19745 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -26,9 +26,8 @@
 #include "config.h"
 #include "JSHTMLFormElement.h"
 
-#include "HTMLCollection.h"
-#include "HTMLGenericFormElement.h"
 #include "HTMLFormElement.h"
+#include "HTMLCollection.h"
 
 using namespace KJS;
 
@@ -36,18 +35,17 @@ namespace WebCore {
 
 bool JSHTMLFormElement::canGetItemsForName(ExecState* exec, HTMLFormElement* form, const AtomicString& propertyName)
 {
-    if (!JSHTMLCollection(exec, form->elements().get()).getNamedItems(exec, propertyName)->isUndefined())
-        return true;
-    return !!form->oldNamedElement(propertyName);
+    // FIXME: ideally there should be a lighter-weight way of doing this
+    JSValue* namedItems = JSHTMLCollection(exec, form->elements().get()).getNamedItems(exec, propertyName);
+    return !namedItems->isUndefined();
 }
 
 JSValue* JSHTMLFormElement::nameGetter(ExecState* exec, JSObject*, const Identifier& propertyName, const PropertySlot& slot)
 {
-    HTMLFormElement* form = static_cast<HTMLFormElement*>(static_cast<JSHTMLElement*>(slot.slotBase())->impl());
-    JSValue* items = JSHTMLCollection(exec, form->elements().get()).getNamedItems(exec, propertyName);
-    if (!items->isUndefined())
-        return items;
-    return toJS(exec, form->oldNamedElement(propertyName));
+    JSHTMLElement* thisObj = static_cast<JSHTMLElement*>(slot.slotBase());
+    HTMLFormElement* form = static_cast<HTMLFormElement*>(thisObj->impl());
+    
+    return JSHTMLCollection(exec, form->elements().get()).getNamedItems(exec, propertyName);
 }
 
 }
index df6e8b45addf9935ad880ed05819ced88f6b1d59..81038fd90e92c57c01584a9402b9cbcd41f29a2d 100644 (file)
@@ -1121,4 +1121,59 @@ JSObject* getDOMExceptionConstructor(ExecState* exec)
   return cacheGlobalObject<DOMExceptionConstructor>(exec, "[[DOMException.constructor]]");
 }
 
+// -------------------------------------------------------------------------
+
+const ClassInfo DOMNamedNodesCollection::info = { "Collection", 0, 0, 0 };
+
+// Such a collection is usually very short-lived, it only exists
+// for constructs like document.forms.<name>[1],
+// so it shouldn't be a problem that it's storing all the nodes (with the same name). (David)
+DOMNamedNodesCollection::DOMNamedNodesCollection(ExecState* exec, const Vector<RefPtr<Node> >& nodes)
+  : m_nodes(nodes)
+{
+    setPrototype(exec->lexicalInterpreter()->builtinObjectPrototype());
+}
+
+JSValue* DOMNamedNodesCollection::lengthGetter(ExecState* exec, JSObject* originalObject, const Identifier& propertyName, const PropertySlot& slot)
+{
+  DOMNamedNodesCollection *thisObj = static_cast<DOMNamedNodesCollection*>(slot.slotBase());
+  return jsNumber(thisObj->m_nodes.size());
+}
+
+JSValue* DOMNamedNodesCollection::indexGetter(ExecState* exec, JSObject* originalObject, const Identifier& propertyName, const PropertySlot& slot)
+{
+  DOMNamedNodesCollection *thisObj = static_cast<DOMNamedNodesCollection*>(slot.slotBase());
+  return toJS(exec, thisObj->m_nodes[slot.index()].get());
+}
+
+bool DOMNamedNodesCollection::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
+{
+  if (propertyName == lengthPropertyName) {
+    slot.setCustom(this, lengthGetter);
+    return true;
+  }
+
+  // array index ?
+  bool ok;
+  unsigned idx = propertyName.toUInt32(&ok);
+  if (ok && idx < m_nodes.size()) {
+    slot.setCustomIndex(this, idx, indexGetter);
+    return true;
+  }
+
+  // For IE compatibility, we need to be able to look up elements in a
+  // document.formName.name result by id as well as be index.
+
+  AtomicString atomicPropertyName = propertyName;
+  for (unsigned i = 0; i < m_nodes.size(); i++) {
+    Node* node = m_nodes[i].get();
+    if (node->hasAttributes() && node->attributes()->id() == atomicPropertyName) {
+      slot.setCustomIndex(this, i, indexGetter);
+      return true;
+    }
+  }
+
+  return DOMObject::getOwnPropertySlot(exec, propertyName, slot);
+}
+
 } // namespace
index 7fb1b1c0d3c44527e06183cbb4409165016ff1d2..c57c96ec14c53686e80ca35b044ff15ecf4a397a 100644 (file)
@@ -142,6 +142,21 @@ namespace KJS {
   JSObject* getNodeConstructor(ExecState*);
   JSObject* getDOMExceptionConstructor(ExecState*);
 
+  // Internal class, used for the collection return by e.g. document.forms.myinput
+  // when multiple nodes have the same name.
+  class DOMNamedNodesCollection : public DOMObject {
+  public:
+    DOMNamedNodesCollection(ExecState *exec, const Vector<RefPtr<WebCore::Node> >& nodes);
+    virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
+    virtual const ClassInfo* classInfo() const { return &info; }
+    static const ClassInfo info;
+private:
+    static JSValue *lengthGetter(ExecState* exec, JSObject *, const Identifier&, const PropertySlot& slot);
+    static JSValue *indexGetter(ExecState* exec, JSObject *, const Identifier&, const PropertySlot& slot);
+
+    Vector<RefPtr<WebCore::Node> > m_nodes;
+  };
+
 } // namespace
 
 #endif
index 56ab4753fb8a09beb58300fa7d0979c271db121e..7bf88a2ca2285688b9c349295da132a5e725ea8e 100644 (file)
@@ -1,7 +1,8 @@
 // -*- c-basic-offset: 4 -*-
 /*
+ *  This file is part of the KDE libraries
  *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
- *  Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
+ *  Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Lesser General Public
@@ -68,17 +69,6 @@ using namespace EventNames;
 
 namespace KJS {
 
-class VectorNodeList : public NodeList {
-public:
-    VectorNodeList(const Vector<RefPtr<Node> >& nodes) : m_nodes(nodes) { }
-
-    virtual unsigned length() const { return m_nodes.size(); }
-    virtual Node* item(unsigned index) const { return index < m_nodes.size() ? m_nodes[index].get() : 0; }
-
-private:
-    Vector<RefPtr<Node> > m_nodes;
-};
-
 class HTMLElementFunction : public InternalFunctionImp {
 public:
   HTMLElementFunction(ExecState* exec, int i, int len, const Identifier& name);
@@ -1560,7 +1550,7 @@ JSValue *JSHTMLCollection::getNamedItems(ExecState* exec, const Identifier &prop
     if (namedItems.size() == 1)
         return toJS(exec, namedItems[0].get());
 
-    return toJS(exec, new VectorNodeList(namedItems));
+    return new DOMNamedNodesCollection(exec, namedItems);
 }
 
 JSValue* JSHTMLCollectionPrototypeFunction::callAsFunction(ExecState* exec, JSObject* thisObj, const List &args)
index 3f94aaf30373676d2616003ba6b83d231ec9fb33..604eb998a1d0b7ce4e5e91f5425488f66ee6dfe2 100644 (file)
 
 #include "config.h"
 #include "ChildNodeList.h"
-
-#include "Element.h"
+#include "Node.h"
 
 using namespace WebCore;
 
 namespace WebCore {
 
-ChildNodeList::ChildNodeList(Node* n)
-    : TreeNodeList(n)
+ChildNodeList::ChildNodeList( Node *n )
+    : NodeList(n)
 {
 }
 
@@ -42,7 +41,8 @@ unsigned ChildNodeList::length() const
         return cachedLength;
 
     unsigned len = 0;
-    for (Node* n = rootNode->firstChild(); n; n = n->nextSibling())
+    Node *n;
+    for(n = rootNode->firstChild(); n != 0; n = n->nextSibling())
         len++;
 
     cachedLength = len;
@@ -51,10 +51,10 @@ unsigned ChildNodeList::length() const
     return len;
 }
 
-Node *ChildNodeList::item(unsigned index) const
+Node *ChildNodeList::item ( unsigned index ) const
 {
     unsigned int pos = 0;
-    Noden = rootNode->firstChild();
+    Node *n = rootNode->firstChild();
 
     if (isItemCacheValid) {
         if (index == lastItemOffset) {
@@ -80,9 +80,9 @@ Node *ChildNodeList::item(unsigned index) const
     return 0;
 }
 
-bool ChildNodeList::elementMatches(Element* element) const
+bool ChildNodeList::nodeMatches(Node *testNode) const
 {
-    return element->parentNode() == rootNode;
+    return testNode->parentNode() == rootNode;
 }
 
 }
index 61d99a5344a028e66d18e02478a4e38a6386d089..56aa44740a587b3999d4dba5d55867bde9b5f63a 100644 (file)
@@ -29,7 +29,7 @@
 
 namespace WebCore {
 
-class ChildNodeList : public TreeNodeList {
+class ChildNodeList : public NodeList {
 public:
     ChildNodeList(Node*);
 
@@ -37,7 +37,7 @@ public:
     virtual Node* item(unsigned index) const;
 
 protected:
-    virtual bool elementMatches(Element*) const;
+    virtual bool nodeMatches(Node* testNode) const;
 };
 
 } // namespace WebCore
index 4c4da826476dc58bebf3d67b9a5b6777aef2dec2..ec4718fa188c79ab51b4d656cb198dca1042ffb6 100644 (file)
 #include "Element.h"
 #include "HTMLNames.h"
 
+using namespace WebCore;
+
 namespace WebCore {
 
 using namespace HTMLNames;
 
-NameNodeList::NameNodeList(Node* n, const String &t)
-    : TreeNodeList(n)
-    , nodeName(t)
+NameNodeList::NameNodeList(Node *n, const String &t)
+  : NodeList(n), nodeName(t)
 {
 }
 
@@ -43,14 +44,14 @@ unsigned NameNodeList::length() const
     return recursiveLength();
 }
 
-Node *NameNodeList::item(unsigned index) const
+Node *NameNodeList::item (unsigned index) const
 {
     return recursiveItem(index);
 }
 
-bool NameNodeList::elementMatches(Element* element) const
+bool NameNodeList::nodeMatches(Node *testNode) const
 {
-    return element->getAttribute(nameAttr) == nodeName;
+    return static_cast<Element*>(testNode)->getAttribute(nameAttr) == nodeName;
 }
 
 }
index 97a845d23e247510dc0c671a067942b43095642f..ff2676f8cefa58657624a37d31b31f6b563e8c72 100644 (file)
@@ -33,7 +33,7 @@ namespace WebCore {
 /**
  * NodeList which lists all Nodes in a Element with a given "name=" tag
  */
-class NameNodeList : public TreeNodeList {
+class NameNodeList : public NodeList {
 public:
     NameNodeList(Node* doc, const String& name);
 
@@ -44,10 +44,10 @@ public:
 
     // Other methods (not part of DOM)
     virtual void rootNodeChildrenChanged() { }
-    virtual void rootNodeAttributeChanged() { TreeNodeList::rootNodeChildrenChanged(); }
+    virtual void rootNodeAttributeChanged() { NodeList::rootNodeChildrenChanged(); }
 
 protected:
-    virtual bool elementMatches(Element*) const;
+    virtual bool nodeMatches(Node* testNode) const;
 
     String nodeName;
 };
index b42bbf4c19fb35fd8c83232aba9b3f9a6649089a..74403a66f16e800360f30429a64513e621e5eb3c 100644 (file)
@@ -50,22 +50,26 @@ using namespace HTMLNames;
 /**
  * NodeList which lists all Nodes in a document with a given tag name
  */
-class TagNodeList : public TreeNodeList {
+class TagNodeList : public NodeList
+{
 public:
-    TagNodeList(Node*, const AtomicString& namespaceURI, const AtomicString& localName);
+    TagNodeList(Node *n, const AtomicString& namespaceURI, const AtomicString& localName);
 
+    // DOM methods overridden from  parent classes
     virtual unsigned length() const;
-    virtual Node *item(unsigned index) const;
+    virtual Node *item (unsigned index) const;
+
+    // Other methods (not part of DOM)
 
 protected:
-    virtual bool elementMatches(Element*) const;
+    virtual bool nodeMatches(Node *testNode) const;
 
     AtomicString m_namespaceURI;
     AtomicString m_localName;
 };
 
 TagNodeList::TagNodeList(Node *n, const AtomicString& namespaceURI, const AtomicString& localName)
-    : TreeNodeList(n), 
+    : NodeList(n), 
       m_namespaceURI(namespaceURI), 
       m_localName(localName)
 {
@@ -81,8 +85,11 @@ Node *TagNodeList::item(unsigned index) const
     return recursiveItem(index);
 }
 
-bool TagNodeList::elementMatches(Element* testNode) const
+bool TagNodeList::nodeMatches(Node *testNode) const
 {
+    if (!testNode->isElementNode())
+        return false;
+
     if (m_namespaceURI != starAtom && m_namespaceURI != testNode->namespaceURI())
         return false;
     
@@ -420,14 +427,14 @@ unsigned Node::nodeIndex() const
     return count;
 }
 
-void Node::registerNodeList(TreeNodeList* list)
+void Node::registerNodeList(NodeList* list)
 {
     if (!m_nodeLists)
         m_nodeLists = new NodeListSet;
     m_nodeLists->add(list);
 }
 
-void Node::unregisterNodeList(TreeNodeList* list)
+void Node::unregisterNodeList(NodeList* list)
 {
     if (!m_nodeLists)
         return;
index 873c67067e522b50ce3cb77e66819ac16eb625ee..3dfaee42e36b1c5484e1fe05b9a4f76a61e43864 100644 (file)
@@ -54,7 +54,6 @@ class RenderArena;
 class RenderObject;
 class RenderStyle;
 class TextStream;
-class TreeNodeList;
 
 typedef int ExceptionCode;
 
@@ -440,8 +439,8 @@ public:
     void showTreeAndMark(const Node* markedNode1, const char* markedLabel1, const Node* markedNode2 = 0, const char* markedLabel2 = 0) const;
 #endif
 
-    void registerNodeList(TreeNodeList*);
-    void unregisterNodeList(TreeNodeList*);
+    void registerNodeList(NodeList*);
+    void unregisterNodeList(NodeList*);
     void notifyNodeListsChildrenChanged();
     void notifyLocalNodeListsChildrenChanged();
     void notifyNodeListsAttributeChanged();
@@ -457,7 +456,7 @@ private: // members
     RenderObject* m_renderer;
 
 protected:
-    typedef HashSet<TreeNodeList*> NodeListSet;
+    typedef HashSet<NodeList*> NodeListSet;
     NodeListSet* m_nodeLists;
 
     short m_tabIndex;
index b0330ebe13abab7e46c5ad6388a43222a95db2bf..2191dfd5c39bf492ee42df249ed02abef996f5e5 100644 (file)
@@ -1,8 +1,10 @@
 /**
+ * This file is part of the DOM implementation for KDE.
+ *
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 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
 
 namespace WebCore {
 
-NodeList::~NodeList()
-{
-}
-
-Node* NodeList::itemWithName(const AtomicString& name) const
-{
-    unsigned l = length();
-    for (unsigned i = 0; i < l; i++) {
-        Node* node = item(i);
-        if (node->isElementNode() && static_cast<Element*>(node)->getIDAttribute() == name)
-            return node;
-    }
-    return 0;
-}
-
-TreeNodeList::TreeNodeList(PassRefPtr<Node> _rootNode)
+NodeList::NodeList(PassRefPtr<Node> _rootNode)
     : rootNode(_rootNode),
       isLengthCacheValid(false),
       isItemCacheValid(false)
@@ -51,12 +38,12 @@ TreeNodeList::TreeNodeList(PassRefPtr<Node> _rootNode)
     rootNode->registerNodeList(this);
 }    
 
-TreeNodeList::~TreeNodeList()
+NodeList::~NodeList()
 {
     rootNode->unregisterNodeList(this);
 }
 
-unsigned TreeNodeList::recursiveLength(Node* start) const
+unsigned NodeList::recursiveLength(Node* start) const
 {
     if (!start)
         start = rootNode.get();
@@ -68,7 +55,8 @@ unsigned TreeNodeList::recursiveLength(Node* start) const
 
     for (Node* n = start->firstChild(); n; n = n->nextSibling())
         if (n->isElementNode()) {
-            len += elementMatches(static_cast<Element*>(n));
+            if (nodeMatches(n))
+                len++;
             len += recursiveLength(n);
         }
 
@@ -80,13 +68,13 @@ unsigned TreeNodeList::recursiveLength(Node* start) const
     return len;
 }
 
-Node* TreeNodeList::itemForwardsFromCurrent(Node* start, unsigned offset, int remainingOffset) const
+Node* NodeList::itemForwardsFromCurrent(Node* start, unsigned offset, int remainingOffset) const
 {
     ASSERT(remainingOffset >= 0);
 
     for (Node *n = start; n; n = n->traverseNextNode(rootNode.get())) {
         if (n->isElementNode()) {
-            if (elementMatches(static_cast<Element*>(n))) {
+            if (nodeMatches(n)) {
                 if (!remainingOffset) {
                     lastItem = n;
                     lastItemOffset = offset;
@@ -101,12 +89,12 @@ Node* TreeNodeList::itemForwardsFromCurrent(Node* start, unsigned offset, int re
     return 0; // no matching node in this subtree
 }
 
-Node* TreeNodeList::itemBackwardsFromCurrent(Node* start, unsigned offset, int remainingOffset) const
+Node* NodeList::itemBackwardsFromCurrent(Node* start, unsigned offset, int remainingOffset) const
 {
     ASSERT(remainingOffset < 0);
     for (Node *n = start; n; n = n->traversePreviousNode(rootNode.get())) {
         if (n->isElementNode()) {
-            if (elementMatches(static_cast<Element*>(n))) {
+            if (nodeMatches(n)) {
                 if (!remainingOffset) {
                     lastItem = n;
                     lastItemOffset = offset;
@@ -121,7 +109,7 @@ Node* TreeNodeList::itemBackwardsFromCurrent(Node* start, unsigned offset, int r
     return 0; // no matching node in this subtree
 }
 
-Node* TreeNodeList::recursiveItem(unsigned offset, Node* start) const
+Node* NodeList::recursiveItem(unsigned offset, Node* start) const
 {
     int remainingOffset = offset;
     if (!start) {
@@ -142,11 +130,12 @@ Node* TreeNodeList::recursiveItem(unsigned offset, Node* start) const
         return itemForwardsFromCurrent(start, offset, remainingOffset);
 }
 
-Node* TreeNodeList::itemWithName(const AtomicString& name) const
+Node* NodeList::itemWithName(const AtomicString& elementId) const
 {
     if (rootNode->isDocumentNode() || rootNode->inDocument()) {
-        Element* node = rootNode->document()->getElementById(name);
-        if (!node || !elementMatches(node))
+        Node* node = rootNode->document()->getElementById(elementId);
+
+        if (!node || !nodeMatches(node))
             return 0;
 
         for (Node* p = node->parentNode(); p; p = p->parentNode())
@@ -156,14 +145,17 @@ Node* TreeNodeList::itemWithName(const AtomicString& name) const
         return 0;
     }
 
-    return NodeList::itemWithName(name);
-}
+    unsigned l = length();
+    for (unsigned i = 0; i < l; i++) {
+        Node* node = item(i);
+        if (node->isElementNode() && static_cast<Element*>(node)->getIDAttribute() == elementId)
+            return node;
+    }
 
-void TreeNodeList::rootNodeAttributeChanged()
-{
+    return 0;
 }
 
-void TreeNodeList::rootNodeChildrenChanged()
+void NodeList::rootNodeChildrenChanged()
 {
     isLengthCacheValid = false;
     isItemCacheValid = false;     
index 55eb3169953e506db9b044d1390531f610f00985..6c031e2cb2ffa2ebc47a0a5f7f569e9a47b3cd7d 100644 (file)
@@ -1,8 +1,10 @@
 /*
+ * This file is part of the DOM implementation for KDE.
+ *
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 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
 namespace WebCore {
 
 class AtomicString;
-class Element;
 class Node;
 
 class NodeList : public Shared<NodeList> {
 public:
+    NodeList(PassRefPtr<Node> rootNode);
     virtual ~NodeList();
 
+    // DOM methods & attributes for NodeList
     virtual unsigned length() const = 0;
     virtual Node* item(unsigned index) const = 0;
-    virtual Node* itemWithName(const AtomicString&) const;
-};
-
-// FIXME: Move this to its own source file.
-class TreeNodeList : public NodeList {
-public:
-    TreeNodeList(PassRefPtr<Node> rootNode);
-    virtual ~TreeNodeList();
-
-    virtual Node* itemWithName(const AtomicString&) const;
+    Node* itemWithName(const AtomicString&) const;
 
+    // Other methods (not part of DOM)
     virtual void rootNodeChildrenChanged();
-    virtual void rootNodeAttributeChanged();
+    virtual void rootNodeAttributeChanged() {}
 
 protected:
-    // helper functions for searching all elements in a tree
+    // helper functions for searching all ElementImpls in a tree
     unsigned recursiveLength(Node* start = 0) const;
-    Node* recursiveItem(unsigned offset, Node* start = 0) const;
-    virtual bool elementMatches(Element*) const = 0;
+    Node* recursiveItem (unsigned offset, Node* start = 0) const;
+    virtual bool nodeMatches(Node* testNode) const = 0;
 
     RefPtr<Node> rootNode;
     mutable int cachedLength;
index 89e724ff0dec043e375aeea5a889cff23040bdfb..7396cf4db3015e33c4d2d80d7aa22ecdab7a308e 100644 (file)
@@ -49,23 +49,21 @@ using namespace HTMLNames;
 
 HTMLFormElement::HTMLFormElement(Document* doc)
     : HTMLElement(formTag, doc)
-    , m_oldNames(0)
-    , collectionInfo(0)
-    , m_enctype("application/x-www-form-urlencoded")
-    , m_post(false)
-    , m_multipart(false)
-    , m_autocomplete(true)
-    , m_insubmit(false)
-    , m_doingsubmit(false)
-    , m_inreset(false)
-    , m_malformed(false)
-    , m_preserveAcrossRemove(false)
 {
+    collectionInfo = 0;
+    m_post = false;
+    m_multipart = false;
+    m_autocomplete = true;
+    m_insubmit = false;
+    m_doingsubmit = false;
+    m_inreset = false;
+    m_enctype = "application/x-www-form-urlencoded";
+    m_malformed = false;
+    m_preserveAcrossRemove = false;
 }
 
 HTMLFormElement::~HTMLFormElement()
 {
-    delete m_oldNames;
     delete collectionInfo;
     
     for (unsigned i = 0; i < formElements.size(); ++i)
@@ -274,19 +272,19 @@ PassRefPtr<FormData> HTMLFormElement::formData(const char* boundary) const
                     // include the filename
                     if (current->hasLocalName(inputTag) &&
                         static_cast<HTMLInputElement*>(current)->inputType() == HTMLInputElement::FILE) {
-                        const AtomicString& path = static_cast<HTMLInputElement*>(current)->value();
+                        String path = static_cast<HTMLInputElement*>(current)->value();
 
                         // FIXME: This won't work if the filename includes a " mark,
                         // or control characters like CR or LF. This also does strange
                         // things if the filename includes characters you can't encode
                         // in the website's character set.
                         hstr += "; filename=\"";
-                        int start = path.domString().reverseFind('/') + 1;
+                        int start = path.reverseFind('/') + 1;
                         int length = path.length() - start;
                         hstr += encoding.encode(reinterpret_cast<const UChar*>(path.characters() + start), length, true);
                         hstr += "\"";
 
-                        if (!path.isEmpty()) {
+                        if (!static_cast<HTMLInputElement*>(current)->value().isEmpty()) {
                             DeprecatedString mimeType = MimeTypeRegistry::getMIMETypeForPath(path).deprecatedString();
                             if (!mimeType.isEmpty()) {
                                 hstr += "\r\nContent-Type: ";
@@ -500,7 +498,7 @@ void HTMLFormElement::parseMappedAttribute(MappedAttribute *attr)
     else if (attr->name() == onresetAttr)
         setHTMLEventListener(resetEvent, attr);
     else if (attr->name() == nameAttr) {
-        const AtomicString& newNameAttr = attr->value();
+        String newNameAttr = attr->value();
         if (inDocument() && document()->isHTMLDocument()) {
             HTMLDocument *doc = static_cast<HTMLDocument *>(document());
             doc->removeNamedItem(oldNameAttr);
@@ -561,30 +559,11 @@ void HTMLFormElement::removeFormElement(HTMLGenericFormElement* e)
         HTMLGenericFormElement* currentCheckedRadio = document()->checkedRadioButtonForGroup(e->name().impl(), this);
         if (currentCheckedRadio == e)
             document()->removeRadioButtonGroup(e->name().impl(), this);
-        formElementNameChanged(e, e->name());
     }
     removeFromVector(formElements, e);
     document()->incDOMTreeVersion();
 }
 
-void HTMLFormElement::formElementNameChanged(HTMLGenericFormElement* element, const AtomicString& oldName)
-{
-    if (oldName.isEmpty())
-        return;
-    if (!m_oldNames)
-        m_oldNames = new OldNameMap;
-    m_oldNames->set(oldName.impl(), element);
-}
-
-HTMLGenericFormElement* HTMLFormElement::oldNamedElement(const AtomicString& oldName) const
-{
-    if (oldName.isEmpty())
-        return 0;
-    if (!m_oldNames)
-        return 0;
-    return m_oldNames->get(oldName.impl()).get();
-}
-
 bool HTMLFormElement::isURLAttribute(Attribute *attr) const
 {
     return attr->name() == actionAttr;
index 330d31da90821da110fa37e50bc412c8a51bb4ec..d6409d4540ec18481648fccf8d9995a3ef819e83 100644 (file)
@@ -65,8 +65,6 @@ public:
 
     void registerFormElement(HTMLGenericFormElement*);
     void removeFormElement(HTMLGenericFormElement*);
-    void formElementNameChanged(HTMLGenericFormElement*, const AtomicString& oldName);
-
     void registerImgElement(HTMLImageElement*);
     void removeImgElement(HTMLImageElement*);
 
@@ -101,8 +99,6 @@ public:
     virtual String target() const;
     void setTarget(const String&);
 
-    HTMLGenericFormElement* oldNamedElement(const AtomicString& oldName) const;
-
     // FIXME: Change this to be private after getting rid of all the clients.
     Vector<HTMLGenericFormElement*> formElements;
 
@@ -113,15 +109,13 @@ private:
 
     friend class HTMLFormCollection;
 
-    typedef HashMap<RefPtr<AtomicStringImpl>, RefPtr<HTMLGenericFormElement> > OldNameMap;
-
-    OldNameMap* m_oldNames;
     HTMLCollection::CollectionInfo* collectionInfo;
 
     Vector<HTMLImageElement*> imgElements;
     String m_url;
     String m_target;
     String m_enctype;
+    String m_boundary;
     String m_acceptcharset;
     bool m_post : 1;
     bool m_multipart : 1;
index a0c4df063414fed97e1c3f80251280eee302ce2c..e9d0c10d970a1a13aa61f05c8ca3139d26342703 100644 (file)
@@ -1,8 +1,10 @@
 /*
+ * This file is part of the DOM implementation for KDE.
+ *
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
  *           (C) 2006 Alexey Proskuryakov (ap@nypop.com)
  *
  * This library is free software; you can redistribute it and/or
@@ -53,13 +55,10 @@ HTMLGenericFormElement::~HTMLGenericFormElement()
         m_form->removeFormElement(this);
 }
 
-void HTMLGenericFormElement::parseMappedAttribute(MappedAttributeattr)
+void HTMLGenericFormElement::parseMappedAttribute(MappedAttribute *attr)
 {
     if (attr->name() == nameAttr) {
-        if (m_form) {
-            m_form->formElementNameChanged(this, m_oldName);
-            m_oldName = name();
-        }
+        // Do nothing.
     } else if (attr->name() == disabledAttr) {
         bool oldDisabled = m_disabled;
         m_disabled = !attr->isNull();
@@ -101,10 +100,9 @@ void HTMLGenericFormElement::insertedIntoTree(bool deep)
         // setting a form, we will already have a non-null value for m_form, 
         // and so we don't need to do anything.
         m_form = getForm();
-        if (m_form) {
+        if (m_form)
             m_form->registerFormElement(this);
-            m_oldName = name();
-        } else
+        else
             if (isRadioButton() && !name().isEmpty() && isChecked())
                 document()->radioButtonChecked((HTMLInputElement*)this, m_form);
     }
index 6ae92ed58488d88c3ab10d323ac6239cd66b9b76..4b58a12c863798bfa2c101c76aac2bf79658920a 100644 (file)
@@ -106,7 +106,7 @@ private:
     bool m_disabled;
     bool m_readOnly;
     mutable bool m_valueMatchesRenderer;
-    AtomicString m_oldName;
+
 };
 
 } //namespace
index 7e25a45feeac391bb03434d2434bc47aa276b5fa..b1d8f046126f65a8de657d9492055b7c3b61dd6f 100644 (file)
@@ -591,7 +591,6 @@ void HTMLInputElement::parseMappedAttribute(MappedAttribute *attr)
             if (checked())
                 document()->radioButtonChecked(this, form());
         }
-        HTMLGenericFormElement::parseMappedAttribute(attr);
     } else if (attr->name() == autocompleteAttr) {
         m_autocomplete = !equalIgnoringCase(attr->value(), "off");
     } else if (attr->name() == typeAttr) {