Changeset 142843 in webkit


Ignore:
Timestamp:
Feb 13, 2013 7:31:58 PM (11 years ago)
Author:
abarth@webkit.org
Message:

TokenPreloadScanner should be (mostly!) thread-safe
https://bugs.webkit.org/show_bug.cgi?id=109760

Reviewed by Eric Seidel.

This patch makes the bulk of TokenPreloadScanner thread-safe. The one
remaining wart is processPossibleBaseTag because it wants to grub
around in the base tag's attributes. I have a plan for that, but it's
going to need to wait for the next patch.

  • html/parser/HTMLPreloadScanner.cpp:

(WebCore::isStartTag):
(WebCore::isStartOrEndTag):
(WebCore::TokenPreloadScanner::identifierFor):
(WebCore::TokenPreloadScanner::inititatorFor):
(WebCore::TokenPreloadScanner::StartTagScanner::StartTagScanner):
(WebCore::TokenPreloadScanner::StartTagScanner::processAttributes):
(TokenPreloadScanner::StartTagScanner):
(WebCore::TokenPreloadScanner::processPossibleTemplateTag):
(WebCore::TokenPreloadScanner::processPossibleStyleTag):
(WebCore::TokenPreloadScanner::processPossibleBaseTag):
(WebCore::TokenPreloadScanner::scan):
(WebCore::HTMLPreloadScanner::scan):

  • html/parser/HTMLPreloadScanner.h:

