* Any method that alters the tree structure MUST cause or be * accompanied by a call to changed(), to inform it that any outstanding * NodeLists may have to be updated. *
* (Required because NodeList is simultaneously "live" and integer- * indexed -- a bad decision in the DOM's design.) *
* Note that changes which do not affect the tree's structure -- changing * the node's name, for example -- do _not_ have to call changed(). *
* Alternative implementation would be to use a cryptographic * Digest value rather than a count. This would have the advantage that * "harmless" changes (those producing equal() trees) would not force * NodeList to resynchronize. Disadvantage is that it's slightly more prone * to "false negatives", though that's the difference between "wildly * unlikely" and "absurdly unlikely". IF we start maintaining digests, * we should consider taking advantage of them. * * Note: This used to be done a node basis, so that we knew what * subtree changed. But since only DeepNodeList really use this today, * the gain appears to be really small compared to the cost of having * an int on every (parent) node plus having to walk up the tree all the * way to the root to mark the branch as changed everytime a node is * changed. * So we now have a single counter global to the document. It means that * some objects may flush their cache more often than necessary, but this * makes nodes smaller and only the document needs to be marked as changed. */ int fChanges; /** Bypass error checking. */ bool errorChecking; MemoryManager *fMemoryManager; friend class NodeIteratorImpl; friend class TreeWalkerImpl; friend class RangeImpl; friend class DOMParser; public: DocumentImpl(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager); DocumentImpl(const DOMString &namespaceURI, //DOM Level 2 const DOMString &qualifiedName, DocumentTypeImpl *doctype, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager); virtual ~DocumentImpl(); virtual bool isDocumentImpl(); // RTTI replacement function virtual NodeImpl *cloneNode(bool deep); virtual DOMString getNodeName(); virtual short getNodeType(); virtual DocumentImpl * getOwnerDocument(); virtual AttrImpl *createAttribute(const DOMString &name); virtual CDATASectionImpl *createCDATASection(const DOMString &data); virtual CommentImpl *createComment(const DOMString &data); virtual DocumentFragmentImpl *createDocumentFragment(); virtual DocumentTypeImpl *createDocumentType(const DOMString &name); virtual DocumentTypeImpl *createDocumentType(const DOMString &qName, const DOMString &publicId, const DOMString &systemId); virtual ElementImpl *createElement(const DOMString & tagName); virtual ElementImpl *createElement(const XMLCh *tagName); virtual EntityImpl *createEntity(const DOMString & name); virtual EntityReferenceImpl *createEntityReference(const DOMString & name); virtual NotationImpl *createNotation(const DOMString & name); virtual ProcessingInstructionImpl *createProcessingInstruction(const DOMString & target, const DOMString & data); virtual TextImpl *createTextNode(const DOMString & data); virtual DocumentTypeImpl *getDoctype(); virtual ElementImpl *getDocumentElement(); virtual DeepNodeListImpl *getElementsByTagName(const DOMString & tagname); virtual NodeImpl *insertBefore(NodeImpl *newChild, NodeImpl *refChild); bool isXMLName(const DOMString & s); virtual void referenced(); virtual NodeImpl *removeChild(NodeImpl *oldChild); virtual void unreferenced(); static NodeIteratorImpl* createNodeIterator(DOM_Node root, unsigned long whatToShow, DOM_NodeFilter* filter, bool entityReferenceExpansion, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager); static TreeWalkerImpl* createTreeWalker(DOM_Node root, unsigned long whatToShow, DOM_NodeFilter* filter, bool entityReferenceExpansion, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager); virtual XMLDeclImpl* createXMLDecl(const DOMString& version, const DOMString& encoding, const DOMString& standalone); virtual void* getUserData(); virtual void setUserData(void* value); virtual RangeImpl* createRange(); virtual RangeImpls* getRanges(); //non-standard api virtual void removeRange(RangeImpl* range); //non-standard api // helper functions to prevent storing userdata pointers on every node. virtual void setUserData(NodeImpl* n, void* data); virtual void* getUserData(NodeImpl* n); //Introduced in DOM Level 2 virtual NodeImpl *importNode(NodeImpl *source, bool deep); virtual ElementImpl *createElementNS(const DOMString &namespaceURI, const DOMString &qualifiedName); virtual AttrImpl *createAttributeNS(const DOMString &namespaceURI, const DOMString &qualifiedName); virtual DeepNodeListImpl *getElementsByTagNameNS(const DOMString &namespaceURI, const DOMString &localName); virtual ElementImpl *getElementById(const DOMString &elementId); //Return the index > 0 of ':' in the given qualified name qName="prefix:localName". //Return 0 if there is no ':', or -1 if qName is malformed such as ":abcd". static int indexofQualifiedName(const DOMString & qName); static bool isKidOK(NodeImpl *parent, NodeImpl *child); inline NodeIDMap * getNodeIDMap() {return fNodeIDMap;}; virtual void changed(); virtual int changes(); /** * Sets whether the DOM implementation performs error checking * upon operations. Turning off error checking only affects * the following DOM checks: *
* Turning off error checking does not turn off the * following checks: *