📄 dom_docimpl.h
字号:
/*
* This file is part of the DOM implementation for KDE.
*
* Copyright (C) 1999 Lars Knoll (knoll@kde.org)
* (C) 1999 Antti Koivisto (koivisto@kde.org)
* (C) 2001 Dirk Mueller (mueller@kde.org)
* Copyright (C) 2004 Apple Computer, Inc.
*
* 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., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
*/
#ifndef _DOM_DocumentImpl_h_
#define _DOM_DocumentImpl_h_
#include "xml/dom_elementimpl.h"
#include "xml/dom2_traversalimpl.h"
#include "misc/shared.h"
#include <qstringlist.h>
#include <qptrlist.h>
#include <qobject.h>
#include <qdict.h>
#include <qptrdict.h>
#include <qmap.h>
#include <qdatetime.h>
#include <kurl.h>
#if APPLE_CHANGES
#include "KWQSignal.h"
#include "decoder.h"
#endif
class QPaintDevice;
class QPaintDeviceMetrics;
class KHTMLView;
class KHTMLPart;
class RenderArena;
#if APPLE_CHANGES
class KWQAccObjectCache;
#endif
namespace khtml {
class CSSStyleSelector;
class DocLoader;
class RenderImage;
class Tokenizer;
class XMLHandler;
#if APPLE_CHANGES
struct DashboardRegionValue;
#endif
}
#ifndef KHTML_NO_XBL
namespace XBL {
class XBLBindingManager;
}
#endif
namespace DOM {
class AbstractViewImpl;
class AttrImpl;
class CDATASectionImpl;
class CSSStyleSheetImpl;
class CSSMappedAttributeDeclarationImpl;
class CommentImpl;
class DocumentFragmentImpl;
class DocumentImpl;
class DocumentType;
class DocumentTypeImpl;
#if APPLE_CHANGES
class DOMImplementation;
#endif
class EditingTextImpl;
class ElementImpl;
class EntityReferenceImpl;
class EventImpl;
class EventListener;
class GenericRONamedNodeMapImpl;
class HTMLDocumentImpl;
class HTMLElementImpl;
class HTMLImageLoader;
class HTMLMapElementImpl;
class JSEditor;
class NodeFilter;
class NodeFilterImpl;
class NodeIteratorImpl;
class NodeListImpl;
class ProcessingInstructionImpl;
class Range;
class RangeImpl;
class RegisteredEventListener;
class StyleSheetImpl;
class StyleSheetListImpl;
class TextImpl;
class TreeWalkerImpl;
#ifdef KHTML_XSLT
class XSLStyleSheetImpl;
#endif
// A range of a node within a document that is "marked", such as being misspelled
struct DocumentMarker
{
enum MarkerType {
Spelling
// Not doing grammar yet, but this is a placeholder for it
// Grammar
};
enum MarkerType type;
ulong startOffset, endOffset;
bool operator == (const DocumentMarker &o) const {
return type == o.type && startOffset == o.startOffset && endOffset == o.endOffset;
}
bool operator != (const DocumentMarker &o) const {
return !(*this == o);
}
};
class DOMImplementationImpl : public khtml::Shared<DOMImplementationImpl>
{
public:
DOMImplementationImpl();
~DOMImplementationImpl();
// DOM methods & attributes for DOMImplementation
bool hasFeature ( const DOMString &feature, const DOMString &version );
DocumentTypeImpl *createDocumentType( const DOMString &qualifiedName, const DOMString &publicId,
const DOMString &systemId, int &exceptioncode );
DocumentImpl *createDocument( const DOMString &namespaceURI, const DOMString &qualifiedName,
const DocumentType &doctype, int &exceptioncode );
DOMImplementationImpl* getInterface(const DOMString& feature) const;
// From the DOMImplementationCSS interface
CSSStyleSheetImpl *createCSSStyleSheet(DOMStringImpl *title, DOMStringImpl *media, int &exceptioncode);
// From the HTMLDOMImplementation interface
HTMLDocumentImpl* createHTMLDocument( const DOMString& title);
// Other methods (not part of DOM)
DocumentImpl *createDocument( KHTMLView *v = 0 );
HTMLDocumentImpl *createHTMLDocument( KHTMLView *v = 0 );
// Returns the static instance of this class - only one instance of this class should
// ever be present, and is used as a factory method for creating DocumentImpl objects
static DOMImplementationImpl *instance();
#if APPLE_CHANGES
static DOMImplementation createInstance (DOMImplementationImpl *impl);
#endif
protected:
static DOMImplementationImpl *m_instance;
};
/**
* @internal
*/
class DocumentImpl : public QObject, public NodeBaseImpl
{
Q_OBJECT
public:
DocumentImpl(DOMImplementationImpl *_implementation, KHTMLView *v);
~DocumentImpl();
// DOM methods & attributes for Document
DocumentTypeImpl *doctype() const;
DOMImplementationImpl *implementation() const;
virtual ElementImpl *documentElement() const;
virtual ElementImpl *createElement ( const DOMString &tagName, int &exceptioncode );
DocumentFragmentImpl *createDocumentFragment ();
TextImpl *createTextNode ( const DOMString &data );
CommentImpl *createComment ( const DOMString &data );
CDATASectionImpl *createCDATASection ( const DOMString &data );
ProcessingInstructionImpl *createProcessingInstruction ( const DOMString &target, const DOMString &data );
Attr createAttribute(NodeImpl::Id id);
EntityReferenceImpl *createEntityReference ( const DOMString &name );
NodeImpl *importNode( NodeImpl *importedNode, bool deep, int &exceptioncode );
virtual ElementImpl *createElementNS ( const DOMString &_namespaceURI, const DOMString &_qualifiedName, int &exceptioncode );
ElementImpl *getElementById ( const DOMString &elementId ) const;
// Actually part of HTMLDocument, but used for giving XML documents a window title as well
DOMString title() const { return m_title; }
void setTitle(DOMString _title);
// DOM methods overridden from parent classes
virtual DOMString nodeName() const;
virtual unsigned short nodeType() const;
// Other methods (not part of DOM)
virtual bool isDocumentNode() const { return true; }
virtual bool isHTMLDocument() const { return false; }
ElementImpl *createHTMLElement(const DOMString &tagName, int &exceptioncode);
ElementImpl *createHTMLElement(unsigned short tagID);
khtml::CSSStyleSelector *styleSelector() { return m_styleSelector; }
ElementImpl *DocumentImpl::getElementByAccessKey( const DOMString &key );
/**
* Updates the pending sheet count and then calls updateStyleSelector.
*/
void stylesheetLoaded();
/**
* This method returns true if all top-level stylesheets have loaded (including
* any @imports that they may be loading).
*/
bool haveStylesheetsLoaded() { return m_pendingStylesheets <= 0 || m_ignorePendingStylesheets; }
/**
* Increments the number of pending sheets. The <link> elements
* invoke this to add themselves to the loading list.
*/
void addPendingSheet() { m_pendingStylesheets++; }
/**
* Called when one or more stylesheets in the document may have been added, removed or changed.
*
* Creates a new style selector and assign it to this document. This is done by iterating through all nodes in
* document (or those before <BODY> in a HTML document), searching for stylesheets. Stylesheets can be contained in
* <LINK>, <STYLE> or <BODY> elements, as well as processing instructions (XML documents only). A list is
* constructed from these which is used to create the a new style selector which collates all of the stylesheets
* found and is used to calculate the derived styles for all rendering objects.
*/
void updateStyleSelector();
void recalcStyleSelector();
bool usesDescendantRules() { return m_usesDescendantRules; }
void setUsesDescendantRules(bool b) { m_usesDescendantRules = b; }
bool usesSiblingRules() { return m_usesSiblingRules; }
void setUsesSiblingRules(bool b) { m_usesSiblingRules = b; }\
QString nextState();
// Query all registered elements for their state
QStringList docState();
void registerMaintainsState(NodeImpl* e) { m_maintainsState.append(e); }
void deregisterMaintainsState(NodeImpl* e) { m_maintainsState.removeRef(e); }
// Set the state the document should restore to
void setRestoreState( const QStringList &s) { m_state = s; }
QStringList &restoreState( ) { return m_state; }
KHTMLView *view() const { return m_view; }
KHTMLPart *part() const;
RangeImpl *createRange();
NodeIteratorImpl *createNodeIterator(NodeImpl *root, unsigned long whatToShow,
NodeFilterImpl *filter, bool expandEntityReferences, int &exceptioncode);
TreeWalkerImpl *createTreeWalker(NodeImpl *root, unsigned long whatToShow,
NodeFilterImpl *filter, bool expandEntityReferences, int &exceptioncode);
// Special support for editing
CSSStyleDeclarationImpl *createCSSStyleDeclaration();
EditingTextImpl *createEditingTextNode(const DOMString &text);
virtual void recalcStyle( StyleChange = NoChange );
static QPtrList<DocumentImpl> * changedDocuments;
virtual void updateRendering();
void updateLayout();
void updateLayoutIgnorePendingStylesheets();
static void updateDocumentsRendering();
khtml::DocLoader *docLoader() { return m_docLoader; }
void setDocLoader(khtml::DocLoader* dl);
virtual void attach();
virtual void detach();
RenderArena* renderArena() { return m_renderArena; }
#if APPLE_CHANGES
KWQAccObjectCache* getAccObjectCache();
#endif
// to get visually ordered hebrew and arabic pages right
void setVisuallyOrdered();
void updateSelection();
void open();
void implicitOpen();
void close();
void implicitClose();
void write ( const DOMString &text );
void write ( const QString &text );
void writeln ( const DOMString &text );
void finishParsing ( );
void clear();
QString URL() const { return m_url; }
void setURL(const QString& url);
QString baseURL() const { return m_baseURL.isEmpty() ? m_url : m_baseURL; }
void setBaseURL(const QString& baseURL) { m_baseURL = baseURL; }
QString baseTarget() const { return m_baseTarget; }
void setBaseTarget(const QString& baseTarget) { m_baseTarget = baseTarget; }
#if APPLE_CHANGES
QString completeURL(const QString &);
#else
QString completeURL(const QString& url) { return KURL(baseURL(),url).url(); };
#endif
// from cachedObjectClient
virtual void setStyleSheet(const DOMString &url, const DOMString &sheetStr);
void setUserStyleSheet(const QString& sheet);
QString userStyleSheet() const { return m_usersheet; }
void setPrintStyleSheet(const QString& sheet) { m_printSheet = sheet; }
QString printStyleSheet() const { return m_printSheet; }
CSSStyleSheetImpl* elementSheet();
virtual khtml::Tokenizer *createTokenizer();
khtml::Tokenizer *tokenizer() { return m_tokenizer; }
QPaintDeviceMetrics *paintDeviceMetrics() { return m_paintDeviceMetrics; }
QPaintDevice *paintDevice() const { return m_paintDevice; }
void setPaintDevice( QPaintDevice *dev );
enum HTMLMode {
Html3,
Html4,
XHtml
};
enum ParseMode {
Compat,
AlmostStrict,
Strict
};
virtual void determineParseMode( const QString &str );
void setParseMode( ParseMode m ) { pMode = m; }
ParseMode parseMode() const { return pMode; }
bool inCompatMode() { return pMode == Compat; }
bool inAlmostStrictMode() { return pMode == AlmostStrict; }
bool inStrictMode() { return pMode == Strict; }
void setHTMLMode( HTMLMode m ) { hMode = m; }
HTMLMode htmlMode() const { return hMode; }
#if NOKIA_CHANGES
bool isXHtmlMobile() const { return m_xHtmlMobile; }
#endif
void setParsing(bool b);
bool parsing() const { return m_bParsing; }
int minimumLayoutDelay();
bool shouldScheduleLayout();
int elapsedTime() const;
void setTextColor( QColor color ) { m_textColor = color; }
QColor textColor() const { return m_textColor; }
const QColor& linkColor() const { return m_linkColor; }
const QColor& visitedLinkColor() const { return m_visitedLinkColor; }
const QColor& activeLinkColor() const { return m_activeLinkColor; }
void setLinkColor(const QColor& c) { m_linkColor = c; }
void setVisitedLinkColor(const QColor& c) { m_visitedLinkColor = c; }
void setActiveLinkColor(const QColor& c) { m_activeLinkColor = c; }
void resetLinkColor();
void resetVisitedLinkColor();
void resetActiveLinkColor();
// internal
NodeImpl *findElement( Id id );
bool prepareMouseEvent( bool readonly, int x, int y, MouseEvent *ev );
virtual bool childAllowed( NodeImpl *newChild );
virtual bool childTypeAllowed( unsigned short nodeType );
virtual NodeImpl *cloneNode ( bool deep );
// ### think about implementing ref'counting for the id's
// in order to be able to reassign those that are no longer in use
// (could make problems when it is still kept somewhere around, i.e. styleselector)
NodeImpl::Id tagId(DOMStringImpl* _namespaceURI, DOMStringImpl *_name, bool readonly);
DOMString tagName(NodeImpl::Id _id) const;
NodeImpl::Id attrId(DOMStringImpl* _namespaceURI, DOMStringImpl *_name, bool readonly);
DOMString attrName(NodeImpl::Id _id) const;
// the namespace uri is mapped to the same id for both
// tagnames as well as attributes.
DOMStringImpl* namespaceURI(NodeImpl::Id _id) const;
StyleSheetListImpl* styleSheets();
/* Newly proposed CSS3 mechanism for selecting alternate
stylesheets using the DOM. May be subject to change as
spec matures. - dwh
*/
DOMString preferredStylesheetSet();
DOMString selectedStylesheetSet();
void setSelectedStylesheetSet(const DOMString& aString);
QStringList availableStyleSheets() const;
NodeImpl *focusNode() const { return m_focusNode; }
bool setFocusNode(NodeImpl *newFocusNode);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -