00001
00023 #include "dom/dom_exception.h"
00024 #include "xml/dom_docimpl.h"
00025 #include "xml/dom_elementimpl.h"
00026 #include "html/html_formimpl.h"
00027
00028 using namespace DOM;
00029
00030 Attr::Attr() : Node()
00031 {
00032 }
00033
00034 Attr::Attr(const Attr &other) : Node(other)
00035 {
00036 }
00037
00038 Attr::Attr( AttrImpl *_impl )
00039 {
00040 impl= _impl;
00041 if (impl) impl->ref();
00042 }
00043
00044 Attr &Attr::operator = (const Node &other)
00045 {
00046 NodeImpl* ohandle = other.handle();
00047 if ( impl != ohandle ) {
00048 if (!ohandle || !ohandle->isAttributeNode()) {
00049 if (impl) impl->deref();
00050 impl = 0;
00051 } else {
00052 Node::operator =(other);
00053 }
00054 }
00055 return *this;
00056 }
00057
00058 Attr &Attr::operator = (const Attr &other)
00059 {
00060 Node::operator =(other);
00061 return *this;
00062 }
00063
00064 Attr::~Attr()
00065 {
00066 }
00067
00068 DOMString Attr::name() const
00069 {
00070 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00071 return ((AttrImpl *)impl)->name();
00072 }
00073
00074 bool Attr::specified() const
00075 {
00076 if (impl) return ((AttrImpl *)impl)->specified();
00077 return 0;
00078 }
00079
00080 Element Attr::ownerElement() const
00081 {
00082 if (!impl) return 0;
00083 return static_cast<AttrImpl*>(impl)->ownerElement();
00084 }
00085
00086 DOMString Attr::value() const
00087 {
00088 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00089 return impl->nodeValue();
00090 }
00091
00092 void Attr::setValue( const DOMString &newValue )
00093 {
00094 if (!impl)
00095 return;
00096
00097 int exceptioncode = 0;
00098 ((AttrImpl *)impl)->setValue(newValue,exceptioncode);
00099 if (exceptioncode)
00100 throw DOMException(exceptioncode);
00101 }
00102
00103
00104
00105 Element::Element() : Node()
00106 {
00107 }
00108
00109 Element::Element(const Element &other) : Node(other)
00110 {
00111 }
00112
00113 Element::Element(ElementImpl *impl) : Node(impl)
00114 {
00115 }
00116
00117 Element &Element::operator = (const Node &other)
00118 {
00119 NodeImpl* ohandle = other.handle();
00120 if ( impl != ohandle ) {
00121 if (!ohandle || !ohandle->isElementNode()) {
00122 if (impl) impl->deref();
00123 impl = 0;
00124 } else {
00125 Node::operator =(other);
00126 }
00127 }
00128 return *this;
00129 }
00130
00131 Element &Element::operator = (const Element &other)
00132 {
00133 Node::operator =(other);
00134 return *this;
00135 }
00136
00137 Element::~Element()
00138 {
00139 }
00140
00141 DOMString Element::tagName() const
00142 {
00143 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00144 return static_cast<ElementImpl*>(impl)->tagName();
00145 }
00146
00147 DOMString Element::getAttribute( const DOMString &name )
00148 {
00149
00150
00151
00152 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00153 if (!name.implementation()) throw DOMException(DOMException::NOT_FOUND_ERR);
00154
00155 NodeImpl::Id id = impl->getDocument()->getId(NodeImpl::AttributeId,name.implementation(),true,true);
00156 if (!id) return DOMString();
00157
00158 ElementImpl* e = static_cast<ElementImpl*>(impl);
00159 return e->getAttribute(id, false, name);
00160 }
00161
00162 void Element::setAttribute( const DOMString &name, const DOMString &value )
00163 {
00164 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00165 int exceptioncode = 0;
00166 NodeImpl::Id id = impl->getDocument()->getId(NodeImpl::AttributeId, name.implementation(), false ,
00167 true, &exceptioncode);
00168
00169 static_cast<ElementImpl*>(impl)->setAttribute(id, value, name, exceptioncode);
00170 if ( exceptioncode )
00171 throw DOMException( exceptioncode );
00172 }
00173
00174 void Element::removeAttribute( const DOMString &name )
00175 {
00176 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00177 NodeImpl::Id id = impl->getDocument()->getId(NodeImpl::AttributeId, name.implementation(), true, true);
00178 if (!id) return;
00179
00180 int exceptioncode = 0;
00181 NamedNodeMapImpl *attributes = static_cast<ElementImpl*>(impl)->attributes(false);
00182 attributes->removeNamedItem(id, false, name.implementation(), exceptioncode);
00183
00184 if ( exceptioncode && exceptioncode != DOMException::NOT_FOUND_ERR )
00185 throw DOMException( exceptioncode );
00186 }
00187
00188 Attr Element::getAttributeNode( const DOMString &name )
00189 {
00190 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00191 if (!name.implementation()) throw DOMException(DOMException::NOT_FOUND_ERR);
00192 NodeImpl::Id id = impl->getDocument()->getId(NodeImpl::AttributeId, name.implementation(), true, true);
00193 if (!id) return 0;
00194
00195 ElementImpl* e = static_cast<ElementImpl*>(impl);
00196 if (!e->attributes()) return 0;
00197
00198 return static_cast<AttrImpl*>(e->attributes()->getNamedItem(id, false, name.implementation()));
00199 }
00200
00201 Attr Element::setAttributeNode( const Attr &newAttr )
00202 {
00203 if (!impl || newAttr.isNull())
00204 throw DOMException(DOMException::NOT_FOUND_ERR);
00205
00206
00207 int exceptioncode = 0;
00208 Attr r = static_cast<ElementImpl*>(impl)->attributes(false)->setNamedItem(newAttr.handle(), false,
00209 newAttr.handle()->nodeName().implementation(), exceptioncode);
00210 if ( exceptioncode )
00211 throw DOMException( exceptioncode );
00212 static_cast<AttrImpl *>(newAttr.handle())->setOwnerElement( static_cast<ElementImpl*>(impl) );
00213 return r;
00214 }
00215
00216 Attr Element::removeAttributeNode( const Attr &oldAttr )
00217 {
00218 if (!impl || oldAttr.isNull() || oldAttr.ownerElement().handle() != impl)
00219 throw DOMException(DOMException::NOT_FOUND_ERR);
00220
00221 if (impl->isReadOnly())
00222 throw DOMException(DOMException::NO_MODIFICATION_ALLOWED_ERR);
00223
00224 if (!static_cast<ElementImpl*>(impl)->attributes(true))
00225 throw DOMException(DOMException::NOT_FOUND_ERR);
00226
00227 NamedAttrMapImpl *attributes = static_cast<ElementImpl*>(impl)->attributes(false);
00228 return attributes->removeAttr(static_cast<AttrImpl*>(static_cast<AttrImpl*>(oldAttr.handle())));
00229 }
00230
00231 NodeList Element::getElementsByTagName( const DOMString &tagName )
00232 {
00233 if (!impl) return 0;
00234 NodeImpl::Id id;
00235 if ( tagName == "*" )
00236 id = 0;
00237 else
00238 id = impl->getDocument()->getId(NodeImpl::ElementId, tagName.implementation(), false, true);
00239 return new TagNodeListImpl( impl, id );
00240 }
00241
00242 NodeList Element::getElementsByTagNameNS( const DOMString &namespaceURI,
00243 const DOMString &localName )
00244 {
00245 if (!impl) return 0;
00246 return new TagNodeListImpl( impl, namespaceURI, localName );
00247 }
00248
00249 DOMString Element::getAttributeNS( const DOMString &namespaceURI,
00250 const DOMString &localName)
00251 {
00252 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00253 if (!localName.implementation()) throw DOMException(DOMException::NOT_FOUND_ERR);
00254 NodeImpl::Id id = impl->getDocument()->getId(NodeImpl::AttributeId, namespaceURI.implementation(), 0, localName.implementation(), true, true);
00255 ElementImpl* e = static_cast<ElementImpl*>(impl);
00256 return e->getAttribute(id, true);
00257 }
00258
00259 void Element::setAttributeNS( const DOMString &namespaceURI,
00260 const DOMString &qualifiedName,
00261 const DOMString &value)
00262 {
00263 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00264
00265 int exceptioncode = 0;
00266 static_cast<ElementImpl*>(impl)->setAttributeNS(namespaceURI, qualifiedName, value, exceptioncode);
00267 if ( exceptioncode )
00268 throw DOMException( exceptioncode );
00269 }
00270
00271 void Element::removeAttributeNS( const DOMString &namespaceURI,
00272 const DOMString &localName )
00273 {
00274 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00275
00276 int exceptioncode = 0;
00277 NamedNodeMapImpl *attributes = static_cast<ElementImpl*>(impl)->attributes(false);
00278 NodeImpl::Id id = impl->getDocument()->getId(NodeImpl::AttributeId, namespaceURI.implementation(), 0, localName.implementation(), false, true);
00279 attributes->removeNamedItem(id, true, 0, exceptioncode);
00280 if ( exceptioncode )
00281 throw DOMException( exceptioncode );
00282 }
00283
00284 Attr Element::getAttributeNodeNS( const DOMString &namespaceURI,
00285 const DOMString &localName )
00286 {
00287 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00288 if (!localName.implementation()) throw DOMException(DOMException::NOT_FOUND_ERR);
00289 NodeImpl::Id id = impl->getDocument()->getId(NodeImpl::AttributeId, namespaceURI.implementation(),
00290 0, localName.implementation(), true, true);
00291 ElementImpl* e = static_cast<ElementImpl*>(impl);
00292 if (!e->attributes()) return 0;
00293
00294 return static_cast<AttrImpl*>(e->attributes()->getNamedItem(id, true));
00295 }
00296
00297 Attr Element::setAttributeNodeNS( const Attr &newAttr )
00298 {
00299 if (!impl || newAttr.isNull())
00300 throw DOMException(DOMException::NOT_FOUND_ERR);
00301
00302
00303 int exceptioncode = 0;
00304 Attr r = static_cast<ElementImpl*>(impl)->attributes(false)->setNamedItem(newAttr.handle(), true, 0, exceptioncode);
00305 if ( exceptioncode )
00306 throw DOMException( exceptioncode );
00307 static_cast<AttrImpl *>(newAttr.handle())->setOwnerElement( static_cast<ElementImpl*>(impl) );
00308 return r;
00309 }
00310
00311
00312 bool Element::hasAttribute( const DOMString& name )
00313 {
00314 if (!impl || !static_cast<ElementImpl*>(impl)->attributes()) return false;
00315 NodeImpl::Id id = impl->getDocument()->getId(NodeImpl::AttributeId, name.implementation(), true, true);
00316 if (!id) return false;
00317
00318 if (!static_cast<ElementImpl*>(impl)->attributes(true )) return false;
00319 return static_cast<ElementImpl*>(impl)->attributes(true)->getValue(id, false, name.implementation()) != 0;
00320 }
00321
00322 bool Element::hasAttributeNS( const DOMString &namespaceURI,
00323 const DOMString &localName )
00324 {
00325 if (!impl || !static_cast<ElementImpl*>(impl)->attributes()) return false;
00326 if (!static_cast<ElementImpl*>(impl)->attributes(true )) return false;
00327 NodeImpl::Id id = impl->getDocument()->getId(NodeImpl::AttributeId,namespaceURI.implementation(),
00328 0, localName.implementation(), true, true);
00329 return static_cast<ElementImpl*>(impl)->attributes(true)->getValue(id, true) != 0;
00330 }
00331
00332 bool Element::isHTMLElement() const
00333 {
00334 if(!impl) return false;
00335 return ((ElementImpl *)impl)->isHTMLElement();
00336 }
00337
00338 Element Element::form() const
00339 {
00340 if (!impl || !impl->isGenericFormElement()) return 0;
00341 return static_cast<HTMLGenericFormElementImpl*>(impl)->form();
00342 ElementImpl* f = static_cast<HTMLGenericFormElementImpl*>( impl )->form();
00343
00344 if( f && f->implicitNode() )
00345 return 0;
00346 return f;
00347 }
00348
00349 CSSStyleDeclaration Element::style()
00350 {
00351 if (impl) return ((ElementImpl *)impl)->styleRules();
00352 return 0;
00353 }
00354
00355 bool Element::contentEditable() const {
00356 if(!impl) return false;
00357 return static_cast<ElementImpl *>(impl)->contentEditable();
00358 }
00359
00360 void Element::setContentEditable(bool enabled) {
00361 if(!impl)
00362 throw DOMException(DOMException::INVALID_STATE_ERR);
00363
00364 static_cast<ElementImpl *>(impl)->setContentEditable(enabled);
00365 }
00366
00367 bool Element::khtmlValidAttrName(const DOMString &name)
00368 {
00369
00370
00371 DOMStringImpl* _name = name.implementation();
00372 QChar ch = _name->s[0];
00373 if ( !ch.isLetter() && ch != '_' && ch != ':' )
00374 return false;
00375 for ( uint i = 0; i < _name->l; ++i )
00376 {
00377 ch = _name->s[i];
00378 if ( !ch.isLetter() && !ch.isDigit() && ch != '.'
00379 && ch != '-' && ch != '_' && ch != ':'
00380 && ch.category() != QChar::Mark_SpacingCombining
00381 )
00382 return false;
00383 }
00384 return true;
00385 }
00386
00387 bool Element::khtmlValidPrefix(const DOMString &name)
00388 {
00389
00390 return !name.implementation() || khtmlValidAttrName(name);
00391 }
00392
00393 bool Element::khtmlValidQualifiedName(const DOMString &name)
00394 {
00395 return khtmlValidAttrName(name);
00396 }
00397
00398 bool Element::khtmlMalformedQualifiedName(const DOMString &name)
00399 {
00400
00401
00402 return name.isNull();
00403 }
00404
00405 bool Element::khtmlMalformedPrefix(const DOMString &)
00406 {
00407
00408 return false;
00409 }