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
36namespace WebCore {
37
38typedef size_t TokenPreloadScannerCheckpoint;
39
40class HTMLParserOptions;
41class HTMLTokenizer;
42class SegmentedString;
43
44class TokenPreloadScanner {
45    WTF_MAKE_NONCOPYABLE(TokenPreloadScanner); WTF_MAKE_FAST_ALLOCATED;
46public:
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
66private:
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
97class HTMLPreloadScanner {
98    WTF_MAKE_NONCOPYABLE(HTMLPreloadScanner); WTF_MAKE_FAST_ALLOCATED;
99public:
100    HTMLPreloadScanner(const HTMLParserOptions&, const KURL& documentURL);
101    ~HTMLPreloadScanner();
102
103    void appendToEnd(const SegmentedString&);
104    void scan(HTMLResourcePreloader*, const KURL& documentBaseElementURL);
105
106private:
107    TokenPreloadScanner m_scanner;
108    SegmentedString m_source;
109    HTMLToken m_token;
110    OwnPtr<HTMLTokenizer> m_tokenizer;
111};
112
113}
114
115#endif
116