• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "platform/text/SegmentedString.h"
34 #include "wtf/Vector.h"
35 
36 namespace blink {
37 
38 typedef size_t TokenPreloadScannerCheckpoint;
39 
40 class HTMLParserOptions;
41 class HTMLTokenizer;
42 class SegmentedString;
43 class MediaValues;
44 
45 class TokenPreloadScanner {
46     WTF_MAKE_NONCOPYABLE(TokenPreloadScanner); WTF_MAKE_FAST_ALLOCATED;
47 public:
48     TokenPreloadScanner(const KURL& documentURL, PassRefPtr<MediaValues>);
49     ~TokenPreloadScanner();
50 
51     void scan(const HTMLToken&, const SegmentedString&, PreloadRequestStream& requests);
52     void scan(const CompactHTMLToken&, const SegmentedString&, PreloadRequestStream& requests);
53 
setPredictedBaseElementURL(const KURL & url)54     void setPredictedBaseElementURL(const KURL& url) { m_predictedBaseElementURL = url; }
55 
56     // A TokenPreloadScannerCheckpoint is valid until the next call to rewindTo,
57     // at which point all outstanding checkpoints are invalidated.
58     TokenPreloadScannerCheckpoint createCheckpoint();
59     void rewindTo(TokenPreloadScannerCheckpoint);
60 
isSafeToSendToAnotherThread()61     bool isSafeToSendToAnotherThread()
62     {
63         return m_documentURL.isSafeToSendToAnotherThread()
64             && m_predictedBaseElementURL.isSafeToSendToAnotherThread();
65     }
66 
67 private:
68     class StartTagScanner;
69 
70     template<typename Token>
71     inline void scanCommon(const Token&, const SegmentedString&, PreloadRequestStream& requests);
72 
73     template<typename Token>
74     void updatePredictedBaseURL(const Token&);
75 
76     struct Checkpoint {
CheckpointCheckpoint77         Checkpoint(const KURL& predictedBaseElementURL, bool inStyle, size_t templateCount)
78             : predictedBaseElementURL(predictedBaseElementURL)
79             , inStyle(inStyle)
80             , templateCount(templateCount)
81         {
82         }
83 
84         KURL predictedBaseElementURL;
85         bool inStyle;
86         size_t templateCount;
87     };
88 
89     CSSPreloadScanner m_cssScanner;
90     const KURL m_documentURL;
91     KURL m_predictedBaseElementURL;
92     bool m_inStyle;
93     bool m_inPicture;
94     String m_pictureSourceURL;
95     size_t m_templateCount;
96     RefPtr<MediaValues> m_mediaValues;
97 
98     Vector<Checkpoint> m_checkpoints;
99 };
100 
101 class HTMLPreloadScanner {
102     WTF_MAKE_NONCOPYABLE(HTMLPreloadScanner); WTF_MAKE_FAST_ALLOCATED;
103 public:
104     HTMLPreloadScanner(const HTMLParserOptions&, const KURL& documentURL, PassRefPtr<MediaValues>);
105     ~HTMLPreloadScanner();
106 
107     void appendToEnd(const SegmentedString&);
108     void scan(HTMLResourcePreloader*, const KURL& documentBaseElementURL);
109 
110 private:
111     TokenPreloadScanner m_scanner;
112     SegmentedString m_source;
113     HTMLToken m_token;
114     OwnPtr<HTMLTokenizer> m_tokenizer;
115 };
116 
117 }
118 
119 #endif
120