Title: [145398] trunk/Source/WebCore
Revision
145398
Author
aba...@webkit.org
Date
2013-03-11 13:53:47 -0700 (Mon, 11 Mar 2013)

Log Message

Factor HTMLTreeBuilderSimulator out of BackgroundHTMLParser
https://bugs.webkit.org/show_bug.cgi?id=112057

Reviewed by Eric Seidel.

Simulating the HTML tree builder is a separate concern from parsing on
the background thread. We plan to re-use the tree builder simulator for
the view-source parser, for example. Also, having the simulator as a
separate object will make it easier to fix
https://bugs.webkit.org/show_bug.cgi?id=109764.

* CMakeLists.txt:
* GNUmakefile.list.am:
* Target.pri:
* WebCore.gypi:
* WebCore.vcproj/WebCore.vcproj:
* html/parser/BackgroundHTMLParser.cpp:
(WebCore):
(WebCore::BackgroundHTMLParser::BackgroundHTMLParser):
(WebCore::BackgroundHTMLParser::pumpTokenizer):
* html/parser/BackgroundHTMLParser.h:
(BackgroundHTMLParser):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/CMakeLists.txt (145397 => 145398)


--- trunk/Source/WebCore/CMakeLists.txt	2013-03-11 20:43:43 UTC (rev 145397)
+++ trunk/Source/WebCore/CMakeLists.txt	2013-03-11 20:53:47 UTC (rev 145398)
@@ -1562,6 +1562,7 @@
     html/parser/HTMLSourceTracker.cpp
     html/parser/HTMLTokenizer.cpp
     html/parser/HTMLTreeBuilder.cpp
+    html/parser/HTMLTreeBuilderSimulator.cpp
     html/parser/HTMLViewSourceParser.cpp
     html/parser/TextDocumentParser.cpp
     html/parser/TextViewSourceParser.cpp

Modified: trunk/Source/WebCore/ChangeLog (145397 => 145398)


--- trunk/Source/WebCore/ChangeLog	2013-03-11 20:43:43 UTC (rev 145397)
+++ trunk/Source/WebCore/ChangeLog	2013-03-11 20:53:47 UTC (rev 145398)
@@ -1,3 +1,28 @@
+2013-03-11  Adam Barth  <aba...@webkit.org>
+
+        Factor HTMLTreeBuilderSimulator out of BackgroundHTMLParser
+        https://bugs.webkit.org/show_bug.cgi?id=112057
+
+        Reviewed by Eric Seidel.
+
+        Simulating the HTML tree builder is a separate concern from parsing on
+        the background thread. We plan to re-use the tree builder simulator for
+        the view-source parser, for example. Also, having the simulator as a
+        separate object will make it easier to fix
+        https://bugs.webkit.org/show_bug.cgi?id=109764.
+
+        * CMakeLists.txt:
+        * GNUmakefile.list.am:
+        * Target.pri:
+        * WebCore.gypi:
+        * WebCore.vcproj/WebCore.vcproj:
+        * html/parser/BackgroundHTMLParser.cpp:
+        (WebCore):
+        (WebCore::BackgroundHTMLParser::BackgroundHTMLParser):
+        (WebCore::BackgroundHTMLParser::pumpTokenizer):
+        * html/parser/BackgroundHTMLParser.h:
+        (BackgroundHTMLParser):
+
 2013-02-26  Dima Gorbik  <dgor...@apple.com>
 
         Not all properties apply to the '::cue' pseudo-element

Modified: trunk/Source/WebCore/GNUmakefile.list.am (145397 => 145398)


--- trunk/Source/WebCore/GNUmakefile.list.am	2013-03-11 20:43:43 UTC (rev 145397)
+++ trunk/Source/WebCore/GNUmakefile.list.am	2013-03-11 20:53:47 UTC (rev 145398)
@@ -3644,6 +3644,8 @@
 	Source/WebCore/html/parser/HTMLTokenizer.h \
 	Source/WebCore/html/parser/HTMLTreeBuilder.cpp \
 	Source/WebCore/html/parser/HTMLTreeBuilder.h \
+	Source/WebCore/html/parser/HTMLTreeBuilderSimulator.cpp \
+	Source/WebCore/html/parser/HTMLTreeBuilderSimulator.h \
 	Source/WebCore/html/parser/HTMLViewSourceParser.cpp \
 	Source/WebCore/html/parser/HTMLViewSourceParser.h \
 	Source/WebCore/html/parser/InputStreamPreprocessor.h \

