Reviewed by Dave.
[WebKit-https.git] / WebCore / khtml / html / html_miscimpl.h
index ba87923..5cec109 100644 (file)
@@ -50,8 +50,9 @@ class HTMLCollectionImpl : public khtml::Shared<HTMLCollectionImpl>
 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,40 +66,45 @@ public:
         // from HTMLMap
         MAP_AREAS,
         DOC_ALL,        // "all" elements (IE)
-        NODE_CHILDREN   // first-level children (IE)
+        NODE_CHILDREN,   // first-level children (IE)
+        LAST_TYPE
     };
 
     HTMLCollectionImpl(NodeImpl *_base, int _tagId);
-
     virtual ~HTMLCollectionImpl();
+    
     unsigned long length() const;
-    // This method is o(n), so you should't use it to iterate over all items. Use firstItem/nextItem instead.
-    NodeImpl *item ( unsigned long index ) const;
+    
+    virtual NodeImpl *item ( unsigned long index ) const;
     virtual NodeImpl *firstItem() const;
     virtual NodeImpl *nextItem() const;
 
-    NodeImpl *namedItem ( const DOMString &name ) 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;
-    virtual NodeImpl *nextNamedItemInternal( const DOMString &name ) const;
+    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 [using item(i)] is O(n) and not O(n^2)!
-    // But for that we need to get notified in case of changes in the dom structure...
-    //NodeImpl *current;
-    //int currentPos;
-
-    // For firstItem()/nextItem()
-    mutable NodeImpl *currentItem;
     // For nextNamedItem()
     mutable bool idsDone;
 };
@@ -113,18 +119,30 @@ 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:
-    NodeImpl* getNamedFormItem(int attr_id, const DOMString& name, int duplicateNumber) const;
-    NodeImpl* getNamedImgItem(NodeImpl* current, int attr_id, const DOMString& name, int& duplicateNumber) const;
+    virtual void resetCollectionInfo() const;
+    NodeImpl* getNamedFormItem(int attr_id, const DOMString& name, int duplicateNumber, bool caseSensitive) const;
+    mutable FormCollectionInfo formInfo;
     mutable int currentPos;
 };