Changeset 142822 in webkit


Ignore:
Timestamp:
Feb 13, 2013 4:56:47 PM (11 years ago)
Author:
abarth@webkit.org
Message:

Factor HTMLTokenScanner out of HTMLPreloadScanner
https://bugs.webkit.org/show_bug.cgi?id=109754

Reviewed by Eric Seidel.

This patch is just a mechanical separation of the per-token "scanning"
logic from HTMLPreloadScanner into a separate class.
HTMLPreloadScanner's job is now to keep track of the input stream and
to pump the tokenizer.

This factorization class will let us use HTMLTokenScanner on the
background thread (once we finish making it thread-safe). In a follow
up patch, I'll move HTMLTokenScanner to its own file.

  • html/parser/HTMLPreloadScanner.cpp:

(WebCore::HTMLTokenScanner::HTMLTokenScanner):
(WebCore::HTMLTokenScanner::~HTMLTokenScanner):
(WebCore::HTMLTokenScanner::processPossibleTemplateTag):
(WebCore::HTMLTokenScanner::processPossibleStyleTag):
(WebCore::HTMLTokenScanner::processPossibleBaseTag):
(WebCore::HTMLTokenScanner::scan):
(WebCore::HTMLPreloadScanner::HTMLPreloadScanner):
(WebCore):
(WebCore::HTMLPreloadScanner::~HTMLPreloadScanner):
(WebCore::HTMLPreloadScanner::appendToEnd):
(WebCore::HTMLPreloadScanner::scan):

  • html/parser/HTMLPreloadScanner.h:

