Changeset 145398 in webkit
- Timestamp:
- Mar 11, 2013, 1:53:47 PM (14 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 added
- 8 edited
-
CMakeLists.txt (modified) (1 diff)
-
ChangeLog (modified) (1 diff)
-
GNUmakefile.list.am (modified) (1 diff)
-
Target.pri (modified) (1 diff)
-
WebCore.gypi (modified) (1 diff)
-
WebCore.vcproj/WebCore.vcproj (modified) (1 diff)
-
html/parser/BackgroundHTMLParser.cpp (modified) (5 diffs)
-
html/parser/BackgroundHTMLParser.h (modified) (3 diffs)
-
html/parser/HTMLTreeBuilderSimulator.cpp (added)
-
html/parser/HTMLTreeBuilderSimulator.h (added)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/CMakeLists.txt
r145354 r145398 1563 1563 html/parser/HTMLTokenizer.cpp 1564 1564 html/parser/HTMLTreeBuilder.cpp 1565 html/parser/HTMLTreeBuilderSimulator.cpp 1565 1566 html/parser/HTMLViewSourceParser.cpp 1566 1567 html/parser/TextDocumentParser.cpp -
trunk/Source/WebCore/ChangeLog
r145397 r145398 1 2013-03-11 Adam Barth <abarth@webkit.org> 2 3 Factor HTMLTreeBuilderSimulator out of BackgroundHTMLParser 4 https://bugs.webkit.org/show_bug.cgi?id=112057 5 6 Reviewed by Eric Seidel. 7 8 Simulating the HTML tree builder is a separate concern from parsing on 9 the background thread. We plan to re-use the tree builder simulator for 10 the view-source parser, for example. Also, having the simulator as a 11 separate object will make it easier to fix 12 https://bugs.webkit.org/show_bug.cgi?id=109764. 13 14 * CMakeLists.txt: 15 * GNUmakefile.list.am: 16 * Target.pri: 17 * WebCore.gypi: 18 * WebCore.vcproj/WebCore.vcproj: 19 * html/parser/BackgroundHTMLParser.cpp: 20 (WebCore): 21 (WebCore::BackgroundHTMLParser::BackgroundHTMLParser): 22 (WebCore::BackgroundHTMLParser::pumpTokenizer): 23 * html/parser/BackgroundHTMLParser.h: 24 (BackgroundHTMLParser): 25 1 26 2013-02-26 Dima Gorbik <dgorbik@apple.com> 2 27 -
trunk/Source/WebCore/GNUmakefile.list.am
r145354 r145398 3645 3645 Source/WebCore/html/parser/HTMLTreeBuilder.cpp \ 3646 3646 Source/WebCore/html/parser/HTMLTreeBuilder.h \ 3647 Source/WebCore/html/parser/HTMLTreeBuilderSimulator.cpp \ 3648 Source/WebCore/html/parser/HTMLTreeBuilderSimulator.h \ 3647 3649 Source/WebCore/html/parser/HTMLViewSourceParser.cpp \ 3648 3650 Source/WebCore/html/parser/HTMLViewSourceParser.h \ -
trunk/Source/WebCore/Target.pri
r145354 r145398 748 748 html/parser/HTMLTokenizer.cpp \ 749 749 html/parser/HTMLTreeBuilder.cpp \ 750 html/parser/HTMLTreeBuilderSimulator.cpp \ 750 751 html/parser/HTMLViewSourceParser.cpp \ 751 752 html/parser/TextDocumentParser.cpp \ -
trunk/Source/WebCore/WebCore.gypi
r145354 r145398 3533 3533 'html/parser/HTMLTreeBuilder.cpp', 3534 3534 'html/parser/HTMLTreeBuilder.h', 3535 'html/parser/HTMLTreeBuilderSimulator.cpp', 3536 'html/parser/HTMLTreeBuilderSimulator.h', 3535 3537 'html/parser/HTMLViewSourceParser.cpp', 3536 3538 'html/parser/HTMLViewSourceParser.h', -
trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj
r145292 r145398 65203 65203 </File> 65204 65204 <File 65205 RelativePath="..\html\parser\HTMLTreeBuilderSimulator.cpp" 65206 > 65207 </File> 65208 <File 65209 RelativePath="..\html\parser\HTMLTreeBuilderSimulator.h" 65210 > 65211 </File> 65212 <File 65205 65213 RelativePath="..\html\parser\HTMLViewSourceParser.cpp" 65206 65214 > -
trunk/Source/WebCore/html/parser/BackgroundHTMLParser.cpp
r145292 r145398 31 31 32 32 #include "HTMLDocumentParser.h" 33 #include "HTMLNames.h"34 33 #include "HTMLParserIdioms.h" 35 34 #include "HTMLParserThread.h" 36 35 #include "HTMLTokenizer.h" 37 #include "MathMLNames.h"38 #include "SVGNames.h"39 36 #include "XSSAuditor.h" 40 37 #include <wtf/MainThread.h> 41 #include <wtf/Vector.h>42 38 #include <wtf/text/TextPosition.h> 43 39 44 40 namespace WebCore { 45 46 using namespace HTMLNames;47 41 48 42 #ifndef NDEBUG … … 68 62 #endif 69 63 70 static bool tokenExitsForeignContent(const CompactHTMLToken& token)71 {72 // FIXME: This is copied from HTMLTreeBuilder::processTokenInForeignContent and changed to use threadSafeHTMLNamesMatch.73 const HTMLIdentifier& tagName = token.data();74 return threadSafeHTMLNamesMatch(tagName, bTag)75 || threadSafeHTMLNamesMatch(tagName, bigTag)76 || threadSafeHTMLNamesMatch(tagName, blockquoteTag)77 || threadSafeHTMLNamesMatch(tagName, bodyTag)78 || threadSafeHTMLNamesMatch(tagName, brTag)79 || threadSafeHTMLNamesMatch(tagName, centerTag)80 || threadSafeHTMLNamesMatch(tagName, codeTag)81 || threadSafeHTMLNamesMatch(tagName, ddTag)82 || threadSafeHTMLNamesMatch(tagName, divTag)83 || threadSafeHTMLNamesMatch(tagName, dlTag)84 || threadSafeHTMLNamesMatch(tagName, dtTag)85 || threadSafeHTMLNamesMatch(tagName, emTag)86 || threadSafeHTMLNamesMatch(tagName, embedTag)87 || threadSafeHTMLNamesMatch(tagName, h1Tag)88 || threadSafeHTMLNamesMatch(tagName, h2Tag)89 || threadSafeHTMLNamesMatch(tagName, h3Tag)90 || threadSafeHTMLNamesMatch(tagName, h4Tag)91 || threadSafeHTMLNamesMatch(tagName, h5Tag)92 || threadSafeHTMLNamesMatch(tagName, h6Tag)93 || threadSafeHTMLNamesMatch(tagName, headTag)94 || threadSafeHTMLNamesMatch(tagName, hrTag)95 || threadSafeHTMLNamesMatch(tagName, iTag)96 || threadSafeHTMLNamesMatch(tagName, imgTag)97 || threadSafeHTMLNamesMatch(tagName, liTag)98 || threadSafeHTMLNamesMatch(tagName, listingTag)99 || threadSafeHTMLNamesMatch(tagName, menuTag)100 || threadSafeHTMLNamesMatch(tagName, metaTag)101 || threadSafeHTMLNamesMatch(tagName, nobrTag)102 || threadSafeHTMLNamesMatch(tagName, olTag)103 || threadSafeHTMLNamesMatch(tagName, pTag)104 || threadSafeHTMLNamesMatch(tagName, preTag)105 || threadSafeHTMLNamesMatch(tagName, rubyTag)106 || threadSafeHTMLNamesMatch(tagName, sTag)107 || threadSafeHTMLNamesMatch(tagName, smallTag)108 || threadSafeHTMLNamesMatch(tagName, spanTag)109 || threadSafeHTMLNamesMatch(tagName, strongTag)110 || threadSafeHTMLNamesMatch(tagName, strikeTag)111 || threadSafeHTMLNamesMatch(tagName, subTag)112 || threadSafeHTMLNamesMatch(tagName, supTag)113 || threadSafeHTMLNamesMatch(tagName, tableTag)114 || threadSafeHTMLNamesMatch(tagName, ttTag)115 || threadSafeHTMLNamesMatch(tagName, uTag)116 || threadSafeHTMLNamesMatch(tagName, ulTag)117 || threadSafeHTMLNamesMatch(tagName, varTag)118 || (threadSafeHTMLNamesMatch(tagName, fontTag) && (token.getAttributeItem(colorAttr) || token.getAttributeItem(faceAttr) || token.getAttributeItem(sizeAttr)));119 }120 121 static bool tokenExitsSVG(const CompactHTMLToken& token)122 {123 // FIXME: It's very fragile that we special case foreignObject here to be case-insensitive.124 // FIXME: Using CaseFoldingHash::equal instead of equalIgnoringCase, as equalIgnoringCase125 // wants non-const StringImpl* (even though it never modifies them).126 // https://bugs.webkit.org/show_bug.cgi?id=111892 is for fixing equalIgnoringCase.127 return CaseFoldingHash::equal(token.data().asStringImpl(), SVGNames::foreignObjectTag.localName().impl());128 }129 130 static bool tokenExitsMath(const CompactHTMLToken& token)131 {132 // FIXME: This is copied from HTMLElementStack::isMathMLTextIntegrationPoint and changed to use threadSafeMatch.133 const HTMLIdentifier& tagName = token.data();134 return threadSafeMatch(tagName, MathMLNames::miTag)135 || threadSafeMatch(tagName, MathMLNames::moTag)136 || threadSafeMatch(tagName, MathMLNames::mnTag)137 || threadSafeMatch(tagName, MathMLNames::msTag)138 || threadSafeMatch(tagName, MathMLNames::mtextTag);139 }140 141 64 static const size_t pendingTokenLimit = 1000; 142 65 143 66 BackgroundHTMLParser::BackgroundHTMLParser(PassRefPtr<WeakReference<BackgroundHTMLParser> > reference, PassOwnPtr<Configuration> config) 144 67 : m_weakFactory(reference, this) 68 , m_treeBuilderSimulator(config->options) 145 69 , m_token(adoptPtr(new HTMLToken)) 146 70 , m_tokenizer(HTMLTokenizer::create(config->options)) … … 151 75 , m_preloadScanner(config->preloadScanner.release()) 152 76 { 153 m_namespaceStack.append(HTML);154 77 } 155 78 … … 204 127 } 205 128 206 bool BackgroundHTMLParser::simulateTreeBuilder(const CompactHTMLToken& token)207 {208 if (token.type() == HTMLToken::StartTag) {209 const HTMLIdentifier& tagName = token.data();210 if (threadSafeMatch(tagName, SVGNames::svgTag))211 m_namespaceStack.append(SVG);212 if (threadSafeMatch(tagName, MathMLNames::mathTag))213 m_namespaceStack.append(MathML);214 if (inForeignContent() && tokenExitsForeignContent(token))215 m_namespaceStack.removeLast();216 if ((m_namespaceStack.last() == SVG && tokenExitsSVG(token))217 || (m_namespaceStack.last() == MathML && tokenExitsMath(token)))218 m_namespaceStack.append(HTML);219 if (!inForeignContent()) {220 // FIXME: This is just a copy of Tokenizer::updateStateFor which uses threadSafeMatches.221 if (threadSafeHTMLNamesMatch(tagName, textareaTag) || threadSafeHTMLNamesMatch(tagName, titleTag))222 m_tokenizer->setState(HTMLTokenizer::RCDATAState);223 else if (threadSafeHTMLNamesMatch(tagName, plaintextTag))224 m_tokenizer->setState(HTMLTokenizer::PLAINTEXTState);225 else if (threadSafeHTMLNamesMatch(tagName, scriptTag))226 m_tokenizer->setState(HTMLTokenizer::ScriptDataState);227 else if (threadSafeHTMLNamesMatch(tagName, styleTag)228 || threadSafeHTMLNamesMatch(tagName, iframeTag)229 || threadSafeHTMLNamesMatch(tagName, xmpTag)230 || (threadSafeHTMLNamesMatch(tagName, noembedTag) && m_options.pluginsEnabled)231 || threadSafeHTMLNamesMatch(tagName, noframesTag)232 || (threadSafeHTMLNamesMatch(tagName, noscriptTag) && m_options.scriptEnabled))233 m_tokenizer->setState(HTMLTokenizer::RAWTEXTState);234 }235 }236 237 if (token.type() == HTMLToken::EndTag) {238 const HTMLIdentifier& tagName = token.data();239 if ((m_namespaceStack.last() == SVG && threadSafeMatch(tagName, SVGNames::svgTag))240 || (m_namespaceStack.last() == MathML && threadSafeMatch(tagName, MathMLNames::mathTag))241 || (m_namespaceStack.contains(SVG) && m_namespaceStack.last() == HTML && tokenExitsSVG(token))242 || (m_namespaceStack.contains(MathML) && m_namespaceStack.last() == HTML && tokenExitsMath(token)))243 m_namespaceStack.removeLast();244 if (threadSafeHTMLNamesMatch(tagName, scriptTag)) {245 if (!inForeignContent())246 m_tokenizer->setState(HTMLTokenizer::DataState);247 return false;248 }249 }250 251 // FIXME: Also setForceNullCharacterReplacement when in text mode.252 m_tokenizer->setForceNullCharacterReplacement(inForeignContent());253 m_tokenizer->setShouldAllowCDATA(inForeignContent());254 return true;255 }256 257 129 void BackgroundHTMLParser::pumpTokenizer() 258 130 { … … 280 152 m_token->clear(); 281 153 282 if (! simulateTreeBuilder(m_pendingTokens->last()) || m_pendingTokens->size() >= pendingTokenLimit)154 if (!m_treeBuilderSimulator.simulate(m_pendingTokens->last(), m_tokenizer.get()) || m_pendingTokens->size() >= pendingTokenLimit) 283 155 sendTokensToMainThread(); 284 156 } -
trunk/Source/WebCore/html/parser/BackgroundHTMLParser.h
r145277 r145398 36 36 #include "HTMLToken.h" 37 37 #include "HTMLTokenizer.h" 38 #include "HTMLTreeBuilderSimulator.h" 38 39 #include "XSSAuditorDelegate.h" 39 40 #include <wtf/PassOwnPtr.h> … … 44 45 namespace WebCore { 45 46 46 typedef const void* ParserIdentifier;47 47 class HTMLDocumentParser; 48 48 class XSSAuditor; … … 82 82 83 83 private: 84 enum Namespace {85 HTML,86 SVG,87 MathML88 };89 90 84 BackgroundHTMLParser(PassRefPtr<WeakReference<BackgroundHTMLParser> >, PassOwnPtr<Configuration>); 91 85 92 86 void markEndOfFile(); 93 87 void pumpTokenizer(); 94 bool simulateTreeBuilder(const CompactHTMLToken&);88 void sendTokensToMainThread(); 95 89 96 void sendTokensToMainThread();97 bool inForeignContent() const { return m_namespaceStack.last() != HTML; }98 99 Vector<Namespace, 1> m_namespaceStack;100 90 WeakPtrFactory<BackgroundHTMLParser> m_weakFactory; 101 91 BackgroundHTMLInputStream m_input; 102 92 HTMLSourceTracker m_sourceTracker; 93 HTMLTreeBuilderSimulator m_treeBuilderSimulator; 103 94 OwnPtr<HTMLToken> m_token; 104 95 OwnPtr<HTMLTokenizer> m_tokenizer;
Note:
See TracChangeset
for help on using the changeset viewer.