Changeset 142822 in webkit
- Timestamp:
- Feb 13, 2013 4:56:47 PM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r142820 r142822 1 2013-02-13 Adam Barth <abarth@webkit.org> 2 3 Factor HTMLTokenScanner out of HTMLPreloadScanner 4 https://bugs.webkit.org/show_bug.cgi?id=109754 5 6 Reviewed by Eric Seidel. 7 8 This patch is just a mechanical separation of the per-token "scanning" 9 logic from HTMLPreloadScanner into a separate class. 10 HTMLPreloadScanner's job is now to keep track of the input stream and 11 to pump the tokenizer. 12 13 This factorization class will let us use HTMLTokenScanner on the 14 background thread (once we finish making it thread-safe). In a follow 15 up patch, I'll move HTMLTokenScanner to its own file. 16 17 * html/parser/HTMLPreloadScanner.cpp: 18 (WebCore::HTMLTokenScanner::HTMLTokenScanner): 19 (WebCore::HTMLTokenScanner::~HTMLTokenScanner): 20 (WebCore::HTMLTokenScanner::processPossibleTemplateTag): 21 (WebCore::HTMLTokenScanner::processPossibleStyleTag): 22 (WebCore::HTMLTokenScanner::processPossibleBaseTag): 23 (WebCore::HTMLTokenScanner::scan): 24 (WebCore::HTMLPreloadScanner::HTMLPreloadScanner): 25 (WebCore): 26 (WebCore::HTMLPreloadScanner::~HTMLPreloadScanner): 27 (WebCore::HTMLPreloadScanner::appendToEnd): 28 (WebCore::HTMLPreloadScanner::scan): 29 * html/parser/HTMLPreloadScanner.h: 30 (HTMLTokenScanner): 31 (WebCore::HTMLTokenScanner::setPredictedBaseElementURL): 32 (HTMLPreloadScanner): 33 (WebCore): 34 1 35 2013-02-13 Elliott Sprehn <esprehn@chromium.org> 2 36 -
trunk/Source/WebCore/html/parser/HTMLPreloadScanner.cpp
r142803 r142822 192 192 }; 193 193 194 HTMLPreloadScanner::HTMLPreloadScanner(const HTMLParserOptions& options,const KURL& documentURL)195 : m_ tokenizer(HTMLTokenizer::create(options))194 TokenPreloadScanner::TokenPreloadScanner(const KURL& documentURL) 195 : m_documentURL(documentURL) 196 196 , m_inStyle(false) 197 , m_documentURL(documentURL)198 197 #if ENABLE(TEMPLATE_ELEMENT) 199 198 , m_templateCount(0) … … 202 201 } 203 202 204 void HTMLPreloadScanner::appendToEnd(const SegmentedString& source) 205 { 206 m_source.append(source); 207 } 208 209 // This function exists for convenience on the main thread and is not used by the background-thread preload scanner. 210 void HTMLPreloadScanner::scan(HTMLResourcePreloader* preloader, const KURL& startingBaseElementURL) 211 { 212 ASSERT(isMainThread()); // HTMLTokenizer::updateStateFor only works on the main thread. 213 // When we start scanning, our best prediction of the baseElementURL is the real one! 214 if (!startingBaseElementURL.isEmpty()) 215 m_predictedBaseElementURL = startingBaseElementURL; 216 217 Vector<OwnPtr<PreloadRequest> > requests; 218 // Note: m_token is only used from this function and for the main thread. 219 // All other functions are passed a token. 220 while (m_tokenizer->nextToken(m_source, m_token)) { 221 if (isStartTag(m_token)) 222 m_tokenizer->updateStateFor(AtomicString(m_token.name())); 223 processToken(m_token, requests); 224 m_token.clear(); 225 } 226 for (size_t i = 0; i < requests.size(); i++) 227 preloader->preload(requests[i].release()); 203 TokenPreloadScanner::~TokenPreloadScanner() 204 { 228 205 } 229 206 230 207 #if ENABLE(TEMPLATE_ELEMENT) 231 bool HTMLPreloadScanner::processPossibleTemplateTag(const AtomicString& tagName, const HTMLToken& token)208 bool TokenPreloadScanner::processPossibleTemplateTag(const AtomicString& tagName, const HTMLToken& token) 232 209 { 233 210 if (isStartOrEndTag(token) && tagName == templateTag) { … … 243 220 #endif 244 221 245 bool HTMLPreloadScanner::processPossibleStyleTag(const AtomicString& tagName, const HTMLToken& token)222 bool TokenPreloadScanner::processPossibleStyleTag(const AtomicString& tagName, const HTMLToken& token) 246 223 { 247 224 ASSERT(isStartOrEndTag(token)); … … 257 234 } 258 235 259 bool HTMLPreloadScanner::processPossibleBaseTag(const AtomicString& tagName, const HTMLToken& token)236 bool TokenPreloadScanner::processPossibleBaseTag(const AtomicString& tagName, const HTMLToken& token) 260 237 { 261 238 ASSERT(isStartTag(token)); … … 278 255 } 279 256 280 void HTMLPreloadScanner::processToken(const HTMLToken& token, Vector<OwnPtr<PreloadRequest> >& requests)257 void TokenPreloadScanner::scan(const HTMLToken& token, Vector<OwnPtr<PreloadRequest> >& requests) 281 258 { 282 259 // <style> is the only place we search for urls in non-start/end-tag tokens. … … 287 264 return m_cssScanner.scan(characters.begin(), characters.end(), requests); 288 265 } 266 289 267 if (!isStartOrEndTag(token)) 290 268 return; … … 308 286 } 309 287 310 } 288 HTMLPreloadScanner::HTMLPreloadScanner(const HTMLParserOptions& options, const KURL& documentURL) 289 : m_scanner(documentURL) 290 , m_tokenizer(HTMLTokenizer::create(options)) 291 { 292 } 293 294 HTMLPreloadScanner::~HTMLPreloadScanner() 295 { 296 } 297 298 void HTMLPreloadScanner::appendToEnd(const SegmentedString& source) 299 { 300 m_source.append(source); 301 } 302 303 void HTMLPreloadScanner::scan(HTMLResourcePreloader* preloader, const KURL& startingBaseElementURL) 304 { 305 ASSERT(isMainThread()); // HTMLTokenizer::updateStateFor only works on the main thread. 306 307 // When we start scanning, our best prediction of the baseElementURL is the real one! 308 if (!startingBaseElementURL.isEmpty()) 309 m_scanner.setPredictedBaseElementURL(startingBaseElementURL); 310 311 Vector<OwnPtr<PreloadRequest> > requests; 312 while (m_tokenizer->nextToken(m_source, m_token)) { 313 if (isStartTag(m_token)) 314 m_tokenizer->updateStateFor(AtomicString(m_token.name())); 315 m_scanner.scan(m_token, requests); 316 m_token.clear(); 317 } 318 for (size_t i = 0; i < requests.size(); i++) 319 preloader->preload(requests[i].release()); 320 } 321 322 } -
trunk/Source/WebCore/html/parser/HTMLPreloadScanner.h
r142427 r142822 39 39 class SegmentedString; 40 40 41 class HTMLPreloadScanner {42 WTF_MAKE_NONCOPYABLE( HTMLPreloadScanner); WTF_MAKE_FAST_ALLOCATED;41 class TokenPreloadScanner { 42 WTF_MAKE_NONCOPYABLE(TokenPreloadScanner); WTF_MAKE_FAST_ALLOCATED; 43 43 public: 44 // HTMLPreloadScanner intentionally does not have a pointer to Document.45 HTMLPreloadScanner(const HTMLParserOptions&, const KURL& documentURL);44 explicit TokenPreloadScanner(const KURL& documentURL); 45 ~TokenPreloadScanner(); 46 46 47 void appendToEnd(const SegmentedString&); 48 void scan(HTMLResourcePreloader*, const KURL& documentBaseElementURL); 47 void scan(const HTMLToken&, Vector<OwnPtr<PreloadRequest> >& requests); 48 49 void setPredictedBaseElementURL(const KURL& url) { m_predictedBaseElementURL = url; } 49 50 50 51 private: 51 void processToken(const HTMLToken&, Vector<OwnPtr<PreloadRequest> >& requests);52 53 52 bool processStyleCharacters(const HTMLToken&); 54 53 … … 60 59 bool processPossibleBaseTag(const AtomicString& tagName, const HTMLToken&); 61 60 62 SegmentedString m_source;63 61 CSSPreloadScanner m_cssScanner; 64 HTMLToken m_token;65 OwnPtr<HTMLTokenizer> m_tokenizer;66 bool m_inStyle;67 62 KURL m_documentURL; 68 63 KURL m_predictedBaseElementURL; 64 bool m_inStyle; 69 65 70 66 #if ENABLE(TEMPLATE_ELEMENT) … … 73 69 }; 74 70 71 class HTMLPreloadScanner { 72 WTF_MAKE_NONCOPYABLE(HTMLPreloadScanner); WTF_MAKE_FAST_ALLOCATED; 73 public: 74 HTMLPreloadScanner(const HTMLParserOptions&, const KURL& documentURL); 75 ~HTMLPreloadScanner(); 76 77 void appendToEnd(const SegmentedString&); 78 void scan(HTMLResourcePreloader*, const KURL& documentBaseElementURL); 79 80 private: 81 TokenPreloadScanner m_scanner; 82 SegmentedString m_source; 83 HTMLToken m_token; 84 OwnPtr<HTMLTokenizer> m_tokenizer; 85 }; 86 75 87 } 76 88
Note: See TracChangeset
for help on using the changeset viewer.