15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Apple Inc. All Rights Reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All Rights Reserved. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef HTMLPreloadScanner_h 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define HTMLPreloadScanner_h 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/parser/CSSPreloadScanner.h" 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/parser/CompactHTMLToken.h" 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/parser/HTMLToken.h" 331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/text/SegmentedString.h" 34e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/Vector.h" 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)typedef size_t TokenPreloadScannerCheckpoint; 39926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 40926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class HTMLParserOptions; 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class HTMLTokenizer; 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SegmentedString; 4307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochclass MediaValues; 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class TokenPreloadScanner { 46926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) WTF_MAKE_NONCOPYABLE(TokenPreloadScanner); WTF_MAKE_FAST_ALLOCATED; 47926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public: 4807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch TokenPreloadScanner(const KURL& documentURL, PassRefPtr<MediaValues>); 49926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ~TokenPreloadScanner(); 50926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) void scan(const HTMLToken&, const SegmentedString&, PreloadRequestStream& requests); 525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) void scan(const CompactHTMLToken&, const SegmentedString&, PreloadRequestStream& requests); 53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 54926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void setPredictedBaseElementURL(const KURL& url) { m_predictedBaseElementURL = url; } 55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // A TokenPreloadScannerCheckpoint is valid until the next call to rewindTo, 57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // at which point all outstanding checkpoints are invalidated. 58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) TokenPreloadScannerCheckpoint createCheckpoint(); 59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void rewindTo(TokenPreloadScannerCheckpoint); 60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool isSafeToSendToAnotherThread() 62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_documentURL.isSafeToSendToAnotherThread() 64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) && m_predictedBaseElementURL.isSafeToSendToAnotherThread(); 65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private: 68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) class StartTagScanner; 69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) template<typename Token> 715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) inline void scanCommon(const Token&, const SegmentedString&, PreloadRequestStream& requests); 72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) template<typename Token> 74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void updatePredictedBaseURL(const Token&); 75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) struct Checkpoint { 7753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Checkpoint(const KURL& predictedBaseElementURL, bool inStyle, size_t templateCount) 78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : predictedBaseElementURL(predictedBaseElementURL) 79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , inStyle(inStyle) 80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , templateCount(templateCount) 81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) KURL predictedBaseElementURL; 85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool inStyle; 86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) size_t templateCount; 87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) }; 88926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) CSSPreloadScanner m_cssScanner; 90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const KURL m_documentURL; 91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) KURL m_predictedBaseElementURL; 92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool m_inStyle; 93d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) bool m_inPicture; 94d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) String m_pictureSourceURL; 95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) size_t m_templateCount; 9607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch RefPtr<MediaValues> m_mediaValues; 97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Vector<Checkpoint> m_checkpoints; 99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}; 100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class HTMLPreloadScanner { 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(HTMLPreloadScanner); WTF_MAKE_FAST_ALLOCATED; 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 10407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch HTMLPreloadScanner(const HTMLParserOptions&, const KURL& documentURL, PassRefPtr<MediaValues>); 105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ~HTMLPreloadScanner(); 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void appendToEnd(const SegmentedString&); 108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void scan(HTMLResourcePreloader*, const KURL& documentBaseElementURL); 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) TokenPreloadScanner m_scanner; 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SegmentedString m_source; 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HTMLToken m_token; 114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) OwnPtr<HTMLTokenizer> m_tokenizer; 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 120