Modified: trunk/Source/WebCore/Target.pri (145397 => 145398)


--- trunk/Source/WebCore/Target.pri	2013-03-11 20:43:43 UTC (rev 145397)
+++ trunk/Source/WebCore/Target.pri	2013-03-11 20:53:47 UTC (rev 145398)
@@ -747,6 +747,7 @@
     html/parser/HTMLSourceTracker.cpp \
     html/parser/HTMLTokenizer.cpp \
     html/parser/HTMLTreeBuilder.cpp \
+    html/parser/HTMLTreeBuilderSimulator.cpp \
     html/parser/HTMLViewSourceParser.cpp \
     html/parser/TextDocumentParser.cpp \
     html/parser/TextViewSourceParser.cpp \

Modified: trunk/Source/WebCore/WebCore.gypi (145397 => 145398)


--- trunk/Source/WebCore/WebCore.gypi	2013-03-11 20:43:43 UTC (rev 145397)
+++ trunk/Source/WebCore/WebCore.gypi	2013-03-11 20:53:47 UTC (rev 145398)
@@ -3532,6 +3532,8 @@
             'html/parser/HTMLTokenizer.h',
             'html/parser/HTMLTreeBuilder.cpp',
             'html/parser/HTMLTreeBuilder.h',
+            'html/parser/HTMLTreeBuilderSimulator.cpp',
+            'html/parser/HTMLTreeBuilderSimulator.h',
             'html/parser/HTMLViewSourceParser.cpp',
             'html/parser/HTMLViewSourceParser.h',
             'html/parser/InputStreamPreprocessor.h',

Modified: trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj (145397 => 145398)


--- trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj	2013-03-11 20:43:43 UTC (rev 145397)
+++ trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj	2013-03-11 20:53:47 UTC (rev 145398)
@@ -65202,6 +65202,14 @@
 					>
 				</File>
 				<File
+					RelativePath="..\html\parser\HTMLTreeBuilderSimulator.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\html\parser\HTMLTreeBuilderSimulator.h"
+					>
+				</File>
+				<File
 					RelativePath="..\html\parser\HTMLViewSourceParser.cpp"
 					>
 				</File>

Modified: trunk/Source/WebCore/html/parser/BackgroundHTMLParser.cpp (145397 => 145398)


--- trunk/Source/WebCore/html/parser/BackgroundHTMLParser.cpp	2013-03-11 20:43:43 UTC (rev 145397)
+++ trunk/Source/WebCore/html/parser/BackgroundHTMLParser.cpp	2013-03-11 20:53:47 UTC (rev 145398)
@@ -30,21 +30,15 @@
 #include "BackgroundHTMLParser.h"
 
 #include "HTMLDocumentParser.h"
-#include "HTMLNames.h"
 #include "HTMLParserIdioms.h"
 #include "HTMLParserThread.h"
 #include "HTMLTokenizer.h"
-#include "MathMLNames.h"
-#include "SVGNames.h"
 #include "XSSAuditor.h"
 #include <wtf/MainThread.h>
