Title: [139950] trunk/Source/WebCore
Revision
139950
Author
[email protected]
Date
2013-01-16 18:55:35 -0800 (Wed, 16 Jan 2013)

Log Message

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):

Modified Paths

Added Paths

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&);
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to