diff options
Diffstat (limited to 'khtml/dom/dom_doc.cpp')
-rw-r--r-- | khtml/dom/dom_doc.cpp | 684 |
1 files changed, 684 insertions, 0 deletions
diff --git a/khtml/dom/dom_doc.cpp b/khtml/dom/dom_doc.cpp new file mode 100644 index 000000000..e5ff84e3d --- /dev/null +++ b/khtml/dom/dom_doc.cpp @@ -0,0 +1,684 @@ +/* + * 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. + * + */ + +#include "dom/dom_exception.h" +#include "dom/dom_xml.h" +#include "dom/dom2_range.h" +#include "dom/dom2_events.h" +#include "dom/dom2_views.h" +#include "dom/dom2_traversal.h" +#include "dom/html_document.h" +#include "html/html_documentimpl.h" + +#include "xml/dom_docimpl.h" +#include "xml/dom_elementimpl.h" + +#include <kdebug.h> + +namespace DOM { + +DOMImplementation::DOMImplementation() +{ + impl = 0; +} + +DOMImplementation::DOMImplementation(const DOMImplementation &other) +{ + impl = other.impl; + if (impl) impl->ref(); +} + +DOMImplementation::DOMImplementation(DOMImplementationImpl *i) +{ + impl = i; + if (impl) impl->ref(); +} + +DOMImplementation &DOMImplementation::operator = (const DOMImplementation &other) +{ + if ( impl != other.impl ) { + if (impl) impl->deref(); + impl = other.impl; + if (impl) impl->ref(); + } + return *this; +} + +DOMImplementation::~DOMImplementation() +{ + if (impl) impl->deref(); +} + +bool DOMImplementation::hasFeature( const DOMString &feature, const DOMString &version ) +{ + if (!impl) + return false; // ### enable throw DOMException(DOMException::NOT_FOUND_ERR); + + return impl->hasFeature(feature,version); +} + +DocumentType DOMImplementation::createDocumentType ( const DOMString &qualifiedName, + const DOMString &publicId, + const DOMString &systemId ) +{ + if (!impl) + throw DOMException(DOMException::NOT_FOUND_ERR); + + int exceptioncode = 0; + DocumentTypeImpl *r = impl->createDocumentType(qualifiedName, publicId, systemId, exceptioncode); + if ( exceptioncode ) + throw DOMException( exceptioncode ); + return r; +} + +Document DOMImplementation::createDocument ( const DOMString &namespaceURI, + const DOMString &qualifiedName, + const DocumentType &doctype ) +{ + if (!impl) + throw DOMException(DOMException::NOT_FOUND_ERR); + + int exceptioncode = 0; + DocumentImpl *r = impl->createDocument(namespaceURI, qualifiedName, doctype, exceptioncode ); + if ( exceptioncode ) + throw DOMException( exceptioncode ); + return r; +} + +HTMLDocument DOMImplementation::createHTMLDocument( const DOMString& title ) +{ + if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR); + + HTMLDocumentImpl* r = impl->createHTMLDocument( 0 /* ### create a view otherwise it doesn't work */); + + r->open(); + + r->write(QString::fromLatin1("<HTML><HEAD><TITLE>") + title.string() + + QString::fromLatin1("</TITLE></HEAD>")); + + return r; +} + +DOMImplementation DOMImplementation::getInterface(const DOMString &feature) const +{ + if (!impl) + throw DOMException(DOMException::NOT_FOUND_ERR); + + return impl->getInterface(feature); +} + +CSSStyleSheet DOMImplementation::createCSSStyleSheet(const DOMString &title, const DOMString &media) +{ + if (!impl) + throw DOMException(DOMException::NOT_FOUND_ERR); + + int exceptioncode = 0; + CSSStyleSheetImpl *r = impl->createCSSStyleSheet(title.implementation(), media.implementation(), + exceptioncode); + if ( exceptioncode ) + throw DOMException( exceptioncode ); + return r; +} + +DOMImplementationImpl *DOMImplementation::handle() const +{ + return impl; +} + +bool DOMImplementation::isNull() const +{ + return (impl == 0); +} + +// ---------------------------------------------------------------------------- + +Document::Document() + : Node() +{ + // we always want an implementation + impl = DOMImplementationImpl::instance()->createDocument(); + impl->ref(); +} + +Document::Document(bool create) + : Node() +{ + if(create) + { + impl = DOMImplementationImpl::instance()->createDocument(); + impl->ref(); + } + else + impl = 0; +// kdDebug(6090) << "Document::Document(bool)" << endl; +} + +Document::Document(const Document &other) : Node(other) +{ +// kdDebug(6090) << "Document::Document(Document &)" << endl; +} + +Document::Document(DocumentImpl *i) : Node(i) +{ +// kdDebug(6090) << "Document::Document(DocumentImpl)" << endl; +} + +Document &Document::operator = (const Node &other) +{ + NodeImpl* ohandle = other.handle(); + if ( impl != ohandle ) { + if (!ohandle || ohandle->nodeType() != DOCUMENT_NODE) { + if ( impl ) impl->deref(); + impl = 0; + } else { + Node::operator =(other); + } + } + return *this; +} + +Document &Document::operator = (const Document &other) +{ + Node::operator =(other); + return *this; +} + +Document::~Document() +{ +// kdDebug(6090) << "Document::~Document\n" << endl; +} + +DocumentType Document::doctype() const +{ + if (impl) return ((DocumentImpl *)impl)->doctype(); + return 0; +} + +DOMImplementation Document::implementation() const +{ + if (impl) return ((DocumentImpl *)impl)->implementation(); + return 0; +} + +Element Document::documentElement() const +{ + if (impl) return ((DocumentImpl *)impl)->documentElement(); + return 0; +} + +Element Document::createElement( const DOMString &tagName ) +{ + if (!impl) + throw DOMException(DOMException::NOT_FOUND_ERR); + + int exceptioncode = 0; + ElementImpl* r = ((DocumentImpl *)impl)->createElement(tagName, &exceptioncode); + if ( exceptioncode ) + throw DOMException( exceptioncode ); + return r; +} + +Element Document::createElementNS( const DOMString &namespaceURI, const DOMString &qualifiedName ) +{ + if (!impl) + throw DOMException(DOMException::NOT_FOUND_ERR); + + int exceptioncode = 0; + ElementImpl* r = ((DocumentImpl *)impl)->createElementNS(namespaceURI,qualifiedName, &exceptioncode); + if ( exceptioncode ) + throw DOMException( exceptioncode ); + return r; +} + +DocumentFragment Document::createDocumentFragment( ) +{ + if (impl) return ((DocumentImpl *)impl)->createDocumentFragment(); + return 0; +} + +Text Document::createTextNode( const DOMString &data ) +{ + if (impl) return ((DocumentImpl *)impl)->createTextNode( data.implementation() ); + return 0; +} + +Comment Document::createComment( const DOMString &data ) +{ + if (impl) return ((DocumentImpl *)impl)->createComment( data.implementation() ); + return 0; +} + +CDATASection Document::createCDATASection( const DOMString &data ) +{ + // ### DOM1 spec says raise exception if html documents - what about XHTML documents? + if (impl) return ((DocumentImpl *)impl)->createCDATASection( data.implementation() ); + return 0; +} + +ProcessingInstruction Document::createProcessingInstruction( const DOMString &target, const DOMString &data ) +{ + if (impl) return ((DocumentImpl *)impl)->createProcessingInstruction( target, data.implementation() ); + return 0; +} + +Attr Document::createAttribute( const DOMString &name ) +{ + if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR); + if (name.isNull()) throw DOMException(DOMException::NOT_FOUND_ERR); + int exceptioncode = 0; + AttrImpl* a = impl->getDocument()->createAttribute(name, &exceptioncode); + if ( exceptioncode ) + throw DOMException( exceptioncode ); + return a; +} + +Attr Document::createAttributeNS( const DOMString &namespaceURI, const DOMString &qualifiedName ) +{ + if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR); + if (qualifiedName.isNull()) throw DOMException(DOMException::NAMESPACE_ERR); + int exceptioncode = 0; + AttrImpl* a = impl->getDocument()->createAttributeNS(namespaceURI, qualifiedName, &exceptioncode); + if ( exceptioncode ) + throw DOMException( exceptioncode ); + return a; +} + +EntityReference Document::createEntityReference( const DOMString &name ) +{ + if (impl) return ((DocumentImpl *)impl)->createEntityReference( name ); + return 0; +} + +Element Document::getElementById( const DOMString &elementId ) const +{ + if(impl) return ((DocumentImpl *)impl)->getElementById( elementId ); + return 0; +} + +NodeList Document::getElementsByTagName( const DOMString &tagName ) +{ + if (!impl) return 0; + NodeImpl::Id id; + if ( tagName == "*" ) + id = 0; + else + id = impl->getDocument()->getId(NodeImpl::ElementId, tagName.implementation(), false, true); + return new TagNodeListImpl( impl, id ); +} + +NodeList Document::getElementsByTagNameNS( const DOMString &namespaceURI, const DOMString &localName ) +{ + if (!impl) return 0; + return new TagNodeListImpl( impl, namespaceURI, localName ); +} + +Node Document::importNode( const Node & importedNode, bool deep ) +{ + if (!impl) + throw DOMException(DOMException::INVALID_STATE_ERR); + + int exceptioncode = 0; + NodeImpl *r = static_cast<DocumentImpl*>(impl)->importNode(importedNode.handle(), deep, exceptioncode); + if (exceptioncode) + throw DOMException(exceptioncode); + return r; +} + +bool Document::isHTMLDocument() const +{ + if (impl) return ((DocumentImpl *)impl)->isHTMLDocument(); + return 0; +} + +Range Document::createRange() +{ + if (impl) return ((DocumentImpl *)impl)->createRange(); + return 0; +} + +NodeIterator Document::createNodeIterator(Node root, unsigned long whatToShow, + NodeFilter filter, bool entityReferenceExpansion) +{ + if (!impl) + throw DOMException(DOMException::INVALID_STATE_ERR); + + int exceptioncode = 0; + NodeIteratorImpl *r = static_cast<DocumentImpl*>(impl)->createNodeIterator(root.handle(), + whatToShow,filter,entityReferenceExpansion,exceptioncode); + if (exceptioncode) + throw DOMException(exceptioncode); + return r; +} + +TreeWalker Document::createTreeWalker(Node root, unsigned long whatToShow, NodeFilter filter, + bool entityReferenceExpansion) +{ + if (!impl) + throw DOMException(DOMException::INVALID_STATE_ERR); + + int exceptioncode = 0; + + TreeWalkerImpl *tw = static_cast<DocumentImpl *>(impl)->createTreeWalker( + root.handle(), whatToShow, filter.handle(), entityReferenceExpansion, exceptioncode); + if (exceptioncode) + throw DOMException(exceptioncode); + + return tw; +} + +Event Document::createEvent(const DOMString &eventType) +{ + if (!impl) + throw DOMException(DOMException::INVALID_STATE_ERR); + + int exceptioncode = 0; + EventImpl *r = ((DocumentImpl *)impl)->createEvent(eventType,exceptioncode); + if (exceptioncode) + throw DOMException(exceptioncode); + return r; +} + +AbstractView Document::defaultView() const +{ + if (!impl) + throw DOMException(DOMException::INVALID_STATE_ERR); + + return static_cast<DocumentImpl*>(impl)->defaultView(); +} + +StyleSheetList Document::styleSheets() const +{ + if (!impl) + throw DOMException(DOMException::INVALID_STATE_ERR); + + return static_cast<DocumentImpl*>(impl)->styleSheets(); +} + +DOMString Document::preferredStylesheetSet() +{ + if (!impl) + throw DOMException(DOMException::INVALID_STATE_ERR); + + return static_cast<DocumentImpl*>(impl)->preferredStylesheetSet(); +} + +DOMString Document::selectedStylesheetSet() +{ + if (!impl) + throw DOMException(DOMException::INVALID_STATE_ERR); + + return static_cast<DocumentImpl*>(impl)->selectedStylesheetSet(); +} + +void Document::setSelectedStylesheetSet(const DOMString& s) +{ + if (!impl) + throw DOMException(DOMException::INVALID_STATE_ERR); + + static_cast<DocumentImpl*>(impl)->setSelectedStylesheetSet(s); +} + + +KHTMLView *Document::view() const +{ + if (!impl) return 0; + + return static_cast<DocumentImpl*>(impl)->view(); +} + +CSSStyleDeclaration Document::getOverrideStyle(const Element &elt, const DOMString &pseudoElt) +{ + if (!impl) + throw DOMException(DOMException::INVALID_STATE_ERR); + + int exceptioncode = 0; + CSSStyleDeclarationImpl *r = ((DocumentImpl *)impl)->getOverrideStyle(static_cast<ElementImpl*>(elt.handle()),pseudoElt.implementation()); + if (exceptioncode) + throw DOMException(exceptioncode); + return r; +} + +bool Document::async() const +{ + if (!impl) + throw DOMException(DOMException::INVALID_STATE_ERR); + + return static_cast<DocumentImpl*>( impl )->async( ); +} + +void Document::setAsync( bool b ) +{ + if (!impl) + throw DOMException(DOMException::INVALID_STATE_ERR); + + static_cast<DocumentImpl*>( impl )->setAsync( b ); +} + +void Document::abort() +{ + if (!impl) + throw DOMException(DOMException::INVALID_STATE_ERR); + + + static_cast<DocumentImpl*>( impl )->abort( ); +} + +void Document::load( const DOMString &uri ) +{ + if (!impl) + throw DOMException(DOMException::INVALID_STATE_ERR); + + static_cast<DocumentImpl*>( impl )->load( uri ); +} + +void Document::loadXML( const DOMString &source ) +{ + if (!impl) + throw DOMException(DOMException::INVALID_STATE_ERR); + + + static_cast<DocumentImpl*>( impl )->loadXML( source ); +} + +bool Document::designMode() const { + if (!impl) + throw DOMException(DOMException::INVALID_STATE_ERR); + + return static_cast<DocumentImpl*>( impl )->designMode(); +} + +void Document::setDesignMode(bool enable) { + if (!impl) + throw DOMException(DOMException::INVALID_STATE_ERR); + + static_cast<DocumentImpl*>( impl )->setDesignMode( enable ); +} + +DOMString Document::completeURL(const DOMString& url) +{ + if ( !impl ) return url; + return static_cast<DocumentImpl*>( impl )->completeURL( url.string() ); +} + +DOMString Document::toString() const +{ + if (!impl) + throw DOMException(DOMException::NOT_FOUND_ERR); + + return static_cast<DocumentImpl*>(impl)->toString(); +} + +void Document::updateRendering() +{ + if ( !impl ) return; + static_cast<DocumentImpl*>( impl )->updateRendering( ); +} + +void Document::addStyleSheet(const StyleSheet &sheet) +{ + if (!impl || sheet.isNull()) + throw DOMException(DOMException::INVALID_STATE_ERR); + + int exceptioncode; + static_cast<DocumentImpl*>( impl )->addStyleSheet( sheet.handle(), &exceptioncode ); + if (exceptioncode) + throw DOMException(exceptioncode); +} + +void Document::removeStyleSheet(const StyleSheet &sheet) +{ + if (!impl || sheet.isNull()) + throw DOMException(DOMException::INVALID_STATE_ERR); + + int exceptioncode; + static_cast<DocumentImpl*>( impl )->removeStyleSheet( sheet.handle(), &exceptioncode ); + if (exceptioncode) + throw DOMException(exceptioncode); +} + +// ---------------------------------------------------------------------------- + +DocumentFragment::DocumentFragment() : Node() +{ +} + +DocumentFragment::DocumentFragment(const DocumentFragment &other) : Node(other) +{ +} + +DocumentFragment &DocumentFragment::operator = (const Node &other) +{ + NodeImpl* ohandle = other.handle(); + if ( impl != ohandle ) { + if (!ohandle || ohandle->nodeType() != DOCUMENT_FRAGMENT_NODE) { + if ( impl ) impl->deref(); + impl = 0; + } else { + Node::operator =(other); + } + } + return *this; +} + +DocumentFragment &DocumentFragment::operator = (const DocumentFragment &other) +{ + Node::operator =(other); + return *this; +} + +DocumentFragment::~DocumentFragment() +{ +} + +DocumentFragment::DocumentFragment(DocumentFragmentImpl *i) : Node(i) +{ +} + +// ---------------------------------------------------------------------------- + +DocumentType::DocumentType() + : Node() +{ +} + +DocumentType::DocumentType(const DocumentType &other) + : Node(other) +{ +} + +DocumentType::DocumentType(DocumentTypeImpl *impl) : Node(impl) +{ +} + +DocumentType &DocumentType::operator = (const Node &other) +{ + NodeImpl* ohandle = other.handle(); + if ( impl != ohandle ) { + if (!ohandle || ohandle->nodeType() != DOCUMENT_TYPE_NODE) { + if ( impl ) impl->deref(); + impl = 0; + } else { + Node::operator =(other); + } + } + return *this; +} + +DocumentType &DocumentType::operator = (const DocumentType &other) +{ + Node::operator =(other); + return *this; +} + +DocumentType::~DocumentType() +{ +} + +DOMString DocumentType::name() const +{ + if (!impl) + return DOMString(); // ### enable throw DOMException(DOMException::NOT_FOUND_ERR); + + return static_cast<DocumentTypeImpl*>(impl)->name(); +} + +NamedNodeMap DocumentType::entities() const +{ + if (!impl) + return 0; // ### enable throw DOMException(DOMException::NOT_FOUND_ERR); + + return static_cast<DocumentTypeImpl*>(impl)->entities(); +} + +NamedNodeMap DocumentType::notations() const +{ + if (!impl) + return 0; // ### enable throw DOMException(DOMException::NOT_FOUND_ERR); + + return static_cast<DocumentTypeImpl*>(impl)->notations(); +} + +DOMString DocumentType::publicId() const +{ + if (!impl) + throw DOMException(DOMException::NOT_FOUND_ERR); + + return static_cast<DocumentTypeImpl*>(impl)->publicId(); +} + +DOMString DocumentType::systemId() const +{ + if (!impl) + throw DOMException(DOMException::NOT_FOUND_ERR); + + return static_cast<DocumentTypeImpl*>(impl)->systemId(); +} + +DOMString DocumentType::internalSubset() const +{ + if (!impl) + throw DOMException(DOMException::NOT_FOUND_ERR); + + return static_cast<DocumentTypeImpl*>(impl)->internalSubset(); +} + +} // namespace |