-#include <wtf/Vector.h>
 #include <wtf/text/TextPosition.h>
 
 namespace WebCore {
 
-using namespace HTMLNames;
-
 #ifndef NDEBUG
 
 static void checkThatTokensAreSafeToSendToAnotherThread(const CompactHTMLTokenStream* tokens)
@@ -67,81 +61,11 @@
 
 #endif
 
-static bool tokenExitsForeignContent(const CompactHTMLToken& token)
-{
-    // FIXME: This is copied from HTMLTreeBuilder::processTokenInForeignContent and changed to use threadSafeHTMLNamesMatch.
-    const HTMLIdentifier& tagName = token.data();
-    return threadSafeHTMLNamesMatch(tagName, bTag)
-        || threadSafeHTMLNamesMatch(tagName, bigTag)
-        || threadSafeHTMLNamesMatch(tagName, blockquoteTag)
-        || threadSafeHTMLNamesMatch(tagName, bodyTag)
-        || threadSafeHTMLNamesMatch(tagName, brTag)
-        || threadSafeHTMLNamesMatch(tagName, centerTag)
-        || threadSafeHTMLNamesMatch(tagName, codeTag)
-        || threadSafeHTMLNamesMatch(tagName, ddTag)
-        || threadSafeHTMLNamesMatch(tagName, divTag)
-        || threadSafeHTMLNamesMatch(tagName, dlTag)
-        || threadSafeHTMLNamesMatch(tagName, dtTag)
-        || threadSafeHTMLNamesMatch(tagName, emTag)
-        || threadSafeHTMLNamesMatch(tagName, embedTag)
-        || threadSafeHTMLNamesMatch(tagName, h1Tag)
-        || threadSafeHTMLNamesMatch(tagName, h2Tag)
-        || threadSafeHTMLNamesMatch(tagName, h3Tag)
-        || threadSafeHTMLNamesMatch(tagName, h4Tag)
-        || threadSafeHTMLNamesMatch(tagName, h5Tag)
-        || threadSafeHTMLNamesMatch(tagName, h6Tag)
-        || threadSafeHTMLNamesMatch(tagName, headTag)
-        || threadSafeHTMLNamesMatch(tagName, hrTag)
-        || threadSafeHTMLNamesMatch(tagName, iTag)
-        || threadSafeHTMLNamesMatch(tagName, imgTag)
-        || threadSafeHTMLNamesMatch(tagName, liTag)
-        || threadSafeHTMLNamesMatch(tagName, listingTag)
-        || threadSafeHTMLNamesMatch(tagName, menuTag)
-        || threadSafeHTMLNamesMatch(tagName, metaTag)
-        || threadSafeHTMLNamesMatch(tagName, nobrTag)
-        || threadSafeHTMLNamesMatch(tagName, olTag)
-        || threadSafeHTMLNamesMatch(tagName, pTag)
-        || threadSafeHTMLNamesMatch(tagName, preTag)
-        || threadSafeHTMLNamesMatch(tagName, rubyTag)
-        || threadSafeHTMLNamesMatch(tagName, sTag)
-        || threadSafeHTMLNamesMatch(tagName, smallTag)
-        || threadSafeHTMLNamesMatch(tagName, spanTag)
-        || threadSafeHTMLNamesMatch(tagName, strongTag)
-        || threadSafeHTMLNamesMatch(tagName, strikeTag)
-        || threadSafeHTMLNamesMatch(tagName, subTag)
-        || threadSafeHTMLNamesMatch(tagName, supTag)
-        || threadSafeHTMLNamesMatch(tagName, tableTag)
-        || threadSafeHTMLNamesMatch(tagName, ttTag)
-        || threadSafeHTMLNamesMatch(tagName, uTag)
-        || threadSafeHTMLNamesMatch(tagName, ulTag)
-        || threadSafeHTMLNamesMatch(tagName, varTag)
-        || (threadSafeHTMLNamesMatch(tagName, fontTag) && (token.getAttributeItem(colorAttr) || token.getAttributeItem(faceAttr) || token.getAttributeItem(sizeAttr)));
-}
-
-static bool tokenExitsSVG(const CompactHTMLToken& token)
-{
-    // FIXME: It's very fragile that we special case foreignObject here to be case-insensitive.
-    // FIXME: Using CaseFoldingHash::equal instead of equalIgnoringCase, as equalIgnoringCase
-    // wants non-const StringImpl* (even though it never modifies them).
-    // https://bugs.webkit.org/show_bug.cgi?id=111892 is for fixing equalIgnoringCase.
-    return CaseFoldingHash::equal(token.data().asStringImpl(), SVGNames::foreignObjectTag.localName().impl());
-}
-
-static bool tokenExitsMath(const CompactHTMLToken& token)
-{
-    // FIXME: This is copied from HTMLElementStack::isMathMLTextIntegrationPoint and changed to use threadSafeMatch.
-    const HTMLIdentifier& tagName = token.data();
-    return threadSafeMatch(tagName, MathMLNames::miTag)
-        || threadSafeMatch(tagName, MathMLNames::moTag)
-        || threadSafeMatch(tagName, MathMLNames::mnTag)
-        || threadSafeMatch(tagName, MathMLNames::msTag)
-        || threadSafeMatch(tagName, MathMLNames::mtextTag);
-}
-
 static const size_t pendingTokenLimit = 1000;
 
 BackgroundHTMLParser::BackgroundHTMLParser(PassRefPtr<WeakReference<BackgroundHTMLParser> > reference, PassOwnPtr<Configuration> config)
     : m_weakFactory(reference, this)
+    , m_treeBuilderSimulator(config->options)
     , m_token(adoptPtr(new HTMLToken))
     , m_tokenizer(HTMLTokenizer::create(config->options))
     , m_options(config->options)
@@ -150,7 +74,6 @@
     , m_xssAuditor(config->xssAuditor.release())
     , m_preloadScanner(config->preloadScanner.release())
 {
-    m_namespaceStack.append(HTML);
 }
 
 void BackgroundHTMLParser::append(const String& input)
@@ -203,57 +126,6 @@
     m_input.close();
 }
 
