Reviewed by Dave.
[WebKit-https.git] / WebCore / khtml / html / html_miscimpl.h
index 9455623..5cec109 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * This file is part of the DOM implementation for KDE.
  *
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  *
- * $Id$
  */
 #ifndef HTML_MISCIMPL_H
 #define HTML_MISCIMPL_H
 
 #include "html_elementimpl.h"
+#include "misc/shared.h"
 
 namespace DOM {
 
@@ -39,20 +39,20 @@ public:
 
     ~HTMLBaseFontElementImpl();
 
-    virtual const DOMString nodeName() const;
-    virtual ushort id() const;
+    virtual Id id() const;
 };
 
 // -------------------------------------------------------------------------
 
-class HTMLCollectionImpl : public DomShared
+class HTMLCollectionImpl : public khtml::Shared<HTMLCollectionImpl>
 {
     friend class DOM::HTMLCollection;
 public:
     enum Type {
         // from HTMLDocument
-        DOC_IMAGES,    // all IMG elements in the document
+        DOC_IMAGES = 0, // all IMG elements in the document
         DOC_APPLETS,   // all OBJECT and APPLET elements
+        DOC_EMBEDS,   // all EMBED elements
         DOC_FORMS,     // all FORMS
         DOC_LINKS,     // all A _and_ AREA elements with a value for href
         DOC_ANCHORS,      // all A elements with a value for name
@@ -65,30 +65,48 @@ public:
         SELECT_OPTIONS,
         // from HTMLMap
         MAP_AREAS,
-        DOC_ALL        // "all" elements
+        DOC_ALL,        // "all" elements (IE)
+        NODE_CHILDREN,   // first-level children (IE)
+        LAST_TYPE
     };
 
     HTMLCollectionImpl(NodeImpl *_base, int _tagId);
-
     virtual ~HTMLCollectionImpl();
+    
     unsigned long length() const;
-    NodeImpl *item ( unsigned long index ) const;
-    NodeImpl *namedItem ( const DOMString &name ) const;
+    
+    virtual NodeImpl *item ( unsigned long index ) const;
+    virtual NodeImpl *firstItem() const;
+    virtual NodeImpl *nextItem() const;
+
+    NodeImpl *namedItem ( const DOMString &name, bool caseSensitive = true ) const;
+    // In case of multiple items named the same way
+    NodeImpl *nextNamedItem( const DOMString &name ) const;
+
+    virtual QValueList<Node> namedItems( const DOMString &name ) const;
+
+    struct CollectionInfo {
+        CollectionInfo() : version(0), current(0), position(0), length(0), haslength(false) {}
+        unsigned int version;
+        NodeImpl *current;
+        unsigned int position;
+        unsigned int length;
+        bool haslength;
+     };
 
 protected:
-    virtual unsigned long calcLength(NodeImpl *current) const;
-    virtual NodeImpl *getItem(NodeImpl *current, int index, int &pos) const;
-    virtual NodeImpl *getNamedItem( NodeImpl *current, int attr_id,
-                            const DOMString &name ) const;
-   // the base node, the collection refers to
+    virtual NodeImpl *traverseNextItem(NodeImpl *start) const;
+    bool checkForNameMatch(NodeImpl *node, bool checkName, const DOMString &name, bool caseSensitive) const;
+    virtual unsigned long calcLength() const;
+    virtual void resetCollectionInfo() const;
+    // the base node, the collection refers to
     NodeImpl *base;
     // The collection list the following elements
     int type;
+    mutable CollectionInfo *info;
 
-    // ### add optimization, so that a linear loop through the
-    // Collection is O(n) and not O(n^2)!
-    //NodeImpl *current;
-    //int currentPos;
+    // For nextNamedItem()
+    mutable bool idsDone;
 };
 
 // this whole class is just a big hack to find form elements even in
@@ -101,12 +119,31 @@ public:
     HTMLFormCollectionImpl(NodeImpl* _base)
         : HTMLCollectionImpl(_base, 0)
     {};
-    ~HTMLFormCollectionImpl() { };
+    ~HTMLFormCollectionImpl() {}
+
+    struct FormCollectionInfo {
+        FormCollectionInfo(); 
+        void reset();
+        int elementsArrayPosition;
+     };
+
+    virtual NodeImpl *item ( unsigned long index ) const;
+    virtual NodeImpl *firstItem() const;
+    virtual NodeImpl *nextItem() const;
+
+    NodeImpl *namedItem ( const DOMString &name, bool caseSensitive = true ) const;
+    NodeImpl *nextNamedItem( const DOMString &name ) const;
 
+    virtual QValueList<Node> namedItems( const DOMString &name ) const;
 protected:
-    virtual unsigned long calcLength(NodeImpl* current) const;
-    virtual NodeImpl* getItem(NodeImpl *current, int index, int& pos) const;
-    virtual NodeImpl* getNamedItem(NodeImpl* current, int attr_id, const DOMString& name) const;
+    virtual unsigned long calcLength() const;
+    virtual NodeImpl *getNamedItem(NodeImpl* current, int attr_id, const DOMString& name, bool caseSensitive) const;
+    virtual NodeImpl *nextNamedItemInternal( const DOMString &name ) const;
+private:
+    virtual void resetCollectionInfo() const;
+    NodeImpl* getNamedFormItem(int attr_id, const DOMString& name, int duplicateNumber, bool caseSensitive) const;
+    mutable FormCollectionInfo formInfo;
+    mutable int currentPos;
 };