⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 145398 in webkit


Ignore:
Timestamp:
Mar 11, 2013, 1:53:47 PM (14 years ago)
Author:
abarth@webkit.org
Message:

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

Reviewed by Eric Seidel.

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

  • CMakeLists.txt:
  • GNUmakefile.list.am:
  • Target.pri:
  • WebCore.gypi:
  • WebCore.vcproj/WebCore.vcproj:
  • html/parser/BackgroundHTMLParser.cpp:

(WebCore):
(WebCore::BackgroundHTMLParser::BackgroundHTMLParser):
(WebCore::BackgroundHTMLParser::pumpTokenizer):

  • html/parser/BackgroundHTMLParser.h:

(BackgroundHTMLParser):

Location:
trunk/Source/WebCore
Files:
2 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/CMakeLists.txt

    r145354 r145398  
    15631563    html/parser/HTMLTokenizer.cpp
    15641564    html/parser/HTMLTreeBuilder.cpp
     1565    html/parser/HTMLTreeBuilderSimulator.cpp
    15651566    html/parser/HTMLViewSourceParser.cpp
    15661567    html/parser/TextDocumentParser.cpp
  • trunk/Source/WebCore/ChangeLog

    r145397 r145398  
     12013-03-11  Adam Barth  <abarth@webkit.org>
     2
     3        Factor HTMLTreeBuilderSimulator out of BackgroundHTMLParser
     4        https://bugs.webkit.org/show_bug.cgi?id=112057
     5
     6        Reviewed by Eric Seidel.
     7
     8        Simulating the HTML tree builder is a separate concern from parsing on
     9        the background thread. We plan to re-use the tree builder simulator for
     10        the view-source parser, for example. Also, having the simulator as a
     11        separate object will make it easier to fix
     12        https://bugs.webkit.org/show_bug.cgi?id=109764.
     13
     14        * CMakeLists.txt:
     15        * GNUmakefile.list.am:
     16        * Target.pri:
     17        * WebCore.gypi:
     18        * WebCore.vcproj/WebCore.vcproj:
     19        * html/parser/BackgroundHTMLParser.cpp:
     20        (WebCore):
     21        (WebCore::BackgroundHTMLParser::BackgroundHTMLParser):
     22        (WebCore::BackgroundHTMLParser::pumpTokenizer):
     23        * html/parser/BackgroundHTMLParser.h:
     24        (BackgroundHTMLParser):
     25
    1262013-02-26  Dima Gorbik  <dgorbik@apple.com>
    227
  • trunk/Source/WebCore/GNUmakefile.list.am

    r145354 r145398  
    36453645        Source/WebCore/html/parser/HTMLTreeBuilder.cpp \
    36463646        Source/WebCore/html/parser/HTMLTreeBuilder.h \
     3647        Source/WebCore/html/parser/HTMLTreeBuilderSimulator.cpp \
     3648        Source/WebCore/html/parser/HTMLTreeBuilderSimulator.h \
    36473649        Source/WebCore/html/parser/HTMLViewSourceParser.cpp \
    36483650        Source/WebCore/html/parser/HTMLViewSourceParser.h \
  • trunk/Source/WebCore/Target.pri

    r145354 r145398  
    748748    html/parser/HTMLTokenizer.cpp \
    749749    html/parser/HTMLTreeBuilder.cpp \
     750    html/parser/HTMLTreeBuilderSimulator.cpp \
    750751    html/parser/HTMLViewSourceParser.cpp \
    751752    html/parser/TextDocumentParser.cpp \
  • trunk/Source/WebCore/WebCore.gypi

    r145354 r145398  
    35333533            'html/parser/HTMLTreeBuilder.cpp',
    35343534            'html/parser/HTMLTreeBuilder.h',
     3535            'html/parser/HTMLTreeBuilderSimulator.cpp',
     3536            'html/parser/HTMLTreeBuilderSimulator.h',
    35353537            'html/parser/HTMLViewSourceParser.cpp',
    35363538            'html/parser/HTMLViewSourceParser.h',
  • trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj

    r145292 r145398  
    6520365203                                </File>
    6520465204                                <File
     65205                                        RelativePath="..\html\parser\HTMLTreeBuilderSimulator.cpp"
     65206                                        >
     65207                                </File>
     65208                                <File
     65209                                        RelativePath="..\html\parser\HTMLTreeBuilderSimulator.h"
     65210                                        >
     65211                                </File>
     65212                                <File
    6520565213                                        RelativePath="..\html\parser\HTMLViewSourceParser.cpp"
    6520665214                                        >
  • trunk/Source/WebCore/html/parser/BackgroundHTMLParser.cpp

    r145292 r145398  
    3131
    3232#include "HTMLDocumentParser.h"
    33 #include "HTMLNames.h"
    3433#include "HTMLParserIdioms.h"
    3534#include "HTMLParserThread.h"
    3635#include "HTMLTokenizer.h"
    37 #include "MathMLNames.h"
    38 #include "SVGNames.h"
    3936#include "XSSAuditor.h"
    4037#include <wtf/MainThread.h>
    41 #include <wtf/Vector.h>
    4238#include <wtf/text/TextPosition.h>
    4339
    4440namespace WebCore {
    45 
    46 using namespace HTMLNames;
    4741
    4842#ifndef NDEBUG
    … …  
    6862#endif
    6963
    70 static bool tokenExitsForeignContent(const CompactHTMLToken& token)
    71 {
    72     // FIXME: This is copied from HTMLTreeBuilder::processTokenInForeignContent and changed to use threadSafeHTMLNamesMatch.
    73     const HTMLIdentifier& tagName = token.data();
    74     return threadSafeHTMLNamesMatch(tagName, bTag)
    75         || threadSafeHTMLNamesMatch(tagName, bigTag)
    76         || threadSafeHTMLNamesMatch(tagName, blockquoteTag)
    77         || threadSafeHTMLNamesMatch(tagName, bodyTag)
    78         || threadSafeHTMLNamesMatch(tagName, brTag)
    79         || threadSafeHTMLNamesMatch(tagName, centerTag)
    80         || threadSafeHTMLNamesMatch(tagName, codeTag)
    81         || threadSafeHTMLNamesMatch(tagName, ddTag)
    82         || threadSafeHTMLNamesMatch(tagName, divTag)
    83         || threadSafeHTMLNamesMatch(tagName, dlTag)
    84         || threadSafeHTMLNamesMatch(tagName, dtTag)
    85         || threadSafeHTMLNamesMatch(tagName, emTag)
    86         || threadSafeHTMLNamesMatch(tagName, embedTag)
    87         || threadSafeHTMLNamesMatch(tagName, h1Tag)
    88         || threadSafeHTMLNamesMatch(tagName, h2Tag)
    89         || threadSafeHTMLNamesMatch(tagName, h3Tag)
    90         || threadSafeHTMLNamesMatch(tagName, h4Tag)
    91         || threadSafeHTMLNamesMatch(tagName, h5Tag)
    92         || threadSafeHTMLNamesMatch(tagName, h6Tag)
    93         || threadSafeHTMLNamesMatch(tagName, headTag)
    94         || threadSafeHTMLNamesMatch(tagName, hrTag)
    95         || threadSafeHTMLNamesMatch(tagName, iTag)
    96         || threadSafeHTMLNamesMatch(tagName, imgTag)
    97         || threadSafeHTMLNamesMatch(tagName, liTag)
    98         || threadSafeHTMLNamesMatch(tagName, listingTag)
    99         || threadSafeHTMLNamesMatch(tagName, menuTag)
    100         || threadSafeHTMLNamesMatch(tagName, metaTag)
    101         || threadSafeHTMLNamesMatch(tagName, nobrTag)
    102         || threadSafeHTMLNamesMatch(tagName, olTag)
    103         || threadSafeHTMLNamesMatch(tagName, pTag)
    104         || threadSafeHTMLNamesMatch(tagName, preTag)
    105         || threadSafeHTMLNamesMatch(tagName, rubyTag)
    106         || threadSafeHTMLNamesMatch(tagName, sTag)
    107         || threadSafeHTMLNamesMatch(tagName, smallTag)
    108         || threadSafeHTMLNamesMatch(tagName, spanTag)
    109         || threadSafeHTMLNamesMatch(tagName, strongTag)
    110         || threadSafeHTMLNamesMatch(tagName, strikeTag)
    111         || threadSafeHTMLNamesMatch(tagName, subTag)
    112         || threadSafeHTMLNamesMatch(tagName, supTag)
    113         || threadSafeHTMLNamesMatch(tagName, tableTag)
    114         || threadSafeHTMLNamesMatch(tagName, ttTag)
    115         || threadSafeHTMLNamesMatch(tagName, uTag)
    116         || threadSafeHTMLNamesMatch(tagName, ulTag)
    117         || threadSafeHTMLNamesMatch(tagName, varTag)
    118         || (threadSafeHTMLNamesMatch(tagName, fontTag) && (token.getAttributeItem(colorAttr) || token.getAttributeItem(faceAttr) || token.getAttributeItem(sizeAttr)));
    119 }
    120 
    121 static bool tokenExitsSVG(const CompactHTMLToken& token)
    122 {
    123     // FIXME: It's very fragile that we special case foreignObject here to be case-insensitive.
    124     // FIXME: Using CaseFoldingHash::equal instead of equalIgnoringCase, as equalIgnoringCase
    125     // wants non-const StringImpl* (even though it never modifies them).
    126     // https://bugs.webkit.org/show_bug.cgi?id=111892 is for fixing equalIgnoringCase.
    127     return CaseFoldingHash::equal(token.data().asStringImpl(), SVGNames::foreignObjectTag.localName().impl());
    128 }
    129 
    130 static bool tokenExitsMath(const CompactHTMLToken& token)
    131 {
    132     // FIXME: This is copied from HTMLElementStack::isMathMLTextIntegrationPoint and changed to use threadSafeMatch.
    133     const HTMLIdentifier& tagName = token.data();
    134     return threadSafeMatch(tagName, MathMLNames::miTag)
    135         || threadSafeMatch(tagName, MathMLNames::moTag)
    136         || threadSafeMatch(tagName, MathMLNames::mnTag)
    137         || threadSafeMatch(tagName, MathMLNames::msTag)
    138         || threadSafeMatch(tagName, MathMLNames::mtextTag);
    139 }
    140 
    14164static const size_t pendingTokenLimit = 1000;
    14265
    14366BackgroundHTMLParser::BackgroundHTMLParser(PassRefPtr<WeakReference<BackgroundHTMLParser> > reference, PassOwnPtr<Configuration> config)
    14467    : m_weakFactory(reference, this)
     68    , m_treeBuilderSimulator(config->options)
    14569    , m_token(adoptPtr(new HTMLToken))
    14670    , m_tokenizer(HTMLTokenizer::create(config->options))
    … …  
    15175    , m_preloadScanner(config->preloadScanner.release())
    15276{
    153     m_namespaceStack.append(HTML);
    15477}
    15578
    … …  
    204127}
    205128
    206 bool BackgroundHTMLParser::simulateTreeBuilder(const CompactHTMLToken& token)
    207 {
    208     if (token.type() == HTMLToken::StartTag) {
    209         const HTMLIdentifier& tagName = token.data();
    210         if (threadSafeMatch(tagName, SVGNames::svgTag))
    211             m_namespaceStack.append(SVG);
    212         if (threadSafeMatch(tagName, MathMLNames::mathTag))
    213             m_namespaceStack.append(MathML);
    214         if (inForeignContent() && tokenExitsForeignContent(token))
    215             m_namespaceStack.removeLast();
    216         if ((m_namespaceStack.last() == SVG && tokenExitsSVG(token))
    217             || (m_namespaceStack.last() == MathML && tokenExitsMath(token)))
    218             m_namespaceStack.append(HTML);
    219         if (!inForeignContent()) {
    220             // FIXME: This is just a copy of Tokenizer::updateStateFor which uses threadSafeMatches.
    221             if (threadSafeHTMLNamesMatch(tagName, textareaTag) || threadSafeHTMLNamesMatch(tagName, titleTag))
    222                 m_tokenizer->setState(HTMLTokenizer::RCDATAState);
    223             else if (threadSafeHTMLNamesMatch(tagName, plaintextTag))
    224                 m_tokenizer->setState(HTMLTokenizer::PLAINTEXTState);
    225             else if (threadSafeHTMLNamesMatch(tagName, scriptTag))
    226                 m_tokenizer->setState(HTMLTokenizer::ScriptDataState);
    227             else if (threadSafeHTMLNamesMatch(tagName, styleTag)
    228                 || threadSafeHTMLNamesMatch(tagName, iframeTag)
    229                 || threadSafeHTMLNamesMatch(tagName, xmpTag)
    230                 || (threadSafeHTMLNamesMatch(tagName, noembedTag) && m_options.pluginsEnabled)
    231                 || threadSafeHTMLNamesMatch(tagName, noframesTag)
    232                 || (threadSafeHTMLNamesMatch(tagName, noscriptTag) && m_options.scriptEnabled))
    233                 m_tokenizer->setState(HTMLTokenizer::RAWTEXTState);
    234         }
    235     }
    236 
    237     if (token.type() == HTMLToken::EndTag) {
    238         const HTMLIdentifier& tagName = token.data();
    239         if ((m_namespaceStack.last() == SVG && threadSafeMatch(tagName, SVGNames::svgTag))
    240             || (m_namespaceStack.last() == MathML && threadSafeMatch(tagName, MathMLNames::mathTag))
    241             || (m_namespaceStack.contains(SVG) && m_namespaceStack.last() == HTML && tokenExitsSVG(token))
    242             || (m_namespaceStack.contains(MathML) && m_namespaceStack.last() == HTML && tokenExitsMath(token)))
    243             m_namespaceStack.removeLast();
    244         if (threadSafeHTMLNamesMatch(tagName, scriptTag)) {
    245             if (!inForeignContent())
    246                 m_tokenizer->setState(HTMLTokenizer::DataState);
    247             return false;
    248         }
    249     }
    250 
    251     // FIXME: Also setForceNullCharacterReplacement when in text mode.
    252     m_tokenizer->setForceNullCharacterReplacement(inForeignContent());
    253     m_tokenizer->setShouldAllowCDATA(inForeignContent());
    254     return true;
    255 }
    256 
    257129void BackgroundHTMLParser::pumpTokenizer()
    258130{
    … …  
    280152        m_token->clear();
    281153
    282         if (!simulateTreeBuilder(m_pendingTokens->last()) || m_pendingTokens->size() >= pendingTokenLimit)
     154        if (!m_treeBuilderSimulator.simulate(m_pendingTokens->last(), m_tokenizer.get()) || m_pendingTokens->size() >= pendingTokenLimit)
    283155            sendTokensToMainThread();
    284156    }
  • trunk/Source/WebCore/html/parser/BackgroundHTMLParser.h

    r145277 r145398  
    3636#include "HTMLToken.h"
    3737#include "HTMLTokenizer.h"
     38#include "HTMLTreeBuilderSimulator.h"
    3839#include "XSSAuditorDelegate.h"
    3940#include <wtf/PassOwnPtr.h>
    … …  
    4445namespace WebCore {
    4546
    46 typedef const void* ParserIdentifier;
    4747class HTMLDocumentParser;
    4848class XSSAuditor;
    … …  
    8282
    8383private:
    84     enum Namespace {
    85         HTML,
    86         SVG,
    87         MathML
    88     };
    89 
    9084    BackgroundHTMLParser(PassRefPtr<WeakReference<BackgroundHTMLParser> >, PassOwnPtr<Configuration>);
    9185
    9286    void markEndOfFile();
    9387    void pumpTokenizer();
    94     bool simulateTreeBuilder(const CompactHTMLToken&);
     88    void sendTokensToMainThread();
    9589
    96     void sendTokensToMainThread();
    97     bool inForeignContent() const { return m_namespaceStack.last() != HTML; }
    98 
    99     Vector<Namespace, 1> m_namespaceStack;
    10090    WeakPtrFactory<BackgroundHTMLParser> m_weakFactory;
    10191    BackgroundHTMLInputStream m_input;
    10292    HTMLSourceTracker m_sourceTracker;
     93    HTMLTreeBuilderSimulator m_treeBuilderSimulator;
    10394    OwnPtr<HTMLToken> m_token;
    10495    OwnPtr<HTMLTokenizer> m_tokenizer;
Note: See TracChangeset for help on using the changeset viewer.