Changeset 141363 in webkit


Ignore:
Timestamp:
Jan 30, 2013 6:40:33 PM (11 years ago)
Author:
abarth@webkit.org
Message:

The background HTML parser should be able to parse speculatively
https://bugs.webkit.org/show_bug.cgi?id=107753

Reviewed by Eric Seidel.

Source/WebCore:

This patch adds the ability for the foreground HTML parser to
invalidate speculative parsing done by the background HTML parser.
Currently, we're a bit overly agressive an invalidate all speculations
on document.write. We plan to refine that in the future.

Test: fast/parser/document-write-partial-script.html

  • WebCore.gypi:
  • html/parser/BackgroundHTMLInputStream.cpp: Added.

(WebCore):
(WebCore::BackgroundHTMLInputStream::BackgroundHTMLInputStream):
(WebCore::BackgroundHTMLInputStream::append):
(WebCore::BackgroundHTMLInputStream::close):
(WebCore::BackgroundHTMLInputStream::createCheckpoint):
(WebCore::BackgroundHTMLInputStream::rewindTo):

  • html/parser/BackgroundHTMLInputStream.h: Added.

(WebCore):
(BackgroundHTMLInputStream):
(WebCore::BackgroundHTMLInputStream::current):
(WebCore::BackgroundHTMLInputStream::Checkpoint::Checkpoint):
(Checkpoint):

  • html/parser/BackgroundHTMLParser.cpp:

(WebCore::BackgroundHTMLParser::append):
(WebCore):
(WebCore::BackgroundHTMLParser::resumeFrom):
(WebCore::BackgroundHTMLParser::markEndOfFile):
(WebCore::BackgroundHTMLParser::pumpTokenizer):
(WebCore::BackgroundHTMLParser::sendTokensToMainThread):
(WebCore::BackgroundHTMLParser::resumeFromPartial):

  • html/parser/BackgroundHTMLParser.h:

(BackgroundHTMLParser):

  • html/parser/HTMLDocumentParser.cpp:

(WebCore::HTMLDocumentParser::didReceiveParsedChunkFromBackgroundParser):
(WebCore::HTMLDocumentParser::didFailSpeculation):
(WebCore::HTMLDocumentParser::processParsedChunkFromBackgroundParser):
(WebCore::HTMLDocumentParser::resumeParsingAfterScriptExecution):

  • html/parser/HTMLDocumentParser.h:

(ParsedChunk):
(HTMLDocumentParser):

LayoutTests:

  • fast/parser/document-write-partial-script-expected.txt: Added.
  • fast/parser/document-write-partial-script.html: Added.
