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