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