#ifndef _DOM_NodeImpl_h_
#define _DOM_NodeImpl_h_
#include "dom/dom_misc.h"
#include "dom/dom_string.h"
#include "dom/dom_node.h"
#include "misc/main_thread_malloc.h"
#include "misc/helper.h"
#include "misc/shared.h"
#include "dom_atomicstring.h"
class QPainter;
template <class type> class QPtrList;
template <class type> class QPtrDict;
class KHTMLView;
class RenderArena;
class QRect;
class QMouseEvent;
class QKeyEvent;
class QTextStream;
class QStringList;
class QWheelEvent;
namespace khtml {
class RenderObject;
class RenderStyle;
};
namespace DOM {
class DocumentImpl;
class ElementImpl;
class EventImpl;
class NodeListImpl;
class RegisteredEventListener;
#define XHTML_NAMESPACE "http://www.w3.org/1999/xhtml"
const Q_UINT16 noNamespace = 0;
const Q_UINT16 anyNamespace = 1;
const Q_UINT16 xhtmlNamespace = 2;
const Q_UINT16 anyLocalName = 0;
const Q_UINT32 namespaceMask = 0xFFFF0000U;
const Q_UINT32 localNameMask = 0x0000FFFFU;
inline Q_UINT16 namespacePart(Q_UINT32 i) { return i >> 16; }
inline Q_UINT16 localNamePart(Q_UINT32 i) { return i; }
inline Q_UINT32 makeId(Q_UINT16 n, Q_UINT16 l) { return (n << 16) | l; }
const Q_UINT32 anyQName = anyNamespace << 16 | anyLocalName;
class DocumentPtr : public khtml::Shared<DocumentPtr>
{
public:
DocumentImpl *document() const { return doc; }
private:
DocumentPtr() { doc = 0; }
friend class DocumentImpl;
friend class DOMImplementationImpl;
DocumentImpl *doc;
};
class NodeImpl : public khtml::TreeShared<NodeImpl>
{
friend class DocumentImpl;
public:
NodeImpl(DocumentPtr *doc);
virtual ~NodeImpl();
MAIN_THREAD_ALLOCATED;
virtual DOMString nodeName() const;
virtual DOMString nodeValue() const;
virtual void setNodeValue( const DOMString &_nodeValue, int &exceptioncode );
virtual unsigned short nodeType() const;
NodeImpl *parentNode() const { return m_parent; }
NodeImpl *previousSibling() const { return m_previous; }
NodeImpl *nextSibling() const { return m_next; }
virtual NodeListImpl *childNodes();
virtual NodeImpl *firstChild() const;
virtual NodeImpl *lastChild() const;
virtual NodeImpl *insertBefore ( NodeImpl *newChild, NodeImpl *refChild, int &exceptioncode );
virtual NodeImpl *replaceChild ( NodeImpl *newChild, NodeImpl *oldChild, int &exceptioncode );
virtual NodeImpl *removeChild ( NodeImpl *oldChild, int &exceptioncode );
virtual NodeImpl *appendChild ( NodeImpl *newChild, int &exceptioncode );
virtual void remove(int &exceptioncode);
virtual bool hasChildNodes ( ) const;
virtual NodeImpl *cloneNode ( bool deep ) = 0;
virtual DOMString localName() const;
virtual DOMString namespaceURI() const;
virtual DOMString prefix() const;
virtual void setPrefix(const DOMString &_prefix, int &exceptioncode );
void normalize ();
NodeImpl *lastDescendent() const;
virtual bool isElementNode() const { return false; }
virtual bool isHTMLElement() const { return false; }
virtual bool isAttributeNode() const { return false; }
virtual bool isTextNode() const { return false; }
virtual bool isDocumentNode() const { return false; }
virtual bool isXMLElementNode() const { return false; }
bool isBlockFlow() const;
bool isBlockFlowOrTable() const;
virtual bool isMalformed() { return false; }
virtual void setMalformed(bool malformed) {};
virtual bool containsOnlyWhitespace() const { return false; }
void setPreviousSibling(NodeImpl *previous) { m_previous = previous; }
void setNextSibling(NodeImpl *next) { m_next = next; }
virtual void setFirstChild(NodeImpl *child);
virtual void setLastChild(NodeImpl *child);
bool isAtomicNode() const;
NodeImpl *previousNodeConsideringAtomicNodes() const;
NodeImpl *nextNodeConsideringAtomicNodes() const;
NodeImpl *nextLeafNode() const;
NodeImpl *previousLeafNode() const;
bool isEditableBlock() const;
ElementImpl *enclosingBlockFlowElement() const;
ElementImpl *enclosingBlockFlowOrTableElement() const;
ElementImpl *enclosingInlineElement() const;
ElementImpl *rootEditableElement() const;
bool inSameRootEditableElement(NodeImpl *);
bool inSameContainingBlockFlowElement(NodeImpl *);
virtual NodeImpl *addChild(NodeImpl *newChild);
virtual void closeRenderer() { }
typedef Q_UINT32 Id;
virtual Id id() const { return 0; };
#if APPLE_CHANGES
Id identifier() const;
#endif
enum MouseEventType {
MousePress,
MouseRelease,
MouseClick,
MouseDblClick,
MouseMove
};
struct MouseEvent
{
MouseEvent( int _button, MouseEventType _type,
const DOMString &_url = DOMString(), const DOMString& _target = DOMString(),
NodeImpl *_innerNode = 0)
{
button = _button; type = _type;
url = _url; target = _target;
innerNode = _innerNode;
}
int button;
MouseEventType type;
DOMString url; DOMString target;
Node innerNode;
};
virtual void sheetLoaded() {}
bool hasID() const { return m_hasId; }
bool hasClass() const { return m_hasClass; }
bool hasStyle() const { return m_hasStyle; }
bool active() const { return m_active; }
bool inActiveChain() const { return m_inActiveChain; }
bool hovered() const { return m_hovered; }
bool focused() const { return m_focused; }
bool attached() const { return m_attached; }
bool changed() const { return m_changed; }
bool hasChangedChild() const { return m_hasChangedChild; }
bool hasAnchor() const { return m_hasAnchor; }
bool inDocument() const { return document->document() && m_inDocument; }
bool styleElement() const { return m_styleElement; }
bool implicitNode() const { return m_implicit; }
void setHasID(bool b=true) { m_hasId = b; }
void setHasClass(bool b=true) { m_hasClass = b; }
void setHasStyle(bool b=true) { m_hasStyle = b; }
void setHasChangedChild( bool b = true ) { m_hasChangedChild = b; }
void setInDocument(bool b=true) { m_inDocument = b; }
virtual void setFocus(bool b=true) { m_focused = b; }
virtual void setActive(bool b=true) { m_active = b; }
void setInActiveChain(bool b=true) { m_inActiveChain = b; }
virtual void setHovered(bool b=true) { m_hovered = b; }
void setChanged(bool b=true);
unsigned short tabIndex() const { return m_tabIndex; }
void setTabIndex(unsigned short _tabIndex) { m_tabIndex = _tabIndex; }
virtual bool isFocusable() const;
virtual bool isKeyboardFocusable() const;
virtual bool isMouseFocusable() const;
virtual bool isInline() const;
virtual bool isContentEditable() const;
virtual QRect getRect() const;
enum StyleChange { NoChange, NoInherit, Inherit, Detach, Force };
virtual void recalcStyle( StyleChange = NoChange ) {}
StyleChange diff( khtml::RenderStyle *s1, khtml::RenderStyle *s2 ) const;
unsigned long nodeIndex() const;
DocumentImpl* getDocument() const { return document->document(); }
void setDocument(DocumentPtr *doc);
void addEventListener(int id, EventListener *listener, const bool useCapture);
void removeEventListener(int id, EventListener *listener, bool useCapture);
void removeHTMLEventListener(int id);
void setHTMLEventListener(int id, EventListener *listener);
EventListener *getHTMLEventListener(int id);
void removeAllEventListeners();
bool dispatchEvent(EventImpl *evt, int &exceptioncode, bool tempEvent = false);
bool dispatchGenericEvent( EventImpl *evt, int &exceptioncode);
bool dispatchHTMLEvent(int _id, bool canBubbleArg, bool cancelableArg);
bool dispatchWindowEvent(int _id, bool canBubbleArg, bool cancelableArg);
bool dispatchMouseEvent(QMouseEvent *e, int overrideId = 0, int overrideDetail = 0);
bool dispatchUIEvent(int _id, int detail = 0);
bool dispatchSubtreeModifiedEvent(bool childrenChanged = true);
bool dispatchKeyEvent(QKeyEvent *key);
void dispatchWheelEvent(QWheelEvent *);
void handleLocalEvents(EventImpl *evt, bool useCapture);
virtual void defaultEventHandler(EventImpl *evt);
virtual bool disabled() const;
virtual bool isReadOnly();
virtual bool childTypeAllowed( unsigned short ) { return false; }
virtual unsigned long childNodeCount() const;
virtual NodeImpl *childNode(unsigned long index);
NodeImpl *traverseNextNode(const NodeImpl *stayWithin = 0) const;
NodeImpl *traverseNextSibling(const NodeImpl *stayWithin = 0) const;
NodeImpl *traversePreviousNode() const;
NodeImpl *traversePreviousNodePostOrder(const NodeImpl *stayWithin = 0) const;
DocumentPtr *docPtr() const { return document; }
NodeImpl *previousEditable() const;
NodeImpl *nextEditable() const;
khtml::RenderObject *renderer() const { return m_render; }
khtml::RenderObject *nextRenderer();
khtml::RenderObject *previousRenderer();
void setRenderer(khtml::RenderObject* renderer) { m_render = renderer; }
void checkSetPrefix(const DOMString &_prefix, int &exceptioncode);
void checkAddChild(NodeImpl *newChild, int &exceptioncode);
bool isAncestor(const NodeImpl *) const;
virtual bool childAllowed( NodeImpl *newChild );
virtual long maxOffset() const;
long maxDeepOffset() const;
virtual long caretMinOffset() const;
virtual long caretMaxOffset() const;
virtual unsigned long caretMaxRenderedOffset() const;
virtual long previousOffset (long current) const;
virtual long nextOffset (long current) const;
#ifndef NDEBUG
virtual void dump(QTextStream *stream, QString ind = "") const;
#endif
virtual void attach();
virtual void detach();
virtual void willRemove();
void createRendererIfNeeded();
virtual khtml::RenderStyle *styleForRenderer(khtml::RenderObject *parent);
virtual bool rendererIsNeeded(khtml::RenderStyle *);
virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
virtual bool maintainsState();
virtual QString state();
virtual void restoreState(QStringList &stateList);
virtual void insertedIntoDocument();
virtual void removedFromDocument();
virtual void childrenChanged();
virtual DOMString toString() const = 0;
#ifndef NDEBUG
virtual void formatForDebugger(char *buffer, unsigned length) const;
void displayNode(const char *prefix="");
void displayTree();
#endif
void registerNodeList(NodeListImpl *list);
void unregisterNodeList(NodeListImpl *list);
void notifyNodeListsSubtreeModified();
void notifyLocalNodeListsSubtreeModified();
private: DocumentPtr *document;
NodeImpl *m_previous;
NodeImpl *m_next;
protected:
khtml::RenderObject *m_render;
QPtrList<RegisteredEventListener> *m_regdListeners;
QPtrDict<NodeListImpl> *m_nodeLists;
unsigned short m_tabIndex : 15;
bool m_hasTabIndex : 1;
bool m_hasId : 1;
bool m_hasClass : 1;
bool m_hasStyle : 1;
bool m_attached : 1;
bool m_changed : 1;
bool m_hasChangedChild : 1;
bool m_inDocument : 1;
bool m_hasAnchor : 1;
bool m_specified : 1; bool m_focused : 1;
bool m_active : 1;
bool m_hovered : 1;
bool m_inActiveChain : 1;
bool m_styleElement : 1; bool m_implicit : 1;
};
class NodeBaseImpl : public NodeImpl
{
public:
NodeBaseImpl(DocumentPtr *doc);
virtual ~NodeBaseImpl();
virtual NodeImpl *firstChild() const;
virtual NodeImpl *lastChild() const;
virtual NodeImpl *insertBefore ( NodeImpl *newChild, NodeImpl *refChild, int &exceptioncode );
virtual NodeImpl *replaceChild ( NodeImpl *newChild, NodeImpl *oldChild, int &exceptioncode );
virtual NodeImpl *removeChild ( NodeImpl *oldChild, int &exceptioncode );
virtual NodeImpl *appendChild ( NodeImpl *newChild, int &exceptioncode );
virtual bool hasChildNodes ( ) const;
void willRemove();
int willRemoveChild(NodeImpl *child);
void removeChildren();
void cloneChildNodes(NodeImpl *clone);
virtual void setFirstChild(NodeImpl *child);
virtual void setLastChild(NodeImpl *child);
virtual NodeImpl *addChild(NodeImpl *newChild);
virtual void attach();
virtual void detach();
virtual NodeListImpl *getElementsByTagNameNS ( DOMStringImpl* namespaceURI,
DOMStringImpl* localName );
virtual QRect getRect() const;
bool getUpperLeftCorner(int &xPos, int &yPos) const;
bool getLowerRightCorner(int &xPos, int &yPos) const;
virtual void setFocus(bool=true);
virtual void setActive(bool=true);
virtual void setHovered(bool=true);
virtual unsigned long childNodeCount() const;
virtual NodeImpl *childNode(unsigned long index);
virtual void insertedIntoDocument();
virtual void removedFromDocument();
bool checkNoOwner( NodeImpl *other, int &exceptioncode );
NodeImpl *_first;
NodeImpl *_last;
bool checkSameDocument( NodeImpl *newchild, int &exceptioncode );
bool checkIsChild( NodeImpl *oldchild, int &exceptioncode );
void dispatchChildInsertedEvents( NodeImpl *child, int &exceptioncode );
void dispatchChildRemovalEvents( NodeImpl *child, int &exceptioncode );
};
class Node;
class NodeImpl;
class NodeListImpl : public khtml::Shared<NodeListImpl>
{
public:
NodeListImpl( NodeImpl *_rootNode );
virtual ~NodeListImpl();
MAIN_THREAD_ALLOCATED;
virtual unsigned long length() const = 0;
virtual NodeImpl *item ( unsigned long index ) const = 0;
virtual NodeImpl *itemById ( const DOMString & elementId ) const;
void rootNodeSubtreeModified();
#if APPLE_CHANGES
static NodeList createInstance(NodeListImpl *impl);
#endif
protected:
unsigned long recursiveLength(NodeImpl *start = 0) const;
NodeImpl *recursiveItem ( unsigned long offset, NodeImpl *start = 0 ) const;
virtual bool nodeMatches( NodeImpl *testNode ) const = 0;
NodeImpl *rootNode;
mutable int cachedLength;
mutable NodeImpl *lastItem;
mutable unsigned long lastItemOffset;
mutable bool isLengthCacheValid : 1;
mutable bool isItemCacheValid : 1;
};
class ChildNodeListImpl : public NodeListImpl
{
public:
ChildNodeListImpl( NodeImpl *n);
virtual unsigned long length() const;
virtual NodeImpl *item ( unsigned long index ) const;
protected:
virtual bool nodeMatches( NodeImpl *testNode ) const;
};
class TagNodeListImpl : public NodeListImpl
{
public:
TagNodeListImpl( NodeImpl *n, NodeImpl::Id tagId, NodeImpl::Id tagIdMask );
virtual unsigned long length() const;
virtual NodeImpl *item ( unsigned long index ) const;
protected:
virtual bool nodeMatches( NodeImpl *testNode ) const;
NodeImpl::Id m_id;
NodeImpl::Id m_idMask;
};
class NameNodeListImpl : public NodeListImpl
{
public:
NameNodeListImpl( NodeImpl *doc, const DOMString &t );
virtual unsigned long length() const;
virtual NodeImpl *item ( unsigned long index ) const;
protected:
virtual bool nodeMatches( NodeImpl *testNode ) const;
DOMString nodeName;
};
class NamedNodeMapImpl : public khtml::Shared<NamedNodeMapImpl>
{
public:
NamedNodeMapImpl();
virtual ~NamedNodeMapImpl();
MAIN_THREAD_ALLOCATED;
virtual NodeImpl *getNamedItem ( NodeImpl::Id id ) const = 0;
virtual Node removeNamedItem ( NodeImpl::Id id, int &exceptioncode ) = 0;
virtual Node setNamedItem ( NodeImpl* arg, int &exceptioncode ) = 0;
virtual NodeImpl *item ( unsigned long index ) const = 0;
virtual unsigned long length( ) const = 0;
virtual NodeImpl::Id mapId(const DOMString& namespaceURI, const DOMString& localName, bool readonly) = 0;
virtual bool isReadOnly() { return false; }
#if APPLE_CHANGES
static NamedNodeMap createInstance(NamedNodeMapImpl *impl);
#endif
};
#if 0
class GenericRONamedNodeMapImpl : public NamedNodeMapImpl
{
public:
GenericRONamedNodeMapImpl(DocumentPtr* doc);
virtual ~GenericRONamedNodeMapImpl();
virtual NodeImpl *getNamedItem ( const DOMString &name, int &exceptioncode ) const;
virtual Node setNamedItem ( const Node &arg, int &exceptioncode );
virtual Node removeNamedItem ( const DOMString &name, int &exceptioncode );
virtual NodeImpl *item ( unsigned long index ) const;
virtual unsigned long length( ) const;
virtual NodeImpl *getNamedItemNS( const DOMString &namespaceURI, const DOMString &localName,
int &exceptioncode ) const;
virtual NodeImpl *setNamedItemNS( NodeImpl *arg, int &exceptioncode );
virtual NodeImpl *removeNamedItemNS( const DOMString &namespaceURI, const DOMString &localName,
int &exceptioncode );
virtual bool isReadOnly() { return true; }
void addNode(NodeImpl *n);
protected:
DocumentImpl* m_doc;
QPtrList<NodeImpl> *m_contents;
};
#endif
}; #endif