10bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*
20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    This library is free software; you can redistribute it and/or
50bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    modify it under the terms of the GNU Library General Public
60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    License as published by the Free Software Foundation; either
70bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    version 2 of the License, or (at your option) any later version.
80bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
90bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    This library is distributed in the hope that it will be useful,
100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    but WITHOUT ANY WARRANTY; without even the implied warranty of
110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Library General Public License for more details.
130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    You should have received a copy of the GNU Library General Public License
150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    along with this library; see the file COPYING.LIB.  If not, write to
160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Boston, MA 02110-1301, USA.
180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifndef QWEBELEMENT_H
210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#define QWEBELEMENT_H
220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QtCore/qstring.h>
24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QtCore/qstringlist.h>
25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QtCore/qrect.h>
26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QtCore/qvariant.h>
27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QtCore/qshareddata.h>
280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "qwebkitglobal.h"
300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochnamespace WebCore {
310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    class Element;
320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    class Node;
330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3568513a70bcd92384395513322f1b801e7bf9c729Steve Block
3668513a70bcd92384395513322f1b801e7bf9c729Steve Block#if defined(WTF_USE_V8) && WTF_USE_V8
3768513a70bcd92384395513322f1b801e7bf9c729Steve Blocknamespace V8 {
3868513a70bcd92384395513322f1b801e7bf9c729Steve Block    namespace Bindings {
39692e5dbf12901edacf14812a6fae25462920af42Steve Block    class QtWebElementRuntime;
4068513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
41692e5dbf12901edacf14812a6fae25462920af42Steve Block}
4268513a70bcd92384395513322f1b801e7bf9c729Steve Block#else
4368513a70bcd92384395513322f1b801e7bf9c729Steve Blocknamespace JSC {
4468513a70bcd92384395513322f1b801e7bf9c729Steve Block    namespace Bindings {
4568513a70bcd92384395513322f1b801e7bf9c729Steve Block    class QtWebElementRuntime;
4668513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
47692e5dbf12901edacf14812a6fae25462920af42Steve Block}
4868513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
49692e5dbf12901edacf14812a6fae25462920af42Steve Block
50cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockQT_BEGIN_NAMESPACE
51cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockclass QPainter;
52cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockQT_END_NAMESPACE
53cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochclass QWebFrame;
55cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockclass QWebElementCollection;
560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochclass QWebElementPrivate;
570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochclass QWEBKIT_EXPORT QWebElement {
590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochpublic:
600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QWebElement();
610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QWebElement(const QWebElement&);
620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QWebElement &operator=(const QWebElement&);
630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ~QWebElement();
640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    bool operator==(const QWebElement& o) const;
660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    bool operator!=(const QWebElement& o) const;
670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    bool isNull() const;
690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
70cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QWebElementCollection findAll(const QString &selectorQuery) const;
71cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QWebElement findFirst(const QString &selectorQuery) const;
720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void setPlainText(const QString& text);
740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QString toPlainText() const;
750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void setOuterXml(const QString& markup);
770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QString toOuterXml() const;
780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void setInnerXml(const QString& markup);
800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QString toInnerXml() const;
810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void setAttribute(const QString& name, const QString& value);
830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void setAttributeNS(const QString& namespaceUri, const QString& name, const QString& value);
840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QString attribute(const QString& name, const QString& defaultValue = QString()) const;
850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QString attributeNS(const QString& namespaceUri, const QString& name, const QString& defaultValue = QString()) const;
860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    bool hasAttribute(const QString& name) const;
870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    bool hasAttributeNS(const QString& namespaceUri, const QString& name) const;
880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void removeAttribute(const QString& name);
890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void removeAttributeNS(const QString& namespaceUri, const QString& name);
900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    bool hasAttributes() const;
91643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    QStringList attributeNames(const QString& namespaceUri = QString()) const;
920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QStringList classes() const;
940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    bool hasClass(const QString& name) const;
950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void addClass(const QString& name);
960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void removeClass(const QString& name);
970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void toggleClass(const QString& name);
980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
99231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    bool hasFocus() const;
100231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    void setFocus();
101231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QRect geometry() const;
1030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QString tagName() const;
1050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QString prefix() const;
1060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QString localName() const;
1070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QString namespaceUri() const;
1080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QWebElement parent() const;
1100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QWebElement firstChild() const;
1110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QWebElement lastChild() const;
1120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QWebElement nextSibling() const;
1130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QWebElement previousSibling() const;
1140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QWebElement document() const;
1150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QWebFrame *webFrame() const;
1160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
117cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // TODO: Add QWebElementCollection overloads
1180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // docs need example snippet
1190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void appendInside(const QString& markup);
1200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void appendInside(const QWebElement& element);
1210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // docs need example snippet
1230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void prependInside(const QString& markup);
1240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void prependInside(const QWebElement& element);
1250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // docs need example snippet
1270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void appendOutside(const QString& markup);
1280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void appendOutside(const QWebElement& element);
1290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // docs need example snippet
1310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void prependOutside(const QString& markup);
1320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void prependOutside(const QWebElement& element);
1330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // docs need example snippet
1350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void encloseContentsWith(const QWebElement& element);
1360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void encloseContentsWith(const QString& markup);
1370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void encloseWith(const QString& markup);
1380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void encloseWith(const QWebElement& element);
1390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void replace(const QString& markup);
1410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void replace(const QWebElement& element);
1420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QWebElement clone() const;
1440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QWebElement& takeFromDocument();
1450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void removeFromDocument();
146cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    void removeAllChildren();
1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
148231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    QVariant evaluateJavaScript(const QString& scriptSource);
1490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
150231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    enum StyleResolveStrategy {
151231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block         InlineStyle,
152231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block         CascadedStyle,
153231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block         ComputedStyle,
154231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    };
155231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    QString styleProperty(const QString& name, StyleResolveStrategy strategy) const;
156231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    void setStyleProperty(const QString& name, const QString& value);
1570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
158cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    void render(QPainter* painter);
15981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void render(QPainter* painter, const QRect& clipRect);
160cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochprivate:
1620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    explicit QWebElement(WebCore::Element*);
1630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    explicit QWebElement(WebCore::Node*);
1640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
165231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    static QWebElement enclosingElement(WebCore::Node*);
166231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    friend class DumpRenderTreeSupportQt;
1680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    friend class QWebFrame;
169cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    friend class QWebElementCollection;
1700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    friend class QWebHitTestResult;
1710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    friend class QWebHitTestResultPrivate;
172231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    friend class QWebPage;
17368513a70bcd92384395513322f1b801e7bf9c729Steve Block
17468513a70bcd92384395513322f1b801e7bf9c729Steve Block#if defined(WTF_USE_V8) && WTF_USE_V8
17568513a70bcd92384395513322f1b801e7bf9c729Steve Block    friend class V8::Bindings::QtWebElementRuntime;
17668513a70bcd92384395513322f1b801e7bf9c729Steve Block#else
177692e5dbf12901edacf14812a6fae25462920af42Steve Block    friend class JSC::Bindings::QtWebElementRuntime;
17868513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
1790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QWebElementPrivate* d;
1810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WebCore::Element* m_element;
1820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch};
1830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
184cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockclass QWebElementCollectionPrivate;
185cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
186cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockclass QWEBKIT_EXPORT QWebElementCollection
187cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
188cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockpublic:
189cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QWebElementCollection();
190cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QWebElementCollection(const QWebElement &contextElement, const QString &query);
191cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QWebElementCollection(const QWebElementCollection &);
192cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QWebElementCollection &operator=(const QWebElementCollection &);
193cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    ~QWebElementCollection();
194cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
195cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QWebElementCollection operator+(const QWebElementCollection &other) const;
196cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    inline QWebElementCollection &operator+=(const QWebElementCollection &other)
197cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    {
198cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        append(other); return *this;
199cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
200cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
201cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    void append(const QWebElementCollection &collection);
202cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
203cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    int count() const;
204cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QWebElement at(int i) const;
205643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    inline QWebElement operator[](int i) const { return at(i); }
206cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
207cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    inline QWebElement first() const { return at(0); }
208cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    inline QWebElement last() const { return at(count() - 1); }
209cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
210cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QList<QWebElement> toList() const;
211cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
212cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    class const_iterator {
213cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block       public:
214643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           inline const_iterator(const QWebElementCollection* collection, int index) : i(index), collection(collection) {}
215643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           inline const_iterator(const const_iterator& o) : i(o.i), collection(o.collection) {}
216cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
217643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           inline const QWebElement operator*() const { return collection->at(i); }
218cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
219643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           inline bool operator==(const const_iterator& o) const { return i == o.i && collection == o.collection; }
220643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           inline bool operator!=(const const_iterator& o) const { return i != o.i || collection != o.collection; }
221cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block           inline bool operator<(const const_iterator& o) const { return i < o.i; }
222cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block           inline bool operator<=(const const_iterator& o) const { return i <= o.i; }
223cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block           inline bool operator>(const const_iterator& o) const { return i > o.i; }
224cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block           inline bool operator>=(const const_iterator& o) const { return i >= o.i; }
225cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
226643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           inline const_iterator& operator++() { ++i; return *this; }
227643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           inline const_iterator operator++(int) { const_iterator n(collection, i); ++i; return n; }
228643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           inline const_iterator& operator--() { i--; return *this; }
229643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           inline const_iterator operator--(int) { const_iterator n(collection, i); i--; return n; }
230643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           inline const_iterator& operator+=(int j) { i += j; return *this; }
231643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           inline const_iterator& operator-=(int j) { i -= j; return *this; }
232643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           inline const_iterator operator+(int j) const { return const_iterator(collection, i + j); }
233643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           inline const_iterator operator-(int j) const { return const_iterator(collection, i - j); }
234cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block           inline int operator-(const_iterator j) const { return i - j.i; }
235cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block       private:
236643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            int i;
237643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            const QWebElementCollection* const collection;
238cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    };
239cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    friend class const_iterator;
240cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
241643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    inline const_iterator begin() const { return constBegin(); }
242643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    inline const_iterator end() const { return constEnd(); }
243643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    inline const_iterator constBegin() const { return const_iterator(this, 0); }
244643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    inline const_iterator constEnd() const { return const_iterator(this, count()); };
245643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
246643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    class iterator {
247643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    public:
248643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        inline iterator(const QWebElementCollection* collection, int index) : i(index), collection(collection) {}
249643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        inline iterator(const iterator& o) : i(o.i), collection(o.collection) {}
250643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
251643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        inline QWebElement operator*() const { return collection->at(i); }
252643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
253643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        inline bool operator==(const iterator& o) const { return i == o.i && collection == o.collection; }
254643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        inline bool operator!=(const iterator& o) const { return i != o.i || collection != o.collection; }
255643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        inline bool operator<(const iterator& o) const { return i < o.i; }
256643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        inline bool operator<=(const iterator& o) const { return i <= o.i; }
257643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        inline bool operator>(const iterator& o) const { return i > o.i; }
258643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        inline bool operator>=(const iterator& o) const { return i >= o.i; }
259643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
260643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        inline iterator& operator++() { ++i; return *this; }
261643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        inline iterator operator++(int) { iterator n(collection, i); ++i; return n; }
262643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        inline iterator& operator--() { i--; return *this; }
263643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        inline iterator operator--(int) { iterator n(collection, i); i--; return n; }
264643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        inline iterator& operator+=(int j) { i += j; return *this; }
265643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        inline iterator& operator-=(int j) { i -= j; return *this; }
266643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        inline iterator operator+(int j) const { return iterator(collection, i + j); }
267643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        inline iterator operator-(int j) const { return iterator(collection, i - j); }
268643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        inline int operator-(iterator j) const { return i - j.i; }
269643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    private:
270643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        int i;
271643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        const QWebElementCollection* const collection;
272643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    };
273643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    friend class iterator;
274cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
275643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    inline iterator begin() { return iterator(this, 0); }
276643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    inline iterator end()  { return iterator(this, count()); }
277cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockprivate:
278cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QExplicitlySharedDataPointer<QWebElementCollectionPrivate> d;
279cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block};
280cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
281692e5dbf12901edacf14812a6fae25462920af42Steve BlockQ_DECLARE_METATYPE(QWebElement)
282692e5dbf12901edacf14812a6fae25462920af42Steve Block
2830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif // QWEBELEMENT_H
284