Changeset 142843 in webkit
- Timestamp:
- Feb 13, 2013 7:31:58 PM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r142840 r142843 1 2013-02-13 Adam Barth <abarth@webkit.org> 2 3 TokenPreloadScanner should be (mostly!) thread-safe 4 https://bugs.webkit.org/show_bug.cgi?id=109760 5 6 Reviewed by Eric Seidel. 7 8 This patch makes the bulk of TokenPreloadScanner thread-safe. The one 9 remaining wart is processPossibleBaseTag because it wants to grub 10 around in the base tag's attributes. I have a plan for that, but it's 11 going to need to wait for the next patch. 12 13 * html/parser/HTMLPreloadScanner.cpp: 14 (WebCore::isStartTag): 15 (WebCore::isStartOrEndTag): 16 (WebCore::TokenPreloadScanner::identifierFor): 17 (WebCore::TokenPreloadScanner::inititatorFor): 18 (WebCore::TokenPreloadScanner::StartTagScanner::StartTagScanner): 19 (WebCore::TokenPreloadScanner::StartTagScanner::processAttributes): 20 (TokenPreloadScanner::StartTagScanner): 21 (WebCore::TokenPreloadScanner::processPossibleTemplateTag): 22 (WebCore::TokenPreloadScanner::processPossibleStyleTag): 23 (WebCore::TokenPreloadScanner::processPossibleBaseTag): 24 (WebCore::TokenPreloadScanner::scan): 25 (WebCore::HTMLPreloadScanner::scan): 26 * html/parser/HTMLPreloadScanner.h: 27 (WebCore): 28 1 29 2013-02-13 Adam Barth <abarth@webkit.org> 2 30 -
trunk/Source/WebCore/html/parser/HTMLPreloadScanner.cpp
r142840 r142843 44 44 using namespace HTMLNames; 45 45 46 static bool isStartTag(const HTMLToken& token) 47 { 48 return token.type() == HTMLToken::StartTag; 49 } 50 51 static bool isStartOrEndTag(const HTMLToken& token) 52 { 53 return token.type() == HTMLToken::EndTag || isStartTag(token); 54 } 55 56 enum HTMLTagIdentifier { 57 ImgTagId, 58 InputTagId, 59 LinkTagId, 60 ScriptTagId, 61 UnknownTagId, 62 }; 63 64 static HTMLTagIdentifier identifierFor(const AtomicString& tagName) 46 static bool isStartTag(HTMLToken::Type type) 47 { 48 return type == HTMLToken::StartTag; 49 } 50 51 static bool isStartOrEndTag(HTMLToken::Type type) 52 { 53 return type == HTMLToken::EndTag || isStartTag(type); 54 } 55 56 TokenPreloadScanner::TagId TokenPreloadScanner::identifierFor(const AtomicString& tagName) 65 57 { 66 58 if (tagName == imgTag) … … 72 64 if (tagName == scriptTag) 73 65 return ScriptTagId; 66 if (tagName == styleTag) 67 return StyleTagId; 68 if (tagName == baseTag) 69 return BaseTagId; 70 if (tagName == templateTag) 71 return TemplateTagId; 74 72 return UnknownTagId; 75 73 } 76 74 77 static String inititatorFor(HTMLTagIdentifiertagId)75 String TokenPreloadScanner::inititatorFor(TagId tagId) 78 76 { 79 77 switch (tagId) { … … 87 85 return "script"; 88 86 case UnknownTagId: 87 case StyleTagId: 88 case BaseTagId: 89 case TemplateTagId: 89 90 ASSERT_NOT_REACHED(); 90 91 return "unknown"; … … 94 95 } 95 96 96 class StartTagScanner {97 class TokenPreloadScanner::StartTagScanner { 97 98 public: 98 explicit StartTagScanner( HTMLTagIdentifiertagId)99 explicit StartTagScanner(TagId tagId) 99 100 : m_tagId(tagId) 100 101 , m_linkIsStyleSheet(false) … … 108 109 ASSERT(isMainThread()); 109 110 110 if (m_tagId == UnknownTagId)111 if (m_tagId >= UnknownTagId) 111 112 return; 112 113 … … 222 223 } 223 224 224 HTMLTagIdentifierm_tagId;225 TagId m_tagId; 225 226 String m_urlToLoad; 226 227 String m_charset; … … 245 246 246 247 #if ENABLE(TEMPLATE_ELEMENT) 247 bool TokenPreloadScanner::processPossibleTemplateTag( const AtomicString& tagName, const HTMLToken& token)248 { 249 if (isStartOrEndTag(t oken) && tagName == templateTag) {250 if (isStartTag(t oken))248 bool TokenPreloadScanner::processPossibleTemplateTag(TagId tagId, HTMLToken::Type type) 249 { 250 if (isStartOrEndTag(type) && tagId == TemplateTagId) { 251 if (isStartTag(type)) 251 252 m_templateCount++; 252 253 else … … 259 260 #endif 260 261 261 bool TokenPreloadScanner::processPossibleStyleTag( const AtomicString& tagName, const HTMLToken& token)262 { 263 ASSERT(isStartOrEndTag(t oken));264 if (tag Name != styleTag)262 bool TokenPreloadScanner::processPossibleStyleTag(TagId tagId, HTMLToken::Type type) 263 { 264 ASSERT(isStartOrEndTag(type)); 265 if (tagId != StyleTagId) 265 266 return false; 266 267 267 m_inStyle = isStartTag(t oken);268 m_inStyle = isStartTag(type); 268 269 269 270 if (!m_inStyle) … … 273 274 } 274 275 275 bool TokenPreloadScanner::processPossibleBaseTag( const AtomicString& tagName, const HTMLToken& token)276 { 277 ASSERT(isStartTag(token ));278 if (tag Name != baseTag)276 bool TokenPreloadScanner::processPossibleBaseTag(TagId tagId, const HTMLToken& token) 277 { 278 ASSERT(isStartTag(token.type())); 279 if (tagId != BaseTagId) 279 280 return false; 280 281 … … 304 305 } 305 306 306 if (!isStartOrEndTag(token ))307 if (!isStartOrEndTag(token.type())) 307 308 return; 308 309 309 310 AtomicString tagName(token.name()); 311 TagId tagId = identifierFor(tagName); 312 310 313 #if ENABLE(TEMPLATE_ELEMENT) 311 if (processPossibleTemplateTag(tag Name, token))314 if (processPossibleTemplateTag(tagId, token.type())) 312 315 return; 313 316 #endif 314 if (processPossibleStyleTag(tag Name, token))315 return; 316 if (!isStartTag(token ))317 return; 318 if (processPossibleBaseTag(tag Name, token))319 return; 320 321 StartTagScanner scanner( identifierFor(tagName));317 if (processPossibleStyleTag(tagId, token.type())) 318 return; 319 if (!isStartTag(token.type())) 320 return; 321 if (processPossibleBaseTag(tagId, token)) 322 return; 323 324 StartTagScanner scanner(tagId); 322 325 scanner.processAttributes(token.attributes()); 323 326 OwnPtr<PreloadRequest> request = scanner.createPreloadRequest(m_predictedBaseElementURL); … … 351 354 Vector<OwnPtr<PreloadRequest> > requests; 352 355 while (m_tokenizer->nextToken(m_source, m_token)) { 353 if (isStartTag(m_token ))356 if (isStartTag(m_token.type())) 354 357 m_tokenizer->updateStateFor(AtomicString(m_token.name())); 355 358 m_scanner.scan(m_token, requests); -
trunk/Source/WebCore/html/parser/HTMLPreloadScanner.h
r142822 r142843 35 35 36 36 class HTMLParserOptions; 37 class HTMLToken;38 37 class HTMLTokenizer; 39 38 class SegmentedString; … … 50 49 51 50 private: 52 bool processStyleCharacters(const HTMLToken&); 51 enum TagId { 52 // These tags are scanned by the StartTagScanner. 53 ImgTagId, 54 InputTagId, 55 LinkTagId, 56 ScriptTagId, 57 58 // These tags are not scanned by the StartTagScanner. 59 UnknownTagId, 60 StyleTagId, 61 BaseTagId, 62 TemplateTagId, 63 }; 64 65 class StartTagScanner; 66 67 static TagId identifierFor(const AtomicString& tagName); 68 static String inititatorFor(TagId); 53 69 54 70 #if ENABLE(TEMPLATE_ELEMENT) 55 bool processPossibleTemplateTag( const AtomicString& tagName, const HTMLToken&);71 bool processPossibleTemplateTag(TagId, HTMLToken::Type); 56 72 #endif 57 73 58 bool processPossibleStyleTag( const AtomicString& tagName, const HTMLToken&);59 bool processPossibleBaseTag( const AtomicString& tagName, const HTMLToken&);74 bool processPossibleStyleTag(TagId, HTMLToken::Type); 75 bool processPossibleBaseTag(TagId, const HTMLToken&); 60 76 61 77 CSSPreloadScanner m_cssScanner;
Note: See TracChangeset
for help on using the changeset viewer.