OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | |
4 * (C) 2001 Dirk Mueller (mueller@kde.org) | |
5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) | |
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. | |
7 * | |
8 * This library is free software; you can redistribute it and/or | |
9 * modify it under the terms of the GNU Library General Public | |
10 * License as published by the Free Software Foundation; either | |
11 * version 2 of the License, or (at your option) any later version. | |
12 * | |
13 * This library is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Library General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU Library General Public License | |
19 * along with this library; see the file COPYING.LIB. If not, write to | |
20 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | |
21 * Boston, MA 02110-1301, USA. | |
22 * | |
23 */ | |
24 | |
25 #ifndef Document_h | |
26 #define Document_h | |
27 | |
28 #include "Attr.h" | |
29 #include "Color.h" | |
30 #include "DeprecatedPtrList.h" | |
31 #include "DocumentMarker.h" | |
32 #include "HTMLCollection.h" | |
33 #include "HTMLFormElement.h" | |
34 #include "KURL.h" | |
35 #include "StringHash.h" | |
36 #include "Timer.h" | |
37 #include "unicode/uscript.h" | |
38 #include <wtf/HashCountedSet.h> | |
39 #include <wtf/ListHashSet.h> | |
40 | |
41 // FIXME: We should move Mac off of the old Frame-based user stylesheet loading | |
42 // code and onto the new code in Page. We can't do that until the code in Page | |
43 // supports non-file: URLs, however. | |
44 #if PLATFORM(MAC) || PLATFORM(QT) | |
45 #define FRAME_LOADS_USER_STYLESHEET 1 | |
46 #else | |
47 #define FRAME_LOADS_USER_STYLESHEET 0 | |
48 #endif | |
49 | |
50 namespace WebCore { | |
51 | |
52 class AXObjectCache; | |
53 class Attr; | |
54 class Attribute; | |
55 class CDATASection; | |
56 class CachedCSSStyleSheet; | |
57 class CanvasRenderingContext2D; | |
58 class CharacterData; | |
59 class CSSStyleDeclaration; | |
60 class CSSStyleSelector; | |
61 class CSSStyleSheet; | |
62 class Comment; | |
63 class Database; | |
64 class DOMImplementation; | |
65 class DOMSelection; | |
66 class DOMWindow; | |
67 class DatabaseThread; | |
68 class DocLoader; | |
69 class DocumentFragment; | |
70 class DocumentType; | |
71 class EditingText; | |
72 class Element; | |
73 class EntityReference; | |
74 class Event; | |
75 class EventListener; | |
76 class Frame; | |
77 class FrameView; | |
78 class HTMLCanvasElement; | |
79 class HTMLDocument; | |
80 class HTMLElement; | |
81 class HTMLFormControlElementWithState; | |
82 class HTMLFormElement; | |
83 class HTMLHeadElement; | |
84 class HTMLImageLoader; | |
85 class HTMLInputElement; | |
86 class HTMLMapElement; | |
87 class IntPoint; | |
88 class JSNode; | |
89 class MouseEventWithHitTestResults; | |
90 class NodeFilter; | |
91 class NodeIterator; | |
92 class Page; | |
93 class PlatformMouseEvent; | |
94 class ProcessingInstruction; | |
95 class Range; | |
96 class RegisteredEventListener; | |
97 class RenderArena; | |
98 class SecurityOrigin; | |
99 class Settings; | |
100 class StyleSheet; | |
101 class StyleSheetList; | |
102 class Text; | |
103 class TextResourceDecoder; | |
104 class Tokenizer; | |
105 class TreeWalker; | |
106 | |
107 #if ENABLE(SVG) | |
108 class SVGDocumentExtensions; | |
109 #endif | |
110 | |
111 #if ENABLE(XBL) | |
112 class XBLBindingManager; | |
113 #endif | |
114 | |
115 #if ENABLE(XPATH) | |
116 class XPathEvaluator; | |
117 class XPathExpression; | |
118 class XPathNSResolver; | |
119 class XPathResult; | |
120 #endif | |
121 | |
122 #if ENABLE(DASHBOARD_SUPPORT) | |
123 struct DashboardRegionValue; | |
124 #endif | |
125 struct HitTestRequest; | |
126 | |
127 typedef int ExceptionCode; | |
128 | |
129 class FormElementKey { | |
130 public: | |
131 FormElementKey(AtomicStringImpl* = 0, AtomicStringImpl* = 0); | |
132 ~FormElementKey(); | |
133 FormElementKey(const FormElementKey&); | |
134 FormElementKey& operator=(const FormElementKey&); | |
135 | |
136 AtomicStringImpl* name() const { return m_name; } | |
137 AtomicStringImpl* type() const { return m_type; } | |
138 | |
139 // Hash table deleted values, which are only constructed and never copied or
destroyed. | |
140 FormElementKey(WTF::HashTableDeletedValueType) : m_name(hashTableDeletedValu
e()) { } | |
141 bool isHashTableDeletedValue() const { return m_name == hashTableDeletedValu
e(); } | |
142 | |
143 private: | |
144 void ref() const; | |
145 void deref() const; | |
146 | |
147 static AtomicStringImpl* hashTableDeletedValue() { return reinterpret_cast<A
tomicStringImpl*>(-1); } | |
148 | |
149 AtomicStringImpl* m_name; | |
150 AtomicStringImpl* m_type; | |
151 }; | |
152 | |
153 inline bool operator==(const FormElementKey& a, const FormElementKey& b) | |
154 { | |
155 return a.name() == b.name() && a.type() == b.type(); | |
156 } | |
157 | |
158 struct FormElementKeyHash { | |
159 static unsigned hash(const FormElementKey&); | |
160 static bool equal(const FormElementKey& a, const FormElementKey& b) { return
a == b; } | |
161 static const bool safeToCompareToEmptyOrDeleted = true; | |
162 }; | |
163 | |
164 struct FormElementKeyHashTraits : WTF::GenericHashTraits<FormElementKey> { | |
165 static void constructDeletedValue(FormElementKey& slot) { new (&slot) FormEl
ementKey(WTF::HashTableDeletedValue); } | |
166 static bool isDeletedValue(const FormElementKey& value) { return value.isHas
hTableDeletedValue(); } | |
167 }; | |
168 | |
169 class Document : public ContainerNode { | |
170 public: | |
171 static PassRefPtr<Document> create(Frame* frame) | |
172 { | |
173 return new Document(frame, false); | |
174 } | |
175 static PassRefPtr<Document> createXHTML(Frame* frame) | |
176 { | |
177 return new Document(frame, true); | |
178 } | |
179 virtual ~Document(); | |
180 | |
181 virtual void removedLastRef(); | |
182 | |
183 // Nodes belonging to this document hold "self-only" references - | |
184 // these are enough to keep the document from being destroyed, but | |
185 // not enough to keep it from removing its children. This allows a | |
186 // node that outlives its document to still have a valid document | |
187 // pointer without introducing reference cycles | |
188 | |
189 void selfOnlyRef() | |
190 { | |
191 ASSERT(!m_deletionHasBegun); | |
192 ++m_selfOnlyRefCount; | |
193 } | |
194 void selfOnlyDeref() | |
195 { | |
196 ASSERT(!m_deletionHasBegun); | |
197 --m_selfOnlyRefCount; | |
198 if (!m_selfOnlyRefCount && !refCount()) { | |
199 #ifndef NDEBUG | |
200 m_deletionHasBegun = true; | |
201 #endif | |
202 delete this; | |
203 } | |
204 } | |
205 | |
206 // DOM methods & attributes for Document | |
207 | |
208 DocumentType* doctype() const { return m_docType.get(); } | |
209 | |
210 DOMImplementation* implementation() const; | |
211 virtual void childrenChanged(bool changedByParser = false, Node* beforeChang
e = 0, Node* afterChange = 0, int childCountDelta = 0); | |
212 Element* documentElement() const; | |
213 virtual PassRefPtr<Element> createElement(const AtomicString& tagName, Excep
tionCode&); | |
214 PassRefPtr<DocumentFragment> createDocumentFragment (); | |
215 PassRefPtr<Text> createTextNode(const String& data); | |
216 PassRefPtr<Comment> createComment(const String& data); | |
217 PassRefPtr<CDATASection> createCDATASection(const String& data, ExceptionCod
e&); | |
218 PassRefPtr<ProcessingInstruction> createProcessingInstruction(const String&
target, const String& data, ExceptionCode&); | |
219 PassRefPtr<Attr> createAttribute(const String& name, ExceptionCode& ec) { re
turn createAttributeNS(String(), name, ec, true); } | |
220 PassRefPtr<Attr> createAttributeNS(const String& namespaceURI, const String&
qualifiedName, ExceptionCode&, bool shouldIgnoreNamespaceChecks = false); | |
221 PassRefPtr<EntityReference> createEntityReference(const String& name, Except
ionCode&); | |
222 PassRefPtr<Node> importNode(Node* importedNode, bool deep, ExceptionCode&); | |
223 virtual PassRefPtr<Element> createElementNS(const String& namespaceURI, cons
t String& qualifiedName, ExceptionCode&); | |
224 PassRefPtr<Element> createElement(const QualifiedName&, bool createdByParser
, ExceptionCode& ec); | |
225 Element* getElementById(const AtomicString&) const; | |
226 bool hasElementWithId(AtomicStringImpl* id) const; | |
227 bool containsMultipleElementsWithId(const AtomicString& elementId) { return
m_duplicateIds.contains(elementId.impl()); } | |
228 | |
229 Element* elementFromPoint(int x, int y) const; | |
230 String readyState() const; | |
231 String inputEncoding() const; | |
232 String defaultCharset() const; | |
233 | |
234 String charset() const { return inputEncoding(); } | |
235 String characterSet() const { return inputEncoding(); } | |
236 | |
237 void setCharset(const String&); | |
238 UScriptCode dominantScript() const; | |
239 | |
240 String contentLanguage() const { return m_contentLanguage; } | |
241 void setContentLanguage(const String& lang) { m_contentLanguage = lang; } | |
242 | |
243 String xmlEncoding() const { return m_xmlEncoding; } | |
244 String xmlVersion() const { return m_xmlVersion; } | |
245 bool xmlStandalone() const { return m_xmlStandalone; } | |
246 | |
247 void setXMLEncoding(const String& encoding) { m_xmlEncoding = encoding; } //
read-only property, only to be set from XMLTokenizer | |
248 void setXMLVersion(const String&, ExceptionCode&); | |
249 void setXMLStandalone(bool, ExceptionCode&); | |
250 | |
251 String documentURI() const { return m_documentURI; } | |
252 void setDocumentURI(const String&); | |
253 | |
254 virtual KURL baseURI() const; | |
255 | |
256 PassRefPtr<Node> adoptNode(PassRefPtr<Node> source, ExceptionCode&); | |
257 | |
258 PassRefPtr<HTMLCollection> images(); | |
259 PassRefPtr<HTMLCollection> embeds(); | |
260 PassRefPtr<HTMLCollection> plugins(); // an alias for embeds() required for
the JS DOM bindings. | |
261 PassRefPtr<HTMLCollection> applets(); | |
262 PassRefPtr<HTMLCollection> links(); | |
263 PassRefPtr<HTMLCollection> forms(); | |
264 PassRefPtr<HTMLCollection> anchors(); | |
265 PassRefPtr<HTMLCollection> all(); | |
266 PassRefPtr<HTMLCollection> objects(); | |
267 PassRefPtr<HTMLCollection> scripts(); | |
268 PassRefPtr<HTMLCollection> windowNamedItems(const String& name); | |
269 PassRefPtr<HTMLCollection> documentNamedItems(const String& name); | |
270 | |
271 HTMLCollection::CollectionInfo* collectionInfo(HTMLCollection::Type type) | |
272 { | |
273 ASSERT(type >= HTMLCollection::FirstUnnamedDocumentCachedType); | |
274 unsigned index = type - HTMLCollection::FirstUnnamedDocumentCachedType; | |
275 ASSERT(index < HTMLCollection::NumUnnamedDocumentCachedTypes); | |
276 return &m_collectionInfo[index]; | |
277 } | |
278 | |
279 HTMLCollection::CollectionInfo* nameCollectionInfo(HTMLCollection::Type, con
st AtomicString& name); | |
280 | |
281 // DOM methods overridden from parent classes | |
282 | |
283 virtual String nodeName() const; | |
284 virtual NodeType nodeType() const; | |
285 | |
286 // Other methods (not part of DOM) | |
287 virtual bool isDocumentNode() const { return true; } | |
288 virtual bool isHTMLDocument() const { return false; } | |
289 virtual bool isImageDocument() const { return false; } | |
290 #if ENABLE(SVG) | |
291 virtual bool isSVGDocument() const { return false; } | |
292 #endif | |
293 virtual bool isPluginDocument() const { return false; } | |
294 virtual bool isMediaDocument() const { return false; } | |
295 | |
296 CSSStyleSelector* styleSelector() const { return m_styleSelector; } | |
297 | |
298 Element* getElementByAccessKey(const String& key) const; | |
299 | |
300 /** | |
301 * Updates the pending sheet count and then calls updateStyleSelector. | |
302 */ | |
303 void removePendingSheet(); | |
304 | |
305 /** | |
306 * This method returns true if all top-level stylesheets have loaded (includ
ing | |
307 * any @imports that they may be loading). | |
308 */ | |
309 bool haveStylesheetsLoaded() const | |
310 { | |
311 return m_pendingStylesheets <= 0 || m_ignorePendingStylesheets | |
312 #if USE(LOW_BANDWIDTH_DISPLAY) | |
313 || m_inLowBandwidthDisplay | |
314 #endif | |
315 ; | |
316 } | |
317 | |
318 /** | |
319 * Increments the number of pending sheets. The <link> elements | |
320 * invoke this to add themselves to the loading list. | |
321 */ | |
322 void addPendingSheet() { m_pendingStylesheets++; } | |
323 | |
324 void addStyleSheetCandidateNode(Node*, bool createdByParser); | |
325 void removeStyleSheetCandidateNode(Node*); | |
326 | |
327 bool gotoAnchorNeededAfterStylesheetsLoad() { return m_gotoAnchorNeededAfter
StylesheetsLoad; } | |
328 void setGotoAnchorNeededAfterStylesheetsLoad(bool b) { m_gotoAnchorNeededAft
erStylesheetsLoad = b; } | |
329 | |
330 /** | |
331 * Called when one or more stylesheets in the document may have been added,
removed or changed. | |
332 * | |
333 * Creates a new style selector and assign it to this document. This is done
by iterating through all nodes in | |
334 * document (or those before <BODY> in a HTML document), searching for style
sheets. Stylesheets can be contained in | |
335 * <LINK>, <STYLE> or <BODY> elements, as well as processing instructions (X
ML documents only). A list is | |
336 * constructed from these which is used to create the a new style selector w
hich collates all of the stylesheets | |
337 * found and is used to calculate the derived styles for all rendering objec
ts. | |
338 */ | |
339 void updateStyleSelector(); | |
340 | |
341 void recalcStyleSelector(); | |
342 | |
343 bool usesDescendantRules() const { return m_usesDescendantRules; } | |
344 void setUsesDescendantRules(bool b) { m_usesDescendantRules = b; } | |
345 bool usesSiblingRules() const { return m_usesSiblingRules; } | |
346 void setUsesSiblingRules(bool b) { m_usesSiblingRules = b; } | |
347 bool usesFirstLineRules() const { return m_usesFirstLineRules; } | |
348 void setUsesFirstLineRules(bool b) { m_usesFirstLineRules = b; } | |
349 bool usesFirstLetterRules() const { return m_usesFirstLetterRules; } | |
350 void setUsesFirstLetterRules(bool b) { m_usesFirstLetterRules = b; } | |
351 | |
352 // Machinery for saving and restoring state when you leave and then go back
to a page. | |
353 void registerFormElementWithState(HTMLFormControlElementWithState* e) { m_fo
rmElementsWithState.add(e); } | |
354 void unregisterFormElementWithState(HTMLFormControlElementWithState* e) { m_
formElementsWithState.remove(e); } | |
355 Vector<String> formElementsState() const; | |
356 void setStateForNewFormElements(const Vector<String>&); | |
357 bool hasStateForNewFormElements() const; | |
358 bool takeStateForFormElement(AtomicStringImpl* name, AtomicStringImpl* type,
String& state); | |
359 | |
360 FrameView* view() const; // can be NULL | |
361 Frame* frame() const { return m_frame; } // can be NULL | |
362 Page* page() const; // can be NULL | |
363 Settings* settings() const; // can be NULL | |
364 | |
365 PassRefPtr<Range> createRange(); | |
366 | |
367 PassRefPtr<NodeIterator> createNodeIterator(Node* root, unsigned whatToShow, | |
368 PassRefPtr<NodeFilter>, bool expandEntityReferences, ExceptionCode&); | |
369 | |
370 PassRefPtr<TreeWalker> createTreeWalker(Node* root, unsigned whatToShow, | |
371 PassRefPtr<NodeFilter>, bool expandEntityReferences, ExceptionCode&); | |
372 | |
373 // Special support for editing | |
374 PassRefPtr<CSSStyleDeclaration> createCSSStyleDeclaration(); | |
375 PassRefPtr<EditingText> createEditingTextNode(const String&); | |
376 | |
377 virtual void recalcStyle( StyleChange = NoChange ); | |
378 virtual void updateRendering(); | |
379 void updateLayout(); | |
380 void updateLayoutIgnorePendingStylesheets(); | |
381 static void updateDocumentsRendering(); | |
382 DocLoader* docLoader() { return m_docLoader; } | |
383 | |
384 virtual void attach(); | |
385 virtual void detach(); | |
386 | |
387 void clearFramePointer(); | |
388 | |
389 RenderArena* renderArena() { return m_renderArena; } | |
390 | |
391 void clearAXObjectCache(); | |
392 AXObjectCache* axObjectCache() const; | |
393 | |
394 // to get visually ordered hebrew and arabic pages right | |
395 void setVisuallyOrdered(); | |
396 | |
397 void open(Document* ownerDocument = 0); | |
398 void implicitOpen(); | |
399 void close(); | |
400 void implicitClose(); | |
401 void cancelParsing(); | |
402 | |
403 void write(const String& text, Document* ownerDocument = 0); | |
404 void writeln(const String& text, Document* ownerDocument = 0); | |
405 void finishParsing(); | |
406 void clear(); | |
407 | |
408 bool wellFormed() const { return m_wellFormed; } | |
409 | |
410 const KURL& url() const { return m_url; } | |
411 void setURL(const KURL&); | |
412 | |
413 const KURL& baseURL() const { return m_baseURL; } | |
414 // Setting the BaseElementURL will change the baseURL. | |
415 void setBaseElementURL(const KURL&); | |
416 | |
417 const String& baseTarget() const { return m_baseTarget; } | |
418 // Setting the BaseElementTarget will change the baseTarget. | |
419 void setBaseElementTarget(const String& baseTarget) { m_baseTarget = baseTar
get; } | |
420 | |
421 KURL completeURL(const String&) const; | |
422 | |
423 unsigned visitedLinkHash(const AtomicString& attributeURL) const; | |
424 | |
425 // from cachedObjectClient | |
426 virtual void setCSSStyleSheet(const String& url, const String& charset, cons
t CachedCSSStyleSheet*); | |
427 | |
428 #if FRAME_LOADS_USER_STYLESHEET | |
429 void setUserStyleSheet(const String& sheet); | |
430 #endif | |
431 | |
432 String userStyleSheet() const; | |
433 | |
434 CSSStyleSheet* elementSheet(); | |
435 CSSStyleSheet* mappedElementSheet(); | |
436 virtual Tokenizer* createTokenizer(); | |
437 Tokenizer* tokenizer() { return m_tokenizer; } | |
438 | |
439 bool printing() const { return m_printing; } | |
440 void setPrinting(bool p) { m_printing = p; } | |
441 | |
442 enum ParseMode { Compat, AlmostStrict, Strict }; | |
443 | |
444 // Used by Chromium to know if it can just SIGKILL a renderer when navigatin
g | |
445 bool hasUnloadEventListener(); | |
446 | |
447 private: | |
448 virtual void determineParseMode() {} | |
449 | |
450 public: | |
451 void setParseMode(ParseMode m) { m_parseMode = m; } | |
452 ParseMode parseMode() const { return m_parseMode; } | |
453 | |
454 bool inCompatMode() const { return m_parseMode == Compat; } | |
455 bool inAlmostStrictMode() const { return m_parseMode == AlmostStrict; } | |
456 bool inStrictMode() const { return m_parseMode == Strict; } | |
457 | |
458 void setParsing(bool); | |
459 bool parsing() const { return m_bParsing; } | |
460 int minimumLayoutDelay(); | |
461 bool shouldScheduleLayout(); | |
462 int elapsedTime() const; | |
463 | |
464 void setTextColor(const Color& color) { m_textColor = color; } | |
465 Color textColor() const { return m_textColor; } | |
466 | |
467 const Color& linkColor() const { return m_linkColor; } | |
468 const Color& visitedLinkColor() const { return m_visitedLinkColor; } | |
469 const Color& activeLinkColor() const { return m_activeLinkColor; } | |
470 void setLinkColor(const Color& c) { m_linkColor = c; } | |
471 void setVisitedLinkColor(const Color& c) { m_visitedLinkColor = c; } | |
472 void setActiveLinkColor(const Color& c) { m_activeLinkColor = c; } | |
473 void resetLinkColor(); | |
474 void resetVisitedLinkColor(); | |
475 void resetActiveLinkColor(); | |
476 | |
477 MouseEventWithHitTestResults prepareMouseEvent(const HitTestRequest&, const
IntPoint&, const PlatformMouseEvent&); | |
478 | |
479 virtual bool childTypeAllowed(NodeType); | |
480 virtual PassRefPtr<Node> cloneNode(bool deep); | |
481 | |
482 virtual bool canReplaceChild(Node* newChild, Node* oldChild); | |
483 | |
484 StyleSheetList* styleSheets(); | |
485 | |
486 /* Newly proposed CSS3 mechanism for selecting alternate | |
487 stylesheets using the DOM. May be subject to change as | |
488 spec matures. - dwh | |
489 */ | |
490 String preferredStylesheetSet() const; | |
491 String selectedStylesheetSet() const; | |
492 void setSelectedStylesheetSet(const String&); | |
493 | |
494 bool setFocusedNode(PassRefPtr<Node>); | |
495 Node* focusedNode() const { return m_focusedNode.get(); } | |
496 | |
497 // The m_ignoreAutofocus flag specifies whether or not the document has been
changed by the user enough | |
498 // for WebCore to ignore the autofocus attribute on any form controls | |
499 bool ignoreAutofocus() const { return m_ignoreAutofocus; }; | |
500 void setIgnoreAutofocus(bool shouldIgnore = true) { m_ignoreAutofocus = shou
ldIgnore; }; | |
501 | |
502 void setHoverNode(PassRefPtr<Node>); | |
503 Node* hoverNode() const { return m_hoverNode.get(); } | |
504 | |
505 void setActiveNode(PassRefPtr<Node>); | |
506 Node* activeNode() const { return m_activeNode.get(); } | |
507 | |
508 void focusedNodeRemoved(); | |
509 void removeFocusedNodeOfSubtree(Node*, bool amongChildrenOnly = false); | |
510 void hoveredNodeDetached(Node*); | |
511 void activeChainNodeDetached(Node*); | |
512 | |
513 // Updates for :target (CSS3 selector). | |
514 void setCSSTarget(Node*); | |
515 Node* getCSSTarget() const; | |
516 | |
517 void setDocumentChanged(bool); | |
518 | |
519 void attachNodeIterator(NodeIterator*); | |
520 void detachNodeIterator(NodeIterator*); | |
521 | |
522 void attachRange(Range*); | |
523 void detachRange(Range*); | |
524 | |
525 void nodeChildrenChanged(ContainerNode*); | |
526 void nodeWillBeRemoved(Node*); | |
527 | |
528 void textInserted(Node*, unsigned offset, unsigned length); | |
529 void textRemoved(Node*, unsigned offset, unsigned length); | |
530 void textNodesMerged(Text* oldNode, unsigned offset); | |
531 void textNodeSplit(Text* oldNode); | |
532 | |
533 DOMWindow* defaultView() const { return domWindow(); } | |
534 DOMWindow* domWindow() const; | |
535 | |
536 PassRefPtr<Event> createEvent(const String& eventType, ExceptionCode&); | |
537 | |
538 // keep track of what types of event listeners are registered, so we don't | |
539 // dispatch events unnecessarily | |
540 enum ListenerType { | |
541 DOMSUBTREEMODIFIED_LISTENER = 0x01, | |
542 DOMNODEINSERTED_LISTENER = 0x02, | |
543 DOMNODEREMOVED_LISTENER = 0x04, | |
544 DOMNODEREMOVEDFROMDOCUMENT_LISTENER = 0x08, | |
545 DOMNODEINSERTEDINTODOCUMENT_LISTENER = 0x10, | |
546 DOMATTRMODIFIED_LISTENER = 0x20, | |
547 DOMCHARACTERDATAMODIFIED_LISTENER = 0x40, | |
548 OVERFLOWCHANGED_LISTENER = 0x80, | |
549 ANIMATIONEND_LISTENER = 0x100, | |
550 ANIMATIONSTART_LISTENER = 0x200, | |
551 ANIMATIONITERATION_LISTENER = 0x400, | |
552 TRANSITIONEND_LISTENER = 0x800 | |
553 }; | |
554 | |
555 bool hasListenerType(ListenerType listenerType) const { return (m_listenerTy
pes & listenerType); } | |
556 void addListenerType(ListenerType listenerType) { m_listenerTypes = m_listen
erTypes | listenerType; } | |
557 | |
558 CSSStyleDeclaration* getOverrideStyle(Element*, const String& pseudoElt); | |
559 | |
560 void handleWindowEvent(Event*, bool useCapture); | |
561 void setHTMLWindowEventListener(const AtomicString &eventType, PassRefPtr<Ev
entListener>); | |
562 EventListener* getHTMLWindowEventListener(const AtomicString &eventType); | |
563 void removeHTMLWindowEventListener(const AtomicString &eventType); | |
564 | |
565 void setHTMLWindowEventListener(const AtomicString& eventType, Attribute*); | |
566 | |
567 void addWindowEventListener(const AtomicString& eventType, PassRefPtr<EventL
istener>, bool useCapture); | |
568 void removeWindowEventListener(const AtomicString& eventType, EventListener*
, bool useCapture); | |
569 bool hasWindowEventListener(const AtomicString& eventType); | |
570 | |
571 void addPendingFrameUnloadEventCount(); | |
572 void removePendingFrameUnloadEventCount(); | |
573 void addPendingFrameBeforeUnloadEventCount(); | |
574 void removePendingFrameBeforeUnloadEventCount(); | |
575 | |
576 PassRefPtr<EventListener> createHTMLEventListener(const String& functionName
, const String& code, Node*); | |
577 | |
578 /** | |
579 * Searches through the document, starting from fromNode, for the next selec
table element that comes after fromNode. | |
580 * The order followed is as specified in section 17.11.1 of the HTML4 spec,
which is elements with tab indexes | |
581 * first (from lowest to highest), and then elements without tab indexes (in
document order). | |
582 * | |
583 * @param fromNode The node from which to start searching. The node after th
is will be focused. May be null. | |
584 * | |
585 * @return The focus node that comes after fromNode | |
586 * | |
587 * See http://www.w3.org/TR/html4/interact/forms.html#h-17.11.1 | |
588 */ | |
589 Node* nextFocusableNode(Node* start, KeyboardEvent*); | |
590 | |
591 /** | |
592 * Searches through the document, starting from fromNode, for the previous s
electable element (that comes _before_) | |
593 * fromNode. The order followed is as specified in section 17.11.1 of the HT
ML4 spec, which is elements with tab | |
594 * indexes first (from lowest to highest), and then elements without tab ind
exes (in document order). | |
595 * | |
596 * @param fromNode The node from which to start searching. The node before t
his will be focused. May be null. | |
597 * | |
598 * @return The focus node that comes before fromNode | |
599 * | |
600 * See http://www.w3.org/TR/html4/interact/forms.html#h-17.11.1 | |
601 */ | |
602 Node* previousFocusableNode(Node* start, KeyboardEvent*); | |
603 | |
604 int nodeAbsIndex(Node*); | |
605 Node* nodeWithAbsIndex(int absIndex); | |
606 | |
607 /** | |
608 * Handles a HTTP header equivalent set by a meta tag using <meta http-equiv
="..." content="...">. This is called | |
609 * when a meta tag is encountered during document parsing, and also when a s
cript dynamically changes or adds a meta | |
610 * tag. This enables scripts to use meta tags to perform refreshes and set e
xpiry dates in addition to them being | |
611 * specified in a HTML file. | |
612 * | |
613 * @param equiv The http header name (value of the meta tag's "equiv" attrib
ute) | |
614 * @param content The header value (value of the meta tag's "content" attrib
ute) | |
615 */ | |
616 void processHttpEquiv(const String& equiv, const String& content); | |
617 | |
618 void dispatchImageLoadEventSoon(HTMLImageLoader*); | |
619 void dispatchImageLoadEventsNow(); | |
620 void removeImage(HTMLImageLoader*); | |
621 | |
622 // Returns the owning element in the parent document. | |
623 // Returns 0 if this is the top level document. | |
624 Element* ownerElement() const; | |
625 | |
626 String title() const { return m_title; } | |
627 void setTitle(const String&, Element* titleElement = 0); | |
628 void removeTitle(Element* titleElement); | |
629 | |
630 String cookie() const; | |
631 void setCookie(const String&); | |
632 | |
633 String referrer() const; | |
634 | |
635 String domain() const; | |
636 void setDomain(const String& newDomain); | |
637 | |
638 String lastModified() const; | |
639 | |
640 const KURL& cookieURL() const { return m_cookieURL; } | |
641 | |
642 const KURL& policyBaseURL() const { return m_policyBaseURL; } | |
643 void setPolicyBaseURL(const KURL& url) { m_policyBaseURL = url; } | |
644 | |
645 // The following implements the rule from HTML 4 for what valid names are. | |
646 // To get this right for all the XML cases, we probably have to improve this
or move it | |
647 // and make it sensitive to the type of document. | |
648 static bool isValidName(const String&); | |
649 | |
650 // The following breaks a qualified name into a prefix and a local name. | |
651 // It also does a validity check, and returns false if the qualified name | |
652 // is invalid. It also sets ExceptionCode when name is invalid. | |
653 static bool parseQualifiedName(const String& qualifiedName, String& prefix,
String& localName, ExceptionCode&); | |
654 | |
655 // Checks to make sure prefix and namespace do not conflict (per DOM Core 3) | |
656 static bool hasPrefixNamespaceMismatch(const QualifiedName&); | |
657 | |
658 void addElementById(const AtomicString& elementId, Element *element); | |
659 void removeElementById(const AtomicString& elementId, Element *element); | |
660 | |
661 void addImageMap(HTMLMapElement*); | |
662 void removeImageMap(HTMLMapElement*); | |
663 HTMLMapElement* getImageMap(const String& url) const; | |
664 | |
665 HTMLElement* body(); | |
666 void setBody(PassRefPtr<HTMLElement>, ExceptionCode&); | |
667 | |
668 HTMLHeadElement* head(); | |
669 | |
670 bool execCommand(const String& command, bool userInterface = false, const St
ring& value = String()); | |
671 bool queryCommandEnabled(const String& command); | |
672 bool queryCommandIndeterm(const String& command); | |
673 bool queryCommandState(const String& command); | |
674 bool queryCommandSupported(const String& command); | |
675 String queryCommandValue(const String& command); | |
676 | |
677 void addMarker(Range*, DocumentMarker::MarkerType, String description = Stri
ng()); | |
678 void addMarker(Node*, DocumentMarker); | |
679 void copyMarkers(Node *srcNode, unsigned startOffset, int length, Node *dstN
ode, int delta, DocumentMarker::MarkerType = DocumentMarker::AllMarkers); | |
680 void removeMarkers(Range*, DocumentMarker::MarkerType = DocumentMarker::AllM
arkers); | |
681 void removeMarkers(Node*, unsigned startOffset, int length, DocumentMarker::
MarkerType = DocumentMarker::AllMarkers); | |
682 void removeMarkers(DocumentMarker::MarkerType = DocumentMarker::AllMarkers); | |
683 void removeMarkers(Node*); | |
684 void repaintMarkers(DocumentMarker::MarkerType = DocumentMarker::AllMarkers)
; | |
685 void setRenderedRectForMarker(Node*, DocumentMarker, const IntRect&); | |
686 void invalidateRenderedRectsForMarkersInRect(const IntRect&); | |
687 void shiftMarkers(Node*, unsigned startOffset, int delta, DocumentMarker::Ma
rkerType = DocumentMarker::AllMarkers); | |
688 | |
689 DocumentMarker* markerContainingPoint(const IntPoint&, DocumentMarker::Marke
rType = DocumentMarker::AllMarkers); | |
690 Vector<DocumentMarker> markersForNode(Node*); | |
691 Vector<IntRect> renderedRectsForMarkers(DocumentMarker::MarkerType = Documen
tMarker::AllMarkers); | |
692 | |
693 // designMode support | |
694 enum InheritedBool { off = false, on = true, inherit }; | |
695 void setDesignMode(InheritedBool value); | |
696 InheritedBool getDesignMode() const; | |
697 bool inDesignMode() const; | |
698 | |
699 Document* parentDocument() const; | |
700 Document* topDocument() const; | |
701 | |
702 int docID() const { return m_docID; } | |
703 | |
704 #if ENABLE(XSLT) | |
705 void applyXSLTransform(ProcessingInstruction* pi); | |
706 void setTransformSource(void* doc); | |
707 const void* transformSource() { return m_transformSource; } | |
708 PassRefPtr<Document> transformSourceDocument() { return m_transformSourceDoc
ument; } | |
709 void setTransformSourceDocument(Document* doc) { m_transformSourceDocument =
doc; } | |
710 #endif | |
711 | |
712 #if ENABLE(XBL) | |
713 // XBL methods | |
714 XBLBindingManager* bindingManager() const { return m_bindingManager; } | |
715 #endif | |
716 | |
717 void incDOMTreeVersion() { ++m_domtree_version; } | |
718 unsigned domTreeVersion() const { return m_domtree_version; } | |
719 | |
720 void setDocType(PassRefPtr<DocumentType>); | |
721 | |
722 void finishedParsing(); | |
723 | |
724 #if ENABLE(XPATH) | |
725 // XPathEvaluator methods | |
726 PassRefPtr<XPathExpression> createExpression(const String& expression, | |
727 XPathNSResolver* resolver, | |
728 ExceptionCode& ec); | |
729 PassRefPtr<XPathNSResolver> createNSResolver(Node *nodeResolver); | |
730 PassRefPtr<XPathResult> evaluate(const String& expression, | |
731 Node* contextNode, | |
732 XPathNSResolver* resolver, | |
733 unsigned short type, | |
734 XPathResult* result, | |
735 ExceptionCode& ec); | |
736 #endif // ENABLE(XPATH) | |
737 | |
738 enum PendingSheetLayout { NoLayoutWithPendingSheets, DidLayoutWithPendingShe
ets, IgnoreLayoutWithPendingSheets }; | |
739 | |
740 bool didLayoutWithPendingStylesheets() const { return m_pendingSheetLayout =
= DidLayoutWithPendingSheets; } | |
741 | |
742 void setHasNodesWithPlaceholderStyle() { m_hasNodesWithPlaceholderStyle = tr
ue; } | |
743 | |
744 const String& iconURL() const { return m_iconURL; } | |
745 void setIconURL(const String& iconURL, const String& type); | |
746 | |
747 void setUseSecureKeyboardEntryWhenActive(bool); | |
748 bool useSecureKeyboardEntryWhenActive() const; | |
749 | |
750 #if USE(LOW_BANDWIDTH_DISPLAY) | |
751 void setDocLoader(DocLoader* loader) { m_docLoader = loader; } | |
752 bool inLowBandwidthDisplay() const { return m_inLowBandwidthDisplay; } | |
753 void setLowBandwidthDisplay(bool lowBandWidth) { m_inLowBandwidthDisplay = l
owBandWidth; } | |
754 #endif | |
755 | |
756 void addNodeListCache() { ++m_numNodeListCaches; } | |
757 void removeNodeListCache() { ASSERT(m_numNodeListCaches > 0); --m_numNodeLis
tCaches; } | |
758 bool hasNodeListCaches() const { return m_numNodeListCaches; } | |
759 | |
760 void updateFocusAppearanceSoon(); | |
761 void cancelFocusAppearanceUpdate(); | |
762 | |
763 // FF method for accessing the selection added for compatability. | |
764 DOMSelection* getSelection() const; | |
765 | |
766 // Extension for manipulating canvas drawing contexts for use in CSS | |
767 CanvasRenderingContext2D* getCSSCanvasContext(const String& type, const Stri
ng& name, int width, int height); | |
768 HTMLCanvasElement* getCSSCanvasElement(const String& name); | |
769 | |
770 bool isDNSPrefetchEnabled() const { return m_isDNSPrefetchEnabled; } | |
771 void initDNSPrefetchEnabled(); | |
772 void setDNSPrefetchControl(const WebCore::String&); | |
773 | |
774 protected: | |
775 Document(Frame*, bool isXHTML); | |
776 | |
777 private: | |
778 CSSStyleSelector* m_styleSelector; | |
779 bool m_didCalculateStyleSelector; | |
780 | |
781 Frame* m_frame; | |
782 DocLoader* m_docLoader; | |
783 Tokenizer* m_tokenizer; | |
784 bool m_wellFormed; | |
785 | |
786 // Document URLs. | |
787 KURL m_url; // Document.URL: The URL from which this document was retrieved
. | |
788 KURL m_baseURL; // Node.baseURI: The URL to use when resolving relative URL
s. | |
789 KURL m_baseElementURL; // The URL set by the <base> element. | |
790 KURL m_cookieURL; // The URL to use for cookie access. | |
791 KURL m_policyBaseURL; // The policy URL for third-party cookie blocking. | |
792 | |
793 // Document.documentURI: | |
794 // Although URL-like, Document.documentURI can actually be set to any | |
795 // string by content. Document.documentURI affects m_baseURL unless the | |
796 // document contains a <base> element, in which case the <base> element | |
797 // takes precedence. | |
798 String m_documentURI; | |
799 | |
800 String m_baseTarget; | |
801 | |
802 RefPtr<DocumentType> m_docType; | |
803 mutable RefPtr<DOMImplementation> m_implementation; | |
804 | |
805 RefPtr<StyleSheet> m_sheet; | |
806 #if FRAME_LOADS_USER_STYLESHEET | |
807 String m_usersheet; | |
808 #endif | |
809 | |
810 // Track the number of currently loading top-level stylesheets. Sheets | |
811 // loaded using the @import directive are not included in this count. | |
812 // We use this count of pending sheets to detect when we can begin attaching | |
813 // elements. | |
814 int m_pendingStylesheets; | |
815 | |
816 // But sometimes you need to ignore pending stylesheet count to | |
817 // force an immediate layout when requested by JS. | |
818 bool m_ignorePendingStylesheets; | |
819 | |
820 // If we do ignore the pending stylesheet count, then we need to add a boole
an | |
821 // to track that this happened so that we can do a full repaint when the sty
lesheets | |
822 // do eventually load. | |
823 PendingSheetLayout m_pendingSheetLayout; | |
824 | |
825 bool m_hasNodesWithPlaceholderStyle; | |
826 | |
827 RefPtr<CSSStyleSheet> m_elemSheet; | |
828 RefPtr<CSSStyleSheet> m_mappedElementSheet; | |
829 | |
830 bool m_printing; | |
831 | |
832 bool m_ignoreAutofocus; | |
833 | |
834 ParseMode m_parseMode; | |
835 | |
836 Color m_textColor; | |
837 | |
838 RefPtr<Node> m_focusedNode; | |
839 RefPtr<Node> m_hoverNode; | |
840 RefPtr<Node> m_activeNode; | |
841 mutable RefPtr<Element> m_documentElement; | |
842 | |
843 unsigned m_domtree_version; | |
844 | |
845 HashSet<NodeIterator*> m_nodeIterators; | |
846 HashSet<Range*> m_ranges; | |
847 | |
848 unsigned short m_listenerTypes; | |
849 | |
850 RefPtr<StyleSheetList> m_styleSheets; // All of the stylesheets that are cur
rently in effect for our media type and stylesheet set. | |
851 ListHashSet<Node*> m_styleSheetCandidateNodes; // All of the nodes that coul
d potentially provide stylesheets to the document (<link>, <style>, <?xml-styles
heet>) | |
852 | |
853 RegisteredEventListenerList m_windowEventListeners; | |
854 | |
855 typedef HashMap<FormElementKey, Vector<String>, FormElementKeyHash, FormElem
entKeyHashTraits> FormElementStateMap; | |
856 ListHashSet<HTMLFormControlElementWithState*> m_formElementsWithState; | |
857 FormElementStateMap m_stateForNewFormElements; | |
858 | |
859 Color m_linkColor; | |
860 Color m_visitedLinkColor; | |
861 Color m_activeLinkColor; | |
862 | |
863 String m_preferredStylesheetSet; | |
864 String m_selectedStylesheetSet; | |
865 | |
866 bool m_loadingSheet; | |
867 bool visuallyOrdered; | |
868 bool m_bParsing; | |
869 bool m_docChanged; | |
870 bool m_inStyleRecalc; | |
871 bool m_closeAfterStyleRecalc; | |
872 bool m_usesDescendantRules; | |
873 bool m_usesSiblingRules; | |
874 bool m_usesFirstLineRules; | |
875 bool m_usesFirstLetterRules; | |
876 bool m_gotoAnchorNeededAfterStylesheetsLoad; | |
877 | |
878 bool m_isDNSPrefetchEnabled; | |
879 bool m_haveExplicitlyDisabledDNSPrefetch; | |
880 | |
881 String m_title; | |
882 bool m_titleSetExplicitly; | |
883 RefPtr<Element> m_titleElement; | |
884 | |
885 RenderArena* m_renderArena; | |
886 | |
887 typedef std::pair<Vector<DocumentMarker>, Vector<IntRect> > MarkerMapVectorP
air; | |
888 typedef HashMap<RefPtr<Node>, MarkerMapVectorPair*> MarkerMap; | |
889 MarkerMap m_markers; | |
890 | |
891 mutable AXObjectCache* m_axObjectCache; | |
892 | |
893 DeprecatedPtrList<HTMLImageLoader> m_imageLoadEventDispatchSoonList; | |
894 DeprecatedPtrList<HTMLImageLoader> m_imageLoadEventDispatchingList; | |
895 Timer<Document> m_imageLoadEventTimer; | |
896 | |
897 Timer<Document> m_updateFocusAppearanceTimer; | |
898 | |
899 Node* m_cssTarget; | |
900 | |
901 bool m_processingLoadEvent; | |
902 double m_startTime; | |
903 bool m_overMinimumLayoutThreshold; | |
904 | |
905 #if ENABLE(XSLT) | |
906 void* m_transformSource; | |
907 RefPtr<Document> m_transformSourceDocument; | |
908 #endif | |
909 | |
910 #if ENABLE(XBL) | |
911 XBLBindingManager* m_bindingManager; // The access point through which docum
ents and elements communicate with XBL. | |
912 #endif | |
913 | |
914 typedef HashMap<AtomicStringImpl*, HTMLMapElement*> ImageMapsByName; | |
915 ImageMapsByName m_imageMapsByName; | |
916 | |
917 HashSet<Node*> m_disconnectedNodesWithEventListeners; | |
918 | |
919 int m_docID; // A unique document identifier used for things like document-s
pecific mapped attributes. | |
920 | |
921 String m_xmlEncoding; | |
922 String m_xmlVersion; | |
923 bool m_xmlStandalone; | |
924 | |
925 String m_contentLanguage; | |
926 | |
927 // UScriptCode can be derived from non-Unicode charsets and help us select a
fallback | |
928 // font. Because it's derived from charset, it's a document-wide constant. | |
929 // For instance, it'll be Latin, SimplifiedHan, TraditionalHan, Hiragana, | |
930 // Hangul, Arabic and Hebrew for documents in ISO-8859-1, GBK, Big5, Shift_J
IS, | |
931 // EUC-KR, Windows-1256 and Windows-1255, respectively. In case of Japanese
encodings, | |
932 // either Hiragana or Katakana should work but Han does not because it does
not | |
933 // uniquely identify Japanese and as a result does not help the font selecti
on. | |
934 // Obviously, this does not work well for Unicode-encoded documents. In the
meantime, | |
935 // we can resort to the 'dominant' script of the current UI language. | |
936 // In the future, we should refer to the value of xml:lang and lang to infer
| |
937 // this value for invididual text nodes. CSSStyleSelector might be a good pl
ace for that. | |
938 // Moreover, the value of m_contentLanguage should be utilized as well. | |
939 mutable UScriptCode m_dominantScript; | |
940 | |
941 public: | |
942 bool inPageCache(); | |
943 void setInPageCache(bool flag); | |
944 | |
945 // Elements can register themselves for the "willSaveToCache()" and | |
946 // "didRestoreFromCache()" callbacks | |
947 void registerForCacheCallbacks(Element*); | |
948 void unregisterForCacheCallbacks(Element*); | |
949 void willSaveToCache(); | |
950 void didRestoreFromCache(); | |
951 | |
952 void setShouldCreateRenderers(bool); | |
953 bool shouldCreateRenderers(); | |
954 | |
955 void setDecoder(PassRefPtr<TextResourceDecoder>); | |
956 TextResourceDecoder* decoder() const { return m_decoder.get(); } | |
957 | |
958 UChar backslashAsCurrencySymbol() const; | |
959 | |
960 #if ENABLE(DASHBOARD_SUPPORT) | |
961 void setDashboardRegionsDirty(bool f) { m_dashboardRegionsDirty = f; } | |
962 bool dashboardRegionsDirty() const { return m_dashboardRegionsDirty; } | |
963 bool hasDashboardRegions () const { return m_hasDashboardRegions; } | |
964 void setHasDashboardRegions (bool f) { m_hasDashboardRegions = f; } | |
965 const Vector<DashboardRegionValue>& dashboardRegions() const; | |
966 void setDashboardRegions(const Vector<DashboardRegionValue>&); | |
967 #endif | |
968 | |
969 void removeAllEventListenersFromAllNodes(); | |
970 | |
971 void registerDisconnectedNodeWithEventListeners(Node*); | |
972 void unregisterDisconnectedNodeWithEventListeners(Node*); | |
973 | |
974 HTMLFormElement::CheckedRadioButtons& checkedRadioButtons() { return m_check
edRadioButtons; } | |
975 | |
976 #if ENABLE(SVG) | |
977 const SVGDocumentExtensions* svgExtensions(); | |
978 SVGDocumentExtensions* accessSVGExtensions(); | |
979 #endif | |
980 | |
981 void initSecurityContext(); | |
982 SecurityOrigin* securityOrigin() const { return m_securityOrigin.get(); } | |
983 | |
984 // Explicitly override the security origin for this document. | |
985 // Note: It is dangerous to change the security origin of a document | |
986 // that already contains content. | |
987 void setSecurityOrigin(SecurityOrigin*); | |
988 | |
989 bool processingLoadEvent() const { return m_processingLoadEvent; } | |
990 | |
991 #if ENABLE(DATABASE) | |
992 void addOpenDatabase(Database*); | |
993 void removeOpenDatabase(Database*); | |
994 DatabaseThread* databaseThread(); // Creates the thread as needed, but not
if it has been already terminated. | |
995 void setHasOpenDatabases() { m_hasOpenDatabases = true; } | |
996 bool hasOpenDatabases() { return m_hasOpenDatabases; } | |
997 void stopDatabases(); | |
998 #endif | |
999 protected: | |
1000 void clearXMLVersion() { m_xmlVersion = String(); } | |
1001 | |
1002 private: | |
1003 void updateTitle(); | |
1004 void removeAllDisconnectedNodeEventListeners(); | |
1005 void imageLoadEventTimerFired(Timer<Document>*); | |
1006 void updateFocusAppearanceTimerFired(Timer<Document>*); | |
1007 void updateBaseURL(); | |
1008 | |
1009 RefPtr<SecurityOrigin> m_securityOrigin; | |
1010 | |
1011 RenderObject* m_savedRenderer; | |
1012 int m_secureForms; | |
1013 | |
1014 RefPtr<TextResourceDecoder> m_decoder; | |
1015 | |
1016 // We maintain the invariant that m_duplicateIds is the count of all element
s with a given ID | |
1017 // excluding the one referenced in m_elementsById, if any. This means it one
less than the total count | |
1018 // when the first node with a given ID is cached, otherwise the same as the
total count. | |
1019 mutable HashMap<AtomicStringImpl*, Element*> m_elementsById; | |
1020 mutable HashCountedSet<AtomicStringImpl*> m_duplicateIds; | |
1021 | |
1022 mutable HashMap<StringImpl*, Element*, CaseFoldingHash> m_elementsByAccessKe
y; | |
1023 | |
1024 InheritedBool m_designMode; | |
1025 | |
1026 int m_selfOnlyRefCount; | |
1027 | |
1028 HTMLFormElement::CheckedRadioButtons m_checkedRadioButtons; | |
1029 | |
1030 typedef HashMap<AtomicStringImpl*, HTMLCollection::CollectionInfo*> NamedCol
lectionMap; | |
1031 HTMLCollection::CollectionInfo m_collectionInfo[HTMLCollection::NumUnnamedDo
cumentCachedTypes]; | |
1032 NamedCollectionMap m_nameCollectionInfo[HTMLCollection::NumNamedDocumentCach
edTypes]; | |
1033 | |
1034 #if ENABLE(XPATH) | |
1035 RefPtr<XPathEvaluator> m_xpathEvaluator; | |
1036 #endif | |
1037 | |
1038 #if ENABLE(SVG) | |
1039 SVGDocumentExtensions* m_svgExtensions; | |
1040 #endif | |
1041 | |
1042 #if ENABLE(DASHBOARD_SUPPORT) | |
1043 Vector<DashboardRegionValue> m_dashboardRegions; | |
1044 bool m_hasDashboardRegions; | |
1045 bool m_dashboardRegionsDirty; | |
1046 #endif | |
1047 | |
1048 HashMap<String, RefPtr<HTMLCanvasElement> > m_cssCanvasElements; | |
1049 | |
1050 mutable bool m_accessKeyMapValid; | |
1051 bool m_createRenderers; | |
1052 bool m_inPageCache; | |
1053 String m_iconURL; | |
1054 | |
1055 HashSet<Element*> m_pageCacheCallbackElements; | |
1056 | |
1057 bool m_useSecureKeyboardEntryWhenActive; | |
1058 | |
1059 bool m_isXHTML; | |
1060 | |
1061 unsigned m_numNodeListCaches; | |
1062 | |
1063 public: | |
1064 typedef HashMap<WebCore::Node*, JSNode*> JSWrapperCache; | |
1065 JSWrapperCache& wrapperCache() { return m_wrapperCache; } | |
1066 private: | |
1067 JSWrapperCache m_wrapperCache; | |
1068 | |
1069 #if ENABLE(DATABASE) | |
1070 RefPtr<DatabaseThread> m_databaseThread; | |
1071 bool m_hasOpenDatabases; // This never changes back to false, even as the
database thread is closed. | |
1072 typedef HashSet<Database*> DatabaseSet; | |
1073 OwnPtr<DatabaseSet> m_openDatabaseSet; | |
1074 #endif | |
1075 | |
1076 #if USE(LOW_BANDWIDTH_DISPLAY) | |
1077 bool m_inLowBandwidthDisplay; | |
1078 #endif | |
1079 | |
1080 }; | |
1081 | |
1082 inline bool Document::hasElementWithId(AtomicStringImpl* id) const | |
1083 { | |
1084 ASSERT(id); | |
1085 return m_elementsById.contains(id) || m_duplicateIds.contains(id); | |
1086 } | |
1087 | |
1088 } // namespace WebCore | |
1089 | |
1090 #endif // Document_h | |
OLD | NEW |