Modified: trunk/Source/WebCore/ChangeLog (140440 => 140441)
--- trunk/Source/WebCore/ChangeLog 2013-01-22 18:52:52 UTC (rev 140440)
+++ trunk/Source/WebCore/ChangeLog 2013-01-22 19:12:15 UTC (rev 140441)
@@ -1,3 +1,21 @@
+2013-01-22 Adam Barth <[email protected]>
+
+ BackgroundHTMLParser should simulate tree building in a separate function
+ https://bugs.webkit.org/show_bug.cgi?id=107569
+
+ Reviewed by Eric Seidel.
+
+ This patch cleans up BackgroundHTMLParser::pumpTokenizer to prepare for
+ implementing speculative parsing.
+
+ * html/parser/BackgroundHTMLParser.cpp:
+ (WebCore::BackgroundHTMLParser::simulateTreeBuilder):
+ (WebCore):
+ (WebCore::BackgroundHTMLParser::pumpTokenizer):
+ * html/parser/BackgroundHTMLParser.h:
+ (BackgroundHTMLParser):
+ * page/Settings.in:
+
2013-01-22 Sheriff Bot <[email protected]>
Unreviewed, rolling out r140435.
Modified: trunk/Source/WebCore/html/parser/BackgroundHTMLParser.cpp (140440 => 140441)
--- trunk/Source/WebCore/html/parser/BackgroundHTMLParser.cpp 2013-01-22 18:52:52 UTC (rev 140440)
+++ trunk/Source/WebCore/html/parser/BackgroundHTMLParser.cpp 2013-01-22 19:12:15 UTC (rev 140441)
@@ -118,6 +118,42 @@
pumpTokenizer();
}
+void BackgroundHTMLParser::simulateTreeBuilder(const CompactHTMLToken& token)
+{
+ if (token.type() == HTMLTokenTypes::StartTag) {
+ const String& tagName = token.data();
+ if (threadSafeMatch(tagName, SVGNames::svgTag)
+ || threadSafeMatch(tagName, MathMLNames::mathTag))
+ m_inForeignContent = true;
+
+ // FIXME: This is just a copy of Tokenizer::updateStateFor which uses threadSafeMatches.
+ if (threadSafeMatch(tagName, textareaTag) || threadSafeMatch(tagName, titleTag))
+ m_tokenizer->setState(HTMLTokenizerState::RCDATAState);
+ else if (threadSafeMatch(tagName, plaintextTag))
+ m_tokenizer->setState(HTMLTokenizerState::PLAINTEXTState);
+ else if (threadSafeMatch(tagName, scriptTag))
+ m_tokenizer->setState(HTMLTokenizerState::ScriptDataState);
+ else if (threadSafeMatch(tagName, styleTag)
+ || threadSafeMatch(tagName, iframeTag)
+ || threadSafeMatch(tagName, xmpTag)
+ || (threadSafeMatch(tagName, noembedTag) && m_options.pluginsEnabled)
+ || threadSafeMatch(tagName, noframesTag)
+ || (threadSafeMatch(tagName, noscriptTag) && m_options.scriptEnabled))
+ m_tokenizer->setState(HTMLTokenizerState::RAWTEXTState);
+ }
+
+ if (token.type() == HTMLTokenTypes::EndTag) {
+ const String& tagName = token.data();
+ if (threadSafeMatch(tagName, SVGNames::svgTag) || threadSafeMatch(tagName, MathMLNames::mathTag))
+ m_inForeignContent = false;
+ if (threadSafeMatch(tagName, scriptTag))
+ m_isPausedWaitingForScripts = true;
+ }
+
+ // FIXME: Need to set setForceNullCharacterReplacement based on m_inForeignContent as well.
+ m_tokenizer->setShouldAllowCDATA(m_inForeignContent);
+}
+
void BackgroundHTMLParser::pumpTokenizer()
{
if (m_isPausedWaitingForScripts)
@@ -125,44 +161,13 @@
while (m_tokenizer->nextToken(m_input.current(), m_token)) {
m_pendingTokens.append(CompactHTMLToken(m_token));
+ m_token.clear();
- const CompactHTMLToken& token = m_pendingTokens.last();
+ simulateTreeBuilder(m_pendingTokens.last());
- if (token.type() == HTMLTokenTypes::StartTag) {
- const String& tagName = token.data();
- if (threadSafeMatch(tagName, SVGNames::svgTag)
- || threadSafeMatch(tagName, MathMLNames::mathTag))
- m_inForeignContent = true;
+ if (m_isPausedWaitingForScripts)
+ break;
- // FIXME: This is just a copy of Tokenizer::updateStateFor which doesn't use HTMLNames.
- if (threadSafeMatch(tagName, textareaTag) || threadSafeMatch(tagName, titleTag))
- m_tokenizer->setState(HTMLTokenizerState::RCDATAState);
- else if (threadSafeMatch(tagName, plaintextTag))
- m_tokenizer->setState(HTMLTokenizerState::PLAINTEXTState);
- else if (threadSafeMatch(tagName, scriptTag))
- m_tokenizer->setState(HTMLTokenizerState::ScriptDataState);
- else if (threadSafeMatch(tagName, styleTag)
- || threadSafeMatch(tagName, iframeTag)
- || threadSafeMatch(tagName, xmpTag)
- || (threadSafeMatch(tagName, noembedTag) && m_options.pluginsEnabled)
- || threadSafeMatch(tagName, noframesTag)
- || (threadSafeMatch(tagName, noscriptTag) && m_options.scriptEnabled))
- m_tokenizer->setState(HTMLTokenizerState::RAWTEXTState);
- }
- if (token.type() == HTMLTokenTypes::EndTag) {
- const String& tagName = token.data();
- if (threadSafeMatch(tagName, SVGNames::svgTag) || threadSafeMatch(tagName, MathMLNames::mathTag))
- m_inForeignContent = false;
- if (threadSafeMatch(tagName, scriptTag)) {
- m_isPausedWaitingForScripts = true;
- m_token.clear();
- break;
- }
- }
- // FIXME: Need to set setForceNullCharacterReplacement based on m_inForeignContent as well.
- m_tokenizer->setShouldAllowCDATA(m_inForeignContent);
- m_token.clear();
-
if (m_pendingTokens.size() >= pendingTokenLimit)
sendTokensToMainThread();
}
Modified: trunk/Source/WebCore/html/parser/BackgroundHTMLParser.h (140440 => 140441)
--- trunk/Source/WebCore/html/parser/BackgroundHTMLParser.h 2013-01-22 18:52:52 UTC (rev 140440)
+++ trunk/Source/WebCore/html/parser/BackgroundHTMLParser.h 2013-01-22 19:12:15 UTC (rev 140441)
@@ -61,6 +61,7 @@
explicit BackgroundHTMLParser(const HTMLParserOptions&, ParserIdentifier);
void pumpTokenizer();
+ void simulateTreeBuilder(const CompactHTMLToken&);
void sendTokensToMainThread();