(HTMLTokenScanner):
(WebCore::HTMLTokenScanner::setPredictedBaseElementURL):
(HTMLPreloadScanner):
(WebCore):

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r142820 r142822  
     12013-02-13  Adam Barth  <abarth@webkit.org>
     2
     3        Factor HTMLTokenScanner out of HTMLPreloadScanner
     4        https://bugs.webkit.org/show_bug.cgi?id=109754
     5
     6        Reviewed by Eric Seidel.
     7
     8        This patch is just a mechanical separation of the per-token "scanning"
     9        logic from HTMLPreloadScanner into a separate class.
     10        HTMLPreloadScanner's job is now to keep track of the input stream and
     11        to pump the tokenizer.
     12
     13        This factorization class will let us use HTMLTokenScanner on the
     14        background thread (once we finish making it thread-safe). In a follow
     15        up patch, I'll move HTMLTokenScanner to its own file.
     16
     17        * html/parser/HTMLPreloadScanner.cpp:
     18        (WebCore::HTMLTokenScanner::HTMLTokenScanner):
     19        (WebCore::HTMLTokenScanner::~HTMLTokenScanner):
     20        (WebCore::HTMLTokenScanner::processPossibleTemplateTag):
     21        (WebCore::HTMLTokenScanner::processPossibleStyleTag):
     22        (WebCore::HTMLTokenScanner::processPossibleBaseTag):
     23        (WebCore::HTMLTokenScanner::scan):
     24        (WebCore::HTMLPreloadScanner::HTMLPreloadScanner):
     25        (WebCore):
     26        (WebCore::HTMLPreloadScanner::~HTMLPreloadScanner):
     27        (WebCore::HTMLPreloadScanner::appendToEnd):
     28        (WebCore::HTMLPreloadScanner::scan):
     29        * html/parser/HTMLPreloadScanner.h:
     30        (HTMLTokenScanner):
     31        (WebCore::HTMLTokenScanner::setPredictedBaseElementURL):
     32        (HTMLPreloadScanner):
     33        (WebCore):
     34
    1352013-02-13  Elliott Sprehn  <esprehn@chromium.org>
    236
  • trunk/Source/WebCore/html/parser/HTMLPreloadScanner.cpp

    r142803 r142822  
    192192};
    193193
    194 HTMLPreloadScanner::HTMLPreloadScanner(const HTMLParserOptions& options, const KURL& documentURL)
    195     : m_tokenizer(HTMLTokenizer::create(options))
     194TokenPreloadScanner::TokenPreloadScanner(const KURL& documentURL)
     195    : m_documentURL(documentURL)
    196196    , m_inStyle(false)
    197     , m_documentURL(documentURL)
    198197#if ENABLE(TEMPLATE_ELEMENT)
    199198    , m_templateCount(0)
     
    202201}
    203202
    204 void HTMLPreloadScanner::appendToEnd(const SegmentedString& source)
    205 {
    206     m_source.append(source);
    207 }
    208 
    209 // This function exists for convenience on the main thread and is not used by the background-thread preload scanner.
    210 void HTMLPreloadScanner::scan(HTMLResourcePreloader* preloader, const KURL& startingBaseElementURL)
    211 {
    212     ASSERT(isMainThread()); // HTMLTokenizer::updateStateFor only works on the main thread.
    213     // When we start scanning, our best prediction of the baseElementURL is the real one!
    214     if (!startingBaseElementURL.isEmpty())
    215         m_predictedBaseElementURL = startingBaseElementURL;
    216 
    217     Vector<OwnPtr<PreloadRequest> > requests;
    218     // Note: m_token is only used from this function and for the main thread.
    219     // All other functions are passed a token.
    220     while (m_tokenizer->nextToken(m_source, m_token)) {
    221         if (isStartTag(m_token))
    222             m_tokenizer->updateStateFor(AtomicString(m_token.name()));
    223         processToken(m_token, requests);
    224         m_token.clear();
    225     }
    226     for (size_t i = 0; i < requests.size(); i++)
    227         preloader->preload(requests[i].release());
     203TokenPreloadScanner::~TokenPreloadScanner()
     204{
    228205}
    229206
    230207#if ENABLE(TEMPLATE_ELEMENT)
    231 bool HTMLPreloadScanner::processPossibleTemplateTag(const AtomicString& tagName, const HTMLToken& token)
     208bool TokenPreloadScanner::processPossibleTemplateTag(const AtomicString& tagName, const HTMLToken& token)
    232209{
    233210    if (isStartOrEndTag(token) && tagName == templateTag) {
     
    243220#endif
    244221
    245 bool HTMLPreloadScanner::processPossibleStyleTag(const AtomicString& tagName, const HTMLToken& token)
     222bool TokenPreloadScanner::processPossibleStyleTag(const AtomicString& tagName, const HTMLToken& token)
    246223{
    247224    ASSERT(isStartOrEndTag(token));
     
    257234}
    258235
    259 bool HTMLPreloadScanner::processPossibleBaseTag(const AtomicString& tagName, const HTMLToken& token)
     236bool TokenPreloadScanner::processPossibleBaseTag(const AtomicString& tagName, const HTMLToken& token)
    260237{
    261238    ASSERT(isStartTag(token));
     
    278255}
    279256
    280 void HTMLPreloadScanner::processToken(const HTMLToken& token, Vector<OwnPtr<PreloadRequest> >& requests)
     257void TokenPreloadScanner::scan(const HTMLToken& token, Vector<OwnPtr<PreloadRequest> >& requests)
    281258{
    282259    // <style> is the only place we search for urls in non-start/end-tag tokens.
     
    287264        return m_cssScanner.scan(characters.begin(), characters.end(), requests);
    288265    }
     266
    289267    if (!isStartOrEndTag(token))
    290268        return;
     
    308286}
    309287
    310 }
     288HTMLPreloadScanner::HTMLPreloadScanner(const HTMLParserOptions& options, const KURL& documentURL)
     289    : m_scanner(documentURL)
     290    , m_tokenizer(HTMLTokenizer::create(options))
     291{
     292}
     293
     294HTMLPreloadScanner::~HTMLPreloadScanner()
     295{
     296}
     297
     298void HTMLPreloadScanner::appendToEnd(const SegmentedString& source)
     299{
     300    m_source.append(source);
     301}
     302
     303void HTMLPreloadScanner::scan(HTMLResourcePreloader* preloader, const KURL& startingBaseElementURL)
     304{
     305    ASSERT(isMainThread()); // HTMLTokenizer::updateStateFor only works on the main thread.
     306
     307    // When we start scanning, our best prediction of the baseElementURL is the real one!
     308    if (!startingBaseElementURL.isEmpty())
     309        m_scanner.setPredictedBaseElementURL(startingBaseElementURL);
     310
     311    Vector<OwnPtr<PreloadRequest> > requests;
     312    while (m_tokenizer->nextToken(m_source, m_token)) {
     313        if (isStartTag(m_token))
     314            m_tokenizer->updateStateFor(AtomicString(m_token.name()));
     315        m_scanner.scan(m_token, requests);
     316        m_token.clear();
     317    }
     318    for (size_t i = 0; i < requests.size(); i++)
     319        preloader->preload(requests[i].release());
     320}
     321
     322}
  • trunk/Source/WebCore/html/parser/HTMLPreloadScanner.h

    r142427 r142822  
    3939class SegmentedString;
    4040
    41 class HTMLPreloadScanner {
    42     WTF_MAKE_NONCOPYABLE(HTMLPreloadScanner); WTF_MAKE_FAST_ALLOCATED;
     41class TokenPreloadScanner {
     42    WTF_MAKE_NONCOPYABLE(TokenPreloadScanner); WTF_MAKE_FAST_ALLOCATED;
    4343public:
    44     // HTMLPreloadScanner intentionally does not have a pointer to Document.
    45     HTMLPreloadScanner(const HTMLParserOptions&, const KURL& documentURL);
     44    explicit TokenPreloadScanner(const KURL& documentURL);
     45    ~TokenPreloadScanner();
    4646
    47     void appendToEnd(const SegmentedString&);
    48     void scan(HTMLResourcePreloader*, const KURL& documentBaseElementURL);
     47    void scan(const HTMLToken&, Vector<OwnPtr<PreloadRequest> >& requests);
     48
     49    void setPredictedBaseElementURL(const KURL& url) { m_predictedBaseElementURL = url; }
    4950
    5051private:
    51     void processToken(const HTMLToken&, Vector<OwnPtr<PreloadRequest> >& requests);
    52 
    5352    bool processStyleCharacters(const HTMLToken&);
    5453
     
    6059    bool processPossibleBaseTag(const AtomicString& tagName, const HTMLToken&);
    6160
    62     SegmentedString m_source;
    6361    CSSPreloadScanner m_cssScanner;
    64     HTMLToken m_token;
    65     OwnPtr<HTMLTokenizer> m_tokenizer;
    66     bool m_inStyle;
    6762    KURL m_documentURL;
    6863    KURL m_predictedBaseElementURL;
     64    bool m_inStyle;
    6965
    7066#if ENABLE(TEMPLATE_ELEMENT)
     
    7369};
    7470
     71class HTMLPreloadScanner {
     72    WTF_MAKE_NONCOPYABLE(HTMLPreloadScanner); WTF_MAKE_FAST_ALLOCATED;
     73public:
     74    HTMLPreloadScanner(const HTMLParserOptions&, const KURL& documentURL);
     75    ~HTMLPreloadScanner();
     76
     77    void appendToEnd(const SegmentedString&);
     78    void scan(HTMLResourcePreloader*, const KURL& documentBaseElementURL);
     79
     80private:
     81    TokenPreloadScanner m_scanner;
     82    SegmentedString m_source;
     83    HTMLToken m_token;
     84    OwnPtr<HTMLTokenizer> m_tokenizer;
     85};
     86
    7587}
    7688
Note: See TracChangeset for help on using the changeset viewer.