Diff
Modified: trunk/Source/WebCore/CMakeLists.txt (139949 => 139950)
--- trunk/Source/WebCore/CMakeLists.txt 2013-01-17 02:32:37 UTC (rev 139949)
+++ trunk/Source/WebCore/CMakeLists.txt 2013-01-17 02:55:35 UTC (rev 139950)
@@ -1526,6 +1526,7 @@
html/canvas/WebGLUniformLocation.cpp
html/canvas/WebGLVertexArrayObjectOES.cpp
+ html/parser/BackgroundHTMLParser.cpp
html/parser/CSSPreloadScanner.cpp
html/parser/CompactHTMLToken.cpp
html/parser/HTMLConstructionSite.cpp
Modified: trunk/Source/WebCore/ChangeLog (139949 => 139950)
--- trunk/Source/WebCore/ChangeLog 2013-01-17 02:32:37 UTC (rev 139949)
+++ trunk/Source/WebCore/ChangeLog 2013-01-17 02:55:35 UTC (rev 139950)
@@ -1,3 +1,57 @@
+2013-01-16 Adam Barth <[email protected]>
+
+ Introduce BackgroundHTMLParser for parsing HTML on a background thread
+ https://bugs.webkit.org/show_bug.cgi?id=107083
+
+ Reviewed by Eric Seidel.
+
+ This patch contains a basic version of an HTML parser that runs on a
+ background thread. The parser passes the majority of the tests in
+ fast/parser and a large number of the subtests in html5lib.
+
+ Notably absent from this early version of the parser is speculation
+ (which will eventually replace preload scanning) and atomization (which
+ we suspect will be important for performance). Our plan is to introduce
+ those elements in subsequent patches.
+
+ * CMakeLists.txt:
+ * GNUmakefile.list.am:
+ * Target.pri:
+ * WebCore.gypi:
+ * WebCore.vcproj/WebCore.vcproj:
+ * WebCore.xcodeproj/project.pbxproj:
+ * html/parser/BackgroundHTMLParser.cpp: Added.
+ (WebCore):
+ (WebCore::checkThatTokensAreSafeToSendToAnotherThread):
+ (WebCore::parserMap):
+ (WebCore::ParserMap::backgroundParsers):
+ (WebCore::ParserMap::mainThreadParsers):
+ (WebCore::BackgroundHTMLParser::BackgroundHTMLParser):
+ (WebCore::BackgroundHTMLParser::append):
+ (WebCore::BackgroundHTMLParser::continueParsing):
+ (WebCore::BackgroundHTMLParser::finish):
+ (WebCore::BackgroundHTMLParser::pumpTokenizer):
+ (TokenDelivery):
+ (WebCore::TokenDelivery::execute):
+ (WebCore::BackgroundHTMLParser::sendTokensToMainThread):
+ (WebCore::BackgroundHTMLParser::createPartial):
+ (WebCore::BackgroundHTMLParser::stopPartial):
+ (WebCore::BackgroundHTMLParser::appendPartial):
+ (WebCore::BackgroundHTMLParser::continuePartial):
+ (WebCore::BackgroundHTMLParser::finishPartial):
+ * html/parser/BackgroundHTMLParser.h: Added.
+ (WebCore):
+ (BackgroundHTMLParser):
+ (WebCore::BackgroundHTMLParser::create):
+ (ParserMap):
+ (WebCore::ParserMap::identifierForParser):
+ * html/parser/HTMLDocumentParser.cpp:
+ (WebCore):
+ (WebCore::HTMLDocumentParser::didReceiveTokensFromBackgroundParser):
+ * html/parser/HTMLDocumentParser.h:
+ (WebCore):
+ (HTMLDocumentParser):
+
2013-01-16 Donghyun Kim <[email protected]>
[soup] Fix build warning in ResourceHandleSoup.cpp
Modified: trunk/Source/WebCore/GNUmakefile.list.am (139949 => 139950)
--- trunk/Source/WebCore/GNUmakefile.list.am 2013-01-17 02:32:37 UTC (rev 139949)
+++ trunk/Source/WebCore/GNUmakefile.list.am 2013-01-17 02:55:35 UTC (rev 139950)
@@ -3530,6 +3530,8 @@
Source/WebCore/html/MonthInputType.h \
Source/WebCore/html/NumberInputType.cpp \
Source/WebCore/html/NumberInputType.h \
+ Source/WebCore/html/parser/BackgroundHTMLParser.cpp \
+ Source/WebCore/html/parser/BackgroundHTMLParser.h \
Source/WebCore/html/parser/CSSPreloadScanner.cpp \
Source/WebCore/html/parser/CSSPreloadScanner.h \
Source/WebCore/html/parser/CompactHTMLToken.cpp \
Modified: trunk/Source/WebCore/Target.pri (139949 => 139950)
--- trunk/Source/WebCore/Target.pri 2013-01-17 02:32:37 UTC (rev 139949)
+++ trunk/Source/WebCore/Target.pri 2013-01-17 02:55:35 UTC (rev 139950)
@@ -707,6 +707,7 @@
html/canvas/CanvasRenderingContext2D.cpp \
html/canvas/CanvasStyle.cpp \
html/canvas/DataView.cpp \
+ html/parser/BackgroundHTMLParser.cpp \
html/parser/CSSPreloadScanner.cpp \
html/parser/CompactHTMLToken.cpp \
html/parser/HTMLConstructionSite.cpp \
Modified: trunk/Source/WebCore/WebCore.gypi (139949 => 139950)
--- trunk/Source/WebCore/WebCore.gypi 2013-01-17 02:32:37 UTC (rev 139949)
+++ trunk/Source/WebCore/WebCore.gypi 2013-01-17 02:55:35 UTC (rev 139950)
@@ -3333,6 +3333,8 @@
'html/canvas/WebGLUniformLocation.h',
'html/canvas/WebGLVertexArrayObjectOES.cpp',
'html/canvas/WebGLVertexArrayObjectOES.h',
+ 'html/parser/BackgroundHTMLParser.cpp',
+ 'html/parser/BackgroundHTMLParser.h',
'html/parser/CSSPreloadScanner.cpp',
'html/parser/CSSPreloadScanner.h',
'html/parser/CompactHTMLToken.cpp',
Modified: trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj (139949 => 139950)
--- trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj 2013-01-17 02:32:37 UTC (rev 139949)
+++ trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj 2013-01-17 02:55:35 UTC (rev 139950)
@@ -64537,6 +64537,14 @@
Name="parser"
>
<File
+ RelativePath="..\html\parser\BackgroundHTMLParser.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\html\parser\BackgroundHTMLParser.h"
+ >
+ </File>
+ <File
RelativePath="..\html\parser\CSSPreloadScanner.cpp"
>
</File>
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (139949 => 139950)
--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2013-01-17 02:32:37 UTC (rev 139949)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2013-01-17 02:55:35 UTC (rev 139950)
@@ -3624,8 +3624,6 @@
977B37261228721700B81FF8 /* HTMLTreeBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 977B37221228721700B81FF8 /* HTMLTreeBuilder.h */; };
977B3862122883E900B81FF8 /* CSSPreloadScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 977B3849122883E900B81FF8 /* CSSPreloadScanner.cpp */; };
977B3863122883E900B81FF8 /* CSSPreloadScanner.h in Headers */ = {isa = PBXBuildFile; fileRef = 977B384A122883E900B81FF8 /* CSSPreloadScanner.h */; };
- 977B3862122883E900B81FF9 /* CompactHTMLToken.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 977B3849122883E900B81FF9 /* CompactHTMLToken.cpp */; };
- 977B3863122883E900B81FF9 /* CompactHTMLToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 977B384A122883E900B81FF9 /* CompactHTMLToken.h */; };
977B3864122883E900B81FF8 /* HTMLConstructionSite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 977B384B122883E900B81FF8 /* HTMLConstructionSite.cpp */; };
977B3865122883E900B81FF8 /* HTMLConstructionSite.h in Headers */ = {isa = PBXBuildFile; fileRef = 977B384C122883E900B81FF8 /* HTMLConstructionSite.h */; };
977B3866122883E900B81FF8 /* HTMLDocumentParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 977B384D122883E900B81FF8 /* HTMLDocumentParser.cpp */; };
@@ -3661,6 +3659,10 @@
978D07CA145A10160096908D /* SVGException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 978D07C9145A10160096908D /* SVGException.cpp */; };
978D07CC145A102E0096908D /* XPathException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 978D07CB145A102E0096908D /* XPathException.cpp */; };
978D07CE145A10370096908D /* XMLHttpRequestException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 978D07CD145A10370096908D /* XMLHttpRequestException.cpp */; };
+ 979DC03616A7992A00807794 /* CompactHTMLToken.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 979DC03316A7992100807794 /* CompactHTMLToken.cpp */; };
+ 979DC03716A7992E00807794 /* CompactHTMLToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 979DC03416A7992100807794 /* CompactHTMLToken.h */; };
+ 979DC03816A7993300807794 /* BackgroundHTMLParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 979DC03216A7992100807794 /* BackgroundHTMLParser.h */; };
+ 979DC03916A7993900807794 /* BackgroundHTMLParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 979DC03116A7992100807794 /* BackgroundHTMLParser.cpp */; };
979F43D31075E44A0000F83B /* NavigationScheduler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 979F43D11075E44A0000F83B /* NavigationScheduler.cpp */; };
979F43D41075E44A0000F83B /* NavigationScheduler.h in Headers */ = {isa = PBXBuildFile; fileRef = 979F43D21075E44A0000F83B /* NavigationScheduler.h */; settings = {ATTRIBUTES = (Private, ); }; };
97AA3CA5145237CC003E1DA6 /* EventTargetHeaders.h in Headers */ = {isa = PBXBuildFile; fileRef = 97AA3CA3145237CC003E1DA6 /* EventTargetHeaders.h */; };
@@ -11002,8 +11004,6 @@
977B37221228721700B81FF8 /* HTMLTreeBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HTMLTreeBuilder.h; path = parser/HTMLTreeBuilder.h; sourceTree = "<group>"; };
977B3849122883E900B81FF8 /* CSSPreloadScanner.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CSSPreloadScanner.cpp; path = parser/CSSPreloadScanner.cpp; sourceTree = "<group>"; };
977B384A122883E900B81FF8 /* CSSPreloadScanner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSSPreloadScanner.h; path = parser/CSSPreloadScanner.h; sourceTree = "<group>"; };
- 977B3849122883E900B81FF9 /* CompactHTMLToken.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CompactHTMLToken.cpp; path = parser/CompactHTMLToken.cpp; sourceTree = "<group>"; };
- 977B384A122883E900B81FF9 /* CompactHTMLToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CompactHTMLToken.h; path = parser/CompactHTMLToken.h; sourceTree = "<group>"; };
977B384B122883E900B81FF8 /* HTMLConstructionSite.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = HTMLConstructionSite.cpp; path = parser/HTMLConstructionSite.cpp; sourceTree = "<group>"; };
977B384C122883E900B81FF8 /* HTMLConstructionSite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HTMLConstructionSite.h; path = parser/HTMLConstructionSite.h; sourceTree = "<group>"; };
977B384D122883E900B81FF8 /* HTMLDocumentParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = HTMLDocumentParser.cpp; path = parser/HTMLDocumentParser.cpp; sourceTree = "<group>"; };
@@ -11041,6 +11041,10 @@
978D07C9145A10160096908D /* SVGException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGException.cpp; sourceTree = "<group>"; };
978D07CB145A102E0096908D /* XPathException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XPathException.cpp; sourceTree = "<group>"; };
978D07CD145A10370096908D /* XMLHttpRequestException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XMLHttpRequestException.cpp; sourceTree = "<group>"; };
+ 979DC03116A7992100807794 /* BackgroundHTMLParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BackgroundHTMLParser.cpp; path = parser/BackgroundHTMLParser.cpp; sourceTree = "<group>"; };
+ 979DC03216A7992100807794 /* BackgroundHTMLParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BackgroundHTMLParser.h; path = parser/BackgroundHTMLParser.h; sourceTree = "<group>"; };
+ 979DC03316A7992100807794 /* CompactHTMLToken.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CompactHTMLToken.cpp; path = parser/CompactHTMLToken.cpp; sourceTree = "<group>"; };
+ 979DC03416A7992100807794 /* CompactHTMLToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CompactHTMLToken.h; path = parser/CompactHTMLToken.h; sourceTree = "<group>"; };
979F43D11075E44A0000F83B /* NavigationScheduler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NavigationScheduler.cpp; sourceTree = "<group>"; };
979F43D21075E44A0000F83B /* NavigationScheduler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NavigationScheduler.h; sourceTree = "<group>"; };
97AA3CA3145237CC003E1DA6 /* EventTargetHeaders.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventTargetHeaders.h; sourceTree = "<group>"; };
@@ -18533,6 +18537,10 @@
97C1F5511228558800EDE616 /* parser */ = {
isa = PBXGroup;
children = (
+ 979DC03116A7992100807794 /* BackgroundHTMLParser.cpp */,
+ 979DC03216A7992100807794 /* BackgroundHTMLParser.h */,
+ 979DC03316A7992100807794 /* CompactHTMLToken.cpp */,
+ 979DC03416A7992100807794 /* CompactHTMLToken.h */,
977B3849122883E900B81FF8 /* CSSPreloadScanner.cpp */,
977B384A122883E900B81FF8 /* CSSPreloadScanner.h */,
977B384B122883E900B81FF8 /* HTMLConstructionSite.cpp */,
@@ -22978,6 +22986,7 @@
BCA8C81E11E3D36900812FB7 /* BackForwardController.h in Headers */,
51741D0F0B07259A00ED442C /* BackForwardList.h in Headers */,
BCA8CA6011E4E6D100812FB7 /* BackForwardListImpl.h in Headers */,
+ 979DC03816A7993300807794 /* BackgroundHTMLParser.h in Headers */,
BC124EE80C2641CD009E2349 /* BarInfo.h in Headers */,
379E61CA126CA5C400B63E8D /* BaseButtonInputType.h in Headers */,
379E61CC126CA5C400B63E8D /* BaseCheckableInputType.h in Headers */,
@@ -23094,6 +23103,7 @@
9382DF5810A8D5C900925652 /* ColorSpace.h in Headers */,
BCDD454E1236C95C009A7985 /* ColumnInfo.h in Headers */,
6550B6A2099DF0270090D781 /* Comment.h in Headers */,
+ 979DC03716A7992E00807794 /* CompactHTMLToken.h in Headers */,
37C236111097EE7700EF9F72 /* ComplexTextController.h in Headers */,
4A6A0C5C15232F2400B09C6E /* ComposedShadowTreeWalker.h in Headers */,
316FE1160E6E1DA700BF6088 /* CompositeAnimation.h in Headers */,
@@ -26655,6 +26665,7 @@
29A8124B0FBB9CA900510293 /* AXObjectCacheMac.mm in Sources */,
BCA8C81F11E3D36900812FB7 /* BackForwardController.cpp in Sources */,
BCA8CA5F11E4E6D100812FB7 /* BackForwardListImpl.cpp in Sources */,
+ 979DC03916A7993900807794 /* BackgroundHTMLParser.cpp in Sources */,
BC124EE70C2641CD009E2349 /* BarInfo.cpp in Sources */,
379E61C9126CA5C300B63E8D /* BaseButtonInputType.cpp in Sources */,
379E61CB126CA5C400B63E8D /* BaseCheckableInputType.cpp in Sources */,
@@ -26747,6 +26758,7 @@
F55B3DB31251F12D003EF269 /* ColorInputType.cpp in Sources */,
B27535770B053814002CE64F /* ColorMac.mm in Sources */,
6550B6A1099DF0270090D781 /* Comment.cpp in Sources */,
+ 979DC03616A7992A00807794 /* CompactHTMLToken.cpp in Sources */,
37C236101097EE7700EF9F72 /* ComplexTextController.cpp in Sources */,
37C238221098C84200EF9F72 /* ComplexTextControllerCoreText.mm in Sources */,
4A6A0C5B15232F2400B09C6E /* ComposedShadowTreeWalker.cpp in Sources */,
Added: trunk/Source/WebCore/html/parser/BackgroundHTMLParser.cpp (0 => 139950)
--- trunk/Source/WebCore/html/parser/BackgroundHTMLParser.cpp (rev 0)
+++ trunk/Source/WebCore/html/parser/BackgroundHTMLParser.cpp 2013-01-17 02:55:35 UTC (rev 139950)
@@ -0,0 +1,219 @@
+/*
+ * 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 "BackgroundHTMLParser.h"
+
+#include "HTMLDocumentParser.h"
+#include "HTMLParserThread.h"
+#include "HTMLTokenizer.h"
+#include <wtf/MainThread.h>
+#include <wtf/Vector.h>
+
+namespace WebCore {
+
+#ifndef NDEBUG
+
+static void checkThatTokensAreSafeToSendToAnotherThread(const Vector<CompactHTMLToken>& tokens)
+{
+ for (size_t i = 0; i < tokens.size(); ++i)
+ ASSERT(tokens[i].isSafeToSendToAnotherThread());
+}
+
+#endif
+
+typedef const void* ParserIdentifier;
+class HTMLDocumentParser;
+
+ParserMap& parserMap()
+{
+ // This initialization assumes that this will be initialize on the main thread before
+ // any parser thread is started.
+ static ParserMap* sParserMap = new ParserMap;
+ return *sParserMap;
+}
+
+ParserMap::BackgroundParserMap& ParserMap::backgroundParsers()
+{
+ ASSERT(HTMLParserThread::shared()->threadId() == currentThread());
+ return m_backgroundParsers;
+}
+
+ParserMap::MainThreadParserMap& ParserMap::mainThreadParsers()
+{
+ ASSERT(isMainThread());
+ return m_mainThreadParsers;
+}
+
+BackgroundHTMLParser::BackgroundHTMLParser(const HTMLParserOptions& options, ParserIdentifier identifier)
+ : m_isPausedWaitingForScripts(false)
+ , m_inForeignContent(false)
+ , m_tokenizer(HTMLTokenizer::create(options))
+ , m_options(options)
+ , m_parserIdentifer(identifier)
+{
+}
+
+void BackgroundHTMLParser::append(const String& input)
+{
+ m_input.appendToEnd(input);
+ pumpTokenizer();
+}
+
+void BackgroundHTMLParser::continueParsing()
+{
+ m_isPausedWaitingForScripts = false;
+ pumpTokenizer();
+}
+
+void BackgroundHTMLParser::finish()
+{
+ ASSERT(!m_input.haveSeenEndOfFile());
+ m_input.markEndOfFile();
+ pumpTokenizer();
+}
+
+void BackgroundHTMLParser::pumpTokenizer()
+{
+ if (m_isPausedWaitingForScripts)
+ return;
+
+ DEFINE_STATIC_LOCAL(AtomicString, iframeTag, ("iframe", AtomicString::ConstructFromLiteral));
+ DEFINE_STATIC_LOCAL(AtomicString, mathTag, ("math", AtomicString::ConstructFromLiteral));
+ DEFINE_STATIC_LOCAL(AtomicString, noembedTag, ("noembed", AtomicString::ConstructFromLiteral));
+ DEFINE_STATIC_LOCAL(AtomicString, noframesTag, ("noframes", AtomicString::ConstructFromLiteral));
+ DEFINE_STATIC_LOCAL(AtomicString, noscriptTag, ("noscript", AtomicString::ConstructFromLiteral));
+ DEFINE_STATIC_LOCAL(AtomicString, plaintextTag, ("plaintext", AtomicString::ConstructFromLiteral));
+ DEFINE_STATIC_LOCAL(AtomicString, scriptTag, ("script", AtomicString::ConstructFromLiteral));
+ DEFINE_STATIC_LOCAL(AtomicString, styleTag, ("style", AtomicString::ConstructFromLiteral));
+ DEFINE_STATIC_LOCAL(AtomicString, svgTag, ("svg", AtomicString::ConstructFromLiteral));
+ DEFINE_STATIC_LOCAL(AtomicString, textareaTag, ("textarea", AtomicString::ConstructFromLiteral));
+ DEFINE_STATIC_LOCAL(AtomicString, titleTag, ("title", AtomicString::ConstructFromLiteral));
+ DEFINE_STATIC_LOCAL(AtomicString, xmpTag, ("xmp", AtomicString::ConstructFromLiteral));
+
+ while (m_tokenizer->nextToken(m_input.current(), m_token)) {
+ m_pendingTokens.append(CompactHTMLToken(m_token));
+
+ if (m_token.type() == HTMLTokenTypes::StartTag) {
+ AtomicString tagName(m_token.name().data(), m_token.name().size());
+ if (tagName == svgTag || tagName == mathTag)
+ m_inForeignContent = true;
+
+ // FIXME: This is just a copy of Tokenizer::updateStateFor which doesn't use HTMLNames.
+ if (tagName == textareaTag || tagName == titleTag)
+ m_tokenizer->setState(HTMLTokenizerState::RCDATAState);
+ else if (tagName == plaintextTag)
+ m_tokenizer->setState(HTMLTokenizerState::PLAINTEXTState);
+ else if (tagName == scriptTag)
+ m_tokenizer->setState(HTMLTokenizerState::ScriptDataState);
+ else if (tagName == styleTag
+ || tagName == iframeTag
+ || tagName == xmpTag
+ || (tagName == noembedTag && m_options.pluginsEnabled)
+ || tagName == noframesTag
+ || (tagName == noscriptTag && m_options.scriptEnabled))
+ m_tokenizer->setState(HTMLTokenizerState::RAWTEXTState);
+ }
+ if (m_token.type() == HTMLTokenTypes::EndTag) {
+ AtomicString tagName(m_token.name().data(), m_token.name().size());
+ if (tagName == svgTag || tagName == mathTag)
+ m_inForeignContent = false;
+ if (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();
+ }
+
+#ifndef NDEBUG
+ checkThatTokensAreSafeToSendToAnotherThread(m_pendingTokens);
+#endif
+
+ sendTokensToMainThread();
+}
+
+class TokenDelivery {
+public:
+ ParserIdentifier identifier;
+ Vector<CompactHTMLToken> tokens;
+
+ static void execute(void* context)
+ {
+ TokenDelivery* delivery = static_cast<TokenDelivery*>(context);
+ HTMLDocumentParser* parser = parserMap().mainThreadParsers().get(delivery->identifier);
+ if (parser)
+ parser->didReceiveTokensFromBackgroundParser(delivery->tokens);
+ delete delivery;
+ }
+};
+
+void BackgroundHTMLParser::sendTokensToMainThread()
+{
+ TokenDelivery* delivery = new TokenDelivery;
+ delivery->identifier = m_parserIdentifer;
+ delivery->tokens.swap(m_pendingTokens);
+ callOnMainThread(TokenDelivery::execute, delivery);
+}
+
+void BackgroundHTMLParser::createPartial(ParserIdentifier identifier, HTMLParserOptions options)
+{
+ ASSERT(!parserMap().backgroundParsers().get(identifier));
+ parserMap().backgroundParsers().set(identifier, BackgroundHTMLParser::create(options, identifier));
+}
+
+void BackgroundHTMLParser::stopPartial(ParserIdentifier identifier)
+{
+ parserMap().backgroundParsers().remove(identifier);
+}
+
+void BackgroundHTMLParser::appendPartial(ParserIdentifier identifier, const String& input)
+{
+ ASSERT(!input.impl() || input.impl()->hasOneRef() || input.isEmpty());
+ if (BackgroundHTMLParser* parser = parserMap().backgroundParsers().get(identifier))
+ parser->append(input);
+}
+
+void BackgroundHTMLParser::continuePartial(ParserIdentifier identifier)
+{
+ if (BackgroundHTMLParser* parser = parserMap().backgroundParsers().get(identifier))
+ parser->continueParsing();
+}
+
+void BackgroundHTMLParser::finishPartial(ParserIdentifier identifier)
+{
+ if (BackgroundHTMLParser* parser = parserMap().backgroundParsers().get(identifier))
+ parser->finish();
+}
+
+}
+
+#endif // ENABLE(THREADED_HTML_PARSER)
Added: trunk/Source/WebCore/html/parser/BackgroundHTMLParser.h (0 => 139950)
--- trunk/Source/WebCore/html/parser/BackgroundHTMLParser.h (rev 0)
+++ trunk/Source/WebCore/html/parser/BackgroundHTMLParser.h 2013-01-17 02:55:35 UTC (rev 139950)
@@ -0,0 +1,101 @@
+/*
+ * 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 BackgroundHTMLParser_h
+#define BackgroundHTMLParser_h
+
+#if ENABLE(THREADED_HTML_PARSER)
+
+#include "CompactHTMLToken.h"
+#include "HTMLInputStream.h"
+#include "HTMLParserOptions.h"
+#include "HTMLToken.h"
+#include "HTMLTokenizer.h"
+
+namespace WebCore {
+
+typedef const void* ParserIdentifier;
+class HTMLDocumentParser;
+
+class BackgroundHTMLParser {
+ WTF_MAKE_FAST_ALLOCATED;
+public:
+ void append(const String&);
+ void continueParsing();
+ void finish();
+
+ static PassOwnPtr<BackgroundHTMLParser> create(const HTMLParserOptions& options, ParserIdentifier identifier)
+ {
+ return adoptPtr(new BackgroundHTMLParser(options, identifier));
+ }
+
+ static void createPartial(ParserIdentifier, HTMLParserOptions);
+ static void stopPartial(ParserIdentifier);
+ static void appendPartial(ParserIdentifier, const String& input);
+ static void continuePartial(ParserIdentifier);
+ static void finishPartial(ParserIdentifier);
+
+private:
+ explicit BackgroundHTMLParser(const HTMLParserOptions&, ParserIdentifier);
+
+ void pumpTokenizer();
+
+ void sendTokensToMainThread();
+
+ HTMLInputStream m_input;
+ HTMLToken m_token;
+ bool m_isPausedWaitingForScripts;
+ bool m_inForeignContent; // FIXME: We need a stack of foreign content markers.
+ OwnPtr<HTMLTokenizer> m_tokenizer;
+ HTMLParserOptions m_options;
+ ParserIdentifier m_parserIdentifer;
+ Vector<CompactHTMLToken> m_pendingTokens;
+};
+
+class ParserMap {
+public:
+ static ParserIdentifier identifierForParser(HTMLDocumentParser* parser)
+ {
+ return reinterpret_cast<ParserIdentifier>(parser);
+ }
+
+ typedef HashMap<ParserIdentifier, OwnPtr<BackgroundHTMLParser> > BackgroundParserMap;
+ typedef HashMap<ParserIdentifier, HTMLDocumentParser*> MainThreadParserMap;
+
+ BackgroundParserMap& backgroundParsers();
+ MainThreadParserMap& mainThreadParsers();
+
+private:
+ BackgroundParserMap m_backgroundParsers;
+ MainThreadParserMap m_mainThreadParsers;
+};
+
+ParserMap& parserMap();
+
+}
+
+#endif // ENABLE(THREADED_HTML_PARSER)
+
+#endif
Modified: trunk/Source/WebCore/html/parser/HTMLDocumentParser.cpp (139949 => 139950)
--- trunk/Source/WebCore/html/parser/HTMLDocumentParser.cpp 2013-01-17 02:32:37 UTC (rev 139949)
+++ trunk/Source/WebCore/html/parser/HTMLDocumentParser.cpp 2013-01-17 02:55:35 UTC (rev 139950)
@@ -26,6 +26,7 @@
#include "config.h"
#include "HTMLDocumentParser.h"
+#include "CompactHTMLToken.h"
#include "ContentSecurityPolicy.h"
#include "DocumentFragment.h"
#include "Element.h"
@@ -242,6 +243,15 @@
return true;
}
+#if ENABLE(THREADED_HTML_PARSER)
+
+void HTMLDocumentParser::didReceiveTokensFromBackgroundParser(const Vector<CompactHTMLToken>& tokens)
+{
+ // FIXME: Actually consume the tokens.
+}
+
+#endif // ENABLE(THREADED_HTML_PARSER)
+
void HTMLDocumentParser::pumpTokenizer(SynchronousMode mode)
{
ASSERT(!isStopped());
Modified: trunk/Source/WebCore/html/parser/HTMLDocumentParser.h (139949 => 139950)
--- trunk/Source/WebCore/html/parser/HTMLDocumentParser.h 2013-01-17 02:32:37 UTC (rev 139949)
+++ trunk/Source/WebCore/html/parser/HTMLDocumentParser.h 2013-01-17 02:55:35 UTC (rev 139950)
@@ -41,6 +41,7 @@
namespace WebCore {
+class CompactHTMLToken;
class Document;
class DocumentFragment;
class HTMLDocument;
@@ -77,6 +78,10 @@
virtual void suspendScheduledTasks();
virtual void resumeScheduledTasks();
+#if ENABLE(THREADED_HTML_PARSER)
+ void didReceiveTokensFromBackgroundParser(const Vector<CompactHTMLToken>&);
+#endif
+
protected:
virtual void insert(const SegmentedString&);
virtual void append(const SegmentedString&);