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