Index: webkit/pending/Document.h |
=================================================================== |
--- webkit/pending/Document.h (revision 2884) |
+++ webkit/pending/Document.h (working copy) |
@@ -1,1090 +0,0 @@ |
-/* |
- * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
- * (C) 1999 Antti Koivisto (koivisto@kde.org) |
- * (C) 2001 Dirk Mueller (mueller@kde.org) |
- * (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
- * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. |
- * |
- * 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. |
- * |
- */ |
- |
-#ifndef Document_h |
-#define Document_h |
- |
-#include "Attr.h" |
-#include "Color.h" |
-#include "DeprecatedPtrList.h" |
-#include "DocumentMarker.h" |
-#include "HTMLCollection.h" |
-#include "HTMLFormElement.h" |
-#include "KURL.h" |
-#include "StringHash.h" |
-#include "Timer.h" |
-#include "unicode/uscript.h" |
-#include <wtf/HashCountedSet.h> |
-#include <wtf/ListHashSet.h> |
- |
-// FIXME: We should move Mac off of the old Frame-based user stylesheet loading |
-// code and onto the new code in Page. We can't do that until the code in Page |
-// supports non-file: URLs, however. |
-#if PLATFORM(MAC) || PLATFORM(QT) |
-#define FRAME_LOADS_USER_STYLESHEET 1 |
-#else |
-#define FRAME_LOADS_USER_STYLESHEET 0 |
-#endif |
- |
-namespace WebCore { |
- |
- class AXObjectCache; |
- class Attr; |
- class Attribute; |
- class CDATASection; |
- class CachedCSSStyleSheet; |
- class CanvasRenderingContext2D; |
- class CharacterData; |
- class CSSStyleDeclaration; |
- class CSSStyleSelector; |
- class CSSStyleSheet; |
- class Comment; |
- class Database; |
- class DOMImplementation; |
- class DOMSelection; |
- class DOMWindow; |
- class DatabaseThread; |
- class DocLoader; |
- class DocumentFragment; |
- class DocumentType; |
- class EditingText; |
- class Element; |
- class EntityReference; |
- class Event; |
- class EventListener; |
- class Frame; |
- class FrameView; |
- class HTMLCanvasElement; |
- class HTMLDocument; |
- class HTMLElement; |
- class HTMLFormControlElementWithState; |
- class HTMLFormElement; |
- class HTMLHeadElement; |
- class HTMLImageLoader; |
- class HTMLInputElement; |
- class HTMLMapElement; |
- class IntPoint; |
- class JSNode; |
- class MouseEventWithHitTestResults; |
- class NodeFilter; |
- class NodeIterator; |
- class Page; |
- class PlatformMouseEvent; |
- class ProcessingInstruction; |
- class Range; |
- class RegisteredEventListener; |
- class RenderArena; |
- class SecurityOrigin; |
- class Settings; |
- class StyleSheet; |
- class StyleSheetList; |
- class Text; |
- class TextResourceDecoder; |
- class Tokenizer; |
- class TreeWalker; |
- |
-#if ENABLE(SVG) |
- class SVGDocumentExtensions; |
-#endif |
- |
-#if ENABLE(XBL) |
- class XBLBindingManager; |
-#endif |
- |
-#if ENABLE(XPATH) |
- class XPathEvaluator; |
- class XPathExpression; |
- class XPathNSResolver; |
- class XPathResult; |
-#endif |
- |
-#if ENABLE(DASHBOARD_SUPPORT) |
- struct DashboardRegionValue; |
-#endif |
- struct HitTestRequest; |
- |
- typedef int ExceptionCode; |
- |
-class FormElementKey { |
-public: |
- FormElementKey(AtomicStringImpl* = 0, AtomicStringImpl* = 0); |
- ~FormElementKey(); |
- FormElementKey(const FormElementKey&); |
- FormElementKey& operator=(const FormElementKey&); |
- |
- AtomicStringImpl* name() const { return m_name; } |
- AtomicStringImpl* type() const { return m_type; } |
- |
- // Hash table deleted values, which are only constructed and never copied or destroyed. |
- FormElementKey(WTF::HashTableDeletedValueType) : m_name(hashTableDeletedValue()) { } |
- bool isHashTableDeletedValue() const { return m_name == hashTableDeletedValue(); } |
- |
-private: |
- void ref() const; |
- void deref() const; |
- |
- static AtomicStringImpl* hashTableDeletedValue() { return reinterpret_cast<AtomicStringImpl*>(-1); } |
- |
- AtomicStringImpl* m_name; |
- AtomicStringImpl* m_type; |
-}; |
- |
-inline bool operator==(const FormElementKey& a, const FormElementKey& b) |
-{ |
- return a.name() == b.name() && a.type() == b.type(); |
-} |
- |
-struct FormElementKeyHash { |
- static unsigned hash(const FormElementKey&); |
- static bool equal(const FormElementKey& a, const FormElementKey& b) { return a == b; } |
- static const bool safeToCompareToEmptyOrDeleted = true; |
-}; |
- |
-struct FormElementKeyHashTraits : WTF::GenericHashTraits<FormElementKey> { |
- static void constructDeletedValue(FormElementKey& slot) { new (&slot) FormElementKey(WTF::HashTableDeletedValue); } |
- static bool isDeletedValue(const FormElementKey& value) { return value.isHashTableDeletedValue(); } |
-}; |
- |
-class Document : public ContainerNode { |
-public: |
- static PassRefPtr<Document> create(Frame* frame) |
- { |
- return new Document(frame, false); |
- } |
- static PassRefPtr<Document> createXHTML(Frame* frame) |
- { |
- return new Document(frame, true); |
- } |
- virtual ~Document(); |
- |
- virtual void removedLastRef(); |
- |
- // Nodes belonging to this document hold "self-only" references - |
- // these are enough to keep the document from being destroyed, but |
- // not enough to keep it from removing its children. This allows a |
- // node that outlives its document to still have a valid document |
- // pointer without introducing reference cycles |
- |
- void selfOnlyRef() |
- { |
- ASSERT(!m_deletionHasBegun); |
- ++m_selfOnlyRefCount; |
- } |
- void selfOnlyDeref() |
- { |
- ASSERT(!m_deletionHasBegun); |
- --m_selfOnlyRefCount; |
- if (!m_selfOnlyRefCount && !refCount()) { |
-#ifndef NDEBUG |
- m_deletionHasBegun = true; |
-#endif |
- delete this; |
- } |
- } |
- |
- // DOM methods & attributes for Document |
- |
- DocumentType* doctype() const { return m_docType.get(); } |
- |
- DOMImplementation* implementation() const; |
- virtual void childrenChanged(bool changedByParser = false, Node* beforeChange = 0, Node* afterChange = 0, int childCountDelta = 0); |
- Element* documentElement() const; |
- virtual PassRefPtr<Element> createElement(const AtomicString& tagName, ExceptionCode&); |
- PassRefPtr<DocumentFragment> createDocumentFragment (); |
- PassRefPtr<Text> createTextNode(const String& data); |
- PassRefPtr<Comment> createComment(const String& data); |
- PassRefPtr<CDATASection> createCDATASection(const String& data, ExceptionCode&); |
- PassRefPtr<ProcessingInstruction> createProcessingInstruction(const String& target, const String& data, ExceptionCode&); |
- PassRefPtr<Attr> createAttribute(const String& name, ExceptionCode& ec) { return createAttributeNS(String(), name, ec, true); } |
- PassRefPtr<Attr> createAttributeNS(const String& namespaceURI, const String& qualifiedName, ExceptionCode&, bool shouldIgnoreNamespaceChecks = false); |
- PassRefPtr<EntityReference> createEntityReference(const String& name, ExceptionCode&); |
- PassRefPtr<Node> importNode(Node* importedNode, bool deep, ExceptionCode&); |
- virtual PassRefPtr<Element> createElementNS(const String& namespaceURI, const String& qualifiedName, ExceptionCode&); |
- PassRefPtr<Element> createElement(const QualifiedName&, bool createdByParser, ExceptionCode& ec); |
- Element* getElementById(const AtomicString&) const; |
- bool hasElementWithId(AtomicStringImpl* id) const; |
- bool containsMultipleElementsWithId(const AtomicString& elementId) { return m_duplicateIds.contains(elementId.impl()); } |
- |
- Element* elementFromPoint(int x, int y) const; |
- String readyState() const; |
- String inputEncoding() const; |
- String defaultCharset() const; |
- |
- String charset() const { return inputEncoding(); } |
- String characterSet() const { return inputEncoding(); } |
- |
- void setCharset(const String&); |
- UScriptCode dominantScript() const; |
- |
- String contentLanguage() const { return m_contentLanguage; } |
- void setContentLanguage(const String& lang) { m_contentLanguage = lang; } |
- |
- String xmlEncoding() const { return m_xmlEncoding; } |
- String xmlVersion() const { return m_xmlVersion; } |
- bool xmlStandalone() const { return m_xmlStandalone; } |
- |
- void setXMLEncoding(const String& encoding) { m_xmlEncoding = encoding; } // read-only property, only to be set from XMLTokenizer |
- void setXMLVersion(const String&, ExceptionCode&); |
- void setXMLStandalone(bool, ExceptionCode&); |
- |
- String documentURI() const { return m_documentURI; } |
- void setDocumentURI(const String&); |
- |
- virtual KURL baseURI() const; |
- |
- PassRefPtr<Node> adoptNode(PassRefPtr<Node> source, ExceptionCode&); |
- |
- PassRefPtr<HTMLCollection> images(); |
- PassRefPtr<HTMLCollection> embeds(); |
- PassRefPtr<HTMLCollection> plugins(); // an alias for embeds() required for the JS DOM bindings. |
- PassRefPtr<HTMLCollection> applets(); |
- PassRefPtr<HTMLCollection> links(); |
- PassRefPtr<HTMLCollection> forms(); |
- PassRefPtr<HTMLCollection> anchors(); |
- PassRefPtr<HTMLCollection> all(); |
- PassRefPtr<HTMLCollection> objects(); |
- PassRefPtr<HTMLCollection> scripts(); |
- PassRefPtr<HTMLCollection> windowNamedItems(const String& name); |
- PassRefPtr<HTMLCollection> documentNamedItems(const String& name); |
- |
- HTMLCollection::CollectionInfo* collectionInfo(HTMLCollection::Type type) |
- { |
- ASSERT(type >= HTMLCollection::FirstUnnamedDocumentCachedType); |
- unsigned index = type - HTMLCollection::FirstUnnamedDocumentCachedType; |
- ASSERT(index < HTMLCollection::NumUnnamedDocumentCachedTypes); |
- return &m_collectionInfo[index]; |
- } |
- |
- HTMLCollection::CollectionInfo* nameCollectionInfo(HTMLCollection::Type, const AtomicString& name); |
- |
- // DOM methods overridden from parent classes |
- |
- virtual String nodeName() const; |
- virtual NodeType nodeType() const; |
- |
- // Other methods (not part of DOM) |
- virtual bool isDocumentNode() const { return true; } |
- virtual bool isHTMLDocument() const { return false; } |
- virtual bool isImageDocument() const { return false; } |
-#if ENABLE(SVG) |
- virtual bool isSVGDocument() const { return false; } |
-#endif |
- virtual bool isPluginDocument() const { return false; } |
- virtual bool isMediaDocument() const { return false; } |
- |
- CSSStyleSelector* styleSelector() const { return m_styleSelector; } |
- |
- Element* getElementByAccessKey(const String& key) const; |
- |
- /** |
- * Updates the pending sheet count and then calls updateStyleSelector. |
- */ |
- void removePendingSheet(); |
- |
- /** |
- * This method returns true if all top-level stylesheets have loaded (including |
- * any @imports that they may be loading). |
- */ |
- bool haveStylesheetsLoaded() const |
- { |
- return m_pendingStylesheets <= 0 || m_ignorePendingStylesheets |
-#if USE(LOW_BANDWIDTH_DISPLAY) |
- || m_inLowBandwidthDisplay |
-#endif |
- ; |
- } |
- |
- /** |
- * Increments the number of pending sheets. The <link> elements |
- * invoke this to add themselves to the loading list. |
- */ |
- void addPendingSheet() { m_pendingStylesheets++; } |
- |
- void addStyleSheetCandidateNode(Node*, bool createdByParser); |
- void removeStyleSheetCandidateNode(Node*); |
- |
- bool gotoAnchorNeededAfterStylesheetsLoad() { return m_gotoAnchorNeededAfterStylesheetsLoad; } |
- void setGotoAnchorNeededAfterStylesheetsLoad(bool b) { m_gotoAnchorNeededAfterStylesheetsLoad = b; } |
- |
- /** |
- * 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() const { return m_usesDescendantRules; } |
- void setUsesDescendantRules(bool b) { m_usesDescendantRules = b; } |
- bool usesSiblingRules() const { return m_usesSiblingRules; } |
- void setUsesSiblingRules(bool b) { m_usesSiblingRules = b; } |
- bool usesFirstLineRules() const { return m_usesFirstLineRules; } |
- void setUsesFirstLineRules(bool b) { m_usesFirstLineRules = b; } |
- bool usesFirstLetterRules() const { return m_usesFirstLetterRules; } |
- void setUsesFirstLetterRules(bool b) { m_usesFirstLetterRules = b; } |
- |
- // Machinery for saving and restoring state when you leave and then go back to a page. |
- void registerFormElementWithState(HTMLFormControlElementWithState* e) { m_formElementsWithState.add(e); } |
- void unregisterFormElementWithState(HTMLFormControlElementWithState* e) { m_formElementsWithState.remove(e); } |
- Vector<String> formElementsState() const; |
- void setStateForNewFormElements(const Vector<String>&); |
- bool hasStateForNewFormElements() const; |
- bool takeStateForFormElement(AtomicStringImpl* name, AtomicStringImpl* type, String& state); |
- |
- FrameView* view() const; // can be NULL |
- Frame* frame() const { return m_frame; } // can be NULL |
- Page* page() const; // can be NULL |
- Settings* settings() const; // can be NULL |
- |
- PassRefPtr<Range> createRange(); |
- |
- PassRefPtr<NodeIterator> createNodeIterator(Node* root, unsigned whatToShow, |
- PassRefPtr<NodeFilter>, bool expandEntityReferences, ExceptionCode&); |
- |
- PassRefPtr<TreeWalker> createTreeWalker(Node* root, unsigned whatToShow, |
- PassRefPtr<NodeFilter>, bool expandEntityReferences, ExceptionCode&); |
- |
- // Special support for editing |
- PassRefPtr<CSSStyleDeclaration> createCSSStyleDeclaration(); |
- PassRefPtr<EditingText> createEditingTextNode(const String&); |
- |
- virtual void recalcStyle( StyleChange = NoChange ); |
- virtual void updateRendering(); |
- void updateLayout(); |
- void updateLayoutIgnorePendingStylesheets(); |
- static void updateDocumentsRendering(); |
- DocLoader* docLoader() { return m_docLoader; } |
- |
- virtual void attach(); |
- virtual void detach(); |
- |
- void clearFramePointer(); |
- |
- RenderArena* renderArena() { return m_renderArena; } |
- |
- void clearAXObjectCache(); |
- AXObjectCache* axObjectCache() const; |
- |
- // to get visually ordered hebrew and arabic pages right |
- void setVisuallyOrdered(); |
- |
- void open(Document* ownerDocument = 0); |
- void implicitOpen(); |
- void close(); |
- void implicitClose(); |
- void cancelParsing(); |
- |
- void write(const String& text, Document* ownerDocument = 0); |
- void writeln(const String& text, Document* ownerDocument = 0); |
- void finishParsing(); |
- void clear(); |
- |
- bool wellFormed() const { return m_wellFormed; } |
- |
- const KURL& url() const { return m_url; } |
- void setURL(const KURL&); |
- |
- const KURL& baseURL() const { return m_baseURL; } |
- // Setting the BaseElementURL will change the baseURL. |
- void setBaseElementURL(const KURL&); |
- |
- const String& baseTarget() const { return m_baseTarget; } |
- // Setting the BaseElementTarget will change the baseTarget. |
- void setBaseElementTarget(const String& baseTarget) { m_baseTarget = baseTarget; } |
- |
- KURL completeURL(const String&) const; |
- |
- unsigned visitedLinkHash(const AtomicString& attributeURL) const; |
- |
- // from cachedObjectClient |
- virtual void setCSSStyleSheet(const String& url, const String& charset, const CachedCSSStyleSheet*); |
- |
-#if FRAME_LOADS_USER_STYLESHEET |
- void setUserStyleSheet(const String& sheet); |
-#endif |
- |
- String userStyleSheet() const; |
- |
- CSSStyleSheet* elementSheet(); |
- CSSStyleSheet* mappedElementSheet(); |
- virtual Tokenizer* createTokenizer(); |
- Tokenizer* tokenizer() { return m_tokenizer; } |
- |
- bool printing() const { return m_printing; } |
- void setPrinting(bool p) { m_printing = p; } |
- |
- enum ParseMode { Compat, AlmostStrict, Strict }; |
- |
- // Used by Chromium to know if it can just SIGKILL a renderer when navigating |
- bool hasUnloadEventListener(); |
- |
-private: |
- virtual void determineParseMode() {} |
- |
-public: |
- void setParseMode(ParseMode m) { m_parseMode = m; } |
- ParseMode parseMode() const { return m_parseMode; } |
- |
- bool inCompatMode() const { return m_parseMode == Compat; } |
- bool inAlmostStrictMode() const { return m_parseMode == AlmostStrict; } |
- bool inStrictMode() const { return m_parseMode == Strict; } |
- |
- void setParsing(bool); |
- bool parsing() const { return m_bParsing; } |
- int minimumLayoutDelay(); |
- bool shouldScheduleLayout(); |
- int elapsedTime() const; |
- |
- void setTextColor(const Color& color) { m_textColor = color; } |
- Color textColor() const { return m_textColor; } |
- |
- const Color& linkColor() const { return m_linkColor; } |
- const Color& visitedLinkColor() const { return m_visitedLinkColor; } |
- const Color& activeLinkColor() const { return m_activeLinkColor; } |
- void setLinkColor(const Color& c) { m_linkColor = c; } |
- void setVisitedLinkColor(const Color& c) { m_visitedLinkColor = c; } |
- void setActiveLinkColor(const Color& c) { m_activeLinkColor = c; } |
- void resetLinkColor(); |
- void resetVisitedLinkColor(); |
- void resetActiveLinkColor(); |
- |
- MouseEventWithHitTestResults prepareMouseEvent(const HitTestRequest&, const IntPoint&, const PlatformMouseEvent&); |
- |
- virtual bool childTypeAllowed(NodeType); |
- virtual PassRefPtr<Node> cloneNode(bool deep); |
- |
- virtual bool canReplaceChild(Node* newChild, Node* oldChild); |
- |
- StyleSheetList* styleSheets(); |
- |
- /* Newly proposed CSS3 mechanism for selecting alternate |
- stylesheets using the DOM. May be subject to change as |
- spec matures. - dwh |
- */ |
- String preferredStylesheetSet() const; |
- String selectedStylesheetSet() const; |
- void setSelectedStylesheetSet(const String&); |
- |
- bool setFocusedNode(PassRefPtr<Node>); |
- Node* focusedNode() const { return m_focusedNode.get(); } |
- |
- // The m_ignoreAutofocus flag specifies whether or not the document has been changed by the user enough |
- // for WebCore to ignore the autofocus attribute on any form controls |
- bool ignoreAutofocus() const { return m_ignoreAutofocus; }; |
- void setIgnoreAutofocus(bool shouldIgnore = true) { m_ignoreAutofocus = shouldIgnore; }; |
- |
- void setHoverNode(PassRefPtr<Node>); |
- Node* hoverNode() const { return m_hoverNode.get(); } |
- |
- void setActiveNode(PassRefPtr<Node>); |
- Node* activeNode() const { return m_activeNode.get(); } |
- |
- void focusedNodeRemoved(); |
- void removeFocusedNodeOfSubtree(Node*, bool amongChildrenOnly = false); |
- void hoveredNodeDetached(Node*); |
- void activeChainNodeDetached(Node*); |
- |
- // Updates for :target (CSS3 selector). |
- void setCSSTarget(Node*); |
- Node* getCSSTarget() const; |
- |
- void setDocumentChanged(bool); |
- |
- void attachNodeIterator(NodeIterator*); |
- void detachNodeIterator(NodeIterator*); |
- |
- void attachRange(Range*); |
- void detachRange(Range*); |
- |
- void nodeChildrenChanged(ContainerNode*); |
- void nodeWillBeRemoved(Node*); |
- |
- void textInserted(Node*, unsigned offset, unsigned length); |
- void textRemoved(Node*, unsigned offset, unsigned length); |
- void textNodesMerged(Text* oldNode, unsigned offset); |
- void textNodeSplit(Text* oldNode); |
- |
- DOMWindow* defaultView() const { return domWindow(); } |
- DOMWindow* domWindow() const; |
- |
- PassRefPtr<Event> createEvent(const String& eventType, ExceptionCode&); |
- |
- // keep track of what types of event listeners are registered, so we don't |
- // dispatch events unnecessarily |
- enum ListenerType { |
- DOMSUBTREEMODIFIED_LISTENER = 0x01, |
- DOMNODEINSERTED_LISTENER = 0x02, |
- DOMNODEREMOVED_LISTENER = 0x04, |
- DOMNODEREMOVEDFROMDOCUMENT_LISTENER = 0x08, |
- DOMNODEINSERTEDINTODOCUMENT_LISTENER = 0x10, |
- DOMATTRMODIFIED_LISTENER = 0x20, |
- DOMCHARACTERDATAMODIFIED_LISTENER = 0x40, |
- OVERFLOWCHANGED_LISTENER = 0x80, |
- ANIMATIONEND_LISTENER = 0x100, |
- ANIMATIONSTART_LISTENER = 0x200, |
- ANIMATIONITERATION_LISTENER = 0x400, |
- TRANSITIONEND_LISTENER = 0x800 |
- }; |
- |
- bool hasListenerType(ListenerType listenerType) const { return (m_listenerTypes & listenerType); } |
- void addListenerType(ListenerType listenerType) { m_listenerTypes = m_listenerTypes | listenerType; } |
- |
- CSSStyleDeclaration* getOverrideStyle(Element*, const String& pseudoElt); |
- |
- void handleWindowEvent(Event*, bool useCapture); |
- void setHTMLWindowEventListener(const AtomicString &eventType, PassRefPtr<EventListener>); |
- EventListener* getHTMLWindowEventListener(const AtomicString &eventType); |
- void removeHTMLWindowEventListener(const AtomicString &eventType); |
- |
- void setHTMLWindowEventListener(const AtomicString& eventType, Attribute*); |
- |
- void addWindowEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture); |
- void removeWindowEventListener(const AtomicString& eventType, EventListener*, bool useCapture); |
- bool hasWindowEventListener(const AtomicString& eventType); |
- |
- void addPendingFrameUnloadEventCount(); |
- void removePendingFrameUnloadEventCount(); |
- void addPendingFrameBeforeUnloadEventCount(); |
- void removePendingFrameBeforeUnloadEventCount(); |
- |
- PassRefPtr<EventListener> createHTMLEventListener(const String& functionName, const String& code, Node*); |
- |
- /** |
- * Searches through the document, starting from fromNode, for the next selectable element that comes after fromNode. |
- * The order followed is as specified in section 17.11.1 of the HTML4 spec, which is elements with tab indexes |
- * first (from lowest to highest), and then elements without tab indexes (in document order). |
- * |
- * @param fromNode The node from which to start searching. The node after this will be focused. May be null. |
- * |
- * @return The focus node that comes after fromNode |
- * |
- * See http://www.w3.org/TR/html4/interact/forms.html#h-17.11.1 |
- */ |
- Node* nextFocusableNode(Node* start, KeyboardEvent*); |
- |
- /** |
- * Searches through the document, starting from fromNode, for the previous selectable element (that comes _before_) |
- * fromNode. The order followed is as specified in section 17.11.1 of the HTML4 spec, which is elements with tab |
- * indexes first (from lowest to highest), and then elements without tab indexes (in document order). |
- * |
- * @param fromNode The node from which to start searching. The node before this will be focused. May be null. |
- * |
- * @return The focus node that comes before fromNode |
- * |
- * See http://www.w3.org/TR/html4/interact/forms.html#h-17.11.1 |
- */ |
- Node* previousFocusableNode(Node* start, KeyboardEvent*); |
- |
- int nodeAbsIndex(Node*); |
- Node* nodeWithAbsIndex(int absIndex); |
- |
- /** |
- * Handles a HTTP header equivalent set by a meta tag using <meta http-equiv="..." content="...">. This is called |
- * when a meta tag is encountered during document parsing, and also when a script dynamically changes or adds a meta |
- * tag. This enables scripts to use meta tags to perform refreshes and set expiry dates in addition to them being |
- * specified in a HTML file. |
- * |
- * @param equiv The http header name (value of the meta tag's "equiv" attribute) |
- * @param content The header value (value of the meta tag's "content" attribute) |
- */ |
- void processHttpEquiv(const String& equiv, const String& content); |
- |
- void dispatchImageLoadEventSoon(HTMLImageLoader*); |
- void dispatchImageLoadEventsNow(); |
- void removeImage(HTMLImageLoader*); |
- |
- // Returns the owning element in the parent document. |
- // Returns 0 if this is the top level document. |
- Element* ownerElement() const; |
- |
- String title() const { return m_title; } |
- void setTitle(const String&, Element* titleElement = 0); |
- void removeTitle(Element* titleElement); |
- |
- String cookie() const; |
- void setCookie(const String&); |
- |
- String referrer() const; |
- |
- String domain() const; |
- void setDomain(const String& newDomain); |
- |
- String lastModified() const; |
- |
- const KURL& cookieURL() const { return m_cookieURL; } |
- |
- const KURL& policyBaseURL() const { return m_policyBaseURL; } |
- void setPolicyBaseURL(const KURL& url) { m_policyBaseURL = url; } |
- |
- // The following implements the rule from HTML 4 for what valid names are. |
- // To get this right for all the XML cases, we probably have to improve this or move it |
- // and make it sensitive to the type of document. |
- static bool isValidName(const String&); |
- |
- // The following breaks a qualified name into a prefix and a local name. |
- // It also does a validity check, and returns false if the qualified name |
- // is invalid. It also sets ExceptionCode when name is invalid. |
- static bool parseQualifiedName(const String& qualifiedName, String& prefix, String& localName, ExceptionCode&); |
- |
- // Checks to make sure prefix and namespace do not conflict (per DOM Core 3) |
- static bool hasPrefixNamespaceMismatch(const QualifiedName&); |
- |
- void addElementById(const AtomicString& elementId, Element *element); |
- void removeElementById(const AtomicString& elementId, Element *element); |
- |
- void addImageMap(HTMLMapElement*); |
- void removeImageMap(HTMLMapElement*); |
- HTMLMapElement* getImageMap(const String& url) const; |
- |
- HTMLElement* body(); |
- void setBody(PassRefPtr<HTMLElement>, ExceptionCode&); |
- |
- HTMLHeadElement* head(); |
- |
- bool execCommand(const String& command, bool userInterface = false, const String& value = String()); |
- bool queryCommandEnabled(const String& command); |
- bool queryCommandIndeterm(const String& command); |
- bool queryCommandState(const String& command); |
- bool queryCommandSupported(const String& command); |
- String queryCommandValue(const String& command); |
- |
- void addMarker(Range*, DocumentMarker::MarkerType, String description = String()); |
- void addMarker(Node*, DocumentMarker); |
- void copyMarkers(Node *srcNode, unsigned startOffset, int length, Node *dstNode, int delta, DocumentMarker::MarkerType = DocumentMarker::AllMarkers); |
- void removeMarkers(Range*, DocumentMarker::MarkerType = DocumentMarker::AllMarkers); |
- void removeMarkers(Node*, unsigned startOffset, int length, DocumentMarker::MarkerType = DocumentMarker::AllMarkers); |
- void removeMarkers(DocumentMarker::MarkerType = DocumentMarker::AllMarkers); |
- void removeMarkers(Node*); |
- void repaintMarkers(DocumentMarker::MarkerType = DocumentMarker::AllMarkers); |
- void setRenderedRectForMarker(Node*, DocumentMarker, const IntRect&); |
- void invalidateRenderedRectsForMarkersInRect(const IntRect&); |
- void shiftMarkers(Node*, unsigned startOffset, int delta, DocumentMarker::MarkerType = DocumentMarker::AllMarkers); |
- |
- DocumentMarker* markerContainingPoint(const IntPoint&, DocumentMarker::MarkerType = DocumentMarker::AllMarkers); |
- Vector<DocumentMarker> markersForNode(Node*); |
- Vector<IntRect> renderedRectsForMarkers(DocumentMarker::MarkerType = DocumentMarker::AllMarkers); |
- |
- // designMode support |
- enum InheritedBool { off = false, on = true, inherit }; |
- void setDesignMode(InheritedBool value); |
- InheritedBool getDesignMode() const; |
- bool inDesignMode() const; |
- |
- Document* parentDocument() const; |
- Document* topDocument() const; |
- |
- int docID() const { return m_docID; } |
- |
-#if ENABLE(XSLT) |
- void applyXSLTransform(ProcessingInstruction* pi); |
- void setTransformSource(void* doc); |
- const void* transformSource() { return m_transformSource; } |
- PassRefPtr<Document> transformSourceDocument() { return m_transformSourceDocument; } |
- void setTransformSourceDocument(Document* doc) { m_transformSourceDocument = doc; } |
-#endif |
- |
-#if ENABLE(XBL) |
- // XBL methods |
- XBLBindingManager* bindingManager() const { return m_bindingManager; } |
-#endif |
- |
- void incDOMTreeVersion() { ++m_domtree_version; } |
- unsigned domTreeVersion() const { return m_domtree_version; } |
- |
- void setDocType(PassRefPtr<DocumentType>); |
- |
- void finishedParsing(); |
- |
-#if ENABLE(XPATH) |
- // XPathEvaluator methods |
- PassRefPtr<XPathExpression> createExpression(const String& expression, |
- XPathNSResolver* resolver, |
- ExceptionCode& ec); |
- PassRefPtr<XPathNSResolver> createNSResolver(Node *nodeResolver); |
- PassRefPtr<XPathResult> evaluate(const String& expression, |
- Node* contextNode, |
- XPathNSResolver* resolver, |
- unsigned short type, |
- XPathResult* result, |
- ExceptionCode& ec); |
-#endif // ENABLE(XPATH) |
- |
- enum PendingSheetLayout { NoLayoutWithPendingSheets, DidLayoutWithPendingSheets, IgnoreLayoutWithPendingSheets }; |
- |
- bool didLayoutWithPendingStylesheets() const { return m_pendingSheetLayout == DidLayoutWithPendingSheets; } |
- |
- void setHasNodesWithPlaceholderStyle() { m_hasNodesWithPlaceholderStyle = true; } |
- |
- const String& iconURL() const { return m_iconURL; } |
- void setIconURL(const String& iconURL, const String& type); |
- |
- void setUseSecureKeyboardEntryWhenActive(bool); |
- bool useSecureKeyboardEntryWhenActive() const; |
- |
-#if USE(LOW_BANDWIDTH_DISPLAY) |
- void setDocLoader(DocLoader* loader) { m_docLoader = loader; } |
- bool inLowBandwidthDisplay() const { return m_inLowBandwidthDisplay; } |
- void setLowBandwidthDisplay(bool lowBandWidth) { m_inLowBandwidthDisplay = lowBandWidth; } |
-#endif |
- |
- void addNodeListCache() { ++m_numNodeListCaches; } |
- void removeNodeListCache() { ASSERT(m_numNodeListCaches > 0); --m_numNodeListCaches; } |
- bool hasNodeListCaches() const { return m_numNodeListCaches; } |
- |
- void updateFocusAppearanceSoon(); |
- void cancelFocusAppearanceUpdate(); |
- |
- // FF method for accessing the selection added for compatability. |
- DOMSelection* getSelection() const; |
- |
- // Extension for manipulating canvas drawing contexts for use in CSS |
- CanvasRenderingContext2D* getCSSCanvasContext(const String& type, const String& name, int width, int height); |
- HTMLCanvasElement* getCSSCanvasElement(const String& name); |
- |
- bool isDNSPrefetchEnabled() const { return m_isDNSPrefetchEnabled; } |
- void initDNSPrefetchEnabled(); |
- void setDNSPrefetchControl(const WebCore::String&); |
- |
-protected: |
- Document(Frame*, bool isXHTML); |
- |
-private: |
- CSSStyleSelector* m_styleSelector; |
- bool m_didCalculateStyleSelector; |
- |
- Frame* m_frame; |
- DocLoader* m_docLoader; |
- Tokenizer* m_tokenizer; |
- bool m_wellFormed; |
- |
- // Document URLs. |
- KURL m_url; // Document.URL: The URL from which this document was retrieved. |
- KURL m_baseURL; // Node.baseURI: The URL to use when resolving relative URLs. |
- KURL m_baseElementURL; // The URL set by the <base> element. |
- KURL m_cookieURL; // The URL to use for cookie access. |
- KURL m_policyBaseURL; // The policy URL for third-party cookie blocking. |
- |
- // Document.documentURI: |
- // Although URL-like, Document.documentURI can actually be set to any |
- // string by content. Document.documentURI affects m_baseURL unless the |
- // document contains a <base> element, in which case the <base> element |
- // takes precedence. |
- String m_documentURI; |
- |
- String m_baseTarget; |
- |
- RefPtr<DocumentType> m_docType; |
- mutable RefPtr<DOMImplementation> m_implementation; |
- |
- RefPtr<StyleSheet> m_sheet; |
-#if FRAME_LOADS_USER_STYLESHEET |
- String m_usersheet; |
-#endif |
- |
- // Track the number of currently loading top-level stylesheets. Sheets |
- // loaded using the @import directive are not included in this count. |
- // We use this count of pending sheets to detect when we can begin attaching |
- // elements. |
- int m_pendingStylesheets; |
- |
- // But sometimes you need to ignore pending stylesheet count to |
- // force an immediate layout when requested by JS. |
- bool m_ignorePendingStylesheets; |
- |
- // If we do ignore the pending stylesheet count, then we need to add a boolean |
- // to track that this happened so that we can do a full repaint when the stylesheets |
- // do eventually load. |
- PendingSheetLayout m_pendingSheetLayout; |
- |
- bool m_hasNodesWithPlaceholderStyle; |
- |
- RefPtr<CSSStyleSheet> m_elemSheet; |
- RefPtr<CSSStyleSheet> m_mappedElementSheet; |
- |
- bool m_printing; |
- |
- bool m_ignoreAutofocus; |
- |
- ParseMode m_parseMode; |
- |
- Color m_textColor; |
- |
- RefPtr<Node> m_focusedNode; |
- RefPtr<Node> m_hoverNode; |
- RefPtr<Node> m_activeNode; |
- mutable RefPtr<Element> m_documentElement; |
- |
- unsigned m_domtree_version; |
- |
- HashSet<NodeIterator*> m_nodeIterators; |
- HashSet<Range*> m_ranges; |
- |
- unsigned short m_listenerTypes; |
- |
- RefPtr<StyleSheetList> m_styleSheets; // All of the stylesheets that are currently in effect for our media type and stylesheet set. |
- ListHashSet<Node*> m_styleSheetCandidateNodes; // All of the nodes that could potentially provide stylesheets to the document (<link>, <style>, <?xml-stylesheet>) |
- |
- RegisteredEventListenerList m_windowEventListeners; |
- |
- typedef HashMap<FormElementKey, Vector<String>, FormElementKeyHash, FormElementKeyHashTraits> FormElementStateMap; |
- ListHashSet<HTMLFormControlElementWithState*> m_formElementsWithState; |
- FormElementStateMap m_stateForNewFormElements; |
- |
- Color m_linkColor; |
- Color m_visitedLinkColor; |
- Color m_activeLinkColor; |
- |
- String m_preferredStylesheetSet; |
- String m_selectedStylesheetSet; |
- |
- bool m_loadingSheet; |
- bool visuallyOrdered; |
- bool m_bParsing; |
- bool m_docChanged; |
- bool m_inStyleRecalc; |
- bool m_closeAfterStyleRecalc; |
- bool m_usesDescendantRules; |
- bool m_usesSiblingRules; |
- bool m_usesFirstLineRules; |
- bool m_usesFirstLetterRules; |
- bool m_gotoAnchorNeededAfterStylesheetsLoad; |
- |
- bool m_isDNSPrefetchEnabled; |
- bool m_haveExplicitlyDisabledDNSPrefetch; |
- |
- String m_title; |
- bool m_titleSetExplicitly; |
- RefPtr<Element> m_titleElement; |
- |
- RenderArena* m_renderArena; |
- |
- typedef std::pair<Vector<DocumentMarker>, Vector<IntRect> > MarkerMapVectorPair; |
- typedef HashMap<RefPtr<Node>, MarkerMapVectorPair*> MarkerMap; |
- MarkerMap m_markers; |
- |
- mutable AXObjectCache* m_axObjectCache; |
- |
- DeprecatedPtrList<HTMLImageLoader> m_imageLoadEventDispatchSoonList; |
- DeprecatedPtrList<HTMLImageLoader> m_imageLoadEventDispatchingList; |
- Timer<Document> m_imageLoadEventTimer; |
- |
- Timer<Document> m_updateFocusAppearanceTimer; |
- |
- Node* m_cssTarget; |
- |
- bool m_processingLoadEvent; |
- double m_startTime; |
- bool m_overMinimumLayoutThreshold; |
- |
-#if ENABLE(XSLT) |
- void* m_transformSource; |
- RefPtr<Document> m_transformSourceDocument; |
-#endif |
- |
-#if ENABLE(XBL) |
- XBLBindingManager* m_bindingManager; // The access point through which documents and elements communicate with XBL. |
-#endif |
- |
- typedef HashMap<AtomicStringImpl*, HTMLMapElement*> ImageMapsByName; |
- ImageMapsByName m_imageMapsByName; |
- |
- HashSet<Node*> m_disconnectedNodesWithEventListeners; |
- |
- int m_docID; // A unique document identifier used for things like document-specific mapped attributes. |
- |
- String m_xmlEncoding; |
- String m_xmlVersion; |
- bool m_xmlStandalone; |
- |
- String m_contentLanguage; |
- |
- // UScriptCode can be derived from non-Unicode charsets and help us select a fallback |
- // font. Because it's derived from charset, it's a document-wide constant. |
- // For instance, it'll be Latin, SimplifiedHan, TraditionalHan, Hiragana, |
- // Hangul, Arabic and Hebrew for documents in ISO-8859-1, GBK, Big5, Shift_JIS, |
- // EUC-KR, Windows-1256 and Windows-1255, respectively. In case of Japanese encodings, |
- // either Hiragana or Katakana should work but Han does not because it does not |
- // uniquely identify Japanese and as a result does not help the font selection. |
- // Obviously, this does not work well for Unicode-encoded documents. In the meantime, |
- // we can resort to the 'dominant' script of the current UI language. |
- // In the future, we should refer to the value of xml:lang and lang to infer |
- // this value for invididual text nodes. CSSStyleSelector might be a good place for that. |
- // Moreover, the value of m_contentLanguage should be utilized as well. |
- mutable UScriptCode m_dominantScript; |
- |
-public: |
- bool inPageCache(); |
- void setInPageCache(bool flag); |
- |
- // Elements can register themselves for the "willSaveToCache()" and |
- // "didRestoreFromCache()" callbacks |
- void registerForCacheCallbacks(Element*); |
- void unregisterForCacheCallbacks(Element*); |
- void willSaveToCache(); |
- void didRestoreFromCache(); |
- |
- void setShouldCreateRenderers(bool); |
- bool shouldCreateRenderers(); |
- |
- void setDecoder(PassRefPtr<TextResourceDecoder>); |
- TextResourceDecoder* decoder() const { return m_decoder.get(); } |
- |
- UChar backslashAsCurrencySymbol() const; |
- |
-#if ENABLE(DASHBOARD_SUPPORT) |
- void setDashboardRegionsDirty(bool f) { m_dashboardRegionsDirty = f; } |
- bool dashboardRegionsDirty() const { return m_dashboardRegionsDirty; } |
- bool hasDashboardRegions () const { return m_hasDashboardRegions; } |
- void setHasDashboardRegions (bool f) { m_hasDashboardRegions = f; } |
- const Vector<DashboardRegionValue>& dashboardRegions() const; |
- void setDashboardRegions(const Vector<DashboardRegionValue>&); |
-#endif |
- |
- void removeAllEventListenersFromAllNodes(); |
- |
- void registerDisconnectedNodeWithEventListeners(Node*); |
- void unregisterDisconnectedNodeWithEventListeners(Node*); |
- |
- HTMLFormElement::CheckedRadioButtons& checkedRadioButtons() { return m_checkedRadioButtons; } |
- |
-#if ENABLE(SVG) |
- const SVGDocumentExtensions* svgExtensions(); |
- SVGDocumentExtensions* accessSVGExtensions(); |
-#endif |
- |
- void initSecurityContext(); |
- SecurityOrigin* securityOrigin() const { return m_securityOrigin.get(); } |
- |
- // Explicitly override the security origin for this document. |
- // Note: It is dangerous to change the security origin of a document |
- // that already contains content. |
- void setSecurityOrigin(SecurityOrigin*); |
- |
- bool processingLoadEvent() const { return m_processingLoadEvent; } |
- |
-#if ENABLE(DATABASE) |
- void addOpenDatabase(Database*); |
- void removeOpenDatabase(Database*); |
- DatabaseThread* databaseThread(); // Creates the thread as needed, but not if it has been already terminated. |
- void setHasOpenDatabases() { m_hasOpenDatabases = true; } |
- bool hasOpenDatabases() { return m_hasOpenDatabases; } |
- void stopDatabases(); |
-#endif |
-protected: |
- void clearXMLVersion() { m_xmlVersion = String(); } |
- |
-private: |
- void updateTitle(); |
- void removeAllDisconnectedNodeEventListeners(); |
- void imageLoadEventTimerFired(Timer<Document>*); |
- void updateFocusAppearanceTimerFired(Timer<Document>*); |
- void updateBaseURL(); |
- |
- RefPtr<SecurityOrigin> m_securityOrigin; |
- |
- RenderObject* m_savedRenderer; |
- int m_secureForms; |
- |
- RefPtr<TextResourceDecoder> m_decoder; |
- |
- // We maintain the invariant that m_duplicateIds is the count of all elements with a given ID |
- // excluding the one referenced in m_elementsById, if any. This means it one less than the total count |
- // when the first node with a given ID is cached, otherwise the same as the total count. |
- mutable HashMap<AtomicStringImpl*, Element*> m_elementsById; |
- mutable HashCountedSet<AtomicStringImpl*> m_duplicateIds; |
- |
- mutable HashMap<StringImpl*, Element*, CaseFoldingHash> m_elementsByAccessKey; |
- |
- InheritedBool m_designMode; |
- |
- int m_selfOnlyRefCount; |
- |
- HTMLFormElement::CheckedRadioButtons m_checkedRadioButtons; |
- |
- typedef HashMap<AtomicStringImpl*, HTMLCollection::CollectionInfo*> NamedCollectionMap; |
- HTMLCollection::CollectionInfo m_collectionInfo[HTMLCollection::NumUnnamedDocumentCachedTypes]; |
- NamedCollectionMap m_nameCollectionInfo[HTMLCollection::NumNamedDocumentCachedTypes]; |
- |
-#if ENABLE(XPATH) |
- RefPtr<XPathEvaluator> m_xpathEvaluator; |
-#endif |
- |
-#if ENABLE(SVG) |
- SVGDocumentExtensions* m_svgExtensions; |
-#endif |
- |
-#if ENABLE(DASHBOARD_SUPPORT) |
- Vector<DashboardRegionValue> m_dashboardRegions; |
- bool m_hasDashboardRegions; |
- bool m_dashboardRegionsDirty; |
-#endif |
- |
- HashMap<String, RefPtr<HTMLCanvasElement> > m_cssCanvasElements; |
- |
- mutable bool m_accessKeyMapValid; |
- bool m_createRenderers; |
- bool m_inPageCache; |
- String m_iconURL; |
- |
- HashSet<Element*> m_pageCacheCallbackElements; |
- |
- bool m_useSecureKeyboardEntryWhenActive; |
- |
- bool m_isXHTML; |
- |
- unsigned m_numNodeListCaches; |
- |
-public: |
- typedef HashMap<WebCore::Node*, JSNode*> JSWrapperCache; |
- JSWrapperCache& wrapperCache() { return m_wrapperCache; } |
-private: |
- JSWrapperCache m_wrapperCache; |
- |
-#if ENABLE(DATABASE) |
- RefPtr<DatabaseThread> m_databaseThread; |
- bool m_hasOpenDatabases; // This never changes back to false, even as the database thread is closed. |
- typedef HashSet<Database*> DatabaseSet; |
- OwnPtr<DatabaseSet> m_openDatabaseSet; |
-#endif |
- |
-#if USE(LOW_BANDWIDTH_DISPLAY) |
- bool m_inLowBandwidthDisplay; |
-#endif |
- |
-}; |
- |
-inline bool Document::hasElementWithId(AtomicStringImpl* id) const |
-{ |
- ASSERT(id); |
- return m_elementsById.contains(id) || m_duplicateIds.contains(id); |
-} |
- |
-} // namespace WebCore |
- |
-#endif // Document_h |