(WebCore):

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r142840 r142843  
     12013-02-13  Adam Barth  <abarth@webkit.org>
     2
     3        TokenPreloadScanner should be (mostly!) thread-safe
     4        https://bugs.webkit.org/show_bug.cgi?id=109760
     5
     6        Reviewed by Eric Seidel.
     7
     8        This patch makes the bulk of TokenPreloadScanner thread-safe.  The one
     9        remaining wart is processPossibleBaseTag because it wants to grub
     10        around in the base tag's attributes. I have a plan for that, but it's
     11        going to need to wait for the next patch.
     12
     13        * html/parser/HTMLPreloadScanner.cpp:
     14        (WebCore::isStartTag):
     15        (WebCore::isStartOrEndTag):
     16        (WebCore::TokenPreloadScanner::identifierFor):
     17        (WebCore::TokenPreloadScanner::inititatorFor):
     18        (WebCore::TokenPreloadScanner::StartTagScanner::StartTagScanner):
     19        (WebCore::TokenPreloadScanner::StartTagScanner::processAttributes):
     20        (TokenPreloadScanner::StartTagScanner):
     21        (WebCore::TokenPreloadScanner::processPossibleTemplateTag):
     22        (WebCore::TokenPreloadScanner::processPossibleStyleTag):
     23        (WebCore::TokenPreloadScanner::processPossibleBaseTag):
     24        (WebCore::TokenPreloadScanner::scan):
     25        (WebCore::HTMLPreloadScanner::scan):
     26        * html/parser/HTMLPreloadScanner.h:
     27        (WebCore):
     28
    1292013-02-13  Adam Barth  <abarth@webkit.org>
    230
  • trunk/Source/WebCore/html/parser/HTMLPreloadScanner.cpp

    r142840 r142843  
    4444using namespace HTMLNames;
    4545
    46 static bool isStartTag(const HTMLToken& token)
    47 {
    48     return token.type() == HTMLToken::StartTag;
    49 }
    50 
    51 static bool isStartOrEndTag(const HTMLToken& token)
    52 {
    53     return token.type() == HTMLToken::EndTag || isStartTag(token);
    54 }
    55 
    56 enum HTMLTagIdentifier {
    57     ImgTagId,
    58     InputTagId,
    59     LinkTagId,
    60     ScriptTagId,
    61     UnknownTagId,
    62 };
    63 
    64 static HTMLTagIdentifier identifierFor(const AtomicString& tagName)
     46static bool isStartTag(HTMLToken::Type type)
     47{
     48    return type == HTMLToken::StartTag;
     49}
     50
     51static bool isStartOrEndTag(HTMLToken::Type type)
     52{
     53    return type == HTMLToken::EndTag || isStartTag(type);
     54}
     55
     56TokenPreloadScanner::TagId TokenPreloadScanner::identifierFor(const AtomicString& tagName)
    6557{
    6658    if (tagName == imgTag)
     
    7264    if (tagName == scriptTag)
    7365        return ScriptTagId;
     66    if (tagName == styleTag)
     67        return StyleTagId;
     68    if (tagName == baseTag)
     69        return BaseTagId;
     70    if (tagName == templateTag)
     71        return TemplateTagId;
    7472    return UnknownTagId;
    7573}
    7674
    77 static String inititatorFor(HTMLTagIdentifier tagId)
     75String TokenPreloadScanner::inititatorFor(TagId tagId)
    7876{
    7977    switch (tagId) {
     
    8785        return "script";
    8886    case UnknownTagId:
     87    case StyleTagId:
     88    case BaseTagId:
     89    case TemplateTagId:
    8990        ASSERT_NOT_REACHED();
    9091        return "unknown";
     
    9495}
    9596
    96 class StartTagScanner {
     97class TokenPreloadScanner::StartTagScanner {
    9798public:
    98     explicit StartTagScanner(HTMLTagIdentifier tagId)
     99    explicit StartTagScanner(TagId tagId)
    99100        : m_tagId(tagId)
    100101        , m_linkIsStyleSheet(false)
     
    108109        ASSERT(isMainThread());
    109110
    110         if (m_tagId == UnknownTagId)
     111        if (m_tagId >= UnknownTagId)
    111112            return;
    112113
     
    222223    }
    223224
    224     HTMLTagIdentifier m_tagId;
     225    TagId m_tagId;
    225226    String m_urlToLoad;
    226227    String m_charset;
     
    245246
    246247#if ENABLE(TEMPLATE_ELEMENT)
    247 bool TokenPreloadScanner::processPossibleTemplateTag(const AtomicString& tagName, const HTMLToken& token)
    248 {
    249     if (isStartOrEndTag(token) && tagName == templateTag) {
    250         if (isStartTag(token))
     248bool TokenPreloadScanner::processPossibleTemplateTag(TagId tagId, HTMLToken::Type type)
     249{
     250    if (isStartOrEndTag(type) && tagId == TemplateTagId) {
     251        if (isStartTag(type))
    251252            m_templateCount++;
    252253        else
     
    259260#endif
    260261
    261 bool TokenPreloadScanner::processPossibleStyleTag(const AtomicString& tagName, const HTMLToken& token)
    262 {
    263     ASSERT(isStartOrEndTag(token));
    264     if (tagName != styleTag)
     262bool TokenPreloadScanner::processPossibleStyleTag(TagId tagId, HTMLToken::Type type)
     263{
     264    ASSERT(isStartOrEndTag(type));
     265    if (tagId != StyleTagId)
    265266        return false;
    266267
    267     m_inStyle = isStartTag(token);
     268    m_inStyle = isStartTag(type);
    268269
    269270    if (!m_inStyle)
     
    273274}
    274275
    275 bool TokenPreloadScanner::processPossibleBaseTag(const AtomicString& tagName, const HTMLToken& token)
    276 {
    277     ASSERT(isStartTag(token));
    278     if (tagName != baseTag)
     276bool TokenPreloadScanner::processPossibleBaseTag(TagId tagId, const HTMLToken& token)
     277{
     278    ASSERT(isStartTag(token.type()));
     279    if (tagId != BaseTagId)
    279280        return false;
    280281
     
    304305    }
    305306
    306     if (!isStartOrEndTag(token))
     307    if (!isStartOrEndTag(token.type()))
    307308        return;
    308309
    309310    AtomicString tagName(token.name());
     311    TagId tagId = identifierFor(tagName);
     312
    310313#if ENABLE(TEMPLATE_ELEMENT)
    311     if (processPossibleTemplateTag(tagName, token))
     314    if (processPossibleTemplateTag(tagId, token.type()))
    312315        return;
    313316#endif
    314     if (processPossibleStyleTag(tagName, token))
    315         return;
    316     if (!isStartTag(token))
    317         return;
    318     if (processPossibleBaseTag(tagName, token))
    319         return;
    320 
    321     StartTagScanner scanner(identifierFor(tagName));
     317    if (processPossibleStyleTag(tagId, token.type()))
     318        return;
     319    if (!isStartTag(token.type()))
     320        return;
     321    if (processPossibleBaseTag(tagId, token))
     322        return;
     323
     324    StartTagScanner scanner(tagId);
    322325    scanner.processAttributes(token.attributes());
    323326    OwnPtr<PreloadRequest> request =  scanner.createPreloadRequest(m_predictedBaseElementURL);
     
    351354    Vector<OwnPtr<PreloadRequest> > requests;
    352355    while (m_tokenizer->nextToken(m_source, m_token)) {
    353         if (isStartTag(m_token))
     356        if (isStartTag(m_token.type()))
    354357            m_tokenizer->updateStateFor(AtomicString(m_token.name()));
    355358        m_scanner.scan(m_token, requests);
  • trunk/Source/WebCore/html/parser/HTMLPreloadScanner.h

    r142822 r142843  
    3535
    3636class HTMLParserOptions;
    37 class HTMLToken;
    3837class HTMLTokenizer;
    3938class SegmentedString;
     
    5049
    5150private:
    52     bool processStyleCharacters(const HTMLToken&);
     51    enum TagId {
     52        // These tags are scanned by the StartTagScanner.
     53        ImgTagId,
     54        InputTagId,
     55        LinkTagId,
     56        ScriptTagId,
     57
     58        // These tags are not scanned by the StartTagScanner.
     59        UnknownTagId,
     60        StyleTagId,
     61        BaseTagId,
     62        TemplateTagId,
     63    };
     64
     65    class StartTagScanner;
     66
     67    static TagId identifierFor(const AtomicString& tagName);
     68    static String inititatorFor(TagId);
    5369
    5470#if ENABLE(TEMPLATE_ELEMENT)
    55     bool processPossibleTemplateTag(const AtomicString& tagName, const HTMLToken&);
     71    bool processPossibleTemplateTag(TagId, HTMLToken::Type);
    5672#endif
    5773
    58     bool processPossibleStyleTag(const AtomicString& tagName, const HTMLToken&);
    59     bool processPossibleBaseTag(const AtomicString& tagName, const HTMLToken&);
     74    bool processPossibleStyleTag(TagId, HTMLToken::Type);
     75    bool processPossibleBaseTag(TagId, const HTMLToken&);
    6076
    6177    CSSPreloadScanner m_cssScanner;
Note: See TracChangeset for help on using the changeset viewer.