/* * This file is part of the DOM implementation for KDE. * * (C) 1999 Lars Knoll (knoll@kde.org) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * This file includes excerpts from the Document Object Model (DOM) * Level 1 Specification (Recommendation) * http://www.w3.org/TR/REC-DOM-Level-1/ * Copyright © World Wide Web Consortium , (Massachusetts Institute of * Technology , Institut National de Recherche en Informatique et en * Automatique , Keio University ). All Rights Reserved. * */ #ifndef _DOM_ELEMENT_h_ #define _DOM_ELEMENT_h_ #include #include #include namespace DOM { class DOMString; class AttrImpl; class Element; class ElementImpl; class NamedAttrMapImpl; class DocumentImpl; /** * The \c Attr interface represents an attribute in an * \c Element object. Typically the allowable values for * the attribute are defined in a document type definition. * * \c Attr objects inherit the \c Node * interface, but since they are not actually child nodes of the * element they describe, the DOM does not consider them part of the * document tree. Thus, the \c Node attributes * \c parentNode , \c previousSibling , and * \c nextSibling have a null value for \c Attr * objects. The DOM takes the view that attributes are properties of * elements rather than having a separate identity from the elements * they are associated with; this should make it more efficient to * implement such features as default attributes associated with all * elements of a given type. Furthermore, \c Attr nodes * may not be immediate children of a \c DocumentFragment * . However, they can be associated with \c Element nodes * contained within a \c DocumentFragment . In short, * users and implementors of the DOM need to be aware that \c Attr * nodes have some things in common with other objects * inheriting the \c Node interface, but they also are * quite distinct. * * The attribute's effective value is determined as follows: if this * attribute has been explicitly assigned any value, that value is the * attribute's effective value; otherwise, if there is a declaration * for this attribute, and that declaration includes a default value, * then that default value is the attribute's effective value; * otherwise, the attribute does not exist on this element in the * structure model until it has been explicitly added. Note that the * \c nodeValue attribute on the \c Attr * instance can also be used to retrieve the string version of the * attribute's value(s). * * In XML, where the value of an attribute can contain entity * references, the child nodes of the \c Attr node provide * a representation in which entity references are not expanded. These * child nodes may be either \c Text or * \c EntityReference nodes. Because the attribute type may be * unknown, there are no tokenized attribute values. * */ class KHTML_EXPORT Attr : public Node { friend class Element; friend class Document; friend class DocumentImpl; friend class HTMLDocument; friend class ElementImpl; friend class NamedAttrMapImpl; friend class AttrImpl; public: Attr(); Attr(const Node &other) : Node() {(*this)=other;} Attr(const Attr &other); Attr & operator = (const Node &other); Attr & operator = (const Attr &other); ~Attr(); /** * Returns the name of this attribute. * */ DOMString name() const; /** * If this attribute was explicitly given a value in the original * document, this is \c true ; otherwise, it is * \c false . Note that the implementation is in charge of * this attribute, not the user. If the user changes the value of * the attribute (even if it ends up having the same value as the * default value) then the \c specified flag is * automatically flipped to \c true . To re-specify * the attribute as the default value from the DTD, the user must * delete the attribute. The implementation will then make a new * attribute available with \c specified set to * \c false and the default value (if one exists). * * In summary: * \li If the attribute has an assigned * value in the document then \c specified is * \c true , and the value is the assigned value. * * \li If the attribute has no assigned value in the * document and has a default value in the DTD, then * \c specified is \c false , and the value is * the default value in the DTD. * * \li If the attribute has no assigned value in the * document and has a value of #IMPLIED in the DTD, then the * attribute does not appear in the structure model of the * document. * * * */ bool specified() const; /** * On retrieval, the value of the attribute is returned as a * string. Character and general entity references are replaced * with their values. * * On setting, this creates a \c Text node with the * unparsed contents of the string. * */ DOMString value() const; /** * see value */ void setValue( const DOMString & ); /** * Introduced in DOM Level 2 * * The Element node this attribute is attached to or null if this attribute * is not in use. */ Element ownerElement() const; protected: Attr( AttrImpl *_impl ); }; class NodeList; class Attr; class DOMString; /** * By far the vast majority of objects (apart from text) that authors * encounter when traversing a document are \c Element * nodes. Assume the following XML document: <elementExample * id="demo"> <subelement1/> * <subelement2><subsubelement/></subelement2> * </elementExample> * * When represented using DOM, the top node is an \c Element * node for "elementExample", which contains two * child \c Element nodes, one for "subelement1" * and one for "subelement2". "subelement1" * contains no child nodes. * * Elements may have attributes associated with them; since the * \c Element interface inherits from \c Node * , the generic \c Node interface method * \c getAttributes may be used to retrieve the set of all * attributes for an element. There are methods on the \c Element * interface to retrieve either an \c Attr object * by name or an attribute value by name. In XML, where an attribute * value may contain entity references, an \c Attr object * should be retrieved to examine the possibly fairly complex sub-tree * representing the attribute value. On the other hand, in HTML, where * all attributes have simple string values, methods to directly * access an attribute value can safely be used as a convenience. * */ class KHTML_EXPORT Element : public Node { friend class Document; friend class HTMLDocument; // friend class AttrImpl; friend class Attr; public: Element(); Element(const Node &other) : Node() {(*this)=other;} Element(const Element &other); Element & operator = (const Node &other); Element & operator = (const Element &other); ~Element(); /** * The name of the element. For example, in: <elementExample * id="demo"> ... </elementExample> , * \c tagName has the value \c "elementExample" * . Note that this is case-preserving in XML, as are all * of the operations of the DOM. The HTML DOM returns the * \c tagName of an HTML element in the canonical uppercase * form, regardless of the case in the source HTML document. * */ DOMString tagName() const; /** * Retrieves an attribute value by name. * * @param name The name of the attribute to retrieve. * * @return The \c Attr value as a string, or the empty * string if that attribute does not have a specified or default * value. * */ DOMString getAttribute ( const DOMString &name ); /** * Adds a new attribute. If an attribute with that name is already * present in the element, its value is changed to be that of the * value parameter. This value is a simple string, it is not * parsed as it is being set. So any markup (such as syntax to be * recognized as an entity reference) is treated as literal text, * and needs to be appropriately escaped by the implementation * when it is written out. In order to assign an attribute value * that contains entity references, the user must create an * \c Attr node plus any \c Text and * \c EntityReference nodes, build the appropriate subtree, * and use \c setAttributeNode to assign it as the * value of an attribute. * * @param name The name of the attribute to create or alter. * * @param value Value to set in string form. * * @return * * @exception DOMException * INVALID_CHARACTER_ERR: Raised if the specified name contains an * invalid character. * * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. * */ void setAttribute ( const DOMString &name, const DOMString &value ); /** * Removes an attribute by name. If the removed attribute has a * default value it is immediately replaced. * * @param name The name of the attribute to remove. * * @return * * @exception DOMException * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. * */ void removeAttribute ( const DOMString &name ); /** * Retrieves an \c Attr node by name. * * @param name The name of the attribute to retrieve. * * @return The \c Attr node with the specified * attribute name or \c null if there is no such * attribute. * */ Attr getAttributeNode ( const DOMString &name ); /** * Adds a new attribute. If an attribute with that name is already * present in the element, it is replaced by the new one. * * @param newAttr The \c Attr node to add to the * attribute list. * * @return If the \c newAttr attribute replaces an * existing attribute with the same name, the previously existing * \c Attr node is returned, otherwise \c null * is returned. * * @exception DOMException * WRONG_DOCUMENT_ERR: Raised if \c newAttr was * created from a different document than the one that created the * element. * * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. * * INUSE_ATTRIBUTE_ERR: Raised if \c newAttr is * already an attribute of another \c Element object. * The DOM user must explicitly clone \c Attr nodes to * re-use them in other elements. * */ Attr setAttributeNode ( const Attr &newAttr ); /** * Removes the specified attribute. * * @param oldAttr The \c Attr node to remove from the * attribute list. If the removed \c Attr has a * default value it is immediately replaced. * * @return The \c Attr node that was removed. * * @exception DOMException * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. * * NOT_FOUND_ERR: Raised if \c oldAttr is not an * attribute of the element. * */ Attr removeAttributeNode ( const Attr &oldAttr ); /** * Returns a \c NodeList of all descendant elements * with a given tag name, in the order in which they would be * encountered in a preorder traversal of the \c Element * tree. * * @param name The name of the tag to match on. The special value * "*" matches all tags. * * @return A list of matching \c Element nodes. * */ NodeList getElementsByTagName ( const DOMString &name ); /** * Introduced in DOM Level 2 * Returns a NodeList of all the descendant Elements with a given local * name and namespace URI in the order in which they are encountered in a * preorder traversal of this Element tree. * * @param namespaceURI The namespace URI of the elements to match on. The * special value "*" matches all namespaces. * * @param localName The local name of the elements to match on. The special * value "*" matches all local names. * * @return A new NodeList object containing all the matched Elements. */ NodeList getElementsByTagNameNS ( const DOMString &namespaceURI, const DOMString &localName ); /** * Introduced in DOM Level 2. * * No Exceptions. * * Retrieves an attribute value by local name and namespace URI. HTML-only * DOM implementations do not need to implement this method. * * @param namespaceURI The namespace URI of the attribute to retrieve. * * @param localName The local name of the attribute to retrieve. * * @return The Attr value as a string, or the empty string if that * attribute does not have a specified or default value. */ DOMString getAttributeNS ( const DOMString &namespaceURI, const DOMString &localName ); /** * Introduced in DOM Level 2 * * Adds a new attribute. If an attribute with the same local name and * namespace URI is already present on the element, its prefix is changed * to be the prefix part of the qualifiedName, and its value is changed to * be the value parameter. This value is a simple string; it is not parsed * as it is being set. So any markup (such as syntax to be recognized as an * entity reference) is treated as literal text, and needs to be * appropriately escaped by the implementation when it is written out. In * order to assign an attribute value that contains entity references, the * user must create an Attr node plus any Text and EntityReference nodes, * build the appropriate subtree, and use setAttributeNodeNS or * setAttributeNode to assign it as the value of an attribute. * * HTML-only DOM implementations do not need to implement this method. * * @param namespaceURI The namespace URI of the attribute to create or * alter. * * @param qualifiedName The qualified name of the attribute to create or * alter. * * @param value The value to set in string form. * * @exception DOMException * INVALID_CHARACTER_ERR: Raised if the specified qualified name contains * an illegal character. * * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. * * NAMESPACE_ERR: Raised if the qualifiedName is malformed, if the * qualifiedName has a prefix and the namespaceURI is null, if the * qualifiedName has a prefix that is "xml" and the namespaceURI is * different from "http://www.w3.org/XML/1998/namespace", or if the * qualifiedName is "xmlns" and the namespaceURI is different from * "http://www.w3.org/2000/xmlns/". */ void setAttributeNS ( const DOMString &namespaceURI, const DOMString &qualifiedName, const DOMString &value ); /** * Introduced in DOM Level 2 * * Removes an attribute by local name and namespace URI. If the removed * attribute has a default value it is immediately replaced. The replacing * attribute has the same namespace URI and local name, as well as the * original prefix. * * HTML-only DOM implementations do not need to implement this method. * * @param namespaceURI The namespace URI of the attribute to remove. * * @param localName The local name of the attribute to remove. * * @exception DOMException * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. */ void removeAttributeNS ( const DOMString &namespaceURI, const DOMString &localName ); /** * Introduced in DOM Level 2 * * Retrieves an Attr node by local name and namespace URI. HTML-only DOM * implementations do not need to implement this method. * * @param namespaceURI The namespace URI of the attribute to retrieve. * * @param localName The local name of the attribute to retrieve. * * @return The Attr node with the specified attribute local name and * namespace URI or null if there is no such attribute. */ Attr getAttributeNodeNS ( const DOMString &namespaceURI, const DOMString &localName ); /** * Introduced in DOM Level 2 * * Adds a new attribute. If an attribute with that local name and that * namespace URI is already present in the element, it is replaced by the * new one. * * HTML-only DOM implementations do not need to implement this method. * * @param newAttr The Attr node to add to the attribute list. * * @return If the newAttr attribute replaces an existing attribute with the * same local name and namespace URI, the replaced Attr node is returned, * otherwise null is returned. * * @exception DOMException * WRONG_DOCUMENT_ERR: Raised if newAttr was created from a different * document than the one that created the element. * * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. * * INUSE_ATTRIBUTE_ERR: Raised if newAttr is already an attribute of * another Element object. The DOM user must explicitly clone Attr nodes to * re-use them in other elements. */ Attr setAttributeNodeNS ( const Attr &newAttr ); /** * Returns true when an attribute with a given name is specified on this * element or has a default value, false otherwise. * Introduced in DOM Level 2. * * @param name The name of the attribute to look for. * * @return true if an attribute with the given name is specified on this * element or has a default value, false otherwise. */ bool hasAttribute( const DOMString& name ); /** * Introduced in DOM Level 2 * * Returns true when an attribute with a given local name and namespace URI * is specified on this element or has a default value, false otherwise. * HTML-only DOM implementations do not need to implement this method. * * @param namespaceURI The namespace URI of the attribute to look for. * * @param localName The local name of the attribute to look for. * * @return true if an attribute with the given local name and namespace URI * is specified or has a default value on this element, false otherwise. */ bool hasAttributeNS ( const DOMString &namespaceURI, const DOMString &localName ); /** * Introduced in DOM Level 2 * This method is from the CSSStyleDeclaration interface * * The style attribute */ CSSStyleDeclaration style ( ); /** * not part of the official DOM * * This method will always reflect the editability setting of this * element as specified by a direct or indirect (that means, inherited) * assignment to contentEditable or the respective CSS rule, even if * design mode is active. * * @return whether this element is editable. * @since 3.2 * @see setContentEditable */ bool contentEditable() const; /** * not part of the official DOM * * This element can be made editable by setting its contentEditable * property to @p true. The setting will be inherited to its children * as well. * * Setting or clearing contentEditable when design mode is active will * take no effect. However, its status will still be propagated to all * child elements. * * @param enabled @p true to make this element editable, @p false * otherwise. * @see DOM::Document::designMode * @since 3.2 */ void setContentEditable(bool enabled); /** * @internal * not part of the DOM */ bool isHTMLElement() const; /** * KHTML extension to DOM * This method returns the associated form element. * returns null if this element is not a form-like element * or if this elment is not in the scope of a form element. */ Element form() const; static bool khtmlValidAttrName(const DOMString &name); static bool khtmlValidPrefix(const DOMString &name); static bool khtmlValidQualifiedName(const DOMString &name); static bool khtmlMalformedQualifiedName(const DOMString &name); static bool khtmlMalformedPrefix(const DOMString &name); protected: Element(ElementImpl *_impl); }; } //namespace #endif