-bool BackgroundHTMLParser::simulateTreeBuilder(const CompactHTMLToken& token)
-{
-    if (token.type() == HTMLToken::StartTag) {
-        const HTMLIdentifier& tagName = token.data();
-        if (threadSafeMatch(tagName, SVGNames::svgTag))
-            m_namespaceStack.append(SVG);
-        if (threadSafeMatch(tagName, MathMLNames::mathTag))
-            m_namespaceStack.append(MathML);
-        if (inForeignContent() && tokenExitsForeignContent(token))
-            m_namespaceStack.removeLast();
-        if ((m_namespaceStack.last() == SVG && tokenExitsSVG(token))
-            || (m_namespaceStack.last() == MathML && tokenExitsMath(token)))
-            m_namespaceStack.append(HTML);
-        if (!inForeignContent()) {
-            // FIXME: This is just a copy of Tokenizer::updateStateFor which uses threadSafeMatches.
-            if (threadSafeHTMLNamesMatch(tagName, textareaTag) || threadSafeHTMLNamesMatch(tagName, titleTag))
-                m_tokenizer->setState(HTMLTokenizer::RCDATAState);
-            else if (threadSafeHTMLNamesMatch(tagName, plaintextTag))
-                m_tokenizer->setState(HTMLTokenizer::PLAINTEXTState);
-            else if (threadSafeHTMLNamesMatch(tagName, scriptTag))
-                m_tokenizer->setState(HTMLTokenizer::ScriptDataState);
-            else if (threadSafeHTMLNamesMatch(tagName, styleTag)
-                || threadSafeHTMLNamesMatch(tagName, iframeTag)
-                || threadSafeHTMLNamesMatch(tagName, xmpTag)
-                || (threadSafeHTMLNamesMatch(tagName, noembedTag) && m_options.pluginsEnabled)
-                || threadSafeHTMLNamesMatch(tagName, noframesTag)
-                || (threadSafeHTMLNamesMatch(tagName, noscriptTag) && m_options.scriptEnabled))
-                m_tokenizer->setState(HTMLTokenizer::RAWTEXTState);
-        }
-    }
-
-    if (token.type() == HTMLToken::EndTag) {
-        const HTMLIdentifier& tagName = token.data();
-        if ((m_namespaceStack.last() == SVG && threadSafeMatch(tagName, SVGNames::svgTag))
-            || (m_namespaceStack.last() == MathML && threadSafeMatch(tagName, MathMLNames::mathTag))
-            || (m_namespaceStack.contains(SVG) && m_namespaceStack.last() == HTML && tokenExitsSVG(token))
-            || (m_namespaceStack.contains(MathML) && m_namespaceStack.last() == HTML && tokenExitsMath(token)))
-            m_namespaceStack.removeLast();
-        if (threadSafeHTMLNamesMatch(tagName, scriptTag)) {
-            if (!inForeignContent())
-                m_tokenizer->setState(HTMLTokenizer::DataState);
-            return false;
-        }
-    }
-
-    // FIXME: Also setForceNullCharacterReplacement when in text mode.
-    m_tokenizer->setForceNullCharacterReplacement(inForeignContent());
-    m_tokenizer->setShouldAllowCDATA(inForeignContent());
-    return true;
-}
-
 void BackgroundHTMLParser::pumpTokenizer()
 {
     while (true) {
@@ -279,7 +151,7 @@
 
         m_token->clear();
 
-        if (!simulateTreeBuilder(m_pendingTokens->last()) || m_pendingTokens->size() >= pendingTokenLimit)
+        if (!m_treeBuilderSimulator.simulate(m_pendingTokens->last(), m_tokenizer.get()) || m_pendingTokens->size() >= pendingTokenLimit)
             sendTokensToMainThread();
     }
 

Modified: trunk/Source/WebCore/html/parser/BackgroundHTMLParser.h (145397 => 145398)


--- trunk/Source/WebCore/html/parser/BackgroundHTMLParser.h	2013-03-11 20:43:43 UTC (rev 145397)
+++ trunk/Source/WebCore/html/parser/BackgroundHTMLParser.h	2013-03-11 20:53:47 UTC (rev 145398)
@@ -35,6 +35,7 @@
 #include "HTMLSourceTracker.h"
 #include "HTMLToken.h"
 #include "HTMLTokenizer.h"
+#include "HTMLTreeBuilderSimulator.h"
 #include "XSSAuditorDelegate.h"
 #include <wtf/PassOwnPtr.h>
 #include <wtf/RefPtr.h>
@@ -43,7 +44,6 @@
 
 namespace WebCore {
 
-typedef const void* ParserIdentifier;
 class HTMLDocumentParser;
 class XSSAuditor;
 
@@ -81,25 +81,16 @@
     void forcePlaintextForTextDocument();
 
 private:
-    enum Namespace {
-        HTML,
-        SVG,
-        MathML
-    };
-
     BackgroundHTMLParser(PassRefPtr<WeakReference<BackgroundHTMLParser> >, PassOwnPtr<Configuration>);
 
     void markEndOfFile();
     void pumpTokenizer();
-    bool simulateTreeBuilder(const CompactHTMLToken&);
-
     void sendTokensToMainThread();
-    bool inForeignContent() const { return m_namespaceStack.last() != HTML; }
 
-    Vector<Namespace, 1> m_namespaceStack;
     WeakPtrFactory<BackgroundHTMLParser> m_weakFactory;
     BackgroundHTMLInputStream m_input;
     HTMLSourceTracker m_sourceTracker;
+    HTMLTreeBuilderSimulator m_treeBuilderSimulator;
     OwnPtr<HTMLToken> m_token;
     OwnPtr<HTMLTokenizer> m_tokenizer;
     HTMLParserOptions m_options;

Added: trunk/Source/WebCore/html/parser/HTMLTreeBuilderSimulator.cpp (0 => 145398)


--- trunk/Source/WebCore/html/parser/HTMLTreeBuilderSimulator.cpp	                        (rev 0)
+++ trunk/Source/WebCore/html/parser/HTMLTreeBuilderSimulator.cpp	2013-03-11 20:53:47 UTC (rev 145398)
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2013 Google, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GOOGLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#if ENABLE(THREADED_HTML_PARSER)
+
+#include "HTMLTreeBuilderSimulator.h"
+
+#include "HTMLDocumentParser.h"
+#include "HTMLNames.h"
+#include "HTMLParserIdioms.h"
+#include "HTMLTokenizer.h"
+#include "MathMLNames.h"
+#include "SVGNames.h"
+
+namespace WebCore {
+
+using namespace HTMLNames;
+
+static bool tokenExitsForeignContent(const CompactHTMLToken& token)
+{
+    // FIXME: This is copied from HTMLTreeBuilder::processTokenInForeignContent and changed to use threadSafeHTMLNamesMatch.
+    const HTMLIdentifier& tagName = token.data();
+    return threadSafeHTMLNamesMatch(tagName, bTag)
+        || threadSafeHTMLNamesMatch(tagName, bigTag)
+        || threadSafeHTMLNamesMatch(tagName, blockquoteTag)
+        || threadSafeHTMLNamesMatch(tagName, bodyTag)
+        || threadSafeHTMLNamesMatch(tagName, brTag)
+        || threadSafeHTMLNamesMatch(tagName, centerTag)
+        || threadSafeHTMLNamesMatch(tagName, codeTag)
+        || threadSafeHTMLNamesMatch(tagName, ddTag)
+        || threadSafeHTMLNamesMatch(tagName, divTag)
+        || threadSafeHTMLNamesMatch(tagName, dlTag)
+        || threadSafeHTMLNamesMatch(tagName, dtTag)
+        || threadSafeHTMLNamesMatch(tagName, emTag)
+        || threadSafeHTMLNamesMatch(tagName, embedTag)
+        || threadSafeHTMLNamesMatch(tagName, h1Tag)
+        || threadSafeHTMLNamesMatch(tagName, h2Tag)
+        || threadSafeHTMLNamesMatch(tagName, h3Tag)
+        || threadSafeHTMLNamesMatch(tagName, h4Tag)
+        || threadSafeHTMLNamesMatch(tagName, h5Tag)
+        || threadSafeHTMLNamesMatch(tagName, h6Tag)
+        || threadSafeHTMLNamesMatch(tagName, headTag)
+        || threadSafeHTMLNamesMatch(tagName, hrTag)
+        || threadSafeHTMLNamesMatch(tagName, iTag)
+        || threadSafeHTMLNamesMatch(tagName, imgTag)
+        || threadSafeHTMLNamesMatch(tagName, liTag)
+        || threadSafeHTMLNamesMatch(tagName, listingTag)
+        || threadSafeHTMLNamesMatch(tagName, menuTag)
+        || threadSafeHTMLNamesMatch(tagName, metaTag)
+        || threadSafeHTMLNamesMatch(tagName, nobrTag)
+        || threadSafeHTMLNamesMatch(tagName, olTag)
+        || threadSafeHTMLNamesMatch(tagName, pTag)
+        || threadSafeHTMLNamesMatch(tagName, preTag)
+        || threadSafeHTMLNamesMatch(tagName, rubyTag)
+        || threadSafeHTMLNamesMatch(tagName, sTag)
+        || threadSafeHTMLNamesMatch(tagName, smallTag)
+        || threadSafeHTMLNamesMatch(tagName, spanTag)
+        || threadSafeHTMLNamesMatch(tagName, strongTag)
+        || threadSafeHTMLNamesMatch(tagName, strikeTag)
+        || threadSafeHTMLNamesMatch(tagName, subTag)
+        || threadSafeHTMLNamesMatch(tagName, supTag)
+        || threadSafeHTMLNamesMatch(tagName, tableTag)
+        || threadSafeHTMLNamesMatch(tagName, ttTag)
+        || threadSafeHTMLNamesMatch(tagName, uTag)
+        || threadSafeHTMLNamesMatch(tagName, ulTag)
+        || threadSafeHTMLNamesMatch(tagName, varTag)
+        || (threadSafeHTMLNamesMatch(tagName, fontTag) && (token.getAttributeItem(colorAttr) || token.getAttributeItem(faceAttr) || token.getAttributeItem(sizeAttr)));
+}
+
+static bool tokenExitsSVG(const CompactHTMLToken& token)
+{
+    // FIXME: It's very fragile that we special case foreignObject here to be case-insensitive.
+    // FIXME: Using CaseFoldingHash::equal instead of equalIgnoringCase, as equalIgnoringCase
+    // wants non-const StringImpl* (even though it never modifies them).
+    // https://bugs.webkit.org/show_bug.cgi?id=111892 is for fixing equalIgnoringCase.
+    return CaseFoldingHash::equal(token.data().asStringImpl(), SVGNames::foreignObjectTag.localName().impl());
+}
+
+static bool tokenExitsMath(const CompactHTMLToken& token)
+{
+    // FIXME: This is copied from HTMLElementStack::isMathMLTextIntegrationPoint and changed to use threadSafeMatch.
+    const HTMLIdentifier& tagName = token.data();
+    return threadSafeMatch(tagName, MathMLNames::miTag)
+        || threadSafeMatch(tagName, MathMLNames::moTag)
+        || threadSafeMatch(tagName, MathMLNames::mnTag)
+        || threadSafeMatch(tagName, MathMLNames::msTag)
+        || threadSafeMatch(tagName, MathMLNames::mtextTag);
+}
+
+HTMLTreeBuilderSimulator::HTMLTreeBuilderSimulator(const HTMLParserOptions& options)
+    : m_options(options)
+{
+    m_namespaceStack.append(HTML);
+}
+
+bool HTMLTreeBuilderSimulator::simulate(const CompactHTMLToken& token, HTMLTokenizer* tokenizer)
+{
+    if (token.type() == HTMLToken::StartTag) {
+        const HTMLIdentifier& tagName = token.data();
+        if (threadSafeMatch(tagName, SVGNames::svgTag))
+            m_namespaceStack.append(SVG);
+        if (threadSafeMatch(tagName, MathMLNames::mathTag))
+            m_namespaceStack.append(MathML);
+        if (inForeignContent() && tokenExitsForeignContent(token))
+            m_namespaceStack.removeLast();
+        if ((m_namespaceStack.last() == SVG && tokenExitsSVG(token))
+            || (m_namespaceStack.last() == MathML && tokenExitsMath(token)))
+            m_namespaceStack.append(HTML);
+        if (!inForeignContent()) {
+            // FIXME: This is just a copy of Tokenizer::updateStateFor which uses threadSafeMatches.
+            if (threadSafeHTMLNamesMatch(tagName, textareaTag) || threadSafeHTMLNamesMatch(tagName, titleTag))
+                tokenizer->setState(HTMLTokenizer::RCDATAState);
+            else if (threadSafeHTMLNamesMatch(tagName, plaintextTag))
+                tokenizer->setState(HTMLTokenizer::PLAINTEXTState);
+            else if (threadSafeHTMLNamesMatch(tagName, scriptTag))
+                tokenizer->setState(HTMLTokenizer::ScriptDataState);
+            else if (threadSafeHTMLNamesMatch(tagName, styleTag)
+                || threadSafeHTMLNamesMatch(tagName, iframeTag)
+                || threadSafeHTMLNamesMatch(tagName, xmpTag)
+                || (threadSafeHTMLNamesMatch(tagName, noembedTag) && m_options.pluginsEnabled)
+                || threadSafeHTMLNamesMatch(tagName, noframesTag)
+                || (threadSafeHTMLNamesMatch(tagName, noscriptTag) && m_options.scriptEnabled))
+                tokenizer->setState(HTMLTokenizer::RAWTEXTState);
+        }
+    }
+
+    if (token.type() == HTMLToken::EndTag) {
+        const HTMLIdentifier& tagName = token.data();
+        if ((m_namespaceStack.last() == SVG && threadSafeMatch(tagName, SVGNames::svgTag))
+            || (m_namespaceStack.last() == MathML && threadSafeMatch(tagName, MathMLNames::mathTag))
+            || (m_namespaceStack.contains(SVG) && m_namespaceStack.last() == HTML && tokenExitsSVG(token))
+            || (m_namespaceStack.contains(MathML) && m_namespaceStack.last() == HTML && tokenExitsMath(token)))
+            m_namespaceStack.removeLast();
+        if (threadSafeHTMLNamesMatch(tagName, scriptTag)) {
+            if (!inForeignContent())
+                tokenizer->setState(HTMLTokenizer::DataState);
+            return false;
+        }
+    }
+
+    // FIXME: Also setForceNullCharacterReplacement when in text mode.
+    tokenizer->setForceNullCharacterReplacement(inForeignContent());
+    tokenizer->setShouldAllowCDATA(inForeignContent());
+    return true;
+}
+
+}
+
+#endif // ENABLE(THREADED_HTML_PARSER)

Added: trunk/Source/WebCore/html/parser/HTMLTreeBuilderSimulator.h (0 => 145398)


--- trunk/Source/WebCore/html/parser/HTMLTreeBuilderSimulator.h	                        (rev 0)
+++ trunk/Source/WebCore/html/parser/HTMLTreeBuilderSimulator.h	2013-03-11 20:53:47 UTC (rev 145398)
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2013 Google, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GOOGLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef HTMLTreeBuilderSimulator_h
+#define HTMLTreeBuilderSimulator_h
+
+#if ENABLE(THREADED_HTML_PARSER)
+
+#include "HTMLParserOptions.h"
+#include <wtf/Vector.h>
+
+namespace WebCore {
+
+class CompactHTMLToken;
+class HTMLTokenizer;
+
+class HTMLTreeBuilderSimulator {
+    WTF_MAKE_FAST_ALLOCATED;
+public:
+    explicit HTMLTreeBuilderSimulator(const HTMLParserOptions&);
+    bool simulate(const CompactHTMLToken&, HTMLTokenizer*);
+
+private:
+    enum Namespace {
+        HTML,
+        SVG,
+        MathML
+    };
+
+    bool inForeignContent() const { return m_namespaceStack.last() != HTML; }
+
+    HTMLParserOptions m_options;
+    Vector<Namespace, 1> m_namespaceStack;
+};
+
+}
+
+#endif // ENABLE(THREADED_HTML_PARSER)
+
+#endif
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to