Add checked casts for ScriptExecutionContext.
[WebKit-https.git] / Source / WebCore / dom / Document.h
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, 2009, 2010, 2012, 2013 Apple Inc. All rights reserved.
7  * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
8  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
9  * Copyright (C) 2011 Google Inc. All rights reserved.
10  *
11  * This library is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Library General Public
13  * License as published by the Free Software Foundation; either
14  * version 2 of the License, or (at your option) any later version.
15  *
16  * This library is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Library General Public License for more details.
20  *
21  * You should have received a copy of the GNU Library General Public License
22  * along with this library; see the file COPYING.LIB.  If not, write to
23  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24  * Boston, MA 02110-1301, USA.
25  *
26  */
27
28 #ifndef Document_h
29 #define Document_h
30
31 #include "CollectionType.h"
32 #include "Color.h"
33 #include "ContainerNode.h"
34 #include "DocumentEventQueue.h"
35 #include "DocumentStyleSheetCollection.h"
36 #include "DocumentTiming.h"
37 #include "FocusDirection.h"
38 #include "HitTestRequest.h"
39 #include "IconURL.h"
40 #include "InspectorCounters.h"
41 #include "MutationObserver.h"
42 #include "PageVisibilityState.h"
43 #include "PlatformScreen.h"
44 #include "QualifiedName.h"
45 #include "ReferrerPolicy.h"
46 #include "RenderPtr.h"
47 #include "ScriptExecutionContext.h"
48 #include "StringWithDirection.h"
49 #include "StyleResolveTree.h"
50 #include "Timer.h"
51 #include "TreeScope.h"
52 #include "UserActionElementSet.h"
53 #include "ViewportArguments.h"
54 #include <chrono>
55 #include <wtf/Deque.h>
56 #include <wtf/HashSet.h>
57 #include <wtf/OwnPtr.h>
58 #include <wtf/PassOwnPtr.h>
59 #include <wtf/PassRefPtr.h>
60 #include <wtf/WeakPtr.h>
61
62 #if ENABLE(WEB_REPLAY)
63 #include <replay/InputCursor.h>
64 #endif
65
66 namespace WebCore {
67
68 class AXObjectCache;
69 class Attr;
70 class CDATASection;
71 class CSSStyleDeclaration;
72 class CSSStyleSheet;
73 class CachedCSSStyleSheet;
74 class CachedResourceLoader;
75 class CachedScript;
76 class CanvasRenderingContext;
77 class CharacterData;
78 class Comment;
79 class DOMImplementation;
80 class DOMNamedFlowCollection;
81 class DOMSelection;
82 class DOMWindow;
83 class DOMWrapperWorld;
84 class Database;
85 class DatabaseThread;
86 class DocumentFragment;
87 class DocumentLoader;
88 class DocumentMarkerController;
89 class DocumentParser;
90 class DocumentSharedObjectPool;
91 class DocumentStyleSheetCollection;
92 class DocumentType;
93 class Element;
94 class EntityReference;
95 class Event;
96 class EventListener;
97 class FloatRect;
98 class FloatQuad;
99 class FormController;
100 class Frame;
101 class FrameView;
102 class HTMLCanvasElement;
103 class HTMLCollection;
104 class HTMLAllCollection;
105 class HTMLDocument;
106 class HTMLElement;
107 class HTMLFrameOwnerElement;
108 class HTMLHeadElement;
109 class HTMLIFrameElement;
110 class HTMLImageElement;
111 class HTMLMapElement;
112 class HTMLNameCollection;
113 class HTMLScriptElement;
114 class HitTestRequest;
115 class HitTestResult;
116 class IntPoint;
117 class LayoutPoint;
118 class LayoutRect;
119 class LiveNodeList;
120 class JSNode;
121 class Locale;
122 class MediaCanStartListener;
123 class MediaQueryList;
124 class MediaQueryMatcher;
125 class MouseEventWithHitTestResults;
126 class NamedFlowCollection;
127 class NodeFilter;
128 class NodeIterator;
129 class Page;
130 class PlatformMouseEvent;
131 class ProcessingInstruction;
132 class Range;
133 class RegisteredEventListener;
134 class RenderView;
135 class RenderFullScreen;
136 class ScriptableDocumentParser;
137 class ScriptElementData;
138 class ScriptRunner;
139 class SecurityOrigin;
140 class SelectorQueryCache;
141 class SerializedScriptValue;
142 class SegmentedString;
143 class Settings;
144 class StyleResolver;
145 class StyleSheet;
146 class StyleSheetContents;
147 class StyleSheetList;
148 class SVGDocumentExtensions;
149 class Text;
150 class TextResourceDecoder;
151 class TreeWalker;
152 class VisitedLinkState;
153 class WebKitNamedFlow;
154 class XMLHttpRequest;
155 class XPathEvaluator;
156 class XPathExpression;
157 class XPathNSResolver;
158 class XPathResult;
159
160 #if ENABLE(XSLT)
161 class TransformSource;
162 #endif
163
164 #if ENABLE(DASHBOARD_SUPPORT)
165 struct AnnotatedRegionValue;
166 #endif
167
168 #if ENABLE(TOUCH_EVENTS)
169 #if PLATFORM(IOS)
170 #include <WebKitAdditions/DocumentIOSForward.h>
171 #endif // PLATFORM(IOS)
172 class Touch;
173 class TouchList;
174 #endif
175
176 #if ENABLE(REQUEST_ANIMATION_FRAME)
177 class RequestAnimationFrameCallback;
178 class ScriptedAnimationController;
179 #endif
180
181 #if ENABLE(TEXT_AUTOSIZING)
182 class TextAutosizer;
183 #endif
184
185 #if ENABLE(CSP_NEXT)
186 class DOMSecurityPolicy;
187 #endif
188
189 #if ENABLE(FONT_LOAD_EVENTS)
190 class FontLoader;
191 #endif
192
193 typedef int ExceptionCode;
194
195 #if PLATFORM(IOS)
196 class DeviceMotionClient;
197 class DeviceMotionController;
198 class DeviceOrientationClient;
199 class DeviceOrientationController;
200 #endif
201
202 #if ENABLE(IOS_TEXT_AUTOSIZING)
203 struct TextAutoSizingHash;
204 class TextAutoSizingKey;
205 class TextAutoSizingValue;
206
207 struct TextAutoSizingTraits : WTF::GenericHashTraits<TextAutoSizingKey> {
208     static const bool emptyValueIsZero = true;
209     static void constructDeletedValue(TextAutoSizingKey& slot);
210     static bool isDeletedValue(const TextAutoSizingKey& value);
211 };
212 #endif
213
214 enum PageshowEventPersistence {
215     PageshowEventNotPersisted = 0,
216     PageshowEventPersisted = 1
217 };
218
219 enum StyleResolverUpdateFlag { RecalcStyleImmediately, DeferRecalcStyle, RecalcStyleIfNeeded, DeferRecalcStyleIfNeeded };
220
221 enum NodeListInvalidationType {
222     DoNotInvalidateOnAttributeChanges = 0,
223     InvalidateOnClassAttrChange,
224     InvalidateOnIdNameAttrChange,
225     InvalidateOnNameAttrChange,
226     InvalidateOnForAttrChange,
227     InvalidateForFormControls,
228     InvalidateOnHRefAttrChange,
229     InvalidateOnAnyAttrChange,
230 };
231 const int numNodeListInvalidationTypes = InvalidateOnAnyAttrChange + 1;
232
233 typedef HashCountedSet<Node*> TouchEventTargetSet;
234
235 enum DocumentClass {
236     DefaultDocumentClass = 0,
237     HTMLDocumentClass = 1,
238     XHTMLDocumentClass = 1 << 1,
239     ImageDocumentClass = 1 << 2,
240     PluginDocumentClass = 1 << 3,
241     MediaDocumentClass = 1 << 4,
242     SVGDocumentClass = 1 << 5,
243     TextDocumentClass = 1 << 6
244 };
245
246 typedef unsigned char DocumentClassFlags;
247
248 class Document : public ContainerNode, public TreeScope, public ScriptExecutionContext {
249 public:
250     static PassRefPtr<Document> create(Frame* frame, const URL& url)
251     {
252         return adoptRef(new Document(frame, url));
253     }
254     static PassRefPtr<Document> createXHTML(Frame* frame, const URL& url)
255     {
256         return adoptRef(new Document(frame, url, XHTMLDocumentClass));
257     }
258     static PassRefPtr<Document> createNonRenderedPlaceholder(Frame* frame, const URL& url)
259     {
260         return adoptRef(new Document(frame, url, DefaultDocumentClass, NonRenderedPlaceholder));
261     }
262     static PassRefPtr<Document> create(ScriptExecutionContext&);
263
264     virtual ~Document();
265
266     MediaQueryMatcher& mediaQueryMatcher();
267
268     using ContainerNode::ref;
269     using ContainerNode::deref;
270
271     virtual bool canContainRangeEndPoint() const override { return true; }
272
273     Element* getElementByAccessKey(const String& key);
274     void invalidateAccessKeyMap();
275
276     void addImageElementByLowercasedUsemap(const AtomicStringImpl&, HTMLImageElement&);
277     void removeImageElementByLowercasedUsemap(const AtomicStringImpl&, HTMLImageElement&);
278     HTMLImageElement* imageElementByLowercasedUsemap(const AtomicStringImpl&) const;
279
280     SelectorQueryCache& selectorQueryCache();
281
282     // DOM methods & attributes for Document
283
284     DEFINE_ATTRIBUTE_EVENT_LISTENER(abort);
285     DEFINE_ATTRIBUTE_EVENT_LISTENER(change);
286     DEFINE_ATTRIBUTE_EVENT_LISTENER(click);
287     DEFINE_ATTRIBUTE_EVENT_LISTENER(contextmenu);
288     DEFINE_ATTRIBUTE_EVENT_LISTENER(dblclick);
289     DEFINE_ATTRIBUTE_EVENT_LISTENER(dragenter);
290     DEFINE_ATTRIBUTE_EVENT_LISTENER(dragover);
291     DEFINE_ATTRIBUTE_EVENT_LISTENER(dragleave);
292     DEFINE_ATTRIBUTE_EVENT_LISTENER(drop);
293     DEFINE_ATTRIBUTE_EVENT_LISTENER(dragstart);
294     DEFINE_ATTRIBUTE_EVENT_LISTENER(drag);
295     DEFINE_ATTRIBUTE_EVENT_LISTENER(dragend);
296     DEFINE_ATTRIBUTE_EVENT_LISTENER(input);
297     DEFINE_ATTRIBUTE_EVENT_LISTENER(invalid);
298     DEFINE_ATTRIBUTE_EVENT_LISTENER(keydown);
299     DEFINE_ATTRIBUTE_EVENT_LISTENER(keypress);
300     DEFINE_ATTRIBUTE_EVENT_LISTENER(keyup);
301     DEFINE_ATTRIBUTE_EVENT_LISTENER(mousedown);
302     DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseenter);
303     DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseleave);
304     DEFINE_ATTRIBUTE_EVENT_LISTENER(mousemove);
305     DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseout);
306     DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseover);
307     DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseup);
308     DEFINE_ATTRIBUTE_EVENT_LISTENER(mousewheel);
309     DEFINE_ATTRIBUTE_EVENT_LISTENER(scroll);
310     DEFINE_ATTRIBUTE_EVENT_LISTENER(select);
311     DEFINE_ATTRIBUTE_EVENT_LISTENER(submit);
312 #if ENABLE(WILL_REVEAL_EDGE_EVENTS)
313     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitwillrevealbottom);
314     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitwillrevealleft);
315     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitwillrevealright);
316     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitwillrevealtop);
317 #endif
318     DEFINE_ATTRIBUTE_EVENT_LISTENER(wheel);
319
320     DEFINE_ATTRIBUTE_EVENT_LISTENER(blur);
321     DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
322     DEFINE_ATTRIBUTE_EVENT_LISTENER(focus);
323     DEFINE_ATTRIBUTE_EVENT_LISTENER(load);
324     DEFINE_ATTRIBUTE_EVENT_LISTENER(readystatechange);
325
326     // WebKit extensions
327     DEFINE_ATTRIBUTE_EVENT_LISTENER(beforecut);
328     DEFINE_ATTRIBUTE_EVENT_LISTENER(cut);
329     DEFINE_ATTRIBUTE_EVENT_LISTENER(beforecopy);
330     DEFINE_ATTRIBUTE_EVENT_LISTENER(copy);
331     DEFINE_ATTRIBUTE_EVENT_LISTENER(beforepaste);
332     DEFINE_ATTRIBUTE_EVENT_LISTENER(paste);
333     DEFINE_ATTRIBUTE_EVENT_LISTENER(reset);
334     DEFINE_ATTRIBUTE_EVENT_LISTENER(search);
335     DEFINE_ATTRIBUTE_EVENT_LISTENER(selectstart);
336     DEFINE_ATTRIBUTE_EVENT_LISTENER(selectionchange);
337 #if ENABLE(TOUCH_EVENTS)
338     DEFINE_ATTRIBUTE_EVENT_LISTENER(touchstart);
339     DEFINE_ATTRIBUTE_EVENT_LISTENER(touchmove);
340     DEFINE_ATTRIBUTE_EVENT_LISTENER(touchend);
341     DEFINE_ATTRIBUTE_EVENT_LISTENER(touchcancel);
342 #endif
343 #if ENABLE(IOS_GESTURE_EVENTS)
344     DEFINE_ATTRIBUTE_EVENT_LISTENER(gesturestart);
345     DEFINE_ATTRIBUTE_EVENT_LISTENER(gesturechange);
346     DEFINE_ATTRIBUTE_EVENT_LISTENER(gestureend);
347 #endif
348 #if ENABLE(FULLSCREEN_API)
349     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitfullscreenchange);
350     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitfullscreenerror);
351 #endif
352 #if ENABLE(POINTER_LOCK)
353     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitpointerlockchange);
354     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitpointerlockerror);
355 #endif
356 #if ENABLE(PAGE_VISIBILITY_API)
357     DEFINE_ATTRIBUTE_EVENT_LISTENER(visibilitychange);
358 #endif
359 #if ENABLE(CSP_NEXT)
360     DEFINE_ATTRIBUTE_EVENT_LISTENER(securitypolicyviolation);
361 #endif
362
363     void setViewportArguments(const ViewportArguments& viewportArguments) { m_viewportArguments = viewportArguments; }
364     ViewportArguments viewportArguments() const { return m_viewportArguments; }
365 #ifndef NDEBUG
366     bool didDispatchViewportPropertiesChanged() const { return m_didDispatchViewportPropertiesChanged; }
367 #endif
368
369     void setReferrerPolicy(ReferrerPolicy referrerPolicy) { m_referrerPolicy = referrerPolicy; }
370     ReferrerPolicy referrerPolicy() const { return m_referrerPolicy; }
371
372     DocumentType* doctype() const;
373
374     DOMImplementation* implementation();
375     
376     Element* documentElement() const
377     {
378         return m_documentElement.get();
379     }
380
381     bool hasManifest() const;
382     
383     virtual PassRefPtr<Element> createElement(const AtomicString& tagName, ExceptionCode&);
384     PassRefPtr<DocumentFragment> createDocumentFragment();
385     PassRefPtr<Text> createTextNode(const String& data);
386     PassRefPtr<Comment> createComment(const String& data);
387     PassRefPtr<CDATASection> createCDATASection(const String& data, ExceptionCode&);
388     PassRefPtr<ProcessingInstruction> createProcessingInstruction(const String& target, const String& data, ExceptionCode&);
389     PassRefPtr<Attr> createAttribute(const String& name, ExceptionCode&);
390     PassRefPtr<Attr> createAttributeNS(const String& namespaceURI, const String& qualifiedName, ExceptionCode&, bool shouldIgnoreNamespaceChecks = false);
391     PassRefPtr<EntityReference> createEntityReference(const String& name, ExceptionCode&);
392     PassRefPtr<Node> importNode(Node* importedNode, ExceptionCode& ec) { return importNode(importedNode, true, ec); }
393     PassRefPtr<Node> importNode(Node* importedNode, bool deep, ExceptionCode&);
394     PassRefPtr<Element> createElementNS(const String& namespaceURI, const String& qualifiedName, ExceptionCode&);
395     PassRefPtr<Element> createElement(const QualifiedName&, bool createdByParser);
396
397     bool cssRegionsEnabled() const;
398     bool cssCompositingEnabled() const;
399 #if ENABLE(CSS_REGIONS)
400     PassRefPtr<DOMNamedFlowCollection> webkitGetNamedFlows();
401 #endif
402
403     NamedFlowCollection* namedFlows();
404
405     bool regionBasedColumnsEnabled() const;
406
407     bool cssGridLayoutEnabled() const;
408
409     Element* elementFromPoint(int x, int y) const;
410     PassRefPtr<Range> caretRangeFromPoint(int x, int y);
411
412     String readyState() const;
413
414     String defaultCharset() const;
415
416     String inputEncoding() const { return Document::encoding(); }
417     String charset() const { return Document::encoding(); }
418     String characterSet() const { return Document::encoding(); }
419
420     AtomicString encoding() const;
421
422     void setCharset(const String&);
423
424     void setContent(const String&);
425
426     String suggestedMIMEType() const;
427
428     String contentLanguage() const { return m_contentLanguage; }
429     void setContentLanguage(const String&);
430
431     String xmlEncoding() const { return m_xmlEncoding; }
432     String xmlVersion() const { return m_xmlVersion; }
433     enum StandaloneStatus { StandaloneUnspecified, Standalone, NotStandalone };
434     bool xmlStandalone() const { return m_xmlStandalone == Standalone; }
435     StandaloneStatus xmlStandaloneStatus() const { return static_cast<StandaloneStatus>(m_xmlStandalone); }
436     bool hasXMLDeclaration() const { return m_hasXMLDeclaration; }
437
438     void setXMLEncoding(const String& encoding) { m_xmlEncoding = encoding; } // read-only property, only to be set from XMLDocumentParser
439     void setXMLVersion(const String&, ExceptionCode&);
440     void setXMLStandalone(bool, ExceptionCode&);
441     void setHasXMLDeclaration(bool hasXMLDeclaration) { m_hasXMLDeclaration = hasXMLDeclaration ? 1 : 0; }
442
443     String documentURI() const { return m_documentURI; }
444     void setDocumentURI(const String&);
445
446     virtual URL baseURI() const override;
447
448 #if ENABLE(WEB_REPLAY)
449     InputCursor& inputCursor() const { return *m_inputCursor; }
450     void setInputCursor(PassRefPtr<InputCursor> cursor) { m_inputCursor = cursor; }
451 #endif
452
453 #if ENABLE(PAGE_VISIBILITY_API)
454     void visibilityStateChanged();
455     String visibilityState() const;
456     bool hidden() const;
457 #endif
458
459 #if ENABLE(CSP_NEXT)
460     DOMSecurityPolicy* securityPolicy();
461 #endif
462
463     PassRefPtr<Node> adoptNode(PassRefPtr<Node> source, ExceptionCode&);
464
465     PassRefPtr<HTMLCollection> images();
466     PassRefPtr<HTMLCollection> embeds();
467     PassRefPtr<HTMLCollection> plugins(); // an alias for embeds() required for the JS DOM bindings.
468     PassRefPtr<HTMLCollection> applets();
469     PassRefPtr<HTMLCollection> links();
470     PassRefPtr<HTMLCollection> forms();
471     PassRefPtr<HTMLCollection> anchors();
472     PassRefPtr<HTMLCollection> scripts();
473     PassRefPtr<HTMLCollection> all();
474
475     PassRefPtr<HTMLCollection> windowNamedItems(const AtomicString& name);
476     PassRefPtr<HTMLCollection> documentNamedItems(const AtomicString& name);
477
478     // Other methods (not part of DOM)
479     bool isSynthesized() const { return m_isSynthesized; }
480     bool isHTMLDocument() const { return m_documentClasses & HTMLDocumentClass; }
481     bool isXHTMLDocument() const { return m_documentClasses & XHTMLDocumentClass; }
482     bool isImageDocument() const { return m_documentClasses & ImageDocumentClass; }
483     bool isSVGDocument() const { return m_documentClasses & SVGDocumentClass; }
484     bool isPluginDocument() const { return m_documentClasses & PluginDocumentClass; }
485     bool isMediaDocument() const { return m_documentClasses & MediaDocumentClass; }
486     bool isTextDocument() const { return m_documentClasses & TextDocumentClass; }
487     bool hasSVGRootNode() const;
488     virtual bool isFrameSet() const { return false; }
489
490     bool isSrcdocDocument() const { return m_isSrcdocDocument; }
491
492     StyleResolver* styleResolverIfExists() const { return m_styleResolver.get(); }
493
494     bool isViewSource() const { return m_isViewSource; }
495     void setIsViewSource(bool);
496
497     bool sawElementsInKnownNamespaces() const { return m_sawElementsInKnownNamespaces; }
498
499     StyleResolver& ensureStyleResolver()
500     { 
501         if (!m_styleResolver)
502             createStyleResolver();
503         return *m_styleResolver;
504     }
505
506     void notifyRemovePendingSheetIfNeeded();
507
508     bool haveStylesheetsLoaded() const;
509
510     // This is a DOM function.
511     StyleSheetList* styleSheets();
512
513     DocumentStyleSheetCollection& styleSheetCollection() { return m_styleSheetCollection; }
514
515     bool gotoAnchorNeededAfterStylesheetsLoad() { return m_gotoAnchorNeededAfterStylesheetsLoad; }
516     void setGotoAnchorNeededAfterStylesheetsLoad(bool b) { m_gotoAnchorNeededAfterStylesheetsLoad = b; }
517
518     /**
519      * Called when one or more stylesheets in the document may have been added, removed or changed.
520      *
521      * Creates a new style resolver and assign it to this document. This is done by iterating through all nodes in
522      * document (or those before <BODY> in a HTML document), searching for stylesheets. Stylesheets can be contained in
523      * <LINK>, <STYLE> or <BODY> elements, as well as processing instructions (XML documents only). A list is
524      * constructed from these which is used to create the a new style selector which collates all of the stylesheets
525      * found and is used to calculate the derived styles for all rendering objects.
526      */
527     void styleResolverChanged(StyleResolverUpdateFlag);
528
529     void scheduleOptimizedStyleSheetUpdate();
530
531     void didAccessStyleResolver();
532
533     void evaluateMediaQueryList();
534
535     FormController& formController();
536     Vector<String> formElementsState() const;
537     void setStateForNewFormElements(const Vector<String>&);
538
539     FrameView* view() const; // can be NULL
540     Frame* frame() const { return m_frame; } // can be NULL
541     Page* page() const; // can be NULL
542     Settings* settings() const; // can be NULL
543
544     float deviceScaleFactor() const;
545
546     PassRefPtr<Range> createRange();
547
548     PassRefPtr<NodeIterator> createNodeIterator(Node* root, unsigned whatToShow,
549         PassRefPtr<NodeFilter>, bool expandEntityReferences, ExceptionCode&);
550
551     PassRefPtr<TreeWalker> createTreeWalker(Node* root, unsigned whatToShow,
552         PassRefPtr<NodeFilter>, bool expandEntityReferences, ExceptionCode&);
553
554     // Special support for editing
555     PassRefPtr<CSSStyleDeclaration> createCSSStyleDeclaration();
556     PassRefPtr<Text> createEditingTextNode(const String&);
557
558     void recalcStyle(Style::Change = Style::NoChange);
559     void updateStyleIfNeeded();
560     void updateLayout();
561     void updateLayoutIgnorePendingStylesheets();
562     PassRef<RenderStyle> styleForElementIgnoringPendingStylesheets(Element*);
563
564     // Returns true if page box (margin boxes and page borders) is visible.
565     bool isPageBoxVisible(int pageIndex);
566
567     // Returns the preferred page size and margins in pixels, assuming 96
568     // pixels per inch. pageSize, marginTop, marginRight, marginBottom,
569     // marginLeft must be initialized to the default values that are used if
570     // auto is specified.
571     void pageSizeAndMarginsInPixels(int pageIndex, IntSize& pageSize, int& marginTop, int& marginRight, int& marginBottom, int& marginLeft);
572
573     CachedResourceLoader* cachedResourceLoader() { return m_cachedResourceLoader.get(); }
574
575     void didBecomeCurrentDocumentInFrame();
576     void destroyRenderTree();
577     void disconnectFromFrame();
578     void prepareForDestruction();
579
580     // Override ScriptExecutionContext methods to do additional work
581     virtual void suspendActiveDOMObjects(ActiveDOMObject::ReasonForSuspension) override;
582     virtual void resumeActiveDOMObjects(ActiveDOMObject::ReasonForSuspension) override;
583     virtual void stopActiveDOMObjects() override;
584
585     RenderView* renderView() const { return m_renderView.get(); }
586
587     bool renderTreeBeingDestroyed() const { return m_renderTreeBeingDestroyed; }
588     bool hasLivingRenderTree() const { return renderView() && !renderTreeBeingDestroyed(); }
589
590     AXObjectCache* existingAXObjectCache() const;
591     AXObjectCache* axObjectCache() const;
592     void clearAXObjectCache();
593
594     // to get visually ordered hebrew and arabic pages right
595     void setVisuallyOrdered();
596     bool visuallyOrdered() const { return m_visuallyOrdered; }
597     
598     DocumentLoader* loader() const;
599
600     void open(Document* ownerDocument = 0);
601     void implicitOpen();
602
603     // close() is the DOM API document.close()
604     void close();
605     // In some situations (see the code), we ignore document.close().
606     // explicitClose() bypass these checks and actually tries to close the
607     // input stream.
608     void explicitClose();
609     // implicitClose() actually does the work of closing the input stream.
610     void implicitClose();
611
612     void cancelParsing();
613
614     void write(const SegmentedString& text, Document* ownerDocument = 0);
615     void write(const String& text, Document* ownerDocument = 0);
616     void writeln(const String& text, Document* ownerDocument = 0);
617
618     bool wellFormed() const { return m_wellFormed; }
619
620     virtual const URL& url() const override final { return m_url; }
621     void setURL(const URL&);
622
623     // To understand how these concepts relate to one another, please see the
624     // comments surrounding their declaration.
625     const URL& baseURL() const { return m_baseURL; }
626     void setBaseURLOverride(const URL&);
627     const URL& baseURLOverride() const { return m_baseURLOverride; }
628     const URL& baseElementURL() const { return m_baseElementURL; }
629     const String& baseTarget() const { return m_baseTarget; }
630     void processBaseElement();
631
632     virtual URL completeURL(const String&) const override final;
633     URL completeURL(const String&, const URL& baseURLOverride) const;
634
635     virtual String userAgent(const URL&) const override;
636
637     virtual void disableEval(const String& errorMessage) override;
638
639     bool canNavigate(Frame* targetFrame);
640     Frame* findUnsafeParentScrollPropagationBoundary();
641
642     CSSStyleSheet& elementSheet();
643     
644     virtual PassRefPtr<DocumentParser> createParser();
645     DocumentParser* parser() const { return m_parser.get(); }
646     ScriptableDocumentParser* scriptableDocumentParser() const;
647     
648     bool printing() const { return m_printing; }
649     void setPrinting(bool p) { m_printing = p; }
650
651     bool paginatedForScreen() const { return m_paginatedForScreen; }
652     void setPaginatedForScreen(bool p) { m_paginatedForScreen = p; }
653     
654     bool paginated() const { return printing() || paginatedForScreen(); }
655
656     enum CompatibilityMode { QuirksMode, LimitedQuirksMode, NoQuirksMode };
657
658     void setCompatibilityMode(CompatibilityMode m);
659     void lockCompatibilityMode() { m_compatibilityModeLocked = true; }
660     CompatibilityMode compatibilityMode() const { return m_compatibilityMode; }
661
662     String compatMode() const;
663
664     bool inQuirksMode() const { return m_compatibilityMode == QuirksMode; }
665     bool inLimitedQuirksMode() const { return m_compatibilityMode == LimitedQuirksMode; }
666     bool inNoQuirksMode() const { return m_compatibilityMode == NoQuirksMode; }
667
668     enum ReadyState {
669         Loading,
670         Interactive,
671         Complete
672     };
673     void setReadyState(ReadyState);
674     void setParsing(bool);
675     bool parsing() const { return m_bParsing; }
676     std::chrono::milliseconds minimumLayoutDelay();
677
678     bool shouldScheduleLayout();
679     bool isLayoutTimerActive();
680     std::chrono::milliseconds elapsedTime() const;
681     
682     void setTextColor(const Color& color) { m_textColor = color; }
683     Color textColor() const { return m_textColor; }
684
685     const Color& linkColor() const { return m_linkColor; }
686     const Color& visitedLinkColor() const { return m_visitedLinkColor; }
687     const Color& activeLinkColor() const { return m_activeLinkColor; }
688     void setLinkColor(const Color& c) { m_linkColor = c; }
689     void setVisitedLinkColor(const Color& c) { m_visitedLinkColor = c; }
690     void setActiveLinkColor(const Color& c) { m_activeLinkColor = c; }
691     void resetLinkColor();
692     void resetVisitedLinkColor();
693     void resetActiveLinkColor();
694     VisitedLinkState& visitedLinkState() const { return *m_visitedLinkState; }
695
696     MouseEventWithHitTestResults prepareMouseEvent(const HitTestRequest&, const LayoutPoint&, const PlatformMouseEvent&);
697
698     /* Newly proposed CSS3 mechanism for selecting alternate
699        stylesheets using the DOM. May be subject to change as
700        spec matures. - dwh
701     */
702     String preferredStylesheetSet() const;
703     String selectedStylesheetSet() const;
704     void setSelectedStylesheetSet(const String&);
705
706     bool setFocusedElement(PassRefPtr<Element>, FocusDirection = FocusDirectionNone);
707     Element* focusedElement() const { return m_focusedElement.get(); }
708     UserActionElementSet& userActionElements()  { return m_userActionElements; }
709     const UserActionElementSet& userActionElements() const { return m_userActionElements; }
710
711     // The m_ignoreAutofocus flag specifies whether or not the document has been changed by the user enough 
712     // for WebCore to ignore the autofocus attribute on any form controls
713     bool ignoreAutofocus() const { return m_ignoreAutofocus; };
714     void setIgnoreAutofocus(bool shouldIgnore = true) { m_ignoreAutofocus = shouldIgnore; };
715
716     void removeFocusedNodeOfSubtree(Node*, bool amongChildrenOnly = false);
717     void hoveredElementDidDetach(Element*);
718     void elementInActiveChainDidDetach(Element*);
719
720     void updateHoverActiveState(const HitTestRequest&, Element*, const PlatformMouseEvent* = 0, StyleResolverUpdateFlag = RecalcStyleIfNeeded);
721
722     // Updates for :target (CSS3 selector).
723     void setCSSTarget(Element*);
724     Element* cssTarget() const { return m_cssTarget; }
725     
726     void scheduleForcedStyleRecalc();
727     void scheduleStyleRecalc();
728     void unscheduleStyleRecalc();
729     bool hasPendingStyleRecalc() const;
730     bool hasPendingForcedStyleRecalc() const;
731     void styleRecalcTimerFired(Timer<Document>&);
732     void optimizedStyleSheetUpdateTimerFired(Timer<Document>&);
733
734     void registerNodeList(LiveNodeList&);
735     void unregisterNodeList(LiveNodeList&);
736     void registerCollection(HTMLCollection&);
737     void unregisterCollection(HTMLCollection&);
738     bool shouldInvalidateNodeListAndCollectionCaches(const QualifiedName* attrName = nullptr) const;
739     void invalidateNodeListAndCollectionCaches(const QualifiedName* attrName);
740
741     void attachNodeIterator(NodeIterator*);
742     void detachNodeIterator(NodeIterator*);
743     void moveNodeIteratorsToNewDocument(Node*, Document*);
744
745     void attachRange(Range*);
746     void detachRange(Range*);
747
748     void updateRangesAfterChildrenChanged(ContainerNode&);
749     // nodeChildrenWillBeRemoved is used when removing all node children at once.
750     void nodeChildrenWillBeRemoved(ContainerNode&);
751     // nodeWillBeRemoved is only safe when removing one node at a time.
752     void nodeWillBeRemoved(Node*);
753     bool canReplaceChild(Node* newChild, Node* oldChild);
754
755     void textInserted(Node*, unsigned offset, unsigned length);
756     void textRemoved(Node*, unsigned offset, unsigned length);
757     void textNodesMerged(Text* oldNode, unsigned offset);
758     void textNodeSplit(Text* oldNode);
759
760     void createDOMWindow();
761     void takeDOMWindowFrom(Document*);
762
763     DOMWindow* domWindow() const { return m_domWindow.get(); }
764     // In DOM Level 2, the Document's DOMWindow is called the defaultView.
765     DOMWindow* defaultView() const { return domWindow(); } 
766
767     // Helper functions for forwarding DOMWindow event related tasks to the DOMWindow if it exists.
768     void setWindowAttributeEventListener(const AtomicString& eventType, const QualifiedName& attributeName, const AtomicString& value);
769     void setWindowAttributeEventListener(const AtomicString& eventType, PassRefPtr<EventListener>);
770     EventListener* getWindowAttributeEventListener(const AtomicString& eventType);
771     void dispatchWindowEvent(PassRefPtr<Event>, PassRefPtr<EventTarget> = 0);
772     void dispatchWindowLoadEvent();
773
774     PassRefPtr<Event> createEvent(const String& eventType, ExceptionCode&);
775
776     // keep track of what types of event listeners are registered, so we don't
777     // dispatch events unnecessarily
778     enum ListenerType {
779         DOMSUBTREEMODIFIED_LISTENER          = 1,
780         DOMNODEINSERTED_LISTENER             = 1 << 1,
781         DOMNODEREMOVED_LISTENER              = 1 << 2,
782         DOMNODEREMOVEDFROMDOCUMENT_LISTENER  = 1 << 3,
783         DOMNODEINSERTEDINTODOCUMENT_LISTENER = 1 << 4,
784         DOMCHARACTERDATAMODIFIED_LISTENER    = 1 << 5,
785         OVERFLOWCHANGED_LISTENER             = 1 << 6,
786         ANIMATIONEND_LISTENER                = 1 << 7,
787         ANIMATIONSTART_LISTENER              = 1 << 8,
788         ANIMATIONITERATION_LISTENER          = 1 << 9,
789         TRANSITIONEND_LISTENER               = 1 << 10,
790         BEFORELOAD_LISTENER                  = 1 << 11,
791         SCROLL_LISTENER                      = 1 << 12
792         // 3 bits remaining
793     };
794
795     bool hasListenerType(ListenerType listenerType) const { return (m_listenerTypes & listenerType); }
796     void addListenerTypeIfNeeded(const AtomicString& eventType);
797
798     bool hasMutationObserversOfType(MutationObserver::MutationType type) const
799     {
800         return m_mutationObserverTypes & type;
801     }
802     bool hasMutationObservers() const { return m_mutationObserverTypes; }
803     void addMutationObserverTypes(MutationObserverOptions types) { m_mutationObserverTypes |= types; }
804
805     CSSStyleDeclaration* getOverrideStyle(Element*, const String& pseudoElt);
806
807     /**
808      * Handles a HTTP header equivalent set by a meta tag using <meta http-equiv="..." content="...">. This is called
809      * when a meta tag is encountered during document parsing, and also when a script dynamically changes or adds a meta
810      * tag. This enables scripts to use meta tags to perform refreshes and set expiry dates in addition to them being
811      * specified in a HTML file.
812      *
813      * @param equiv The http header name (value of the meta tag's "equiv" attribute)
814      * @param content The header value (value of the meta tag's "content" attribute)
815      */
816     void processHttpEquiv(const String& equiv, const String& content);
817
818 #if PLATFORM(IOS)
819     void processFormatDetection(const String&);
820
821     // Called when <meta name="apple-mobile-web-app-orientations"> changes.
822     void processWebAppOrientations();
823 #endif
824     
825     void processViewport(const String& features, ViewportArguments::Type origin);
826     void updateViewportArguments();
827     void processReferrerPolicy(const String& policy);
828
829     // Returns the owning element in the parent document.
830     // Returns 0 if this is the top level document.
831     HTMLFrameOwnerElement* ownerElement() const;
832
833     // Used by DOM bindings; no direction known.
834     String title() const { return m_title.string(); }
835     void setTitle(const String&);
836
837     void setTitleElement(const StringWithDirection&, Element* titleElement);
838     void removeTitle(Element* titleElement);
839
840     String cookie(ExceptionCode&) const;
841     void setCookie(const String&, ExceptionCode&);
842
843     String referrer() const;
844
845     String origin() const;
846
847     String domain() const;
848     void setDomain(const String& newDomain, ExceptionCode&);
849
850     String lastModified() const;
851
852     // The cookieURL is used to query the cookie database for this document's
853     // cookies. For example, if the cookie URL is http://example.com, we'll
854     // use the non-Secure cookies for example.com when computing
855     // document.cookie.
856     //
857     // Q: How is the cookieURL different from the document's URL?
858     // A: The two URLs are the same almost all the time.  However, if one
859     //    document inherits the security context of another document, it
860     //    inherits its cookieURL but not its URL.
861     //
862     const URL& cookieURL() const { return m_cookieURL; }
863     void setCookieURL(const URL& url) { m_cookieURL = url; }
864
865     // The firstPartyForCookies is used to compute whether this document
866     // appears in a "third-party" context for the purpose of third-party
867     // cookie blocking.  The document is in a third-party context if the
868     // cookieURL and the firstPartyForCookies are from different hosts.
869     //
870     // Note: Some ports (including possibly Apple's) only consider the
871     //       document in a third-party context if the cookieURL and the
872     //       firstPartyForCookies have a different registry-controlled
873     //       domain.
874     //
875     const URL& firstPartyForCookies() const { return m_firstPartyForCookies; }
876     void setFirstPartyForCookies(const URL& url) { m_firstPartyForCookies = url; }
877     
878     // The following implements the rule from HTML 4 for what valid names are.
879     // To get this right for all the XML cases, we probably have to improve this or move it
880     // and make it sensitive to the type of document.
881     static bool isValidName(const String&);
882
883     // The following breaks a qualified name into a prefix and a local name.
884     // It also does a validity check, and returns false if the qualified name
885     // is invalid.  It also sets ExceptionCode when name is invalid.
886     static bool parseQualifiedName(const String& qualifiedName, String& prefix, String& localName, ExceptionCode&);
887
888     // Checks to make sure prefix and namespace do not conflict (per DOM Core 3)
889     static bool hasValidNamespaceForElements(const QualifiedName&);
890     static bool hasValidNamespaceForAttributes(const QualifiedName&);
891
892     HTMLElement* body() const;
893     void setBody(PassRefPtr<HTMLElement>, ExceptionCode&);
894
895     HTMLHeadElement* head();
896
897     DocumentMarkerController& markers() const { return *m_markers; }
898
899     bool directionSetOnDocumentElement() const { return m_directionSetOnDocumentElement; }
900     bool writingModeSetOnDocumentElement() const { return m_writingModeSetOnDocumentElement; }
901     void setDirectionSetOnDocumentElement(bool b) { m_directionSetOnDocumentElement = b; }
902     void setWritingModeSetOnDocumentElement(bool b) { m_writingModeSetOnDocumentElement = b; }
903
904     bool execCommand(const String& command, bool userInterface = false, const String& value = String());
905     bool queryCommandEnabled(const String& command);
906     bool queryCommandIndeterm(const String& command);
907     bool queryCommandState(const String& command);
908     bool queryCommandSupported(const String& command);
909     String queryCommandValue(const String& command);
910
911     // designMode support
912     enum InheritedBool { off = false, on = true, inherit };    
913     void setDesignMode(InheritedBool value);
914     InheritedBool getDesignMode() const;
915     bool inDesignMode() const;
916
917     Document* parentDocument() const;
918     Document& topDocument() const;
919     
920     ScriptRunner* scriptRunner() { return m_scriptRunner.get(); }
921
922     HTMLScriptElement* currentScript() const { return !m_currentScriptStack.isEmpty() ? m_currentScriptStack.last().get() : 0; }
923     void pushCurrentScript(PassRefPtr<HTMLScriptElement>);
924     void popCurrentScript();
925
926 #if ENABLE(XSLT)
927     void applyXSLTransform(ProcessingInstruction* pi);
928     PassRefPtr<Document> transformSourceDocument() { return m_transformSourceDocument; }
929     void setTransformSourceDocument(Document* doc) { m_transformSourceDocument = doc; }
930
931     void setTransformSource(PassOwnPtr<TransformSource>);
932     TransformSource* transformSource() const { return m_transformSource.get(); }
933 #endif
934
935     void incDOMTreeVersion() { m_domTreeVersion = ++s_globalTreeVersion; }
936     uint64_t domTreeVersion() const { return m_domTreeVersion; }
937
938     // XPathEvaluator methods
939     PassRefPtr<XPathExpression> createExpression(const String& expression,
940                                                  XPathNSResolver* resolver,
941                                                  ExceptionCode& ec);
942     PassRefPtr<XPathNSResolver> createNSResolver(Node *nodeResolver);
943     PassRefPtr<XPathResult> evaluate(const String& expression,
944                                      Node* contextNode,
945                                      XPathNSResolver* resolver,
946                                      unsigned short type,
947                                      XPathResult* result,
948                                      ExceptionCode& ec);
949
950     enum PendingSheetLayout { NoLayoutWithPendingSheets, DidLayoutWithPendingSheets, IgnoreLayoutWithPendingSheets };
951
952     bool didLayoutWithPendingStylesheets() const { return m_pendingSheetLayout == DidLayoutWithPendingSheets; }
953
954     bool hasNodesWithPlaceholderStyle() const { return m_hasNodesWithPlaceholderStyle; }
955     void setHasNodesWithPlaceholderStyle() { m_hasNodesWithPlaceholderStyle = true; }
956
957     const Vector<IconURL>& shortcutIconURLs();
958     const Vector<IconURL>& iconURLs(int iconTypesMask);
959     void addIconURL(const String& url, const String& mimeType, const String& size, IconType);
960
961     void updateFocusAppearanceSoon(bool restorePreviousSelection);
962     void cancelFocusAppearanceUpdate();
963
964     void resetHiddenFocusElementSoon();
965
966     // Extension for manipulating canvas drawing contexts for use in CSS
967     CanvasRenderingContext* getCSSCanvasContext(const String& type, const String& name, int width, int height);
968     HTMLCanvasElement* getCSSCanvasElement(const String& name);
969
970     bool isDNSPrefetchEnabled() const { return m_isDNSPrefetchEnabled; }
971     void parseDNSPrefetchControlHeader(const String&);
972
973     virtual void postTask(PassOwnPtr<Task>) override; // Executes the task on context's thread asynchronously.
974
975     void suspendScriptedAnimationControllerCallbacks();
976     void resumeScriptedAnimationControllerCallbacks();
977     virtual void scriptedAnimationControllerSetThrottled(bool);
978     
979     void windowScreenDidChange(PlatformDisplayID);
980
981     void finishedParsing();
982
983     bool inPageCache() const { return m_inPageCache; }
984     void setInPageCache(bool flag);
985
986     // Elements can register themselves for the "documentWillSuspendForPageCache()" and  
987     // "documentDidResumeFromPageCache()" callbacks
988     void registerForPageCacheSuspensionCallbacks(Element*);
989     void unregisterForPageCacheSuspensionCallbacks(Element*);
990
991     void documentWillBecomeInactive();
992     void documentWillSuspendForPageCache();
993     void documentDidResumeFromPageCache();
994
995     void registerForMediaVolumeCallbacks(Element*);
996     void unregisterForMediaVolumeCallbacks(Element*);
997     void mediaVolumeDidChange();
998
999     void registerForPrivateBrowsingStateChangedCallbacks(Element*);
1000     void unregisterForPrivateBrowsingStateChangedCallbacks(Element*);
1001     void storageBlockingStateDidChange();
1002     void privateBrowsingStateDidChange();
1003
1004 #if ENABLE(VIDEO_TRACK)
1005     void registerForCaptionPreferencesChangedCallbacks(Element*);
1006     void unregisterForCaptionPreferencesChangedCallbacks(Element*);
1007     void captionPreferencesChanged();
1008 #endif
1009
1010 #if ENABLE(PAGE_VISIBILITY_API)
1011     void registerForVisibilityStateChangedCallbacks(Element*);
1012     void unregisterForVisibilityStateChangedCallbacks(Element*);
1013 #endif
1014
1015     void setShouldCreateRenderers(bool);
1016     bool shouldCreateRenderers();
1017
1018     void setDecoder(PassRefPtr<TextResourceDecoder>);
1019     TextResourceDecoder* decoder() const { return m_decoder.get(); }
1020
1021     String displayStringModifiedByEncoding(const String&) const;
1022     PassRefPtr<StringImpl> displayStringModifiedByEncoding(PassRefPtr<StringImpl>) const;
1023     void displayBufferModifiedByEncoding(LChar* buffer, unsigned len) const
1024     {
1025         displayBufferModifiedByEncodingInternal(buffer, len);
1026     }
1027     void displayBufferModifiedByEncoding(UChar* buffer, unsigned len) const
1028     {
1029         displayBufferModifiedByEncodingInternal(buffer, len);
1030     }
1031
1032     // Quirk for the benefit of Apple's Dictionary application.
1033     void setFrameElementsShouldIgnoreScrolling(bool ignore) { m_frameElementsShouldIgnoreScrolling = ignore; }
1034     bool frameElementsShouldIgnoreScrolling() const { return m_frameElementsShouldIgnoreScrolling; }
1035
1036 #if ENABLE(DASHBOARD_SUPPORT)
1037     void setAnnotatedRegionsDirty(bool f) { m_annotatedRegionsDirty = f; }
1038     bool annotatedRegionsDirty() const { return m_annotatedRegionsDirty; }
1039     bool hasAnnotatedRegions () const { return m_hasAnnotatedRegions; }
1040     void setHasAnnotatedRegions(bool f) { m_hasAnnotatedRegions = f; }
1041     const Vector<AnnotatedRegionValue>& annotatedRegions() const;
1042     void setAnnotatedRegions(const Vector<AnnotatedRegionValue>&);
1043 #endif
1044
1045     virtual void removeAllEventListeners() override;
1046
1047     const SVGDocumentExtensions* svgExtensions();
1048     SVGDocumentExtensions* accessSVGExtensions();
1049
1050     void initSecurityContext();
1051     void initContentSecurityPolicy();
1052
1053     void updateURLForPushOrReplaceState(const URL&);
1054     void statePopped(PassRefPtr<SerializedScriptValue>);
1055
1056     bool processingLoadEvent() const { return m_processingLoadEvent; }
1057     bool loadEventFinished() const { return m_loadEventFinished; }
1058
1059     virtual bool isContextThread() const override;
1060     virtual bool isJSExecutionForbidden() const override { return false; }
1061
1062     bool containsValidityStyleRules() const { return m_containsValidityStyleRules; }
1063     void setContainsValidityStyleRules() { m_containsValidityStyleRules = true; }
1064
1065     void enqueueWindowEvent(PassRefPtr<Event>);
1066     void enqueueDocumentEvent(PassRefPtr<Event>);
1067     void enqueueOverflowEvent(PassRefPtr<Event>);
1068     void enqueuePageshowEvent(PageshowEventPersistence);
1069     void enqueueHashchangeEvent(const String& oldURL, const String& newURL);
1070     void enqueuePopstateEvent(PassRefPtr<SerializedScriptValue> stateObject);
1071     virtual DocumentEventQueue& eventQueue() const override { return m_eventQueue; }
1072
1073     void addMediaCanStartListener(MediaCanStartListener*);
1074     void removeMediaCanStartListener(MediaCanStartListener*);
1075     MediaCanStartListener* takeAnyMediaCanStartListener();
1076
1077     const QualifiedName& idAttributeName() const { return m_idAttributeName; }
1078     
1079 #if ENABLE(FULLSCREEN_API)
1080     bool webkitIsFullScreen() const { return m_fullScreenElement.get(); }
1081     bool webkitFullScreenKeyboardInputAllowed() const { return m_fullScreenElement.get() && m_areKeysEnabledInFullScreen; }
1082     Element* webkitCurrentFullScreenElement() const { return m_fullScreenElement.get(); }
1083     
1084     enum FullScreenCheckType {
1085         EnforceIFrameAllowFullScreenRequirement,
1086         ExemptIFrameAllowFullScreenRequirement,
1087     };
1088
1089     void requestFullScreenForElement(Element*, unsigned short flags, FullScreenCheckType);
1090     void webkitCancelFullScreen();
1091     
1092     void webkitWillEnterFullScreenForElement(Element*);
1093     void webkitDidEnterFullScreenForElement(Element*);
1094     void webkitWillExitFullScreenForElement(Element*);
1095     void webkitDidExitFullScreenForElement(Element*);
1096     
1097     void setFullScreenRenderer(RenderFullScreen*);
1098     RenderFullScreen* fullScreenRenderer() const { return m_fullScreenRenderer; }
1099     void fullScreenRendererDestroyed();
1100     
1101     void fullScreenChangeDelayTimerFired(Timer<Document>&);
1102     bool fullScreenIsAllowedForElement(Element*) const;
1103     void fullScreenElementRemoved();
1104     void removeFullScreenElementOfSubtree(Node*, bool amongChildrenOnly = false);
1105     bool isAnimatingFullScreen() const;
1106     void setAnimatingFullScreen(bool);
1107
1108     // W3C API
1109     bool webkitFullscreenEnabled() const;
1110     Element* webkitFullscreenElement() const { return !m_fullScreenElementStack.isEmpty() ? m_fullScreenElementStack.last().get() : 0; }
1111     void webkitExitFullscreen();
1112 #endif
1113
1114 #if ENABLE(POINTER_LOCK)
1115     void webkitExitPointerLock();
1116     Element* webkitPointerLockElement() const;
1117 #endif
1118
1119     // Used to allow element that loads data without going through a FrameLoader to delay the 'load' event.
1120     void incrementLoadEventDelayCount() { ++m_loadEventDelayCount; }
1121     void decrementLoadEventDelayCount();
1122     bool isDelayingLoadEvent() const { return m_loadEventDelayCount; }
1123
1124 #if ENABLE(TOUCH_EVENTS)
1125 #if PLATFORM(IOS)
1126 #include <WebKitAdditions/DocumentIOS.h>
1127 #else
1128     PassRefPtr<Touch> createTouch(DOMWindow*, EventTarget*, int identifier, int pageX, int pageY, int screenX, int screenY, int radiusX, int radiusY, float rotationAngle, float force, ExceptionCode&) const;
1129 #endif // PLATFORM(IOS)
1130 #endif
1131
1132 #if ENABLE(DEVICE_ORIENTATION) && PLATFORM(IOS)
1133     DeviceMotionController* deviceMotionController() const;
1134     DeviceOrientationController* deviceOrientationController() const;
1135 #endif
1136
1137 #if ENABLE(WEB_TIMING)
1138     const DocumentTiming* timing() const { return &m_documentTiming; }
1139 #endif
1140
1141 #if ENABLE(REQUEST_ANIMATION_FRAME)
1142     int requestAnimationFrame(PassRefPtr<RequestAnimationFrameCallback>);
1143     void cancelAnimationFrame(int id);
1144     void serviceScriptedAnimations(double monotonicAnimationStartTime);
1145 #endif
1146
1147     virtual EventTarget* errorEventTarget() override;
1148     virtual void logExceptionToConsole(const String& errorMessage, const String& sourceURL, int lineNumber, int columnNumber, PassRefPtr<Inspector::ScriptCallStack>) override;
1149
1150     void initDNSPrefetch();
1151
1152     unsigned wheelEventHandlerCount() const { return m_wheelEventHandlerCount; }
1153     void didAddWheelEventHandler();
1154     void didRemoveWheelEventHandler();
1155
1156     double lastHandledUserGestureTimestamp() const { return m_lastHandledUserGestureTimestamp; }
1157     void resetLastHandledUserGestureTimestamp();
1158
1159 #if ENABLE(TOUCH_EVENTS)
1160     bool hasTouchEventHandlers() const { return (m_touchEventTargets.get()) ? m_touchEventTargets->size() : false; }
1161 #else
1162     bool hasTouchEventHandlers() const { return false; }
1163 #endif
1164
1165     void didAddTouchEventHandler(Node*);
1166     void didRemoveTouchEventHandler(Node*);
1167
1168 #if ENABLE(TOUCH_EVENTS)
1169     void didRemoveEventTargetNode(Node*);
1170 #endif
1171
1172 #if ENABLE(TOUCH_EVENTS)
1173     const TouchEventTargetSet* touchEventTargets() const { return m_touchEventTargets.get(); }
1174 #else
1175     const TouchEventTargetSet* touchEventTargets() const { return 0; }
1176 #endif
1177
1178     bool visualUpdatesAllowed() const { return m_visualUpdatesAllowed; }
1179
1180     bool isInDocumentWrite() { return m_writeRecursionDepth > 0; }
1181
1182     void suspendScheduledTasks(ActiveDOMObject::ReasonForSuspension);
1183     void resumeScheduledTasks(ActiveDOMObject::ReasonForSuspension);
1184
1185 #if ENABLE(CSS_DEVICE_ADAPTATION)
1186     IntSize initialViewportSize() const;
1187 #endif
1188
1189 #if ENABLE(TEXT_AUTOSIZING)
1190     TextAutosizer* textAutosizer() { return m_textAutosizer.get(); }
1191 #endif
1192
1193     void adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale(Vector<FloatQuad>&, const RenderStyle&);
1194     void adjustFloatRectForScrollAndAbsoluteZoomAndFrameScale(FloatRect&, const RenderStyle&);
1195
1196     bool hasActiveParser();
1197     void incrementActiveParserCount() { ++m_activeParserCount; }
1198     void decrementActiveParserCount();
1199
1200     DocumentSharedObjectPool* sharedObjectPool() { return m_sharedObjectPool.get(); }
1201
1202     void didRemoveAllPendingStylesheet();
1203     void setNeedsNotifyRemoveAllPendingStylesheet() { m_needsNotifyRemoveAllPendingStylesheet = true; }
1204     void clearStyleResolver();
1205
1206     bool inStyleRecalc() { return m_inStyleRecalc; }
1207
1208     // Return a Locale for the default locale if the argument is null or empty.
1209     Locale& getCachedLocale(const AtomicString& locale = nullAtom);
1210
1211 #if ENABLE(TEMPLATE_ELEMENT)
1212     const Document* templateDocument() const;
1213     Document* ensureTemplateDocument();
1214     void setTemplateDocumentHost(Document* templateDocumentHost) { m_templateDocumentHost = templateDocumentHost; }
1215     Document* templateDocumentHost() { return m_templateDocumentHost; }
1216 #endif
1217
1218     void didAssociateFormControl(Element*);
1219
1220     virtual void addConsoleMessage(MessageSource, MessageLevel, const String& message, unsigned long requestIdentifier = 0) override;
1221
1222     virtual SecurityOrigin* topOrigin() const override;
1223
1224 #if ENABLE(FONT_LOAD_EVENTS)
1225     PassRefPtr<FontLoader> fontloader();
1226 #endif
1227
1228     void ensurePlugInsInjectedScript(DOMWrapperWorld&);
1229
1230     void setVisualUpdatesAllowedByClient(bool);
1231
1232 #if ENABLE(SUBTLE_CRYPTO)
1233     virtual bool wrapCryptoKey(const Vector<uint8_t>& key, Vector<uint8_t>& wrappedKey) override;
1234     virtual bool unwrapCryptoKey(const Vector<uint8_t>& wrappedKey, Vector<uint8_t>& key) override;
1235 #endif
1236
1237 protected:
1238     enum ConstructionFlags { Synthesized = 1, NonRenderedPlaceholder = 1 << 1 };
1239     Document(Frame*, const URL&, unsigned = DefaultDocumentClass, unsigned constructionFlags = 0);
1240
1241     void clearXMLVersion() { m_xmlVersion = String(); }
1242
1243     virtual PassRefPtr<Document> cloneDocumentWithoutChildren() const;
1244
1245 private:
1246     friend class Node;
1247     friend class IgnoreDestructiveWriteCountIncrementer;
1248
1249     void commonTeardown();
1250
1251     RenderObject* renderer() const = delete;
1252     void setRenderer(RenderObject*) = delete;
1253
1254     void createRenderTree();
1255     void detachParser();
1256
1257     virtual void dropChildren() override;
1258
1259     typedef void (*ArgumentsCallback)(const String& keyString, const String& valueString, Document*, void* data);
1260     void processArguments(const String& features, void* data, ArgumentsCallback);
1261
1262     virtual bool isDocument() const override { return true; }
1263
1264     virtual void childrenChanged(const ChildChange&) override;
1265
1266     virtual String nodeName() const override;
1267     virtual NodeType nodeType() const override;
1268     virtual bool childTypeAllowed(NodeType) const override;
1269     virtual PassRefPtr<Node> cloneNode(bool deep) override;
1270     void cloneDataFromDocument(const Document&);
1271
1272     virtual void refScriptExecutionContext() override { ref(); }
1273     virtual void derefScriptExecutionContext() override { deref(); }
1274
1275     virtual void addMessage(MessageSource, MessageLevel, const String& message, const String& sourceURL, unsigned lineNumber, unsigned columnNumber, PassRefPtr<Inspector::ScriptCallStack>, JSC::ExecState* = 0, unsigned long requestIdentifier = 0) override;
1276
1277     virtual double minimumTimerInterval() const override;
1278
1279     virtual double timerAlignmentInterval() const override;
1280
1281     void updateTitle(const StringWithDirection&);
1282     void updateFocusAppearanceTimerFired(Timer<Document>&);
1283     void updateBaseURL();
1284
1285     void resetHiddenFocusElementTimer(Timer<Document>&);
1286
1287     void buildAccessKeyMap(TreeScope* root);
1288
1289     void createStyleResolver();
1290
1291     void loadEventDelayTimerFired(Timer<Document>&);
1292
1293     void pendingTasksTimerFired(Timer<Document>&);
1294
1295     static void didReceiveTask(void*);
1296     
1297     template <typename CharacterType>
1298     void displayBufferModifiedByEncodingInternal(CharacterType*, unsigned) const;
1299
1300 #if ENABLE(PAGE_VISIBILITY_API)
1301     PageVisibilityState pageVisibilityState() const;
1302 #endif
1303
1304     PassRefPtr<HTMLCollection> ensureCachedCollection(CollectionType);
1305
1306 #if ENABLE(FULLSCREEN_API)
1307     void dispatchFullScreenChangeOrErrorEvent(Deque<RefPtr<Node>>&, const AtomicString& eventName, bool shouldNotifyMediaElement);
1308     void clearFullscreenElementStack();
1309     void popFullscreenElementStack();
1310     void pushFullscreenElementStack(Element*);
1311     void addDocumentToFullScreenChangeEventQueue(Document*);
1312 #endif
1313
1314     void setVisualUpdatesAllowed(ReadyState);
1315     void setVisualUpdatesAllowed(bool);
1316     void visualUpdatesSuppressionTimerFired(Timer<Document>&);
1317
1318     void addListenerType(ListenerType listenerType) { m_listenerTypes |= listenerType; }
1319
1320     void didAssociateFormControlsTimerFired(Timer<Document>&);
1321
1322     void styleResolverThrowawayTimerFired(DeferrableOneShotTimer<Document>&);
1323     DeferrableOneShotTimer<Document> m_styleResolverThrowawayTimer;
1324
1325     OwnPtr<StyleResolver> m_styleResolver;
1326     bool m_didCalculateStyleResolver;
1327     bool m_hasNodesWithPlaceholderStyle;
1328     bool m_needsNotifyRemoveAllPendingStylesheet;
1329     // But sometimes you need to ignore pending stylesheet count to
1330     // force an immediate layout when requested by JS.
1331     bool m_ignorePendingStylesheets;
1332
1333     // If we do ignore the pending stylesheet count, then we need to add a boolean
1334     // to track that this happened so that we can do a full repaint when the stylesheets
1335     // do eventually load.
1336     PendingSheetLayout m_pendingSheetLayout;
1337
1338     Frame* m_frame;
1339     RefPtr<DOMWindow> m_domWindow;
1340
1341     RefPtr<CachedResourceLoader> m_cachedResourceLoader;
1342     RefPtr<DocumentParser> m_parser;
1343     unsigned m_activeParserCount;
1344
1345     bool m_wellFormed;
1346
1347     // Document URLs.
1348     URL m_url; // Document.URL: The URL from which this document was retrieved.
1349     URL m_baseURL; // Node.baseURI: The URL to use when resolving relative URLs.
1350     URL m_baseURLOverride; // An alternative base URL that takes precedence over m_baseURL (but not m_baseElementURL).
1351     URL m_baseElementURL; // The URL set by the <base> element.
1352     URL m_cookieURL; // The URL to use for cookie access.
1353     URL m_firstPartyForCookies; // The policy URL for third-party cookie blocking.
1354
1355     // Document.documentURI:
1356     // Although URL-like, Document.documentURI can actually be set to any
1357     // string by content.  Document.documentURI affects m_baseURL unless the
1358     // document contains a <base> element, in which case the <base> element
1359     // takes precedence.
1360     //
1361     // This property is read-only from JavaScript, but writable from Objective C.
1362     String m_documentURI;
1363
1364     String m_baseTarget;
1365
1366     OwnPtr<DOMImplementation> m_implementation;
1367
1368     RefPtr<CSSStyleSheet> m_elementSheet;
1369
1370     bool m_printing;
1371     bool m_paginatedForScreen;
1372
1373     bool m_ignoreAutofocus;
1374
1375     CompatibilityMode m_compatibilityMode;
1376     bool m_compatibilityModeLocked; // This is cheaper than making setCompatibilityMode virtual.
1377
1378     Color m_textColor;
1379
1380     RefPtr<Element> m_focusedElement;
1381     RefPtr<Element> m_hoveredElement;
1382     RefPtr<Element> m_activeElement;
1383     RefPtr<Element> m_documentElement;
1384     UserActionElementSet m_userActionElements;
1385
1386     uint64_t m_domTreeVersion;
1387     static uint64_t s_globalTreeVersion;
1388     
1389     HashSet<NodeIterator*> m_nodeIterators;
1390     HashSet<Range*> m_ranges;
1391
1392     unsigned short m_listenerTypes;
1393
1394     MutationObserverOptions m_mutationObserverTypes;
1395
1396     DocumentStyleSheetCollection m_styleSheetCollection;
1397     RefPtr<StyleSheetList> m_styleSheetList;
1398
1399     OwnPtr<FormController> m_formController;
1400
1401     Color m_linkColor;
1402     Color m_visitedLinkColor;
1403     Color m_activeLinkColor;
1404     const OwnPtr<VisitedLinkState> m_visitedLinkState;
1405
1406     bool m_visuallyOrdered;
1407     ReadyState m_readyState;
1408     bool m_bParsing;
1409
1410     Timer<Document> m_optimizedStyleSheetUpdateTimer;
1411     Timer<Document> m_styleRecalcTimer;
1412     bool m_pendingStyleRecalcShouldForce;
1413     bool m_inStyleRecalc;
1414     bool m_closeAfterStyleRecalc;
1415
1416     bool m_gotoAnchorNeededAfterStylesheetsLoad;
1417     bool m_isDNSPrefetchEnabled;
1418     bool m_haveExplicitlyDisabledDNSPrefetch;
1419     bool m_frameElementsShouldIgnoreScrolling;
1420     bool m_containsValidityStyleRules;
1421     bool m_updateFocusAppearanceRestoresSelection;
1422
1423     // http://www.whatwg.org/specs/web-apps/current-work/#ignore-destructive-writes-counter
1424     unsigned m_ignoreDestructiveWriteCount;
1425
1426     StringWithDirection m_title;
1427     StringWithDirection m_rawTitle;
1428     bool m_titleSetExplicitly;
1429     RefPtr<Element> m_titleElement;
1430
1431     OwnPtr<AXObjectCache> m_axObjectCache;
1432     const OwnPtr<DocumentMarkerController> m_markers;
1433     
1434     Timer<Document> m_updateFocusAppearanceTimer;
1435     Timer<Document> m_resetHiddenFocusElementTimer;
1436
1437     Element* m_cssTarget;
1438
1439     // FIXME: Merge these 2 variables into an enum. Also, FrameLoader::m_didCallImplicitClose
1440     // is almost a duplication of this data, so that should probably get merged in too.
1441     // FIXME: Document::m_processingLoadEvent and DocumentLoader::m_wasOnloadHandled are roughly the same
1442     // and should be merged.
1443     bool m_processingLoadEvent;
1444     bool m_loadEventFinished;
1445
1446     RefPtr<SerializedScriptValue> m_pendingStateObject;
1447     std::chrono::steady_clock::time_point m_startTime;
1448     bool m_overMinimumLayoutThreshold;
1449     
1450     std::unique_ptr<ScriptRunner> m_scriptRunner;
1451
1452     Vector<RefPtr<HTMLScriptElement>> m_currentScriptStack;
1453
1454 #if ENABLE(XSLT)
1455     OwnPtr<TransformSource> m_transformSource;
1456     RefPtr<Document> m_transformSourceDocument;
1457 #endif
1458
1459     String m_xmlEncoding;
1460     String m_xmlVersion;
1461     unsigned m_xmlStandalone : 2;
1462     unsigned m_hasXMLDeclaration : 1;
1463
1464     String m_contentLanguage;
1465
1466     RefPtr<TextResourceDecoder> m_decoder;
1467
1468     InheritedBool m_designMode;
1469
1470     HashSet<LiveNodeList*> m_listsInvalidatedAtDocument;
1471     HashSet<HTMLCollection*> m_collectionsInvalidatedAtDocument;
1472
1473     unsigned m_nodeListAndCollectionCounts[numNodeListInvalidationTypes];
1474
1475     RefPtr<XPathEvaluator> m_xpathEvaluator;
1476
1477     OwnPtr<SVGDocumentExtensions> m_svgExtensions;
1478
1479 #if ENABLE(DASHBOARD_SUPPORT)
1480     Vector<AnnotatedRegionValue> m_annotatedRegions;
1481     bool m_hasAnnotatedRegions;
1482     bool m_annotatedRegionsDirty;
1483 #endif
1484
1485     HashMap<String, RefPtr<HTMLCanvasElement>> m_cssCanvasElements;
1486
1487     bool m_createRenderers;
1488     bool m_inPageCache;
1489     Vector<IconURL> m_iconURLs;
1490
1491     HashSet<Element*> m_documentSuspensionCallbackElements;
1492     HashSet<Element*> m_mediaVolumeCallbackElements;
1493     HashSet<Element*> m_privateBrowsingStateChangedElements;
1494 #if ENABLE(VIDEO_TRACK)
1495     HashSet<Element*> m_captionPreferencesChangedElements;
1496 #endif
1497
1498 #if ENABLE(PAGE_VISIBILITY_API)
1499     HashSet<Element*> m_visibilityStateCallbackElements;
1500 #endif
1501
1502     HashMap<StringImpl*, Element*, CaseFoldingHash> m_elementsByAccessKey;
1503     bool m_accessKeyMapValid;
1504
1505     DocumentOrderedMap m_imagesByUsemap;
1506
1507     OwnPtr<SelectorQueryCache> m_selectorQueryCache;
1508
1509     DocumentClassFlags m_documentClasses;
1510
1511     bool m_isSynthesized;
1512     bool m_isNonRenderedPlaceholder;
1513
1514     bool m_isViewSource;
1515     bool m_sawElementsInKnownNamespaces;
1516     bool m_isSrcdocDocument;
1517
1518     RenderPtr<RenderView> m_renderView;
1519     mutable DocumentEventQueue m_eventQueue;
1520
1521     WeakPtrFactory<Document> m_weakFactory;
1522
1523     HashSet<MediaCanStartListener*> m_mediaCanStartListeners;
1524
1525     QualifiedName m_idAttributeName;
1526
1527 #if ENABLE(FULLSCREEN_API)
1528     bool m_areKeysEnabledInFullScreen;
1529     RefPtr<Element> m_fullScreenElement;
1530     Vector<RefPtr<Element>> m_fullScreenElementStack;
1531     RenderFullScreen* m_fullScreenRenderer;
1532     Timer<Document> m_fullScreenChangeDelayTimer;
1533     Deque<RefPtr<Node>> m_fullScreenChangeEventTargetQueue;
1534     Deque<RefPtr<Node>> m_fullScreenErrorEventTargetQueue;
1535     bool m_isAnimatingFullScreen;
1536     LayoutRect m_savedPlaceholderFrameRect;
1537     RefPtr<RenderStyle> m_savedPlaceholderRenderStyle;
1538 #endif
1539
1540     int m_loadEventDelayCount;
1541     Timer<Document> m_loadEventDelayTimer;
1542
1543     ViewportArguments m_viewportArguments;
1544
1545     ReferrerPolicy m_referrerPolicy;
1546
1547     bool m_directionSetOnDocumentElement;
1548     bool m_writingModeSetOnDocumentElement;
1549
1550 #if ENABLE(WEB_TIMING)
1551     DocumentTiming m_documentTiming;
1552 #endif
1553
1554     RefPtr<MediaQueryMatcher> m_mediaQueryMatcher;
1555     bool m_writeRecursionIsTooDeep;
1556     unsigned m_writeRecursionDepth;
1557     
1558     unsigned m_wheelEventHandlerCount;
1559 #if ENABLE(TOUCH_EVENTS)
1560     OwnPtr<TouchEventTargetSet> m_touchEventTargets;
1561 #endif
1562
1563     double m_lastHandledUserGestureTimestamp;
1564
1565 #if ENABLE(REQUEST_ANIMATION_FRAME)
1566     void clearScriptedAnimationController();
1567     RefPtr<ScriptedAnimationController> m_scriptedAnimationController;
1568 #endif
1569
1570 #if ENABLE(DEVICE_ORIENTATION) && PLATFORM(IOS)
1571     // FIXME: Use std::unique_ptr instead of OwnPtr after we upstream DeviceMotionClientIOS.{h, mm}.
1572     OwnPtr<DeviceMotionClient> m_deviceMotionClient;
1573     OwnPtr<DeviceMotionController> m_deviceMotionController;
1574     OwnPtr<DeviceOrientationClient> m_deviceOrientationClient;
1575     OwnPtr<DeviceOrientationController> m_deviceOrientationController;
1576 #endif
1577
1578 // FIXME: Find a better place for this functionality.
1579 #if PLATFORM(IOS)
1580 public:
1581
1582     // These functions provide a two-level setting:
1583     //    - A user-settable wantsTelephoneNumberParsing (at the Page / WebView level)
1584     //    - A read-only telephoneNumberParsingAllowed which is set by the
1585     //      document if it has the appropriate meta tag.
1586     //    - isTelephoneNumberParsingEnabled() == isTelephoneNumberParsingAllowed() && page()->settings()->isTelephoneNumberParsingEnabled()
1587
1588     bool isTelephoneNumberParsingAllowed() const;
1589     bool isTelephoneNumberParsingEnabled() const;
1590
1591 private:
1592     friend void setParserFeature(const String& key, const String& value, Document*, void* userData);
1593     void setIsTelephoneNumberParsingAllowed(bool);
1594
1595     bool m_isTelephoneNumberParsingAllowed;
1596 #endif
1597
1598     Timer<Document> m_pendingTasksTimer;
1599     Vector<OwnPtr<Task>> m_pendingTasks;
1600
1601 #if ENABLE(IOS_TEXT_AUTOSIZING)
1602 public:
1603     void addAutoSizingNode(Node*, float size);
1604     void validateAutoSizingNodes();
1605     void resetAutoSizingNodes();
1606
1607 private:
1608     typedef HashMap<TextAutoSizingKey, RefPtr<TextAutoSizingValue>, TextAutoSizingHash, TextAutoSizingTraits> TextAutoSizingMap;
1609     TextAutoSizingMap m_textAutoSizedNodes;
1610 #endif
1611
1612 #if ENABLE(TEXT_AUTOSIZING)
1613     OwnPtr<TextAutosizer> m_textAutosizer;
1614 #endif
1615
1616     void platformSuspendOrStopActiveDOMObjects();
1617
1618     bool m_scheduledTasksAreSuspended;
1619     
1620     bool m_visualUpdatesAllowed;
1621     Timer<Document> m_visualUpdatesSuppressionTimer;
1622
1623     RefPtr<NamedFlowCollection> m_namedFlows;
1624
1625 #if ENABLE(CSP_NEXT)
1626     RefPtr<DOMSecurityPolicy> m_domSecurityPolicy;
1627 #endif
1628
1629     void sharedObjectPoolClearTimerFired(Timer<Document>&);
1630     Timer<Document> m_sharedObjectPoolClearTimer;
1631
1632     OwnPtr<DocumentSharedObjectPool> m_sharedObjectPool;
1633
1634 #ifndef NDEBUG
1635     bool m_didDispatchViewportPropertiesChanged;
1636 #endif
1637
1638     typedef HashMap<AtomicString, OwnPtr<Locale>> LocaleIdentifierToLocaleMap;
1639     LocaleIdentifierToLocaleMap m_localeCache;
1640
1641 #if ENABLE(TEMPLATE_ELEMENT)
1642     RefPtr<Document> m_templateDocument;
1643     Document* m_templateDocumentHost; // Manually managed weakref (backpointer from m_templateDocument).
1644 #endif
1645
1646 #if ENABLE(FONT_LOAD_EVENTS)
1647     RefPtr<FontLoader> m_fontloader;
1648 #endif
1649
1650 #if ENABLE(WEB_REPLAY)
1651     RefPtr<InputCursor> m_inputCursor;
1652 #endif
1653
1654     Timer<Document> m_didAssociateFormControlsTimer;
1655     HashSet<RefPtr<Element>> m_associatedFormControls;
1656
1657     bool m_hasInjectedPlugInsScript;
1658     bool m_renderTreeBeingDestroyed;
1659 };
1660
1661 inline void Document::notifyRemovePendingSheetIfNeeded()
1662 {
1663     if (m_needsNotifyRemoveAllPendingStylesheet)
1664         didRemoveAllPendingStylesheet();
1665 }
1666
1667 #if ENABLE(TEMPLATE_ELEMENT)
1668 inline const Document* Document::templateDocument() const
1669 {
1670     // If DOCUMENT does not have a browsing context, Let TEMPLATE CONTENTS OWNER be DOCUMENT and abort these steps.
1671     if (!m_frame)
1672         return this;
1673
1674     return m_templateDocument.get();
1675 }
1676 #endif
1677
1678 // Put these methods here, because they require the Document definition, but we really want to inline them.
1679
1680 inline bool Node::isDocumentNode() const
1681 {
1682     return this == documentInternal();
1683 }
1684
1685 inline Node::Node(Document* document, ConstructionType type)
1686     : m_nodeFlags(type)
1687     , m_parentNode(0)
1688     , m_treeScope(document ? document : &TreeScope::noDocumentInstance())
1689     , m_previous(0)
1690     , m_next(0)
1691 {
1692     m_treeScope->selfOnlyRef();
1693
1694 #if !defined(NDEBUG) || (defined(DUMP_NODE_STATISTICS) && DUMP_NODE_STATISTICS)
1695     trackForDebugging();
1696 #endif
1697
1698     InspectorCounters::incrementCounter(InspectorCounters::NodeCounter);
1699 }
1700
1701 inline ScriptExecutionContext* Node::scriptExecutionContext() const
1702 {
1703     return &document();
1704 }
1705
1706 Element* eventTargetElementForDocument(Document*);
1707
1708 SCRIPT_EXECUTION_CONTEXT_TYPE_CASTS(Document)
1709
1710 inline bool isDocument(const Node& node) { return node.isDocumentNode(); }
1711 void isDocument(const Document&); // Catch unnecessary runtime check of type known at compile time.
1712
1713 NODE_TYPE_CASTS(Document)
1714
1715 #define DOCUMENT_TYPE_CASTS(ToClassName) \
1716     TYPE_CASTS_BASE(ToClassName, Document, document, WebCore::is##ToClassName(*document), WebCore::is##ToClassName(document))
1717
1718 } // namespace WebCore
1719
1720 namespace WTF {
1721 inline WebCore::Document* getPtr(WebCore::Document& p) { return &p; }
1722 }
1723
1724 #endif // Document_h