Modernize and tighten up HTMLDocumentParser
[WebKit-https.git] / Source / WebCore / html / parser / HTMLDocumentParser.h
1 /*
2  * Copyright (C) 2010 Google, Inc. All Rights Reserved.
3  * Copyright (C) 2015 Apple Inc. All Rights Reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #ifndef HTMLDocumentParser_h
28 #define HTMLDocumentParser_h
29
30 #include "CachedResourceClient.h"
31 #include "HTMLInputStream.h"
32 #include "HTMLScriptRunnerHost.h"
33 #include "HTMLSourceTracker.h"
34 #include "HTMLTokenizer.h"
35 #include "ScriptableDocumentParser.h"
36 #include "XSSAuditor.h"
37 #include "XSSAuditorDelegate.h"
38
39 namespace WebCore {
40
41 class DocumentFragment;
42 class HTMLDocument;
43 class HTMLParserScheduler;
44 class HTMLPreloadScanner;
45 class HTMLScriptRunner;
46 class HTMLTreeBuilder;
47 class HTMLResourcePreloader;
48 class PumpSession;
49
50 class HTMLDocumentParser : public ScriptableDocumentParser, private HTMLScriptRunnerHost, private CachedResourceClient {
51     WTF_MAKE_FAST_ALLOCATED;
52 public:
53     static Ref<HTMLDocumentParser> create(HTMLDocument&);
54     virtual ~HTMLDocumentParser();
55
56     static void parseDocumentFragment(const String&, DocumentFragment&, Element& contextElement, ParserContentPolicy = AllowScriptingContent);
57
58     // For HTMLParserScheduler.
59     void resumeParsingAfterYield();
60
61     // For HTMLTreeBuilder.
62     HTMLTokenizer& tokenizer();
63     virtual TextPosition textPosition() const override final;
64
65 protected:
66     explicit HTMLDocumentParser(HTMLDocument&);
67
68     virtual void insert(const SegmentedString&) override final;
69     virtual void append(PassRefPtr<StringImpl>) override;
70     virtual void finish() override;
71
72     HTMLTreeBuilder& treeBuilder();
73
74 private:
75     HTMLDocumentParser(DocumentFragment&, Element& contextElement, ParserContentPolicy);
76     static Ref<HTMLDocumentParser> create(DocumentFragment&, Element& contextElement, ParserContentPolicy);
77
78     // DocumentParser
79     virtual void detach() override final;
80     virtual bool hasInsertionPoint() override final;
81     virtual bool processingData() const override final;
82     virtual void prepareToStopParsing() override final;
83     virtual void stopParsing() override final;
84     virtual bool isWaitingForScripts() const override;
85     virtual bool isExecutingScript() const override final;
86     virtual void executeScriptsWaitingForStylesheets() override final;
87     virtual void suspendScheduledTasks() override final;
88     virtual void resumeScheduledTasks() override final;
89
90     // HTMLScriptRunnerHost
91     virtual void watchForLoad(CachedResource*) override final;
92     virtual void stopWatchingForLoad(CachedResource*) override final;
93     virtual HTMLInputStream& inputStream() override final;
94     virtual bool hasPreloadScanner() const override final;
95     virtual void appendCurrentInputStreamToPreloadScannerAndScan() override final;
96
97     // CachedResourceClient
98     virtual void notifyFinished(CachedResource*) override final;
99
100     Document* contextForParsingSession();
101
102     enum SynchronousMode { AllowYield, ForceSynchronous };
103     bool canTakeNextToken(SynchronousMode, PumpSession&);
104     void pumpTokenizer(SynchronousMode);
105     void pumpTokenizerIfPossible(SynchronousMode);
106     void constructTreeFromHTMLToken(HTMLToken&);
107
108     void runScriptsForPausedTreeBuilder();
109     void resumeParsingAfterScriptExecution();
110
111     void attemptToEnd();
112     void endIfDelayed();
113     void attemptToRunDeferredScriptsAndEnd();
114     void end();
115
116     bool isParsingFragment() const;
117     bool isScheduledForResume() const;
118     bool inPumpSession() const;
119     bool shouldDelayEnd() const;
120
121     HTMLParserOptions m_options;
122     HTMLInputStream m_input;
123
124     HTMLToken m_token;
125     HTMLTokenizer m_tokenizer;
126     std::unique_ptr<HTMLScriptRunner> m_scriptRunner;
127     std::unique_ptr<HTMLTreeBuilder> m_treeBuilder;
128     std::unique_ptr<HTMLPreloadScanner> m_preloadScanner;
129     std::unique_ptr<HTMLPreloadScanner> m_insertionPreloadScanner;
130     std::unique_ptr<HTMLParserScheduler> m_parserScheduler;
131     HTMLSourceTracker m_sourceTracker;
132     TextPosition m_textPosition;
133     XSSAuditor m_xssAuditor;
134     XSSAuditorDelegate m_xssAuditorDelegate;
135
136     std::unique_ptr<HTMLResourcePreloader> m_preloader;
137
138     bool m_endWasDelayed { false };
139     unsigned m_pumpSessionNestingLevel { 0 };
140 };
141
142 inline HTMLTokenizer& HTMLDocumentParser::tokenizer()
143 {
144     return m_tokenizer;
145 }
146
147 inline HTMLInputStream& HTMLDocumentParser::inputStream()
148 {
149     return m_input;
150 }
151
152 inline bool HTMLDocumentParser::hasPreloadScanner() const
153 {
154     return m_preloadScanner.get();
155 }
156
157 inline HTMLTreeBuilder& HTMLDocumentParser::treeBuilder()
158 {
159     ASSERT(m_treeBuilder);
160     return *m_treeBuilder;
161 }
162
163 }
164
165 #endif