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#include "config.h"
210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "qwebelement.h"
220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "CSSComputedStyleDeclaration.h"
240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "CSSMutableStyleDeclaration.h"
250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "CSSParser.h"
260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "CSSRule.h"
27231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "CSSRuleList.h"
280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "CSSStyleRule.h"
29e14391e94c850b8bd03680c23b38978db68687a8John Reck#include "CSSStyleSelector.h"
300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "Document.h"
310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "DocumentFragment.h"
320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "FrameView.h"
33cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include "GraphicsContext.h"
340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "HTMLElement.h"
3568513a70bcd92384395513322f1b801e7bf9c729Steve Block#if USE(JSC)
360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "JSGlobalObject.h"
370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "JSHTMLElement.h"
380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "JSObject.h"
390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "PropertyNameArray.h"
4068513a70bcd92384395513322f1b801e7bf9c729Steve Block#include <parser/SourceCode.h>
4168513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "qt_runtime.h"
4268513a70bcd92384395513322f1b801e7bf9c729Steve Block#elif USE(V8)
4368513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "V8DOMWindow.h"
4468513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "V8Binding.h"
4568513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "NotImplemented.h"
4668513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
4768513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "NodeList.h"
48cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include "RenderImage.h"
490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "StaticNodeList.h"
500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "qwebframe.h"
510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "qwebframe_p.h"
5281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(JSC)
530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "runtime_root.h"
5481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/Vector.h>
56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/text/CString.h>
570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
58cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include <QPainter>
59cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
6068513a70bcd92384395513322f1b801e7bf9c729Steve Block#if USE(V8)
6168513a70bcd92384395513322f1b801e7bf9c729Steve Blockusing namespace V8::Bindings;
6268513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
6368513a70bcd92384395513322f1b801e7bf9c729Steve Block
640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochusing namespace WebCore;
650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochclass QWebElementPrivate {
670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochpublic:
680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch};
690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \class QWebElement
720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \since 4.6
73231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \brief The QWebElement class provides convenient access to DOM elements in
74231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    a QWebFrame.
75231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \inmodule QtWebKit
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
77231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    A QWebElement object allows easy access to the document model, represented
78231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    by a tree-like structure of DOM elements. The root of the tree is called
79231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    the document element and can be accessed using
80231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    QWebFrame::documentElement().
810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
82231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Specific elements can be accessed using findAll() and findFirst(). These
83231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    elements are identified using CSS selectors. The code snippet below
84231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    demonstrates the use of findAll().
850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \snippet webkitsnippets/webelement/main.cpp FindAll
870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
88231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    The first list contains all \c span elements in the document. The second
89231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    list contains \c span elements that are children of \c p, classified with
90231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \c intro.
910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
92231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Using findFirst() is more efficient than calling findAll(), and extracting
93231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    the first element only in the list returned.
940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
95231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Alternatively you can traverse the document manually using firstChild() and
96231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    nextSibling():
970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \snippet webkitsnippets/webelement/main.cpp Traversing with QWebElement
990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    Individual elements can be inspected or changed using methods such as attribute()
1016c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    or setAttribute(). For examle, to capture the user's input in a text field for later
1026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    use (auto-completion), a browser could do something like this:
1036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
1046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    \snippet webkitsnippets/webelement/main.cpp autocomplete1
1056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
1066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    When the same page is later revisited, the browser can fill in the text field automatically
1076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    by modifying the value attribute of the input element:
1086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
1096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    \snippet webkitsnippets/webelement/main.cpp autocomplete2
1106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
1116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    Another use case is to emulate a click event on an element. The following
1126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    code snippet demonstrates how to call the JavaScript DOM method click() of
1136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    a submit button:
1146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
1156c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    \snippet webkitsnippets/webelement/main.cpp Calling a DOM element method
1166c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
117231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    The underlying content of QWebElement is explicitly shared. Creating a copy
118231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    of a QWebElement does not create a copy of the content. Instead, both
119231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    instances point to the same element.
1200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
121231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    The contents of child elements can be converted to plain text with
122231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    toPlainText(); to XHTML using toInnerXml(). To include the element's tag in
123231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    the output, use toOuterXml().
1240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
125231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    It is possible to replace the contents of child elements using
126231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    setPlainText() and setInnerXml(). To replace the element itself and its
127231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    contents, use setOuterXml().
128643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
129643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \section1 Examples
130643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
131643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    The \l{DOM Traversal Example} shows one way to traverse documents in a running
132643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    example.
133643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
134643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    The \l{Simple Selector Example} can be used to experiment with the searching
135643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    features of this class and provides sample code you can start working with.
1360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
1370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
1390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Constructs a null web element.
1400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
1410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQWebElement::QWebElement()
1420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    : d(0)
1430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    , m_element(0)
1440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
1480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \internal
1490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
1500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQWebElement::QWebElement(WebCore::Element* domElement)
1510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    : d(0)
1520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    , m_element(domElement)
1530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_element)
1550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_element->ref();
1560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
1590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \internal
1600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
1610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQWebElement::QWebElement(WebCore::Node* node)
1620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    : d(0)
1630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    , m_element(0)
1640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (node && node->isHTMLElement()) {
1660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_element = static_cast<HTMLElement*>(node);
1670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_element->ref();
1680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
1690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
1720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Constructs a copy of \a other.
1730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
1740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQWebElement::QWebElement(const QWebElement &other)
1750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    : d(0)
1760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    , m_element(other.m_element)
1770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_element)
1790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_element->ref();
1800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
1830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Assigns \a other to this element and returns a reference to this element.
1840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
1850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQWebElement &QWebElement::operator=(const QWebElement &other)
1860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // ### handle "d" assignment
1880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (this != &other) {
1890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        Element *otherElement = other.m_element;
1900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (otherElement)
1910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            otherElement->ref();
1920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (m_element)
1930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            m_element->deref();
1940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_element = otherElement;
1950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
1960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return *this;
1970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
200231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Destroys the element. However, the underlying DOM element is not destroyed.
2010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
2020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQWebElement::~QWebElement()
2030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    delete d;
2050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_element)
2060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_element->deref();
2070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool QWebElement::operator==(const QWebElement& o) const
2100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return m_element == o.m_element;
2120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool QWebElement::operator!=(const QWebElement& o) const
2150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return m_element != o.m_element;
2170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
220231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns true if the element is a null element; otherwise returns false.
2210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
2220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool QWebElement::isNull() const
2230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return !m_element;
2250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
228231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns a new list of child elements matching the given CSS selector
229231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \a selectorQuery. If there are no matching elements, an empty list is
230231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    returned.
2310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
232643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \l{Standard CSS2 selector} syntax is used for the query.
2330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \note This search is performed recursively.
235231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
236231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa findFirst()
2370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
238cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockQWebElementCollection QWebElement::findAll(const QString &selectorQuery) const
2390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
240cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    return QWebElementCollection(*this, selectorQuery);
2410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
244231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns the first child element that matches the given CSS selector
245231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \a selectorQuery.
2460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
247643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \l{Standard CSS2 selector} syntax is used for the query.
2480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \note This search is performed recursively.
250231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
251231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa findAll()
2520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
2530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQWebElement QWebElement::findFirst(const QString &selectorQuery) const
2540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
2560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QWebElement();
2570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0; // ###
2580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return QWebElement(m_element->querySelector(selectorQuery, exception).get());
2590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
2620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Replaces the existing content of this element with \a text.
2630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    This is equivalent to setting the HTML innerText property.
265231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
266231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa toPlainText()
2670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
2680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::setPlainText(const QString &text)
2690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element || !m_element->isHTMLElement())
2710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
2720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0;
2730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    static_cast<HTMLElement*>(m_element)->setInnerText(text, exception);
2740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
2770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Returns the text between the start and the end tag of this
2780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    element.
2790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    This is equivalent to reading the HTML innerText property.
281231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
282231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa setPlainText()
2830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
2840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQString QWebElement::toPlainText() const
2850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element || !m_element->isHTMLElement())
2870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QString();
2880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return static_cast<HTMLElement*>(m_element)->innerText();
2890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
292231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Replaces the contents of this element as well as its own tag with
293231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \a markup. The string may contain HTML or XML tags, which is parsed and
294231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    formatted before insertion into the document.
2950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \note This is currently only implemented for (X)HTML elements.
297231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
298231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa toOuterXml(), toInnerXml(), setInnerXml()
2990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
3000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::setOuterXml(const QString &markup)
3010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
3020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element || !m_element->isHTMLElement())
3030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
3040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0;
3060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    static_cast<HTMLElement*>(m_element)->setOuterHTML(markup, exception);
3080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
3110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Returns this element converted to XML, including the start and the end
312231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    tags as well as its attributes.
3130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
314231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \note This is currently implemented for (X)HTML elements only.
315231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
31628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    \note The format of the markup returned will obey the namespace of the
31728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    document containing the element. This means the return value will obey XML
31828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    formatting rules, such as self-closing tags, only if the document is
31928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    'text/xhtml+xml'.
32028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
321231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa setOuterXml(), setInnerXml(), toInnerXml()
3220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
3230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQString QWebElement::toOuterXml() const
3240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
3250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element || !m_element->isHTMLElement())
3260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QString();
3270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return static_cast<HTMLElement*>(m_element)->outerHTML();
3290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
332231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Replaces the contents of this element with \a markup. The string may
333231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    contain HTML or XML tags, which is parsed and formatted before insertion
334231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    into the document.
3350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
336231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \note This is currently implemented for (X)HTML elements only.
337231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
338231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa toInnerXml(), toOuterXml(), setOuterXml()
3390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
3400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::setInnerXml(const QString &markup)
3410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
3420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element || !m_element->isHTMLElement())
3430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
3440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0;
3460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    static_cast<HTMLElement*>(m_element)->setInnerHTML(markup, exception);
3480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
351231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns the XML content between the element's start and end tags.
3520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
353231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \note This is currently implemented for (X)HTML elements only.
354231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
35528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    \note The format of the markup returned will obey the namespace of the
35628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    document containing the element. This means the return value will obey XML
35728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    formatting rules, such as self-closing tags, only if the document is
35828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    'text/xhtml+xml'.
35928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
360231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa setInnerXml(), setOuterXml(), toOuterXml()
3610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
3620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQString QWebElement::toInnerXml() const
3630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
3640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element || !m_element->isHTMLElement())
3650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QString();
3660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return static_cast<HTMLElement*>(m_element)->innerHTML();
3680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
371231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Adds an attribute with the given \a name and \a value. If an attribute with
372231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    the same name exists, its value is replaced by \a value.
373231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
374231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa attribute(), attributeNS(), setAttributeNS()
3750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
3760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::setAttribute(const QString &name, const QString &value)
3770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
3780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
3790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
3800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0;
3810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_element->setAttribute(name, value, exception);
3820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
385231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Adds an attribute with the given \a name in \a namespaceUri with \a value.
386231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    If an attribute with the same name exists, its value is replaced by
387231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \a value.
388231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
389231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa attributeNS(), attribute(), setAttribute()
3900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
3910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::setAttributeNS(const QString &namespaceUri, const QString &name, const QString &value)
3920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
3930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
3940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
3950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WebCore::ExceptionCode exception = 0;
3960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_element->setAttributeNS(namespaceUri, name, value, exception);
3970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
400231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns the attribute with the given \a name. If the attribute does not
401231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    exist, \a defaultValue is returned.
402231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
403231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa setAttribute(), setAttributeNS(), attributeNS()
4040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
4050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQString QWebElement::attribute(const QString &name, const QString &defaultValue) const
4060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
4080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QString();
4090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_element->hasAttribute(name))
4100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return m_element->getAttribute(name);
4110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    else
4120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return defaultValue;
4130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
416231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns the attribute with the given \a name in \a namespaceUri. If the
417231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    attribute does not exist, \a defaultValue is returned.
418231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
419231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa setAttributeNS(), setAttribute(), attribute()
4200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
4210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQString QWebElement::attributeNS(const QString &namespaceUri, const QString &name, const QString &defaultValue) const
4220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
4240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QString();
4250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_element->hasAttributeNS(namespaceUri, name))
4260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return m_element->getAttributeNS(namespaceUri, name);
4270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    else
4280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return defaultValue;
4290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
432231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns true if this element has an attribute with the given \a name;
433231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    otherwise returns false.
434231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
435231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa attribute(), setAttribute()
4360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
4370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool QWebElement::hasAttribute(const QString &name) const
4380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
4400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
4410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return m_element->hasAttribute(name);
4420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
445231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns true if this element has an attribute with the given \a name, in
446231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \a namespaceUri; otherwise returns false.
447231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
448231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa attributeNS(), setAttributeNS()
4490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
4500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool QWebElement::hasAttributeNS(const QString &namespaceUri, const QString &name) const
4510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
4530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
4540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return m_element->hasAttributeNS(namespaceUri, name);
4550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
458231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Removes the attribute with the given \a name from this element.
459231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
460231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa attribute(), setAttribute(), hasAttribute()
4610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
4620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::removeAttribute(const QString &name)
4630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
4650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
4660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0;
4670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_element->removeAttribute(name, exception);
4680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
471231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Removes the attribute with the given \a name, in \a namespaceUri, from this
472231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    element.
473231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
474231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa attributeNS(), setAttributeNS(), hasAttributeNS()
4750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
4760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::removeAttributeNS(const QString &namespaceUri, const QString &name)
4770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
4790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
4800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WebCore::ExceptionCode exception = 0;
4810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_element->removeAttributeNS(namespaceUri, name, exception);
4820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
485231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns true if the element has any attributes defined; otherwise returns
486231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    false;
487231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
488231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa attribute(), setAttribute()
4890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
4900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool QWebElement::hasAttributes() const
4910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
4930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
4940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return m_element->hasAttributes();
4950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
498643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Return the list of attributes for the namespace given as \a namespaceUri.
499643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
500643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \sa attribute(), setAttribute()
501643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
502643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockQStringList QWebElement::attributeNames(const QString& namespaceUri) const
503643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
504643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_element)
505643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return QStringList();
506643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
507643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    QStringList attributeNameList;
508643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    const NamedNodeMap* const attrs = m_element->attributes(/* read only = */ true);
509643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (attrs) {
510643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        const String namespaceUriString(namespaceUri); // convert QString -> String once
511643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        const unsigned attrsCount = attrs->length();
512643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        for (unsigned i = 0; i < attrsCount; ++i) {
513643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            const Attribute* const attribute = attrs->attributeItem(i);
514643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (namespaceUriString == attribute->namespaceURI())
515643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                attributeNameList.append(attribute->localName());
516643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
517643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
518643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return attributeNameList;
519643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
520643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
521643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
522231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns true if the element has keyboard input focus; otherwise, returns false
523231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
524231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa setFocus()
525231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block*/
526231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool QWebElement::hasFocus() const
527231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
528231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!m_element)
529231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return false;
530231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (m_element->document())
531231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return m_element == m_element->document()->focusedNode();
532231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return false;
533231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
534231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
535231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block/*!
536231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Gives keyboard input focus to this element
537231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
538231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa hasFocus()
539231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block*/
540231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid QWebElement::setFocus()
541231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
542231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!m_element)
543231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
544231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (m_element->document() && m_element->isFocusable())
545231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_element->document()->setFocusedNode(m_element);
546231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
547231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
548231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block/*!
5490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Returns the geometry of this element, relative to its containing frame.
550231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
551231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa tagName()
5520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
5530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQRect QWebElement::geometry() const
5540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
5550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
5560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QRect();
5570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return m_element->getRect();
5580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
5590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
5610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Returns the tag name of this element.
562231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
563231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa geometry()
5640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
5650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQString QWebElement::tagName() const
5660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
5670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
5680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QString();
5690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return m_element->tagName();
5700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
5710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
573231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns the namespace prefix of the element. If the element has no\
574231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    namespace prefix, empty string is returned.
5750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
5760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQString QWebElement::prefix() const
5770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
5780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
5790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QString();
5800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return m_element->prefix();
5810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
5820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
584231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns the local name of the element. If the element does not use
585231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    namespaces, an empty string is returned.
5860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
5870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQString QWebElement::localName() const
5880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
5890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
5900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QString();
5910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return m_element->localName();
5920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
5930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
595231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns the namespace URI of this element. If the element has no namespace
596231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    URI, an empty string is returned.
5970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
5980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQString QWebElement::namespaceUri() const
5990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
6000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
6010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QString();
6020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return m_element->namespaceURI();
6030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
6040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
6050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
606231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns the parent element of this elemen. If this element is the root
607231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    document element, a null element is returned.
6080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
6090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQWebElement QWebElement::parent() const
6100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
6110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_element)
6120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QWebElement(m_element->parentElement());
6130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return QWebElement();
6140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
6150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
6160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
617231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns the element's first child.
6180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
619231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa lastChild(), previousSibling(), nextSibling()
6200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
6210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQWebElement QWebElement::firstChild() const
6220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
6230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
6240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QWebElement();
6250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    for (Node* child = m_element->firstChild(); child; child = child->nextSibling()) {
6260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!child->isElementNode())
6270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            continue;
6280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        Element* e = static_cast<Element*>(child);
6290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QWebElement(e);
6300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
6310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return QWebElement();
6320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
6330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
6340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
635231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns the element's last child.
6360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
637231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa firstChild(), previousSibling(), nextSibling()
6380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
6390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQWebElement QWebElement::lastChild() const
6400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
6410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
6420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QWebElement();
6430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    for (Node* child = m_element->lastChild(); child; child = child->previousSibling()) {
6440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!child->isElementNode())
6450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            continue;
6460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        Element* e = static_cast<Element*>(child);
6470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QWebElement(e);
6480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
6490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return QWebElement();
6500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
6510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
6520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
653231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns the element's next sibling.
6540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
655231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa firstChild(), previousSibling(), lastChild()
6560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
6570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQWebElement QWebElement::nextSibling() const
6580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
6590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
6600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QWebElement();
6610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    for (Node* sib = m_element->nextSibling(); sib; sib = sib->nextSibling()) {
6620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!sib->isElementNode())
6630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            continue;
6640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        Element* e = static_cast<Element*>(sib);
6650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QWebElement(e);
6660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
6670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return QWebElement();
6680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
6690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
6700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
671231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns the element's previous sibling.
6720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
673231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa firstChild(), nextSibling(), lastChild()
6740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
6750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQWebElement QWebElement::previousSibling() const
6760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
6770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
6780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QWebElement();
6790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    for (Node* sib = m_element->previousSibling(); sib; sib = sib->previousSibling()) {
6800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!sib->isElementNode())
6810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            continue;
6820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        Element* e = static_cast<Element*>(sib);
6830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QWebElement(e);
6840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
6850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return QWebElement();
6860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
6870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
6880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
689231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns the document which this element belongs to.
6900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
6910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQWebElement QWebElement::document() const
6920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
6930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
6940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QWebElement();
6950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Document* document = m_element->document();
6960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!document)
6970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QWebElement();
6980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return QWebElement(document->documentElement());
6990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
7000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
702231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns the web frame which this element is a part of. If the element is a
703231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    null element, null is returned.
7040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
7050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQWebFrame *QWebElement::webFrame() const
7060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
7070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
7080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return 0;
7090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Document* document = m_element->document();
7110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!document)
7120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return 0;
7130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Frame* frame = document->frame();
7150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!frame)
7160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return 0;
7170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return QWebFramePrivate::kit(frame);
7180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
7190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
72068513a70bcd92384395513322f1b801e7bf9c729Steve Block#if USE(JSC)
7210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic bool setupScriptContext(WebCore::Element* element, JSC::JSValue& thisValue, ScriptState*& state, ScriptController*& scriptController)
7220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
7230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!element)
7240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
7250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Document* document = element->document();
7270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!document)
7280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
7290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Frame* frame = document->frame();
7310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!frame)
7320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
7330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    scriptController = frame->script();
7350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!scriptController)
7360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
7370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
738cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    state = scriptController->globalObject(mainThreadNormalWorld())->globalExec();
7390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!state)
7400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
7410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    thisValue = toJS(state, element);
7430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!thisValue)
7440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
7450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return true;
7470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
74868513a70bcd92384395513322f1b801e7bf9c729Steve Block#elif USE(V8)
74968513a70bcd92384395513322f1b801e7bf9c729Steve Blockstatic bool setupScriptContext(WebCore::Element* element, v8::Handle<v8::Value>& thisValue, ScriptState*& state, ScriptController*& scriptController)
75068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
75168513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!element)
75268513a70bcd92384395513322f1b801e7bf9c729Steve Block        return false;
75368513a70bcd92384395513322f1b801e7bf9c729Steve Block
75468513a70bcd92384395513322f1b801e7bf9c729Steve Block    Document* document = element->document();
75568513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!document)
75668513a70bcd92384395513322f1b801e7bf9c729Steve Block        return false;
75768513a70bcd92384395513322f1b801e7bf9c729Steve Block
75868513a70bcd92384395513322f1b801e7bf9c729Steve Block    Frame* frame = document->frame();
75968513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!frame)
76068513a70bcd92384395513322f1b801e7bf9c729Steve Block        return false;
76168513a70bcd92384395513322f1b801e7bf9c729Steve Block
76268513a70bcd92384395513322f1b801e7bf9c729Steve Block    state = mainWorldScriptState(frame);
76368513a70bcd92384395513322f1b801e7bf9c729Steve Block    // Get V8 wrapper for DOM element
76468513a70bcd92384395513322f1b801e7bf9c729Steve Block    thisValue = toV8(frame->domWindow());
76568513a70bcd92384395513322f1b801e7bf9c729Steve Block    return true;
76668513a70bcd92384395513322f1b801e7bf9c729Steve Block}
76768513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
7680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
771231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Executes \a scriptSource with this element as \c this object.
7720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
773231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockQVariant QWebElement::evaluateJavaScript(const QString& scriptSource)
7740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
7750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (scriptSource.isEmpty())
7760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QVariant();
7770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ScriptState* state = 0;
77968513a70bcd92384395513322f1b801e7bf9c729Steve Block#if USE(JSC)
7800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSC::JSValue thisValue;
78168513a70bcd92384395513322f1b801e7bf9c729Steve Block#elif USE(V8)
78268513a70bcd92384395513322f1b801e7bf9c729Steve Block    v8::Handle<v8::Value> thisValue;
78368513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
7840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ScriptController* scriptController = 0;
7850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!setupScriptContext(m_element, thisValue, state, scriptController))
7870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QVariant();
78868513a70bcd92384395513322f1b801e7bf9c729Steve Block#if USE(JSC)
78981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    JSC::ScopeChainNode* scopeChain = state->dynamicGlobalObject()->globalScopeChain();
790e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    JSC::UString script(reinterpret_cast_ptr<const UChar*>(scriptSource.data()), scriptSource.length());
7910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSC::Completion completion = JSC::evaluate(state, scopeChain, JSC::makeSource(script), thisValue);
7920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if ((completion.complType() != JSC::ReturnValue) && (completion.complType() != JSC::Normal))
7930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QVariant();
7940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSC::JSValue result = completion.value();
7960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!result)
7970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QVariant();
7980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    int distance = 0;
8000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return JSC::Bindings::convertValueToQVariant(state, result, QMetaType::Void, &distance);
80168513a70bcd92384395513322f1b801e7bf9c729Steve Block#elif USE(V8)
80268513a70bcd92384395513322f1b801e7bf9c729Steve Block    notImplemented();
80368513a70bcd92384395513322f1b801e7bf9c729Steve Block    return QVariant();
80468513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
8050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
8060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
808231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \enum QWebElement::StyleResolveStrategy
8090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    This enum describes how QWebElement's styleProperty resolves the given
8110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    property name.
8120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
813231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \value InlineStyle Return the property value as it is defined in
814231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block           the element, without respecting style inheritance and other CSS
815231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block           rules.
816231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \value CascadedStyle The property's value is determined using the
817231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block           inheritance and importance rules defined in the document's
818231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block           stylesheet.
819231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \value ComputedStyle The property's value is the absolute value
820231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block           of the style property resolved from the environment.
8210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
8220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
824231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns the value of the style with the given \a name using the specified
825231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \a strategy. If a style with \a name does not exist, an empty string is
826231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    returned.
8270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
828231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    In CSS, the cascading part depends on which CSS rule has priority and is
829231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    thus applied. Generally, the last defined rule has priority. Thus, an
830231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    inline style rule has priority over an embedded block style rule, which
831231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    in return has priority over an external style rule.
8320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
833231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    If the "!important" declaration is set on one of those, the declaration
834231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    receives highest priority, unless other declarations also use the
835231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    "!important" declaration. Then, the last "!important" declaration takes
836231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    predecence.
8370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
838231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \sa setStyleProperty()
8390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
840231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
841231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockQString QWebElement::styleProperty(const QString &name, StyleResolveStrategy strategy) const
8420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
8430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element || !m_element->isStyledElement())
8440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QString();
8450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    int propID = cssPropertyID(name);
8470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!propID)
8490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QString();
8500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CSSStyleDeclaration* style = static_cast<StyledElement*>(m_element)->style();
8520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
853231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (strategy == InlineStyle)
8540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return style->getPropertyValue(propID);
8550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
856231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (strategy == CascadedStyle) {
8570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (style->getPropertyPriority(propID))
8580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return style->getPropertyValue(propID);
8590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // We are going to resolve the style property by walking through the
8610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // list of non-inline matched CSS rules for the element, looking for
8620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // the highest priority definition.
8630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Get an array of matched CSS rules for the given element sorted
8650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // by importance and inheritance order. This include external CSS
8660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // declarations, as well as embedded and inline style declarations.
8670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
868e14391e94c850b8bd03680c23b38978db68687a8John Reck        Document* doc = m_element->document();
869e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (RefPtr<CSSRuleList> rules = doc->styleSelector()->styleRulesForElement(m_element, /*authorOnly*/ true)) {
8700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            for (int i = rules->length(); i > 0; --i) {
8710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                CSSStyleRule* rule = static_cast<CSSStyleRule*>(rules->item(i - 1));
8720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                if (rule->style()->getPropertyPriority(propID))
8740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    return rule->style()->getPropertyValue(propID);
8750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                if (style->getPropertyValue(propID).isEmpty())
8770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    style = rule->style();
8780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            }
8790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
8800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return style->getPropertyValue(propID);
8820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
8830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
884231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (strategy == ComputedStyle) {
885231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (!m_element || !m_element->isStyledElement())
886231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return QString();
887231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
888231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        int propID = cssPropertyID(name);
889231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
89021939df44de1705786c545cd1bf519d47250322dBen Murdoch        RefPtr<CSSComputedStyleDeclaration> style = computedStyle(m_element, true);
891231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (!propID || !style)
892231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return QString();
893231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
894231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return style->getPropertyValue(propID);
895231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
896231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
8970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return QString();
8980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
8990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
901231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Sets the value of the inline style with the given \a name to \a value.
9020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
903231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Setting a value, does not necessarily mean that it will become the applied
9040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    value, due to the fact that the style property's value might have been set
905231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    earlier with a higher priority in external or embedded style declarations.
9060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
907231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    In order to ensure that the value will be applied, you may have to append
9080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    "!important" to the value.
9090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
910231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid QWebElement::setStyleProperty(const QString &name, const QString &value)
9110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
9120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element || !m_element->isStyledElement())
9130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
9140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    int propID = cssPropertyID(name);
9160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CSSStyleDeclaration* style = static_cast<StyledElement*>(m_element)->style();
9170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!propID || !style)
9180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
9190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0;
921231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    style->setProperty(name, value, exception);
9220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
9230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
9250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Returns the list of classes of this element.
9260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
9270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQStringList QWebElement::classes() const
9280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
9290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!hasAttribute(QLatin1String("class")))
9300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QStringList();
9310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QStringList classes =  attribute(QLatin1String("class")).simplified().split(QLatin1Char(' '), QString::SkipEmptyParts);
9330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    classes.removeDuplicates();
9340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return classes;
9350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
9360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
938231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns true if this element has a class with the given \a name; otherwise
939231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    returns false.
9400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
9410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool QWebElement::hasClass(const QString &name) const
9420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
9430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QStringList list = classes();
9440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return list.contains(name);
9450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
9460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
948231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Adds the specified class with the given \a name to the element.
9490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
9500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::addClass(const QString &name)
9510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
9520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QStringList list = classes();
9530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!list.contains(name)) {
9540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        list.append(name);
9550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        QString value = list.join(QLatin1String(" "));
9560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        setAttribute(QLatin1String("class"), value);
9570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
9580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
9590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
961231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Removes the specified class with the given \a name from the element.
9620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
9630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::removeClass(const QString &name)
9640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
9650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QStringList list = classes();
9660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (list.contains(name)) {
9670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        list.removeAll(name);
9680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        QString value = list.join(QLatin1String(" "));
9690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        setAttribute(QLatin1String("class"), value);
9700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
9710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
9720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
974231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Adds the specified class with the given \a name if it is not present. If
975231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    the class is already present, it will be removed.
9760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
9770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::toggleClass(const QString &name)
9780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
9790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QStringList list = classes();
9800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (list.contains(name))
9810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        list.removeAll(name);
9820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    else
9830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        list.append(name);
9840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QString value = list.join(QLatin1String(" "));
9860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    setAttribute(QLatin1String("class"), value);
9870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
9880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
990231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Appends the given \a element as the element's last child.
9910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
992231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    If \a element is the child of another element, it is re-parented to this
993231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    element. If \a element is a child of this element, then its position in
994231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    the list of children is changed.
9950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Calling this function on a null element does nothing.
9970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \sa prependInside(), prependOutside(), appendOutside()
9990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
10000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::appendInside(const QWebElement &element)
10010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
10020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element || element.isNull())
10030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
10040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0;
10060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_element->appendChild(element.m_element, exception);
10070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
10080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
10100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Appends the result of parsing \a markup as the element's last child.
10110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Calling this function on a null element does nothing.
10130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \sa prependInside(), prependOutside(), appendOutside()
10150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
10160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::appendInside(const QString &markup)
10170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
10180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
10190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
10200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element->isHTMLElement())
10220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
10230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    HTMLElement* htmlElement = static_cast<HTMLElement*>(m_element);
10254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    RefPtr<DocumentFragment> fragment = htmlElement->Element::deprecatedCreateContextualFragment(markup);
10260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0;
10280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_element->appendChild(fragment, exception);
10290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
10300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
10320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Prepends \a element as the element's first child.
10330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1034231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    If \a element is the child of another element, it is re-parented to this
1035231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    element. If \a element is a child of this element, then its position in
1036231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    the list of children is changed.
10370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Calling this function on a null element does nothing.
10390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \sa appendInside(), prependOutside(), appendOutside()
10410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
10420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::prependInside(const QWebElement &element)
10430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
10440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element || element.isNull())
10450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
10460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0;
10480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_element->hasChildNodes())
10500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_element->insertBefore(element.m_element, m_element->firstChild(), exception);
10510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    else
10520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_element->appendChild(element.m_element, exception);
10530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
10540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
10560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Prepends the result of parsing \a markup as the element's first child.
10570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Calling this function on a null element does nothing.
10590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \sa appendInside(), prependOutside(), appendOutside()
10610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
10620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::prependInside(const QString &markup)
10630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
10640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
10650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
10660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element->isHTMLElement())
10680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
10690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    HTMLElement* htmlElement = static_cast<HTMLElement*>(m_element);
1071f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    RefPtr<DocumentFragment> fragment = htmlElement->deprecatedCreateContextualFragment(markup);
10720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0;
10740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_element->hasChildNodes())
10760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_element->insertBefore(fragment, m_element->firstChild(), exception);
10770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    else
10780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_element->appendChild(fragment, exception);
10790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
10800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
1083231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Inserts the given \a element before this element.
10840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1085231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    If \a element is the child of another element, it is re-parented to the
1086231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    parent of this element.
10870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Calling this function on a null element does nothing.
10890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \sa appendInside(), prependInside(), appendOutside()
10910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
10920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::prependOutside(const QWebElement &element)
10930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
10940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element || element.isNull())
10950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
10960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!m_element->parentNode())
10980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
10990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0;
11016b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_element->parentNode()->insertBefore(element.m_element, m_element, exception);
11020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
11030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
11050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Inserts the result of parsing \a markup before this element.
11060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Calling this function on a null element does nothing.
11080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \sa appendInside(), prependInside(), appendOutside()
11100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
11110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::prependOutside(const QString &markup)
11120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
11130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
11140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
11150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!m_element->parentNode())
11170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
11180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element->isHTMLElement())
11200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
11210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    HTMLElement* htmlElement = static_cast<HTMLElement*>(m_element);
1123f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    RefPtr<DocumentFragment> fragment = htmlElement->deprecatedCreateContextualFragment(markup);
11240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0;
11266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_element->parentNode()->insertBefore(fragment, m_element, exception);
11270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
11280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
1130231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Inserts the given \a element after this element.
11310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1132231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    If \a element is the child of another element, it is re-parented to the
1133231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    parent of this element.
11340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Calling this function on a null element does nothing.
11360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \sa appendInside(), prependInside(), prependOutside()
11380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
11390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::appendOutside(const QWebElement &element)
11400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
11410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element || element.isNull())
11420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
11430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!m_element->parentNode())
11450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
11460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0;
11480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element->nextSibling())
11496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        m_element->parentNode()->appendChild(element.m_element, exception);
11500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    else
11516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        m_element->parentNode()->insertBefore(element.m_element, m_element->nextSibling(), exception);
11520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
11530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
11550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Inserts the result of parsing \a markup after this element.
11560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Calling this function on a null element does nothing.
11580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \sa appendInside(), prependInside(), prependOutside()
11600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
11610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::appendOutside(const QString &markup)
11620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
11630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
11640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
11650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!m_element->parentNode())
11670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
11680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element->isHTMLElement())
11700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
11710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    HTMLElement* htmlElement = static_cast<HTMLElement*>(m_element);
1173f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    RefPtr<DocumentFragment> fragment = htmlElement->deprecatedCreateContextualFragment(markup);
11740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0;
11760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element->nextSibling())
11776b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        m_element->parentNode()->appendChild(fragment, exception);
11780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    else
11796b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        m_element->parentNode()->insertBefore(fragment, m_element->nextSibling(), exception);
11800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
11810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
11830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Returns a clone of this element.
11840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    The clone may be inserted at any point in the document.
11860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \sa appendInside(), prependInside(), prependOutside(), appendOutside()
11880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
11890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQWebElement QWebElement::clone() const
11900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
11910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
11920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return QWebElement();
11930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return QWebElement(m_element->cloneElementWithChildren().get());
11950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
11960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
1198231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Removes this element from the document and returns a reference to it.
11990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1200231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    The element is still valid after removal, and can be inserted into other
1201231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    parts of the document.
12020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1203cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \sa removeAllChildren(), removeFromDocument()
12040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
12050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQWebElement &QWebElement::takeFromDocument()
12060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
12070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
12080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return *this;
12090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0;
12110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_element->remove(exception);
12120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return *this;
12140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
12150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
1217231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Removes this element from the document and makes it a null element.
12180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1219cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \sa removeAllChildren(), takeFromDocument()
12200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
12210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::removeFromDocument()
12220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
12230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
12240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
12250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0;
12270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_element->remove(exception);
12280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_element->deref();
12290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_element = 0;
12300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
12310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
12330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Removes all children from this element.
12340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \sa removeFromDocument(), takeFromDocument()
12360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
1237cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid QWebElement::removeAllChildren()
12380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
12390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
12400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
12410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_element->removeAllChildren();
12430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
12440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1245e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block// FIXME: This code, and all callers are wrong, and have no place in a
1246e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block// WebKit implementation.  These should be replaced with WebCore implementations.
12470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic RefPtr<Node> findInsertionPoint(PassRefPtr<Node> root)
12480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
12490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RefPtr<Node> node = root;
12500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Go as far down the tree as possible.
12520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    while (node->hasChildNodes() && node->firstChild()->isElementNode())
12530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        node = node->firstChild();
12540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // TODO: Implement SVG support
12560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (node->isHTMLElement()) {
12570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        HTMLElement* element = static_cast<HTMLElement*>(node.get());
12580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // The insert point could be a non-enclosable tag and it can thus
12600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // never have children, so go one up. Get the parent element, and not
12610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // note as a root note will always exist.
1262e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        if (element->ieForbidsInsertHTML())
12630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            node = node->parentElement();
12640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
12650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return node;
12670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
12680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
1270231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Encloses the contents of this element with \a element. This element becomes
1271231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    the child of the deepest descendant within \a element.
1272231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1273231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ### illustration
12740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \sa encloseWith()
12760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
12770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::encloseContentsWith(const QWebElement &element)
12780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
12790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element || element.isNull())
12800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
12810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RefPtr<Node> insertionPoint = findInsertionPoint(element.m_element);
12830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!insertionPoint)
12850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
12860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0;
12880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // reparent children
12900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    for (RefPtr<Node> child = m_element->firstChild(); child;) {
12910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        RefPtr<Node> next = child->nextSibling();
12920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        insertionPoint->appendChild(child, exception);
12930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        child = next;
12940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
12950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_element->hasChildNodes())
12970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_element->insertBefore(element.m_element, m_element->firstChild(), exception);
12980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    else
12990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_element->appendChild(element.m_element, exception);
13000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
13010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
1303231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Encloses the contents of this element with the result of parsing \a markup.
1304231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    This element becomes the child of the deepest descendant within \a markup.
13050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \sa encloseWith()
13070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
13080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::encloseContentsWith(const QString &markup)
13090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
13100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
13110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
13120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!m_element->parentNode())
13140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
13150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element->isHTMLElement())
13170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
13180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    HTMLElement* htmlElement = static_cast<HTMLElement*>(m_element);
1320f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    RefPtr<DocumentFragment> fragment = htmlElement->deprecatedCreateContextualFragment(markup);
13210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!fragment || !fragment->firstChild())
13230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
13240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RefPtr<Node> insertionPoint = findInsertionPoint(fragment->firstChild());
13260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!insertionPoint)
13280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
13290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0;
13310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // reparent children
13330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    for (RefPtr<Node> child = m_element->firstChild(); child;) {
13340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        RefPtr<Node> next = child->nextSibling();
13350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        insertionPoint->appendChild(child, exception);
13360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        child = next;
13370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
13380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_element->hasChildNodes())
13400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_element->insertBefore(fragment, m_element->firstChild(), exception);
13410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    else
13420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_element->appendChild(fragment, exception);
13430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
13440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
1346231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Encloses this element with \a element. This element becomes the child of
1347231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    the deepest descendant within \a element.
13480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \sa replace()
13500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
13510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::encloseWith(const QWebElement &element)
13520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
13530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element || element.isNull())
13540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
13550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RefPtr<Node> insertionPoint = findInsertionPoint(element.m_element);
13570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!insertionPoint)
13590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
13600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Keep reference to these two nodes before pulling out this element and
13620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // wrapping it in the fragment. The reason for doing it in this order is
13630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // that once the fragment has been added to the document it is empty, so
13640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // we no longer have access to the nodes it contained.
13656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    Node* parent = m_element->parentNode();
13660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Node* siblingNode = m_element->nextSibling();
13670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0;
13690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    insertionPoint->appendChild(m_element, exception);
13700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!siblingNode)
13726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        parent->appendChild(element.m_element, exception);
13730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    else
13746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        parent->insertBefore(element.m_element, siblingNode, exception);
13750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
13760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
1378231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Encloses this element with the result of parsing \a markup. This element
1379231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    becomes the child of the deepest descendant within \a markup.
13800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \sa replace()
13820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
13830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::encloseWith(const QString &markup)
13840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
13850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
13860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
13870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!m_element->parentNode())
13890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
13900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element->isHTMLElement())
13920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
13930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    HTMLElement* htmlElement = static_cast<HTMLElement*>(m_element);
1395f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    RefPtr<DocumentFragment> fragment = htmlElement->deprecatedCreateContextualFragment(markup);
13960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
13970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!fragment || !fragment->firstChild())
13980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
13990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
14000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RefPtr<Node> insertionPoint = findInsertionPoint(fragment->firstChild());
14010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
14020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!insertionPoint)
14030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
14040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
14050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Keep reference to these two nodes before pulling out this element and
14060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // wrapping it in the fragment. The reason for doing it in this order is
14070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // that once the fragment has been added to the document it is empty, so
14080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // we no longer have access to the nodes it contained.
14096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    Node* parent = m_element->parentNode();
14100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Node* siblingNode = m_element->nextSibling();
14110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
14120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ExceptionCode exception = 0;
14130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    insertionPoint->appendChild(m_element, exception);
14140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
14150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!siblingNode)
14166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        parent->appendChild(fragment, exception);
14170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    else
14186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        parent->insertBefore(fragment, siblingNode, exception);
14190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
14200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
14210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
14220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Replaces this element with \a element.
14230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1424231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    This method will not replace the <html>, <head> or <body> elements.
14250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
14260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \sa encloseWith()
14270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
14280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::replace(const QWebElement &element)
14290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
14300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element || element.isNull())
14310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
14320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
14330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    appendOutside(element);
14340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    takeFromDocument();
14350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
14360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
14370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
14380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Replaces this element with the result of parsing \a markup.
14390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1440231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    This method will not replace the <html>, <head> or <body> elements.
14410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
14420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \sa encloseWith()
14430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
14440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid QWebElement::replace(const QString &markup)
14450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
14460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_element)
14470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
14480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
14490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    appendOutside(markup);
14500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    takeFromDocument();
14510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
14520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
14530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
1454231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \internal
1455231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Walk \a node's parents until a valid QWebElement is found.
1456231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    For example, a WebCore::Text node is not a valid Html QWebElement, but its
1457231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    enclosing p tag is.
1458231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block*/
1459231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockQWebElement QWebElement::enclosingElement(WebCore::Node* node)
1460231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1461231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    QWebElement element(node);
1462231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1463231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    while (element.isNull() && node) {
1464231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        node = node->parentNode();
1465231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        element = QWebElement(node);
1466231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
1467231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return element;
1468231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1469231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1470231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block/*!
14710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \fn inline bool QWebElement::operator==(const QWebElement& o) const;
14720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1473231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns true if this element points to the same underlying DOM object as
1474231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    \a o; otherwise returns false.
14750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
14760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
14770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*!
14780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    \fn inline bool QWebElement::operator!=(const QWebElement& o) const;
14790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1480231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Returns true if this element points to a different underlying DOM object
1481231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    than \a o; otherwise returns false.
14820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
1483cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1484cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1485cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1486cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block  Render the element into \a painter .
1487cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1488cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid QWebElement::render(QPainter* painter)
1489cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
149081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    render(painter, QRect());
149181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
149281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
149381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch/*!
149481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch  Render the element into \a painter clipping to \a clip.
149581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch*/
149681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid QWebElement::render(QPainter* painter, const QRect& clip)
149781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
1498cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    WebCore::Element* e = m_element;
1499cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Document* doc = e ? e->document() : 0;
1500cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!doc)
1501cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
1502cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1503cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Frame* frame = doc->frame();
1504cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!frame || !frame->view() || !frame->contentRenderer())
1505cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
1506cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1507cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    FrameView* view = frame->view();
1508cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
15095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    view->updateLayoutAndStyleIfNeededRecursive();
1510cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1511cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    IntRect rect = e->getRect();
1512cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1513cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (rect.size().isEmpty())
1514cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
1515cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
151681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QRect finalClipRect = rect;
151781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!clip.isEmpty())
151881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        rect.intersect(clip.translated(rect.location()));
151981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
1520cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    GraphicsContext context(painter);
1521cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1522cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    context.save();
1523cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    context.translate(-rect.x(), -rect.y());
152481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    painter->setClipRect(finalClipRect, Qt::IntersectClip);
1525cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    view->setNodeToDraw(e);
152681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view->paintContents(&context, finalClipRect);
1527cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    view->setNodeToDraw(0);
1528cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    context.restore();
1529cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
1530cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1531cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockclass QWebElementCollectionPrivate : public QSharedData
1532cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
1533cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockpublic:
1534cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    static QWebElementCollectionPrivate* create(const PassRefPtr<Node> &context, const QString &query);
1535cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1536cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    RefPtr<NodeList> m_result;
1537cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1538cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockprivate:
1539cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    inline QWebElementCollectionPrivate() {}
1540cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block};
1541cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1542cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockQWebElementCollectionPrivate* QWebElementCollectionPrivate::create(const PassRefPtr<Node> &context, const QString &query)
1543cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
1544cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!context)
1545cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return 0;
1546cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1547cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // Let WebKit do the hard work hehehe
1548cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    ExceptionCode exception = 0; // ###
1549cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    RefPtr<NodeList> nodes = context->querySelectorAll(query, exception);
1550cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!nodes)
1551cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return 0;
1552cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1553cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QWebElementCollectionPrivate* priv = new QWebElementCollectionPrivate;
1554cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    priv->m_result = nodes;
1555cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    return priv;
1556cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
1557cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1558cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1559cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \class QWebElementCollection
1560cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \since 4.6
1561cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \brief The QWebElementCollection class represents a collection of web elements.
1562cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \preliminary
1563cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1564cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Elements in a document can be selected using QWebElement::findAll() or using the
1565cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QWebElement constructor. The collection is composed by choosing all elements in the
1566cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    document that match a specified CSS selector expression.
1567cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1568cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    The number of selected elements is provided through the count() property. Individual
1569cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    elements can be retrieved by index using at().
1570cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1571cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    It is also possible to iterate through all elements in the collection using Qt's foreach
1572cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    macro:
1573cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1574cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \code
1575cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        QWebElementCollection collection = document.findAll("p");
1576cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        foreach (QWebElement paraElement, collection) {
1577cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            ...
1578cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        }
1579cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \endcode
1580cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1581cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1582cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1583cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Constructs an empty collection.
1584cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1585cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockQWebElementCollection::QWebElementCollection()
1586cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
1587cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
1588cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1589cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1590cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Constructs a copy of \a other.
1591cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1592cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockQWebElementCollection::QWebElementCollection(const QWebElementCollection &other)
1593cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    : d(other.d)
1594cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
1595cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
1596cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1597cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1598cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Constructs a collection of elements from the list of child elements of \a contextElement that
1599cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    match the specified CSS selector \a query.
1600cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1601cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockQWebElementCollection::QWebElementCollection(const QWebElement &contextElement, const QString &query)
1602cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
1603cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    d = QExplicitlySharedDataPointer<QWebElementCollectionPrivate>(QWebElementCollectionPrivate::create(contextElement.m_element, query));
1604cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
1605cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1606cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1607cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Assigns \a other to this collection and returns a reference to this collection.
1608cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1609cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockQWebElementCollection &QWebElementCollection::operator=(const QWebElementCollection &other)
1610cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
1611cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    d = other.d;
1612cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    return *this;
1613cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
1614cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1615cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1616cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Destroys the collection.
1617cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1618cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockQWebElementCollection::~QWebElementCollection()
1619cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
1620cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
1621cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1622cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*! \fn QWebElementCollection &QWebElementCollection::operator+=(const QWebElementCollection &other)
1623cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1624cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Appends the items of the \a other list to this list and returns a
1625cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    reference to this list.
1626cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1627cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \sa operator+(), append()
1628cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1629cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1630cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1631cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Returns a collection that contains all the elements of this collection followed
1632cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    by all the elements in the \a other collection. Duplicates may occur in the result.
1633cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1634cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \sa operator+=()
1635cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1636cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockQWebElementCollection QWebElementCollection::operator+(const QWebElementCollection &other) const
1637cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
1638cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QWebElementCollection n = *this; n.d.detach(); n += other; return n;
1639cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
1640cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1641cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1642cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Extends the collection by appending all items of \a other.
1643cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1644cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    The resulting collection may include duplicate elements.
1645cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1646cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \sa operator+=()
1647cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1648cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid QWebElementCollection::append(const QWebElementCollection &other)
1649cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
1650cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!d) {
1651cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        *this = other;
1652cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
1653cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
1654cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!other.d)
1655cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
1656cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Vector<RefPtr<Node> > nodes;
1657cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    RefPtr<NodeList> results[] = { d->m_result, other.d->m_result };
1658cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    nodes.reserveInitialCapacity(results[0]->length() + results[1]->length());
1659cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1660cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    for (int i = 0; i < 2; ++i) {
1661cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int j = 0;
1662cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        Node* n = results[i]->item(j);
1663cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        while (n) {
1664cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            nodes.append(n);
1665cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            n = results[i]->item(++j);
1666cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        }
1667cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
1668cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1669cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    d->m_result = StaticNodeList::adopt(nodes);
1670cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
1671cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1672cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1673cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Returns the number of elements in the collection.
1674cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1675cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockint QWebElementCollection::count() const
1676cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
1677cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!d)
1678cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return 0;
1679cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    return d->m_result->length();
1680cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
1681cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1682cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1683cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Returns the element at index position \a i in the collection.
1684cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1685cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockQWebElement QWebElementCollection::at(int i) const
1686cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
1687cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!d)
1688cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return QWebElement();
1689cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Node* n = d->m_result->item(i);
1690cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    return QWebElement(static_cast<Element*>(n));
1691cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
1692cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1693cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1694cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn const QWebElement QWebElementCollection::operator[](int position) const
1695cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1696cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Returns the element at the specified \a position in the collection.
1697cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1698cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1699cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*! \fn QWebElement QWebElementCollection::first() const
1700cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1701cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Returns the first element in the collection.
1702cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1703cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \sa last(), operator[](), at(), count()
1704cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1705cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1706cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*! \fn QWebElement QWebElementCollection::last() const
1707cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1708cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Returns the last element in the collection.
1709cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1710cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \sa first(), operator[](), at(), count()
1711cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1712cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1713cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1714cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Returns a QList object with the elements contained in this collection.
1715cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1716cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockQList<QWebElement> QWebElementCollection::toList() const
1717cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
1718cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!d)
1719cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return QList<QWebElement>();
1720cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QList<QWebElement> elements;
1721cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    int i = 0;
1722cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Node* n = d->m_result->item(i);
1723cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    while (n) {
1724cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        if (n->isElementNode())
1725cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            elements.append(QWebElement(static_cast<Element*>(n)));
1726cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        n = d->m_result->item(++i);
1727cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
1728cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    return elements;
1729cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
1730cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1731cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1732cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn QWebElementCollection::const_iterator QWebElementCollection::begin() const
1733cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1734cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Returns an STL-style iterator pointing to the first element in the collection.
1735cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1736cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \sa end()
1737cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1738cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1739cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1740cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn QWebElementCollection::const_iterator QWebElementCollection::end() const
1741cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1742cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Returns an STL-style iterator pointing to the imaginary element after the
1743cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    last element in the list.
1744cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1745cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \sa begin()
1746cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1747cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1748cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1749cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \class QWebElementCollection::const_iterator
1750cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \since 4.6
1751cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \brief The QWebElementCollection::const_iterator class provides an STL-style const iterator for QWebElementCollection.
1752cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1753cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QWebElementCollection provides STL style const iterators for fast low-level access to the elements.
1754cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1755cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QWebElementCollection::const_iterator allows you to iterate over a QWebElementCollection.
1756cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1757cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1758cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1759cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn QWebElementCollection::const_iterator::const_iterator(const const_iterator &other)
1760cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1761cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Constructs a copy of \a other.
1762cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1763cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1764cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1765cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn QWebElementCollection::const_iterator::const_iterator(const QWebElementCollection *collection, int index)
1766cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \internal
1767cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1768cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1769cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1770cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn const QWebElement QWebElementCollection::const_iterator::operator*() const
1771cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1772cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Returns the current element.
1773cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1774cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1775cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1776cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn bool QWebElementCollection::const_iterator::operator==(const const_iterator &other) const
1777cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1778cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Returns true if \a other points to the same item as this iterator;
1779cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    otherwise returns false.
1780cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1781cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \sa operator!=()
1782cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1783cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1784cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1785cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn bool QWebElementCollection::const_iterator::operator!=(const const_iterator &other) const
1786cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1787cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Returns true if \a other points to a different element than this;
1788cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    iterator; otherwise returns false.
1789cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1790cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \sa operator==()
1791cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1792cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1793cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1794cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn QWebElementCollection::const_iterator &QWebElementCollection::const_iterator::operator++()
1795cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1796cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    The prefix ++ operator (\c{++it}) advances the iterator to the next element in the collection
1797cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    and returns an iterator to the new current element.
1798cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1799cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Calling this function on QWebElementCollection::end() leads to undefined results.
1800cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1801cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \sa operator--()
1802cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1803cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1804cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1805cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn QWebElementCollection::const_iterator QWebElementCollection::const_iterator::operator++(int)
1806cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1807cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \overload
1808cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1809cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    The postfix ++ operator (\c{it++}) advances the iterator to the next element in the collection
1810cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    and returns an iterator to the previously current element.
1811cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1812cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Calling this function on QWebElementCollection::end() leads to undefined results.
1813cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1814cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1815cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1816cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn QWebElementCollection::const_iterator &QWebElementCollection::const_iterator::operator--()
1817cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1818cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    The prefix -- operator (\c{--it}) makes the preceding element current and returns an
1819cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    iterator to the new current element.
1820cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1821cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Calling this function on QWebElementCollection::begin() leads to undefined results.
1822cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1823cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \sa operator++()
1824cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1825cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1826cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1827cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn QWebElementCollection::const_iterator QWebElementCollection::const_iterator::operator--(int)
1828cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1829cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \overload
1830cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1831cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    The postfix -- operator (\c{it--}) makes the preceding element current and returns
1832cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    an iterator to the previously current element.
1833cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1834cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1835cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1836cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn QWebElementCollection::const_iterator &QWebElementCollection::const_iterator::operator+=(int j)
1837cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1838cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Advances the iterator by \a j elements. If \a j is negative, the iterator goes backward.
1839cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1840cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \sa operator-=(), operator+()
1841cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1842cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1843cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1844cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn QWebElementCollection::const_iterator &QWebElementCollection::const_iterator::operator-=(int j)
1845cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1846cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Makes the iterator go back by \a j elements. If \a j is negative, the iterator goes forward.
1847cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1848cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \sa operator+=(), operator-()
1849cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1850cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1851cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1852cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn QWebElementCollection::const_iterator QWebElementCollection::const_iterator::operator+(int j) const
1853cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1854cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Returns an iterator to the element at \a j positions forward from this iterator. If \a j
1855cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    is negative, the iterator goes backward.
1856cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1857cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \sa operator-(), operator+=()
1858cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1859cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1860cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1861cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn QWebElementCollection::const_iterator QWebElementCollection::const_iterator::operator-(int j) const
1862cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1863cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Returns an iterator to the element at \a j positiosn backward from this iterator.
1864cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    If \a j is negative, the iterator goes forward.
1865cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1866cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \sa operator+(), operator-=()
1867cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1868cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1869cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1870cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn int QWebElementCollection::const_iterator::operator-(const_iterator other) const
1871cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1872cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Returns the number of elements between the item point to by \a other
1873cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    and the element pointed to by this iterator.
1874cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1875cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1876cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1877cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn bool QWebElementCollection::const_iterator::operator<(const const_iterator &other) const
1878cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1879cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Returns true if the element pointed to by this iterator is less than the element pointed to
1880cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    by the \a other iterator.
1881cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1882cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1883cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1884cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn bool QWebElementCollection::const_iterator::operator<=(const const_iterator &other) const
1885cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1886cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Returns true if the element pointed to by this iterator is less than or equal to the
1887cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    element pointed to by the \a other iterator.
1888cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1889cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1890cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1891cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn bool QWebElementCollection::const_iterator::operator>(const const_iterator &other) const
1892cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1893cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Returns true if the element pointed to by this iterator is greater than the element pointed to
1894cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    by the \a other iterator.
1895cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1896cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1897cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/*!
1898cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    \fn bool QWebElementCollection::const_iterator::operator>=(const const_iterator &other) const
1899cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1900cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Returns true if the element pointed to by this iterator is greater than or equal to the
1901cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    element pointed to by the \a other iterator.
1902cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block*/
1903643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1904643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
1905643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn QWebElementCollection::iterator QWebElementCollection::begin()
1906643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1907643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Returns an STL-style iterator pointing to the first element in the collection.
1908643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1909643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \sa end()
1910643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
1911643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1912643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
1913643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn QWebElementCollection::iterator QWebElementCollection::end()
1914643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1915643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Returns an STL-style iterator pointing to the imaginary element after the
1916643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    last element in the list.
1917643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1918643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \sa begin()
1919643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
1920643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1921643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
1922643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn QWebElementCollection::const_iterator QWebElementCollection::constBegin() const
1923643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1924643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Returns an STL-style iterator pointing to the first element in the collection.
1925643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1926643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \sa end()
1927643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
1928643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1929643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
1930643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn QWebElementCollection::const_iterator QWebElementCollection::constEnd() const
1931643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1932643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Returns an STL-style iterator pointing to the imaginary element after the
1933643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    last element in the list.
1934643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1935643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \sa begin()
1936643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
1937643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1938643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
1939643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \class QWebElementCollection::iterator
1940643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \since 4.6
1941643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \brief The QWebElementCollection::iterator class provides an STL-style iterator for QWebElementCollection.
1942643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1943643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    QWebElementCollection provides STL style iterators for fast low-level access to the elements.
1944643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1945643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    QWebElementCollection::iterator allows you to iterate over a QWebElementCollection.
1946643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
1947643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1948643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
1949643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn QWebElementCollection::iterator::iterator(const iterator &other)
1950643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1951643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Constructs a copy of \a other.
1952643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
1953643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1954643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
1955643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn QWebElementCollection::iterator::iterator(const QWebElementCollection *collection, int index)
1956643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \internal
1957643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
1958643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1959643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
1960643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn const QWebElement QWebElementCollection::iterator::operator*() const
1961643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1962643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Returns the current element.
1963643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
1964643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1965643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
1966643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn bool QWebElementCollection::iterator::operator==(const iterator &other) const
1967643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1968643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Returns true if \a other points to the same item as this iterator;
1969643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    otherwise returns false.
1970643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1971643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \sa operator!=()
1972643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
1973643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1974643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
1975643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn bool QWebElementCollection::iterator::operator!=(const iterator &other) const
1976643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1977643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Returns true if \a other points to a different element than this;
1978643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    iterator; otherwise returns false.
1979643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1980643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \sa operator==()
1981643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
1982643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1983643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
1984643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn QWebElementCollection::iterator &QWebElementCollection::iterator::operator++()
1985643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1986643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    The prefix ++ operator (\c{++it}) advances the iterator to the next element in the collection
1987643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    and returns an iterator to the new current element.
1988643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1989643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Calling this function on QWebElementCollection::end() leads to undefined results.
1990643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1991643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \sa operator--()
1992643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
1993643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1994643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
1995643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn QWebElementCollection::iterator QWebElementCollection::iterator::operator++(int)
1996643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1997643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \overload
1998643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1999643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    The postfix ++ operator (\c{it++}) advances the iterator to the next element in the collection
2000643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    and returns an iterator to the previously current element.
2001643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2002643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Calling this function on QWebElementCollection::end() leads to undefined results.
2003643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
2004643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2005643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
2006643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn QWebElementCollection::iterator &QWebElementCollection::iterator::operator--()
2007643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2008643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    The prefix -- operator (\c{--it}) makes the preceding element current and returns an
2009643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    iterator to the new current element.
2010643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2011643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Calling this function on QWebElementCollection::begin() leads to undefined results.
2012643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2013643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \sa operator++()
2014643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
2015643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2016643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
2017643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn QWebElementCollection::iterator QWebElementCollection::iterator::operator--(int)
2018643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2019643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \overload
2020643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2021643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    The postfix -- operator (\c{it--}) makes the preceding element current and returns
2022643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    an iterator to the previously current element.
2023643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
2024643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2025643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
2026643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn QWebElementCollection::iterator &QWebElementCollection::iterator::operator+=(int j)
2027643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2028643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Advances the iterator by \a j elements. If \a j is negative, the iterator goes backward.
2029643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2030643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \sa operator-=(), operator+()
2031643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
2032643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2033643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
2034643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn QWebElementCollection::iterator &QWebElementCollection::iterator::operator-=(int j)
2035643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2036643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Makes the iterator go back by \a j elements. If \a j is negative, the iterator goes forward.
2037643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2038643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \sa operator+=(), operator-()
2039643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
2040643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2041643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
2042643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn QWebElementCollection::iterator QWebElementCollection::iterator::operator+(int j) const
2043643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2044643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Returns an iterator to the element at \a j positions forward from this iterator. If \a j
2045643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    is negative, the iterator goes backward.
2046643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2047643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \sa operator-(), operator+=()
2048643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
2049643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2050643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
2051643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn QWebElementCollection::iterator QWebElementCollection::iterator::operator-(int j) const
2052643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2053643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Returns an iterator to the element at \a j positiosn backward from this iterator.
2054643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    If \a j is negative, the iterator goes forward.
2055643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2056643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \sa operator+(), operator-=()
2057643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
2058643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2059643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
2060643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn int QWebElementCollection::iterator::operator-(iterator other) const
2061643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2062643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Returns the number of elements between the item point to by \a other
2063643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    and the element pointed to by this iterator.
2064643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
2065643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2066643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
2067643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn bool QWebElementCollection::iterator::operator<(const iterator &other) const
2068643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2069643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Returns true if the element pointed to by this iterator is less than the element pointed to
2070643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    by the \a other iterator.
2071643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
2072643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2073643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
2074643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn bool QWebElementCollection::iterator::operator<=(const iterator &other) const
2075643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2076643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Returns true if the element pointed to by this iterator is less than or equal to the
2077643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    element pointed to by the \a other iterator.
2078643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
2079643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2080643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
2081643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn bool QWebElementCollection::iterator::operator>(const iterator &other) const
2082643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2083643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Returns true if the element pointed to by this iterator is greater than the element pointed to
2084643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    by the \a other iterator.
2085643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
2086643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2087643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*!
2088643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    \fn bool QWebElementCollection::iterator::operator>=(const iterator &other) const
2089643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2090643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Returns true if the element pointed to by this iterator is greater than or equal to the
2091643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    element pointed to by the \a other iterator.
2092643ca7872b450ea4efacab6188849e5aac2ba161Steve Block*/
2093