Location:
trunk
Files:
4 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r141362 r141363  
     12013-01-30  Adam Barth  <abarth@webkit.org>
     2
     3        The background HTML parser should be able to parse speculatively
     4        https://bugs.webkit.org/show_bug.cgi?id=107753
     5
     6        Reviewed by Eric Seidel.
     7
     8        * fast/parser/document-write-partial-script-expected.txt: Added.
     9        * fast/parser/document-write-partial-script.html: Added.
     10
    1112013-01-30  Jessie Berlin  <jberlin@apple.com>
    212
  • trunk/Source/WebCore/CMakeLists.txt

    r141296 r141363  
    15331533    html/canvas/WebGLVertexArrayObjectOES.cpp
    15341534
     1535    html/parser/BackgroundHTMLInputStream.cpp
    15351536    html/parser/BackgroundHTMLParser.cpp
    15361537    html/parser/CSSPreloadScanner.cpp
  • trunk/Source/WebCore/ChangeLog

    r141360 r141363  
     12013-01-30  Adam Barth  <abarth@webkit.org>
     2
     3        The background HTML parser should be able to parse speculatively
     4        https://bugs.webkit.org/show_bug.cgi?id=107753
     5
     6        Reviewed by Eric Seidel.
     7
     8        This patch adds the ability for the foreground HTML parser to
     9        invalidate speculative parsing done by the background HTML parser.
     10        Currently, we're a bit overly agressive an invalidate all speculations
     11        on document.write. We plan to refine that in the future.
     12
     13        Test: fast/parser/document-write-partial-script.html
     14
     15        * WebCore.gypi:
     16        * html/parser/BackgroundHTMLInputStream.cpp: Added.
     17        (WebCore):
     18        (WebCore::BackgroundHTMLInputStream::BackgroundHTMLInputStream):
     19        (WebCore::BackgroundHTMLInputStream::append):
     20        (WebCore::BackgroundHTMLInputStream::close):
     21        (WebCore::BackgroundHTMLInputStream::createCheckpoint):
     22        (WebCore::BackgroundHTMLInputStream::rewindTo):
     23        * html/parser/BackgroundHTMLInputStream.h: Added.
     24        (WebCore):
     25        (BackgroundHTMLInputStream):
     26        (WebCore::BackgroundHTMLInputStream::current):
     27        (WebCore::BackgroundHTMLInputStream::Checkpoint::Checkpoint):
     28        (Checkpoint):
     29        * html/parser/BackgroundHTMLParser.cpp:
     30        (WebCore::BackgroundHTMLParser::append):
     31        (WebCore):
     32        (WebCore::BackgroundHTMLParser::resumeFrom):
     33        (WebCore::BackgroundHTMLParser::markEndOfFile):
     34        (WebCore::BackgroundHTMLParser::pumpTokenizer):
     35        (WebCore::BackgroundHTMLParser::sendTokensToMainThread):
     36        (WebCore::BackgroundHTMLParser::resumeFromPartial):
     37        * html/parser/BackgroundHTMLParser.h:
     38        (BackgroundHTMLParser):
     39        * html/parser/HTMLDocumentParser.cpp:
     40        (WebCore::HTMLDocumentParser::didReceiveParsedChunkFromBackgroundParser):
     41        (WebCore::HTMLDocumentParser::didFailSpeculation):
     42        (WebCore::HTMLDocumentParser::processParsedChunkFromBackgroundParser):
     43        (WebCore::HTMLDocumentParser::resumeParsingAfterScriptExecution):
     44        * html/parser/HTMLDocumentParser.h:
     45        (ParsedChunk):
     46        (HTMLDocumentParser):
     47
    1482013-01-30  Nils Barth  <nbarth@google.com>
    249
  • trunk/Source/WebCore/GNUmakefile.list.am

    r141296 r141363  
    35443544        Source/WebCore/html/NumberInputType.cpp \
    35453545        Source/WebCore/html/NumberInputType.h \
     3546        Source/WebCore/html/parser/BackgroundHTMLInputStream.cpp \
     3547        Source/WebCore/html/parser/BackgroundHTMLInputStream.h \
    35463548        Source/WebCore/html/parser/BackgroundHTMLParser.cpp \
    35473549        Source/WebCore/html/parser/BackgroundHTMLParser.h \
  • trunk/Source/WebCore/Target.pri

    r141296 r141363  
    712712    html/canvas/CanvasStyle.cpp \
    713713    html/canvas/DataView.cpp \
     714    html/parser/BackgroundHTMLInputStream.cpp \
    714715    html/parser/BackgroundHTMLParser.cpp \
    715716    html/parser/CSSPreloadScanner.cpp \
  • trunk/Source/WebCore/WebCore.gypi

    r141296 r141363  
    33493349            'html/parser/BackgroundHTMLParser.cpp',
    33503350            'html/parser/BackgroundHTMLParser.h',
     3351            'html/parser/BackgroundHTMLInputStream.cpp',
     3352            'html/parser/BackgroundHTMLInputStream.h',
    33513353            'html/parser/CSSPreloadScanner.cpp',
    33523354            'html/parser/CSSPreloadScanner.h',
  • trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj

    r141296 r141363  
    6475864758                                >
    6475964759                                <File
     64760                                        RelativePath="..\html\parser\BackgroundHTMLInputStream.cpp"
     64761                                        >
     64762                                </File>
     64763                                <File
     64764                                        RelativePath="..\html\parser\BackgroundHTMLInputStream.h"
     64765                                        >
     64766                                </File>
     64767                                <File
    6476064768                                        RelativePath="..\html\parser\BackgroundHTMLParser.cpp"
    6476164769                                        >
  • trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj

    r141296 r141363  
    48664866    <ClCompile Include="..\html\ValidityState.cpp" />
    48674867    <ClCompile Include="..\html\WeekInputType.cpp" />
     4868    <ClCompile Include="..\html\parser\BackgroundHTMLInputStream.cpp" />
    48684869    <ClCompile Include="..\html\parser\BackgroundHTMLParser.cpp" />
    48694870    <ClCompile Include="..\html\parser\CompactHTMLToken.cpp" />
  • trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters

    r141296 r141363  
    56265626      <Filter>html</Filter>
    56275627    </ClCompile>
     5628    <ClCompile Include="..\html\parser\BackgroundHTMLInputStream.cpp">
     5629      <Filter>html\parser</Filter>
     5630    </ClCompile>
    56285631    <ClCompile Include="..\html\parser\BackgroundHTMLParser.cpp">
    56295632      <Filter>html\parser</Filter>
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r141296 r141363  
    36903690                97B38E28151C4273004622E9 /* DOMWindowNotifications.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97B38E23151C4264004622E9 /* DOMWindowNotifications.cpp */; };
    36913691                97B8FFD116AE7F960038388D /* CharacterReferenceParserInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 97B8FFCF16AE7F920038388D /* CharacterReferenceParserInlines.h */; };
     3692                97BC69DA1505F076001B74AC /* DatabaseBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97BC69D61505F076001B74AC /* DatabaseBackend.cpp */; };
     3693                97BC69DB1505F076001B74AC /* DatabaseBackend.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC69D71505F076001B74AC /* DatabaseBackend.h */; settings = {ATTRIBUTES = (Private, ); }; };
    36923694                97BC69DC1505F076001B74AC /* ChangeVersionWrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97BC69D81505F076001B74AC /* ChangeVersionWrapper.cpp */; };
    36933695                97BC69DD1505F076001B74AC /* ChangeVersionWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC69D91505F076001B74AC /* ChangeVersionWrapper.h */; };
     
    36963698                97BC6A231505F081001B74AC /* DatabaseAuthorizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97BC69E11505F081001B74AC /* DatabaseAuthorizer.cpp */; };
    36973699                97BC6A241505F081001B74AC /* DatabaseAuthorizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC69E21505F081001B74AC /* DatabaseAuthorizer.h */; };
    3698                 97BC69DA1505F076001B74AC /* DatabaseBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97BC69D61505F076001B74AC /* DatabaseBackend.cpp */; };
    3699                 97BC69DB1505F076001B74AC /* DatabaseBackend.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC69D71505F076001B74AC /* DatabaseBackend.h */; settings = {ATTRIBUTES = (Private, ); }; };
    37003700                97BC6A251505F081001B74AC /* DatabaseCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC69E31505F081001B74AC /* DatabaseCallback.h */; };
    37013701                97BC6A271505F081001B74AC /* DatabaseContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97BC69E51505F081001B74AC /* DatabaseContext.cpp */; };
    37023702                97BC6A281505F081001B74AC /* DatabaseContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC69E61505F081001B74AC /* DatabaseContext.h */; settings = {ATTRIBUTES = (Private, ); }; };
    37033703                97BC6A291505F081001B74AC /* DatabaseDetails.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC69E71505F081001B74AC /* DatabaseDetails.h */; settings = {ATTRIBUTES = (Private, ); }; };
    3704                 FE09DB49169E2D6E00622557 /* DatabaseError.h in Headers */ = {isa = PBXBuildFile; fileRef = FE09DB46169E2D6E00622557 /* DatabaseError.h */; settings = {ATTRIBUTES = (Private, ); }; };
    3705                 FEB26D28167A8F2A00FDD26B /* DatabaseServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FEB26D27167A8F2A00FDD26B /* DatabaseServer.cpp */; };
    3706                 FEAF6654167970320062D0C5 /* DatabaseServer.h in Headers */ = {isa = PBXBuildFile; fileRef = FEAF6653167970070062D0C5 /* DatabaseServer.h */; settings = {ATTRIBUTES = (Private, ); }; };
    37073704                97BC6A2A1505F081001B74AC /* DatabaseSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97BC69E81505F081001B74AC /* DatabaseSync.cpp */; };
    37083705                97BC6A2B1505F081001B74AC /* DatabaseSync.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BC69E91505F081001B74AC /* DatabaseSync.h */; };
     
    37573754                97D2AD0314B823A60093DF32 /* DOMWindowProperty.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97D2AD0114B823A60093DF32 /* DOMWindowProperty.cpp */; };
    37583755                97D2AD0414B823A60093DF32 /* DOMWindowProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = 97D2AD0214B823A60093DF32 /* DOMWindowProperty.h */; settings = {ATTRIBUTES = (Private, ); }; };
     3756                97DC69EC16B9F529008CFD6F /* BackgroundHTMLInputStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97DC69E916B9F50E008CFD6F /* BackgroundHTMLInputStream.cpp */; };
     3757                97DC69ED16B9F52C008CFD6F /* BackgroundHTMLInputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 97DC69EA16B9F50E008CFD6F /* BackgroundHTMLInputStream.h */; };
    37593758                97DCE20110807C750057D394 /* HistoryController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97DCE1FF10807C750057D394 /* HistoryController.cpp */; };
    37603759                97DCE20210807C750057D394 /* HistoryController.h in Headers */ = {isa = PBXBuildFile; fileRef = 97DCE20010807C750057D394 /* HistoryController.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    67306729                FDF7E9C313AC21DB00A51EAC /* JSAudioBufferCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDF7E9C113AC21DB00A51EAC /* JSAudioBufferCallback.cpp */; };
    67316730                FDF7E9C413AC21DB00A51EAC /* JSAudioBufferCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = FDF7E9C213AC21DB00A51EAC /* JSAudioBufferCallback.h */; };
     6731                FE09DB49169E2D6E00622557 /* DatabaseError.h in Headers */ = {isa = PBXBuildFile; fileRef = FE09DB46169E2D6E00622557 /* DatabaseError.h */; settings = {ATTRIBUTES = (Private, ); }; };
    67326732                FE115FAB167988CD00249134 /* AbstractDatabaseServer.h in Headers */ = {isa = PBXBuildFile; fileRef = FE115FA9167988CD00249134 /* AbstractDatabaseServer.h */; settings = {ATTRIBUTES = (Private, ); }; };
    67336733                FE3371A2167C11D400EDB752 /* DatabaseBasicTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = FE3371A0167C11D400EDB752 /* DatabaseBasicTypes.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    67456745                FE80DA710E9C472F000D6F75 /* JSPositionError.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE80DA6D0E9C472F000D6F75 /* JSPositionError.cpp */; };
    67466746                FE80DA720E9C472F000D6F75 /* JSPositionError.h in Headers */ = {isa = PBXBuildFile; fileRef = FE80DA6E0E9C472F000D6F75 /* JSPositionError.h */; };
     6747                FEAF6654167970320062D0C5 /* DatabaseServer.h in Headers */ = {isa = PBXBuildFile; fileRef = FEAF6653167970070062D0C5 /* DatabaseServer.h */; settings = {ATTRIBUTES = (Private, ); }; };
     6748                FEB26D28167A8F2A00FDD26B /* DatabaseServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FEB26D27167A8F2A00FDD26B /* DatabaseServer.cpp */; };
    67476749                FEDEF84116797108000E444A /* DatabaseStrategy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FEDEF83F16797108000E444A /* DatabaseStrategy.cpp */; };
    67486750                FEDEF84216797108000E444A /* DatabaseStrategy.h in Headers */ = {isa = PBXBuildFile; fileRef = FEDEF84016797108000E444A /* DatabaseStrategy.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    1109111093                97B38E25151C4264004622E9 /* DOMWindowNotifications.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = DOMWindowNotifications.idl; path = Modules/notifications/DOMWindowNotifications.idl; sourceTree = "<group>"; };
    1109211094                97B8FFCF16AE7F920038388D /* CharacterReferenceParserInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CharacterReferenceParserInlines.h; sourceTree = "<group>"; };
     11095                97BC69D61505F076001B74AC /* DatabaseBackend.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DatabaseBackend.cpp; path = Modules/webdatabase/DatabaseBackend.cpp; sourceTree = "<group>"; };
     11096                97BC69D71505F076001B74AC /* DatabaseBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DatabaseBackend.h; path = Modules/webdatabase/DatabaseBackend.h; sourceTree = "<group>"; };
    1109311097                97BC69D81505F076001B74AC /* ChangeVersionWrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ChangeVersionWrapper.cpp; path = Modules/webdatabase/ChangeVersionWrapper.cpp; sourceTree = "<group>"; };
    1109411098                97BC69D91505F076001B74AC /* ChangeVersionWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ChangeVersionWrapper.h; path = Modules/webdatabase/ChangeVersionWrapper.h; sourceTree = "<group>"; };
     
    1109811102                97BC69E11505F081001B74AC /* DatabaseAuthorizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DatabaseAuthorizer.cpp; path = Modules/webdatabase/DatabaseAuthorizer.cpp; sourceTree = "<group>"; };
    1109911103                97BC69E21505F081001B74AC /* DatabaseAuthorizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DatabaseAuthorizer.h; path = Modules/webdatabase/DatabaseAuthorizer.h; sourceTree = "<group>"; };
    11100                 97BC69D61505F076001B74AC /* DatabaseBackend.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DatabaseBackend.cpp; path = Modules/webdatabase/DatabaseBackend.cpp; sourceTree = "<group>"; };
    11101                 97BC69D71505F076001B74AC /* DatabaseBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DatabaseBackend.h; path = Modules/webdatabase/DatabaseBackend.h; sourceTree = "<group>"; };
    1110211104                97BC69E31505F081001B74AC /* DatabaseCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DatabaseCallback.h; path = Modules/webdatabase/DatabaseCallback.h; sourceTree = "<group>"; };
    1110311105                97BC69E41505F081001B74AC /* DatabaseCallback.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = DatabaseCallback.idl; path = Modules/webdatabase/DatabaseCallback.idl; sourceTree = "<group>"; };
     
    1110511107                97BC69E61505F081001B74AC /* DatabaseContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DatabaseContext.h; path = Modules/webdatabase/DatabaseContext.h; sourceTree = "<group>"; };
    1110611108                97BC69E71505F081001B74AC /* DatabaseDetails.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DatabaseDetails.h; path = Modules/webdatabase/DatabaseDetails.h; sourceTree = "<group>"; };
    11107                 FE09DB46169E2D6E00622557 /* DatabaseError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DatabaseError.h; path = Modules/webdatabase/DatabaseError.h; sourceTree = "<group>"; };
    11108                 FEAF6653167970070062D0C5 /* DatabaseServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DatabaseServer.h; path = Modules/webdatabase/DatabaseServer.h; sourceTree = "<group>"; };
    11109                 FEB26D27167A8F2A00FDD26B /* DatabaseServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DatabaseServer.cpp; path = Modules/webdatabase/DatabaseServer.cpp; sourceTree = "<group>"; };
    1111011109                97BC69E81505F081001B74AC /* DatabaseSync.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DatabaseSync.cpp; path = Modules/webdatabase/DatabaseSync.cpp; sourceTree = "<group>"; };
    1111111110                97BC69E91505F081001B74AC /* DatabaseSync.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DatabaseSync.h; path = Modules/webdatabase/DatabaseSync.h; sourceTree = "<group>"; };
     
    1117511174                97D2AD0114B823A60093DF32 /* DOMWindowProperty.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DOMWindowProperty.cpp; sourceTree = "<group>"; };
    1117611175                97D2AD0214B823A60093DF32 /* DOMWindowProperty.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMWindowProperty.h; sourceTree = "<group>"; };
     11176                97DC69E916B9F50E008CFD6F /* BackgroundHTMLInputStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BackgroundHTMLInputStream.cpp; path = parser/BackgroundHTMLInputStream.cpp; sourceTree = "<group>"; };
     11177                97DC69EA16B9F50E008CFD6F /* BackgroundHTMLInputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BackgroundHTMLInputStream.h; path = parser/BackgroundHTMLInputStream.h; sourceTree = "<group>"; };
    1117711178                97DCE1FF10807C750057D394 /* HistoryController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HistoryController.cpp; sourceTree = "<group>"; };
    1117811179                97DCE20010807C750057D394 /* HistoryController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryController.h; sourceTree = "<group>"; };
     
    1439714398                FDF7E9C113AC21DB00A51EAC /* JSAudioBufferCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSAudioBufferCallback.cpp; sourceTree = "<group>"; };
    1439814399                FDF7E9C213AC21DB00A51EAC /* JSAudioBufferCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSAudioBufferCallback.h; sourceTree = "<group>"; };
     14400                FE09DB46169E2D6E00622557 /* DatabaseError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DatabaseError.h; path = Modules/webdatabase/DatabaseError.h; sourceTree = "<group>"; };
    1439914401                FE115FA9167988CD00249134 /* AbstractDatabaseServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AbstractDatabaseServer.h; path = Modules/webdatabase/AbstractDatabaseServer.h; sourceTree = "<group>"; };
    1440014402                FE3371A0167C11D400EDB752 /* DatabaseBasicTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DatabaseBasicTypes.h; path = Modules/webdatabase/DatabaseBasicTypes.h; sourceTree = "<group>"; };
     
    1441314415                FE80DA6D0E9C472F000D6F75 /* JSPositionError.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPositionError.cpp; sourceTree = "<group>"; };
    1441414416                FE80DA6E0E9C472F000D6F75 /* JSPositionError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPositionError.h; sourceTree = "<group>"; };
     14417                FEAF6653167970070062D0C5 /* DatabaseServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DatabaseServer.h; path = Modules/webdatabase/DatabaseServer.h; sourceTree = "<group>"; };
     14418                FEB26D27167A8F2A00FDD26B /* DatabaseServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DatabaseServer.cpp; path = Modules/webdatabase/DatabaseServer.cpp; sourceTree = "<group>"; };
    1441514419                FEDEF83F16797108000E444A /* DatabaseStrategy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DatabaseStrategy.cpp; sourceTree = "<group>"; };
    1441614420                FEDEF84016797108000E444A /* DatabaseStrategy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DatabaseStrategy.h; sourceTree = "<group>"; };
     
    1857718581                        isa = PBXGroup;
    1857818582                        children = (
     18583                                97DC69E916B9F50E008CFD6F /* BackgroundHTMLInputStream.cpp */,
     18584                                97DC69EA16B9F50E008CFD6F /* BackgroundHTMLInputStream.h */,
    1857918585                                979DC03116A7992100807794 /* BackgroundHTMLParser.cpp */,
    1858018586                                979DC03216A7992100807794 /* BackgroundHTMLParser.h */,
     
    2631626322                                2E07753416B1BD4C004D9936 /* MicroDataAttributeTokenList.h in Headers */,
    2631726323                                2919A1E916B3376600787213 /* ContentFilter.h in Headers */,
     26324                                97DC69ED16B9F52C008CFD6F /* BackgroundHTMLInputStream.h in Headers */,
    2631826325                        );
    2631926326                        runOnlyForDeploymentPostprocessing = 0;
     
    2947029477                                2E07753116B1BD13004D9936 /* MicroDataAttributeTokenList.cpp in Sources */,
    2947129478                                2919A1EB16B3378900787213 /* ContentFilterMac.mm in Sources */,
     29479                                97DC69EC16B9F529008CFD6F /* BackgroundHTMLInputStream.cpp in Sources */,
    2947229480                        );
    2947329481                        runOnlyForDeploymentPostprocessing = 0;
  • trunk/Source/WebCore/html/parser/BackgroundHTMLParser.cpp

    r141070 r141363  
    9595void BackgroundHTMLParser::append(const String& input)
    9696{
    97     m_input.append(SegmentedString(input));
     97    m_input.append(input);
     98    pumpTokenizer();
     99}
     100
     101void BackgroundHTMLParser::resumeFrom(const WeakPtr<HTMLDocumentParser>& parser, PassOwnPtr<HTMLToken> token, PassOwnPtr<HTMLTokenizer> tokenizer, HTMLInputCheckpoint checkpoint)
     102{
     103    m_parser = parser;
     104    m_token = token;
     105    m_tokenizer = tokenizer;
     106    m_input.rewindTo(checkpoint);
    98107    pumpTokenizer();
    99108}
     
    111120    const LChar endOfFileMarker = 0;
    112121
    113     ASSERT(!m_input.isClosed());
    114     m_input.append(SegmentedString(String(&endOfFileMarker, 1)));
     122    ASSERT(!m_input.current().isClosed());
     123    m_input.append(String(&endOfFileMarker, 1));
    115124    m_input.close();
    116125}
     
    155164void BackgroundHTMLParser::pumpTokenizer()
    156165{
    157     while (m_tokenizer->nextToken(m_input, *m_token.get())) {
    158         m_pendingTokens->append(CompactHTMLToken(m_token.get(), TextPosition(m_input.currentLine(), m_input.currentColumn())));
     166    while (m_tokenizer->nextToken(m_input.current(), *m_token.get())) {
     167        m_pendingTokens->append(CompactHTMLToken(m_token.get(), TextPosition(m_input.current().currentLine(), m_input.current().currentColumn())));
    159168        m_token->clear();
    160169
     
    175184#endif
    176185
    177     callOnMainThread(bind(&HTMLDocumentParser::didReceiveTokensFromBackgroundParser, m_parser, m_pendingTokens.release()));
     186    OwnPtr<HTMLDocumentParser::ParsedChunk> chunk = adoptPtr(new HTMLDocumentParser::ParsedChunk);
     187    chunk->tokens = m_pendingTokens.release();
     188    chunk->checkpoint = m_input.createCheckpoint();
     189    callOnMainThread(bind(&HTMLDocumentParser::didReceiveParsedChunkFromBackgroundParser, m_parser, chunk.release()));
    178190
    179191    m_pendingTokens = adoptPtr(new CompactHTMLTokenStream);
     
    198210}
    199211
     212void BackgroundHTMLParser::resumeFromPartial(ParserIdentifier identifier, const WeakPtr<HTMLDocumentParser>& parser, PassOwnPtr<HTMLToken> token, PassOwnPtr<HTMLTokenizer> tokenizer, HTMLInputCheckpoint checkpoint)
     213{
     214    if (BackgroundHTMLParser* backgroundParser = parserMap().backgroundParsers().get(identifier))
     215        backgroundParser->resumeFrom(parser, token, tokenizer, checkpoint);
     216}
     217
    200218void BackgroundHTMLParser::finishPartial(ParserIdentifier identifier)
    201219{
  • trunk/Source/WebCore/html/parser/BackgroundHTMLParser.h

    r141070 r141363  
    2929#if ENABLE(THREADED_HTML_PARSER)
    3030
     31#include "BackgroundHTMLInputStream.h"
    3132#include "CompactHTMLToken.h"
    3233#include "HTMLParserOptions.h"
     
    4445public:
    4546    void append(const String&);
     47    void resumeFrom(const WeakPtr<HTMLDocumentParser>&, PassOwnPtr<HTMLToken>, PassOwnPtr<HTMLTokenizer>, HTMLInputCheckpoint);
    4648    void finish();
    4749
     
    5456    static void stopPartial(ParserIdentifier);
    5557    static void appendPartial(ParserIdentifier, const String& input);
     58    static void resumeFromPartial(ParserIdentifier, const WeakPtr<HTMLDocumentParser>&, PassOwnPtr<HTMLToken>, PassOwnPtr<HTMLTokenizer>, HTMLInputCheckpoint);
    5659    static void finishPartial(ParserIdentifier);
    5760
     
    6669
    6770    bool m_inForeignContent; // FIXME: We need a stack of foreign content markers.
    68     SegmentedString m_input;
     71    BackgroundHTMLInputStream m_input;
    6972    OwnPtr<HTMLToken> m_token;
    7073    OwnPtr<HTMLTokenizer> m_tokenizer;
  • trunk/Source/WebCore/html/parser/HTMLDocumentParser.cpp

    r141328 r141363  
    277277#if ENABLE(THREADED_HTML_PARSER)
    278278
    279 void HTMLDocumentParser::didReceiveTokensFromBackgroundParser(PassOwnPtr<CompactHTMLTokenStream> tokens)
     279void HTMLDocumentParser::didReceiveParsedChunkFromBackgroundParser(PassOwnPtr<ParsedChunk> chunk)
    280280{
    281281    if (isWaitingForScripts()) {
    282         m_pendingTokens.append(tokens);
    283         return;
    284     }
    285     ASSERT(m_pendingTokens.isEmpty());
    286     processTokensFromBackgroundParser(tokens);
    287 }
    288 
    289 void HTMLDocumentParser::didFailSpeculation(PassOwnPtr<HTMLToken>, PassOwnPtr<HTMLTokenizer>)
    290 {
    291     // FIXME: Tell the background parser to resume parsing with this token and tokenizer.
    292 }
    293 
    294 void HTMLDocumentParser::processTokensFromBackgroundParser(PassOwnPtr<CompactHTMLTokenStream> tokens)
     282        m_speculations.append(chunk);
     283        return;
     284    }
     285    ASSERT(m_speculations.isEmpty());
     286    processParsedChunkFromBackgroundParser(chunk);
     287}
     288
     289void HTMLDocumentParser::didFailSpeculation(PassOwnPtr<HTMLToken> token, PassOwnPtr<HTMLTokenizer> tokenizer)
     290{
     291    m_weakFactory.revokeAll();
     292    m_speculations.clear();
     293
     294    ParserIdentifier identifier = ParserMap::identifierForParser(this);
     295    HTMLParserThread::shared()->postTask(bind(&BackgroundHTMLParser::resumeFromPartial,
     296        identifier, m_weakFactory.createWeakPtr(), token, tokenizer, m_currentChunk->checkpoint));
     297}
     298
     299void HTMLDocumentParser::processParsedChunkFromBackgroundParser(PassOwnPtr<ParsedChunk> chunk)
    295300{
    296301    ASSERT(shouldUseThreading());
     
    299304    // but we need to ensure it isn't deleted yet.
    300305    RefPtr<HTMLDocumentParser> protect(this);
     306
     307    ASSERT(!m_currentChunk);
     308    m_currentChunk = chunk;
     309    OwnPtr<CompactHTMLTokenStream> tokens = m_currentChunk->tokens.release();
    301310
    302311    // FIXME: Pass in current input length.
     
    330339    }
    331340
     341    m_currentChunk.clear();
    332342    InspectorInstrumentation::didWriteHTML(cookie, lineNumber().zeroBasedInt());
    333343}
     
    702712#if ENABLE(THREADED_HTML_PARSER)
    703713    if (shouldUseThreading()) {
    704         while (!m_pendingTokens.isEmpty()) {
    705             processTokensFromBackgroundParser(m_pendingTokens.takeFirst());
     714        while (!m_speculations.isEmpty()) {
     715            processParsedChunkFromBackgroundParser(m_speculations.takeFirst());
    706716            if (isWaitingForScripts() || isStopped())
    707717                return;
  • trunk/Source/WebCore/html/parser/HTMLDocumentParser.h

    r141328 r141363  
    2727#define HTMLDocumentParser_h
    2828
     29#include "BackgroundHTMLInputStream.h"
    2930#include "CachedResourceClient.h"
    3031#include "FragmentScriptingPermission.h"
     
    8384
    8485#if ENABLE(THREADED_HTML_PARSER)
    85     void didReceiveTokensFromBackgroundParser(PassOwnPtr<CompactHTMLTokenStream>);
     86    struct ParsedChunk {
     87        OwnPtr<CompactHTMLTokenStream> tokens;
     88        HTMLInputCheckpoint checkpoint;
     89    };
     90    void didReceiveParsedChunkFromBackgroundParser(PassOwnPtr<ParsedChunk>);
    8691#endif
    8792
     
    126131    void stopBackgroundParser();
    127132    void didFailSpeculation(PassOwnPtr<HTMLToken>, PassOwnPtr<HTMLTokenizer>);
    128     void processTokensFromBackgroundParser(PassOwnPtr<CompactHTMLTokenStream>);
     133    void processParsedChunkFromBackgroundParser(PassOwnPtr<ParsedChunk>);
    129134#endif
    130135
     
    173178
    174179#if ENABLE(THREADED_HTML_PARSER)
    175     Deque<OwnPtr<CompactHTMLTokenStream> > m_pendingTokens;
     180    OwnPtr<ParsedChunk> m_currentChunk;
     181    Deque<OwnPtr<ParsedChunk> > m_speculations;
    176182    WeakPtrFactory<HTMLDocumentParser> m_weakFactory;
    177183#endif
Note: See TracChangeset for help on using the changeset viewer.