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