WebCore:
[WebKit-https.git] / WebCore / dom / Document.h
1 /*
2  * This file is part of the DOM implementation for KDE.
3  *
4  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
5  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
6  *           (C) 2001 Dirk Mueller (mueller@kde.org)
7  * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Library General Public
11  * License as published by the Free Software Foundation; either
12  * version 2 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Library General Public License for more details.
18  *
19  * You should have received a copy of the GNU Library General Public License
20  * along with this library; see the file COPYING.LIB.  If not, write to
21  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22  * Boston, MA 02111-1307, USA.
23  *
24  */
25
26 #ifndef DOM_Document_h
27 #define DOM_Document_h
28
29 #include "Attr.h"
30 #include "Color.h"
31 #include "DeprecatedPtrList.h"
32 #include "DeprecatedStringList.h"
33 #include "DocumentMarker.h"
34 #include "HTMLCollection.h"
35 #include "StringHash.h"
36 #include "Timer.h"
37 #include <wtf/HashCountedSet.h>
38
39 namespace WebCore {
40
41     class AXObjectCache;
42     class Attr;
43     class Attribute;
44     class CDATASection;
45     class CSSStyleDeclaration;
46     class CSSStyleSelector;
47     class CSSStyleSheet;
48     class Comment;
49     class DOMImplementation;
50     class DOMWindow;
51     class Decoder;
52     class DocLoader;
53     class DocumentFragment;
54     class DocumentType;
55     class EditingText;
56     class Element;
57     class EntityReference;
58     class Event;
59     class EventListener;
60     class Frame;
61     class FrameView;
62     class HTMLDocument;
63     class HTMLElement;
64     class HTMLFormElement;
65     class HTMLGenericFormElement;
66     class HTMLImageLoader;
67     class HTMLInputElement;
68     class HTMLMapElement;
69     class IntPoint;
70     class JSEditor;
71     class MouseEventWithHitTestResults;
72     class NameNodeList;
73     class NodeFilter;
74     class NodeIterator;
75     class NodeList;
76     class PlatformMouseEvent;
77     class ProcessingInstruction;
78     class Range;
79     class RegisteredEventListener;
80     class RenderArena;
81     class StyleSheet;
82     class StyleSheetList;
83     class Text;
84     class Tokenizer;
85     class TreeWalker;
86 #ifdef XBL_SUPPORT
87     class XBLBindingManager;
88 #endif
89 #ifdef XPATH_SUPPORT
90     class XPathEvaluator;
91     class XPathExpression;
92     class XPathNSResolver;
93     class XPathResult;
94 #endif
95     
96 #if __APPLE__
97     struct DashboardRegionValue;
98 #endif
99
100 #ifdef SVG_SUPPORT
101     class SVGDocumentExtensions;
102 #endif
103
104     typedef int ExceptionCode;
105
106 class FormElementKey {
107 public:
108     FormElementKey(AtomicStringImpl* = 0, AtomicStringImpl* = 0);
109     ~FormElementKey();
110     FormElementKey(const FormElementKey&);
111     FormElementKey& operator=(const FormElementKey&);
112     AtomicStringImpl* name() const { return m_name; }
113     AtomicStringImpl* type() const { return m_type; }
114 private:
115     void ref() const;
116     void deref() const;
117     AtomicStringImpl* m_name;
118     AtomicStringImpl* m_type;
119 };
120
121 inline bool operator==(const FormElementKey& a, const FormElementKey& b)
122     { return a.name() == b.name() && a.type() == b.type(); }
123
124 struct FormElementKeyHash {
125     static unsigned hash(const FormElementKey&);
126     static bool equal(const FormElementKey& a, const FormElementKey& b) { return a == b; }
127 };
128
129 struct FormElementKeyHashTraits : WTF::GenericHashTraits<FormElementKey> {
130     static FormElementKey deletedValue();
131 };
132
133 class Document : public ContainerNode {
134 public:
135     Document(DOMImplementation*, FrameView*);
136     ~Document();
137
138     virtual void removedLastRef();
139
140     // Nodes belonging to this document hold "self-only" references -
141     // these are enough to keep the document from being destroyed, but
142     // not enough to keep it from removing its children. This allows a
143     // node that outlives its document to still have a valid document
144     // pointer without introducing reference cycles
145
146     void selfOnlyRef() { ++m_selfOnlyRefCount; }
147     void selfOnlyDeref() {
148         --m_selfOnlyRefCount;
149         if (!m_selfOnlyRefCount && !refCount())
150             delete this;
151     }
152
153     // DOM methods & attributes for Document
154
155     virtual DocumentType* doctype() const; // May return 0 for HTML documents
156     DocumentType* realDocType() const { return m_docType.get(); }
157
158     DOMImplementation* implementation() const;
159     virtual void childrenChanged();
160     Element* documentElement() const;
161     virtual PassRefPtr<Element> createElement(const String& tagName, ExceptionCode&);
162     PassRefPtr<DocumentFragment> createDocumentFragment ();
163     PassRefPtr<Text> createTextNode(const String& data);
164     PassRefPtr<Comment> createComment(const String& data);
165     PassRefPtr<CDATASection> createCDATASection(const String& data, ExceptionCode&);
166     PassRefPtr<ProcessingInstruction> createProcessingInstruction(const String& target, const String& data, ExceptionCode&);
167     PassRefPtr<Attr> createAttribute(const String& name, ExceptionCode& ec) { return createAttributeNS(String(), name, ec); }
168     PassRefPtr<Attr> createAttributeNS(const String& namespaceURI, const String& qualifiedName, ExceptionCode&);
169     PassRefPtr<EntityReference> createEntityReference(const String& name, ExceptionCode&);
170     PassRefPtr<Node> importNode(Node* importedNode, bool deep, ExceptionCode&);
171     virtual PassRefPtr<Element> createElementNS(const String& namespaceURI, const String& qualifiedName, ExceptionCode&);
172     Element* getElementById(const AtomicString&) const;
173
174     Element* elementFromPoint(int x, int y) const;
175     String readyState() const;
176     String inputEncoding() const;
177     String defaultCharset() const;
178
179     String charset() const { return inputEncoding(); }
180     String characterSet() const { return inputEncoding(); }
181
182     void setCharset(const String&);
183
184     PassRefPtr<Node> adoptNode(PassRefPtr<Node> source, ExceptionCode&);
185     
186     PassRefPtr<NameNodeList> getElementsByName(const String& elementName);
187
188     // Actually part of JSHTMLDocument, but used for giving XML documents a window title as well
189     String title() const { return m_title; }
190     void setTitle(const String&, Node* titleElement = 0);
191     void removeTitle(Node* titleElement);
192
193     PassRefPtr<HTMLCollection> images();
194     PassRefPtr<HTMLCollection> embeds();
195     PassRefPtr<HTMLCollection> applets();
196     PassRefPtr<HTMLCollection> links();
197     PassRefPtr<HTMLCollection> forms();
198     PassRefPtr<HTMLCollection> anchors();
199     PassRefPtr<HTMLCollection> all();
200     PassRefPtr<HTMLCollection> objects();
201     PassRefPtr<HTMLCollection> scripts();
202     PassRefPtr<HTMLCollection> windowNamedItems(const String& name);
203     PassRefPtr<HTMLCollection> documentNamedItems(const String& name);
204
205     HTMLCollection::CollectionInfo* collectionInfo(HTMLCollection::Type type)
206     {
207         if ((int)type < HTMLCollection::UnnamedCollectionTypes) 
208             return m_collectionInfo + type; 
209         return 0;
210     }
211
212     HTMLCollection::CollectionInfo* nameCollectionInfo(HTMLCollection::Type type, const String& name);
213
214     // DOM methods overridden from  parent classes
215
216     virtual String nodeName() const;
217     virtual NodeType nodeType() const;
218
219     // Other methods (not part of DOM)
220     virtual bool isDocumentNode() const { return true; }
221     virtual bool isHTMLDocument() const { return false; }
222 #ifdef SVG_SUPPORT
223     virtual bool isSVGDocument() const { return false; }
224 #endif
225     virtual bool isPluginDocument() const { return false; }
226     
227     CSSStyleSelector* styleSelector() const { return m_styleSelector; }
228
229     Element* getElementByAccessKey(const String& key) const;
230     
231     /**
232      * Updates the pending sheet count and then calls updateStyleSelector.
233      */
234     void stylesheetLoaded();
235
236     /**
237      * This method returns true if all top-level stylesheets have loaded (including
238      * any @imports that they may be loading).
239      */
240     bool haveStylesheetsLoaded() const { return m_pendingStylesheets <= 0 || m_ignorePendingStylesheets; }
241
242     /**
243      * Increments the number of pending sheets.  The <link> elements
244      * invoke this to add themselves to the loading list.
245      */
246     void addPendingSheet() { m_pendingStylesheets++; }
247
248     /**
249      * Called when one or more stylesheets in the document may have been added, removed or changed.
250      *
251      * Creates a new style selector and assign it to this document. This is done by iterating through all nodes in
252      * document (or those before <BODY> in a HTML document), searching for stylesheets. Stylesheets can be contained in
253      * <LINK>, <STYLE> or <BODY> elements, as well as processing instructions (XML documents only). A list is
254      * constructed from these which is used to create the a new style selector which collates all of the stylesheets
255      * found and is used to calculate the derived styles for all rendering objects.
256      */
257     void updateStyleSelector();
258
259     void recalcStyleSelector();
260
261     bool usesDescendantRules() const { return m_usesDescendantRules; }
262     void setUsesDescendantRules(bool b) { m_usesDescendantRules = b; }
263     bool usesSiblingRules() const { return m_usesSiblingRules; }
264     void setUsesSiblingRules(bool b) { m_usesSiblingRules = b; }
265
266     // Machinery for saving and restoring state when you leave and then go back to a page.
267     void registerFormElementWithState(HTMLGenericFormElement* e) { m_formElementsWithState.add(e); }
268     void deregisterFormElementWithState(HTMLGenericFormElement* e) { m_formElementsWithState.remove(e); }
269     Vector<String> formElementsState() const;
270     void setStateForNewFormElements(const Vector<String>&);
271     bool hasStateForNewFormElements() const;
272     bool takeStateForFormElement(AtomicStringImpl* name, AtomicStringImpl* type, String& state);
273
274     FrameView* view() const { return m_view; }
275     Frame* frame() const;
276
277     PassRefPtr<Range> createRange();
278
279     PassRefPtr<NodeIterator> createNodeIterator(Node* root, unsigned whatToShow,
280         PassRefPtr<NodeFilter>, bool expandEntityReferences, ExceptionCode&);
281
282     PassRefPtr<TreeWalker> createTreeWalker(Node* root, unsigned whatToShow, 
283         PassRefPtr<NodeFilter>, bool expandEntityReferences, ExceptionCode&);
284
285     // Special support for editing
286     PassRefPtr<CSSStyleDeclaration> createCSSStyleDeclaration();
287     PassRefPtr<EditingText> createEditingTextNode(const String&);
288
289     virtual void recalcStyle( StyleChange = NoChange );
290     static DeprecatedPtrList<Document>* changedDocuments;
291     virtual void updateRendering();
292     void updateLayout();
293     void updateLayoutIgnorePendingStylesheets();
294     static void updateDocumentsRendering();
295     DocLoader* docLoader() { return m_docLoader; }
296
297     virtual void attach();
298     virtual void detach();
299
300     RenderArena* renderArena() { return m_renderArena; }
301
302     AXObjectCache* axObjectCache() const;
303     
304     // to get visually ordered hebrew and arabic pages right
305     void setVisuallyOrdered();
306
307     void updateSelection();
308     
309     void open();
310     void implicitOpen();
311     void close();
312     void implicitClose();
313     void cancelParsing();
314
315     void write(const String& text);
316     void write(const DeprecatedString &text);
317     void writeln(const String& text);
318     void finishParsing();
319     void clear();
320
321     DeprecatedString URL() const { return m_url.isEmpty() ? "about:blank" : m_url; }
322     void setURL(const DeprecatedString& url);
323
324     DeprecatedString baseURL() const { return m_baseURL.isEmpty() ? URL() : m_baseURL; }
325     void setBaseURL(const DeprecatedString& baseURL) { m_baseURL = baseURL; }
326
327     String baseTarget() const { return m_baseTarget; }
328     void setBaseTarget(const String& baseTarget) { m_baseTarget = baseTarget; }
329
330     DeprecatedString completeURL(const DeprecatedString &);
331     String completeURL(const String&);
332
333     // from cachedObjectClient
334     virtual void setStyleSheet(const String& url, const String& sheetStr);
335     void setUserStyleSheet(const String& sheet);
336     const String& userStyleSheet() const { return m_usersheet; }
337     void setPrintStyleSheet(const String& sheet) { m_printSheet = sheet; }
338     const String& printStyleSheet() const { return m_printSheet; }
339
340     CSSStyleSheet* elementSheet();
341     virtual Tokenizer* createTokenizer();
342     Tokenizer* tokenizer() { return m_tokenizer; }
343     
344     bool printing() const { return m_printing; }
345     void setPrinting(bool p) { m_printing = p; }
346
347     enum ParseMode { Compat, AlmostStrict, Strict };
348     
349     virtual void determineParseMode(const String&);
350     void setParseMode(ParseMode m) { pMode = m; }
351     ParseMode parseMode() const { return pMode; }
352
353     bool inCompatMode() const { return pMode == Compat; }
354     bool inAlmostStrictMode() const { return pMode == AlmostStrict; }
355     bool inStrictMode() const { return pMode == Strict; }
356     
357     enum HTMLMode { Html3, Html4, XHtml };
358
359     void setHTMLMode(HTMLMode m) { hMode = m; }
360     HTMLMode htmlMode() const { return hMode; }
361
362     void setParsing(bool);
363     bool parsing() const { return m_bParsing; }
364     int minimumLayoutDelay();
365     bool shouldScheduleLayout();
366     int elapsedTime() const;
367     
368     void setTextColor(const Color& color) { m_textColor = color; }
369     Color textColor() const { return m_textColor; }
370
371     const Color& linkColor() const { return m_linkColor; }
372     const Color& visitedLinkColor() const { return m_visitedLinkColor; }
373     const Color& activeLinkColor() const { return m_activeLinkColor; }
374     void setLinkColor(const Color& c) { m_linkColor = c; }
375     void setVisitedLinkColor(const Color& c) { m_visitedLinkColor = c; }
376     void setActiveLinkColor(const Color& c) { m_activeLinkColor = c; }
377     void resetLinkColor();
378     void resetVisitedLinkColor();
379     void resetActiveLinkColor();
380     
381     MouseEventWithHitTestResults prepareMouseEvent(bool readonly, bool active, bool mouseMove, const IntPoint& point, const PlatformMouseEvent&);
382
383     virtual bool childTypeAllowed(NodeType);
384     virtual PassRefPtr<Node> cloneNode(bool deep);
385
386     StyleSheetList* styleSheets();
387
388     /* Newly proposed CSS3 mechanism for selecting alternate
389        stylesheets using the DOM. May be subject to change as
390        spec matures. - dwh
391     */
392     String preferredStylesheetSet() const;
393     String selectedStylesheetSet() const;
394     void setSelectedStylesheetSet(const String&);
395
396     DeprecatedStringList availableStyleSheets() const;
397
398     Node* focusNode() const { return m_focusNode.get(); }
399     bool setFocusNode(PassRefPtr<Node>);
400     void clearSelectionIfNeeded(Node*);
401
402     Node* hoverNode() const { return m_hoverNode.get(); }
403     void setHoverNode(PassRefPtr<Node>);
404     void hoveredNodeDetached(Node*);
405     void activeChainNodeDetached(Node*);
406     
407     Node* activeNode() const { return m_activeNode.get(); }
408     void setActiveNode(PassRefPtr<Node>);
409
410     // Updates for :target (CSS3 selector).
411     void setCSSTarget(Node*);
412     Node* getCSSTarget() const;
413     
414     void setDocumentChanged(bool);
415
416     void attachNodeIterator(NodeIterator*);
417     void detachNodeIterator(NodeIterator*);
418     void notifyBeforeNodeRemoval(Node*);
419     DOMWindow* defaultView() const;
420     PassRefPtr<Event> createEvent(const String& eventType, ExceptionCode&);
421
422     // keep track of what types of event listeners are registered, so we don't
423     // dispatch events unnecessarily
424     enum ListenerType {
425         DOMSUBTREEMODIFIED_LISTENER          = 0x01,
426         DOMNODEINSERTED_LISTENER             = 0x02,
427         DOMNODEREMOVED_LISTENER              = 0x04,
428         DOMNODEREMOVEDFROMDOCUMENT_LISTENER  = 0x08,
429         DOMNODEINSERTEDINTODOCUMENT_LISTENER = 0x10,
430         DOMATTRMODIFIED_LISTENER             = 0x20,
431         DOMCHARACTERDATAMODIFIED_LISTENER    = 0x40,
432         OVERFLOWCHANGED_LISTENER             = 0x80
433     };
434
435     bool hasListenerType(ListenerType listenerType) const { return (m_listenerTypes & listenerType); }
436     void addListenerType(ListenerType listenerType) { m_listenerTypes = m_listenerTypes | listenerType; }
437
438     CSSStyleDeclaration* getOverrideStyle(Element*, const String& pseudoElt);
439
440     virtual void defaultEventHandler(Event*);
441     void handleWindowEvent(Event*, bool useCapture);
442     void setHTMLWindowEventListener(const AtomicString &eventType, PassRefPtr<EventListener>);
443     EventListener* getHTMLWindowEventListener(const AtomicString &eventType);
444     void removeHTMLWindowEventListener(const AtomicString &eventType);
445
446     void setHTMLWindowEventListener(const AtomicString& eventType, Attribute*);
447
448     void addWindowEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture);
449     void removeWindowEventListener(const AtomicString& eventType, EventListener*, bool useCapture);
450     bool hasWindowEventListener(const AtomicString& eventType);
451
452     PassRefPtr<EventListener> createHTMLEventListener(const String& functionName, const String& code, Node*);
453     
454     /**
455      * Searches through the document, starting from fromNode, for the next selectable element that comes after fromNode.
456      * The order followed is as specified in section 17.11.1 of the HTML4 spec, which is elements with tab indexes
457      * first (from lowest to highest), and then elements without tab indexes (in document order).
458      *
459      * @param fromNode The node from which to start searching. The node after this will be focused. May be null.
460      *
461      * @return The focus node that comes after fromNode
462      *
463      * See http://www.w3.org/TR/html4/interact/forms.html#h-17.11.1
464      */
465     Node* nextFocusNode(Node* fromNode);
466
467     /**
468      * Searches through the document, starting from fromNode, for the previous selectable element (that comes _before_)
469      * fromNode. The order followed is as specified in section 17.11.1 of the HTML4 spec, which is elements with tab
470      * indexes first (from lowest to highest), and then elements without tab indexes (in document order).
471      *
472      * @param fromNode The node from which to start searching. The node before this will be focused. May be null.
473      *
474      * @return The focus node that comes before fromNode
475      *
476      * See http://www.w3.org/TR/html4/interact/forms.html#h-17.11.1
477      */
478     Node* previousFocusNode(Node* fromNode);
479
480     int nodeAbsIndex(Node*);
481     Node* nodeWithAbsIndex(int absIndex);
482
483     /**
484      * Handles a HTTP header equivalent set by a meta tag using <meta http-equiv="..." content="...">. This is called
485      * when a meta tag is encountered during document parsing, and also when a script dynamically changes or adds a meta
486      * tag. This enables scripts to use meta tags to perform refreshes and set expiry dates in addition to them being
487      * specified in a HTML file.
488      *
489      * @param equiv The http header name (value of the meta tag's "equiv" attribute)
490      * @param content The header value (value of the meta tag's "content" attribute)
491      */
492     void processHttpEquiv(const String& equiv, const String& content);
493     
494     void dispatchImageLoadEventSoon(HTMLImageLoader*);
495     void dispatchImageLoadEventsNow();
496     void removeImage(HTMLImageLoader*);
497     
498     // Returns the owning element in the parent document.
499     // Returns 0 if this is the top level document.
500     Element* ownerElement() const;
501     
502     String referrer() const;
503     String domain() const;
504     void setDomain(const String& newDomain, bool force = false); // not part of the DOM
505
506     String policyBaseURL() const { return m_policyBaseURL; }
507     void setPolicyBaseURL(const String& s) { m_policyBaseURL = s; }
508     
509     // The following implements the rule from HTML 4 for what valid names are.
510     // To get this right for all the XML cases, we probably have to improve this or move it
511     // and make it sensitive to the type of document.
512     static bool isValidName(const String&);
513
514     // The following breaks a qualified name into a prefix and a local name.
515     // It also does a validity check, and returns false if the qualified name is invalid
516     // (empty string or invalid characters).
517     static bool parseQualifiedName(const String& qualifiedName, String& prefix, String& localName);
518     
519     void addElementById(const AtomicString& elementId, Element *element);
520     void removeElementById(const AtomicString& elementId, Element *element);
521
522     void addImageMap(HTMLMapElement*);
523     void removeImageMap(HTMLMapElement*);
524     HTMLMapElement* getImageMap(const String& URL) const;
525
526     HTMLElement* body();
527
528     String toString() const;
529     
530     bool execCommand(const String& command, bool userInterface, const String& value);
531     bool queryCommandEnabled(const String& command);
532     bool queryCommandIndeterm(const String& command);
533     bool queryCommandState(const String& command);
534     bool queryCommandSupported(const String& command);
535     String queryCommandValue(const String& command);
536     
537     void addMarker(Range*, DocumentMarker::MarkerType);
538     void addMarker(Node*, DocumentMarker);
539     void copyMarkers(Node *srcNode, unsigned startOffset, int length, Node *dstNode, int delta, DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
540     void removeMarkers(Range*, DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
541     void removeMarkers(Node*, unsigned startOffset, int length, DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
542     void removeMarkers(DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
543     void removeMarkers(Node*);
544     void repaintMarkers(DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
545     void setRenderedRectForMarker(Node*, DocumentMarker, const IntRect&);
546     void invalidateRenderedRectsForMarkersInRect(const IntRect&);
547     void shiftMarkers(Node*, unsigned startOffset, int delta, DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
548
549     Vector<DocumentMarker> markersForNode(Node*);
550     Vector<IntRect> renderedRectsForMarkers(DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
551     
552     // designMode support
553     enum InheritedBool { off = false, on = true, inherit };    
554     void setDesignMode(InheritedBool value);
555     InheritedBool getDesignMode() const;
556     bool inDesignMode() const;
557
558     Document* parentDocument() const;
559     Document* topDocument() const;
560
561     int docID() const { return m_docID; }
562
563 #if XSLT_SUPPORT
564     void applyXSLTransform(ProcessingInstruction* pi);
565     void setTransformSource(void* doc) { m_transformSource = doc; }
566     const void* transformSource() { return m_transformSource; }
567     PassRefPtr<Document> transformSourceDocument() { return m_transformSourceDocument; }
568     void setTransformSourceDocument(Document *doc) { m_transformSourceDocument = doc; }
569 #endif
570
571 #ifdef XBL_SUPPORT
572     // XBL methods
573     XBLBindingManager* bindingManager() const { return m_bindingManager; }
574 #endif
575
576     void incDOMTreeVersion() { ++m_domtree_version; }
577     unsigned domTreeVersion() const { return m_domtree_version; }
578
579     void setDocType(PassRefPtr<DocumentType>);
580
581     void finishedParsing();
582
583 #ifdef XPATH_SUPPORT
584     // XPathEvaluator methods
585     PassRefPtr<XPathExpression> createExpression(const String& expression,
586                                                  XPathNSResolver* resolver,
587                                                  ExceptionCode& ec);
588     PassRefPtr<XPathNSResolver> createNSResolver(Node *nodeResolver);
589     PassRefPtr<XPathResult> evaluate(const String& expression,
590                                      Node* contextNode,
591                                      XPathNSResolver* resolver,
592                                      unsigned short type,
593                                      XPathResult* result,
594                                      ExceptionCode& ec);
595 #endif // XPATH_SUPPORT
596     
597     enum PendingSheetLayout { NoLayoutWithPendingSheets, DidLayoutWithPendingSheets, IgnoreLayoutWithPendingSheets };
598
599     bool didLayoutWithPendingStylesheets() const { return m_pendingSheetLayout == DidLayoutWithPendingSheets; }
600
601     String iconURL();
602     void setIconURL(const String& iconURL, const String& type);
603 protected:
604     CSSStyleSelector* m_styleSelector;
605     FrameView* m_view;
606
607     DocLoader* m_docLoader;
608     Tokenizer* m_tokenizer;
609     DeprecatedString m_url;
610     DeprecatedString m_baseURL;
611     String m_baseTarget;
612     
613     RefPtr<DocumentType> m_docType;
614     RefPtr<DOMImplementation> m_implementation;
615
616     RefPtr<StyleSheet> m_sheet;
617     String m_usersheet;
618     String m_printSheet;
619     DeprecatedStringList m_availableSheets;
620
621     // Track the number of currently loading top-level stylesheets.  Sheets
622     // loaded using the @import directive are not included in this count.
623     // We use this count of pending sheets to detect when we can begin attaching
624     // elements.
625     int m_pendingStylesheets;
626
627     // But sometimes you need to ignore pending stylesheet count to
628     // force an immediate layout when requested by JS.
629     bool m_ignorePendingStylesheets;
630
631     // If we do ignore the pending stylesheet count, then we need to add a boolean
632     // to track that this happened so that we can do a full repaint when the stylesheets
633     // do eventually load.
634     PendingSheetLayout m_pendingSheetLayout;
635
636     RefPtr<CSSStyleSheet> m_elemSheet;
637
638     bool m_printing;
639
640     ParseMode pMode;
641     HTMLMode hMode;
642
643     Color m_textColor;
644
645     RefPtr<Node> m_focusNode;
646     RefPtr<Node> m_hoverNode;
647     RefPtr<Node> m_activeNode;
648     mutable RefPtr<Element> m_documentElement;
649
650     unsigned m_domtree_version;
651     
652     DeprecatedPtrList<NodeIterator> m_nodeIterators;
653
654     unsigned short m_listenerTypes;
655     RefPtr<StyleSheetList> m_styleSheets;
656     
657     typedef DeprecatedValueList<RefPtr<RegisteredEventListener> > RegisteredEventListenerList;
658     RegisteredEventListenerList m_windowEventListeners;
659
660     typedef HashMap<FormElementKey, Vector<String>, FormElementKeyHash, FormElementKeyHashTraits> FormElementStateMap;
661     HashSet<HTMLGenericFormElement*> m_formElementsWithState;
662     FormElementStateMap m_stateForNewFormElements;
663
664     Color m_linkColor;
665     Color m_visitedLinkColor;
666     Color m_activeLinkColor;
667
668     String m_preferredStylesheetSet;
669     String m_selectedStylesheetSet;
670
671     bool m_loadingSheet;
672     bool visuallyOrdered;
673     bool m_bParsing;
674     bool m_bAllDataReceived;
675     bool m_docChanged;
676     bool m_styleSelectorDirty;
677     bool m_inStyleRecalc;
678     bool m_closeAfterStyleRecalc;
679     bool m_usesDescendantRules;
680     bool m_usesSiblingRules;
681     
682     String m_title;
683     bool m_titleSetExplicitly;
684     RefPtr<Node> m_titleElement;
685     
686     RenderArena* m_renderArena;
687
688     typedef std::pair<Vector<DocumentMarker>, Vector<IntRect> > MarkerMapVectorPair;
689     typedef HashMap<RefPtr<Node>, MarkerMapVectorPair*> MarkerMap;
690     MarkerMap m_markers;
691
692     mutable AXObjectCache* m_axObjectCache;
693     
694     DeprecatedPtrList<HTMLImageLoader> m_imageLoadEventDispatchSoonList;
695     DeprecatedPtrList<HTMLImageLoader> m_imageLoadEventDispatchingList;
696     Timer<Document> m_imageLoadEventTimer;
697
698     Node* m_cssTarget;
699     
700     bool m_processingLoadEvent;
701     double m_startTime;
702     bool m_overMinimumLayoutThreshold;
703     
704 #if XSLT_SUPPORT
705     void* m_transformSource;
706     RefPtr<Document> m_transformSourceDocument;
707 #endif
708
709 #ifdef XBL_SUPPORT
710     XBLBindingManager* m_bindingManager; // The access point through which documents and elements communicate with XBL.
711 #endif
712     
713     typedef HashMap<AtomicStringImpl*, HTMLMapElement*> ImageMapsByName;
714     ImageMapsByName m_imageMapsByName;
715
716     String m_policyBaseURL;
717
718     HashSet<Node*> m_disconnectedNodesWithEventListeners;
719
720     int m_docID; // A unique document identifier used for things like document-specific mapped attributes.
721
722 public:
723     bool inPageCache();
724     void setInPageCache(bool flag);
725
726     void passwordFieldAdded();
727     void passwordFieldRemoved();
728     bool hasPasswordField() const;
729
730     void secureFormAdded();
731     void secureFormRemoved();
732     bool hasSecureForm() const;
733
734     void setShouldCreateRenderers(bool);
735     bool shouldCreateRenderers();
736     
737     void setDecoder(Decoder*);
738     Decoder* decoder() const { return m_decoder.get(); }
739
740     UChar backslashAsCurrencySymbol() const;
741
742 #if __APPLE__
743     void setDashboardRegionsDirty(bool f) { m_dashboardRegionsDirty = f; }
744     bool dashboardRegionsDirty() const { return m_dashboardRegionsDirty; }
745     bool hasDashboardRegions () const { return m_hasDashboardRegions; }
746     void setHasDashboardRegions (bool f) { m_hasDashboardRegions = f; }
747     const Vector<DashboardRegionValue>& dashboardRegions() const;
748     void setDashboardRegions(const Vector<DashboardRegionValue>&);
749 #endif
750
751     void removeAllEventListenersFromAllNodes();
752
753     void registerDisconnectedNodeWithEventListeners(Node*);
754     void unregisterDisconnectedNodeWithEventListeners(Node*);
755     
756     void radioButtonChecked(HTMLInputElement* caller, HTMLFormElement* form);
757     HTMLInputElement* checkedRadioButtonForGroup(AtomicStringImpl* name, HTMLFormElement* form);
758     void removeRadioButtonGroup(AtomicStringImpl* name, HTMLFormElement* form);
759     
760 #ifdef SVG_SUPPORT
761     const SVGDocumentExtensions* svgExtensions();
762     SVGDocumentExtensions* accessSVGExtensions();
763 #endif
764
765 private:
766     void updateTitle();
767     void removeAllDisconnectedNodeEventListeners();
768     void imageLoadEventTimerFired(Timer<Document>*);
769
770     JSEditor* jsEditor();
771
772     JSEditor* m_jsEditor;
773     bool relinquishesEditingFocus(Node*);
774     bool acceptsEditingFocus(Node*);
775     void didBeginEditing();
776     void didEndEditing();
777
778     mutable String m_domain;
779     RenderObject* m_savedRenderer;
780     int m_passwordFields;
781     int m_secureForms;
782     
783     RefPtr<Decoder> m_decoder;
784
785     mutable HashMap<AtomicStringImpl*, Element*> m_elementsById;
786     mutable HashCountedSet<AtomicStringImpl*> m_duplicateIds;
787     
788     mutable HashMap<StringImpl*, Element*, CaseInsensitiveHash> m_elementsByAccessKey;
789     
790     InheritedBool m_designMode;
791     
792     int m_selfOnlyRefCount;
793     typedef HashMap<AtomicStringImpl*, HTMLInputElement*> NameToInputMap;
794     typedef HashMap<HTMLFormElement*, NameToInputMap*> FormToGroupMap;
795     FormToGroupMap m_selectedRadioButtons;
796     
797     HTMLCollection::CollectionInfo m_collectionInfo[HTMLCollection::UnnamedCollectionTypes];
798     HashMap<AtomicStringImpl*, HTMLCollection::CollectionInfo> m_nameCollectionInfo[HTMLCollection::CollectionTypes - HTMLCollection::UnnamedCollectionTypes];
799
800 #ifdef XPATH_SUPPORT
801     RefPtr<XPathEvaluator> m_xpathEvaluator;
802 #endif
803     
804 #ifdef SVG_SUPPORT
805     SVGDocumentExtensions* m_svgExtensions;
806 #endif
807     
808 #if __APPLE__
809     Vector<DashboardRegionValue> m_dashboardRegions;
810     bool m_hasDashboardRegions;
811     bool m_dashboardRegionsDirty;
812 #endif
813
814     mutable bool m_accessKeyMapValid;
815     bool m_createRenderers;
816     bool m_inPageCache;
817     String m_iconURL;
818 };
819
820 } //namespace
821
822 #endif