Home | History | Annotate | Download | only in parser
      1 /*
      2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
      3  * Copyright (C) 2010 Google Inc. All Rights Reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
     15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
     18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     25  */
     26 
     27 #ifndef HTMLPreloadScanner_h
     28 #define HTMLPreloadScanner_h
     29 
     30 #include "core/html/parser/CSSPreloadScanner.h"
     31 #include "core/html/parser/CompactHTMLToken.h"
     32 #include "core/html/parser/HTMLToken.h"
     33 #include "core/platform/text/SegmentedString.h"
     34 #include "wtf/Vector.h"
     35 
     36 namespace WebCore {
     37 
     38 typedef size_t TokenPreloadScannerCheckpoint;
     39 
     40 class HTMLParserOptions;
     41 class HTMLTokenizer;
     42 class SegmentedString;
     43 
     44 class TokenPreloadScanner {
     45     WTF_MAKE_NONCOPYABLE(TokenPreloadScanner); WTF_MAKE_FAST_ALLOCATED;
     46 public:
     47     explicit TokenPreloadScanner(const KURL& documentURL);
     48     ~TokenPreloadScanner();
     49 
     50     void scan(const HTMLToken&, const SegmentedString&, PreloadRequestStream& requests);
     51     void scan(const CompactHTMLToken&, const SegmentedString&, PreloadRequestStream& requests);
     52 
     53     void setPredictedBaseElementURL(const KURL& url) { m_predictedBaseElementURL = url; }
     54 
     55     // A TokenPreloadScannerCheckpoint is valid until the next call to rewindTo,
     56     // at which point all outstanding checkpoints are invalidated.
     57     TokenPreloadScannerCheckpoint createCheckpoint();
     58     void rewindTo(TokenPreloadScannerCheckpoint);
     59 
     60     bool isSafeToSendToAnotherThread()
     61     {
     62         return m_documentURL.isSafeToSendToAnotherThread()
     63             && m_predictedBaseElementURL.isSafeToSendToAnotherThread();
     64     }
     65 
     66 private:
     67     class StartTagScanner;
     68 
     69     template<typename Token>
     70     inline void scanCommon(const Token&, const SegmentedString&, PreloadRequestStream& requests);
     71 
     72     template<typename Token>
     73     void updatePredictedBaseURL(const Token&);
     74 
     75     struct Checkpoint {
     76         Checkpoint(const KURL& predictedBaseElementURL, bool inStyle, size_t templateCount)
     77             : predictedBaseElementURL(predictedBaseElementURL)
     78             , inStyle(inStyle)
     79             , templateCount(templateCount)
     80         {
     81         }
     82 
     83         KURL predictedBaseElementURL;
     84         bool inStyle;
     85         size_t templateCount;
     86     };
     87 
     88     CSSPreloadScanner m_cssScanner;
     89     const KURL m_documentURL;
     90     KURL m_predictedBaseElementURL;
     91     bool m_inStyle;
     92     size_t m_templateCount;
     93 
     94     Vector<Checkpoint> m_checkpoints;
     95 };
     96 
     97 class HTMLPreloadScanner {
     98     WTF_MAKE_NONCOPYABLE(HTMLPreloadScanner); WTF_MAKE_FAST_ALLOCATED;
     99 public:
    100     HTMLPreloadScanner(const HTMLParserOptions&, const KURL& documentURL);
    101     ~HTMLPreloadScanner();
    102 
    103     void appendToEnd(const SegmentedString&);
    104     void scan(HTMLResourcePreloader*, const KURL& documentBaseElementURL);
    105 
    106 private:
    107     TokenPreloadScanner m_scanner;
    108     SegmentedString m_source;
    109     HTMLToken m_token;
    110     OwnPtr<HTMLTokenizer> m_tokenizer;
    111 };
    112 
    113 }
    114 
    115 #endif
    116