Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(79)

Side by Side Diff: Source/core/html/parser/HTMLPreloadScanner.cpp

Issue 457413002: Defer late and async scripts (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Lower priorities for late/async scripts Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3 * Copyright (C) 2009 Torch Mobile, Inc. http://www.torchmobile.com/ 3 * Copyright (C) 2009 Torch Mobile, Inc. http://www.torchmobile.com/
4 * Copyright (C) 2010 Google Inc. All Rights Reserved. 4 * Copyright (C) 2010 Google Inc. All Rights Reserved.
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 7 * modification, are permitted provided that the following conditions
8 * are met: 8 * are met:
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 class TokenPreloadScanner::StartTagScanner { 104 class TokenPreloadScanner::StartTagScanner {
105 public: 105 public:
106 StartTagScanner(const StringImpl* tagImpl, PassRefPtr<MediaValues> mediaValu es) 106 StartTagScanner(const StringImpl* tagImpl, PassRefPtr<MediaValues> mediaValu es)
107 : m_tagImpl(tagImpl) 107 : m_tagImpl(tagImpl)
108 , m_linkIsStyleSheet(false) 108 , m_linkIsStyleSheet(false)
109 , m_matchedMediaAttribute(true) 109 , m_matchedMediaAttribute(true)
110 , m_inputIsImage(false) 110 , m_inputIsImage(false)
111 , m_sourceSize(0) 111 , m_sourceSize(0)
112 , m_sourceSizeSet(false) 112 , m_sourceSizeSet(false)
113 , m_isCORSEnabled(false) 113 , m_isCORSEnabled(false)
114 , m_execAsync(false)
114 , m_allowCredentials(DoNotAllowStoredCredentials) 115 , m_allowCredentials(DoNotAllowStoredCredentials)
115 , m_mediaValues(mediaValues) 116 , m_mediaValues(mediaValues)
116 { 117 {
117 if (match(m_tagImpl, imgTag) 118 if (match(m_tagImpl, imgTag)
118 || match(m_tagImpl, sourceTag)) { 119 || match(m_tagImpl, sourceTag)) {
119 if (RuntimeEnabledFeatures::pictureSizesEnabled()) 120 if (RuntimeEnabledFeatures::pictureSizesEnabled())
120 m_sourceSize = SizesAttributeParser(m_mediaValues, String()).len gth(); 121 m_sourceSize = SizesAttributeParser(m_mediaValues, String()).len gth();
121 return; 122 return;
122 } 123 }
123 if ( !match(m_tagImpl, inputTag) 124 if ( !match(m_tagImpl, inputTag)
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 { 164 {
164 if (!shouldPreload() || !m_matchedMediaAttribute) 165 if (!shouldPreload() || !m_matchedMediaAttribute)
165 return nullptr; 166 return nullptr;
166 167
167 TRACE_EVENT_INSTANT1("net", "PreloadRequest", "url", m_urlToLoad.ascii() ); 168 TRACE_EVENT_INSTANT1("net", "PreloadRequest", "url", m_urlToLoad.ascii() );
168 TextPosition position = TextPosition(source.currentLine(), source.curren tColumn()); 169 TextPosition position = TextPosition(source.currentLine(), source.curren tColumn());
169 OwnPtr<PreloadRequest> request = PreloadRequest::create(initiatorFor(m_t agImpl), position, m_urlToLoad, predictedBaseURL, resourceType()); 170 OwnPtr<PreloadRequest> request = PreloadRequest::create(initiatorFor(m_t agImpl), position, m_urlToLoad, predictedBaseURL, resourceType());
170 if (isCORSEnabled()) 171 if (isCORSEnabled())
171 request->setCrossOriginEnabled(allowStoredCredentials()); 172 request->setCrossOriginEnabled(allowStoredCredentials());
172 request->setCharset(charset()); 173 request->setCharset(charset());
174 request->setExecAsync(m_execAsync);
173 return request.release(); 175 return request.release();
174 } 176 }
175 177
176 private: 178 private:
177 template<typename NameType> 179 template<typename NameType>
178 void processScriptAttribute(const NameType& attributeName, const String& att ributeValue) 180 void processScriptAttribute(const NameType& attributeName, const String& att ributeValue)
179 { 181 {
180 // FIXME - Don't set crossorigin multiple times. 182 // FIXME - Don't set crossorigin multiple times.
181 if (match(attributeName, srcAttr)) 183 if (match(attributeName, srcAttr))
182 setUrlToLoad(attributeValue, DisallowURLReplacement); 184 setUrlToLoad(attributeValue, DisallowURLReplacement);
183 else if (match(attributeName, crossoriginAttr)) 185 else if (match(attributeName, crossoriginAttr))
184 setCrossOriginAllowed(attributeValue); 186 setCrossOriginAllowed(attributeValue);
187 else if (match(attributeName, asyncAttr))
188 setExecAsync(true);
189 else if (match(attributeName, deferAttr))
190 setExecAsync(true);
185 } 191 }
186 192
187 template<typename NameType> 193 template<typename NameType>
188 void processImgAttribute(const NameType& attributeName, const String& attrib uteValue) 194 void processImgAttribute(const NameType& attributeName, const String& attrib uteValue)
189 { 195 {
190 if (match(attributeName, srcAttr) && m_imgSrcUrl.isNull()) { 196 if (match(attributeName, srcAttr) && m_imgSrcUrl.isNull()) {
191 m_imgSrcUrl = attributeValue; 197 m_imgSrcUrl = attributeValue;
192 setUrlToLoad(bestFitSourceForImageAttributes(m_mediaValues->devicePi xelRatio(), m_sourceSize, attributeValue, m_srcsetImageCandidate), AllowURLRepla cement); 198 setUrlToLoad(bestFitSourceForImageAttributes(m_mediaValues->devicePi xelRatio(), m_sourceSize, attributeValue, m_srcsetImageCandidate), AllowURLRepla cement);
193 } else if (match(attributeName, crossoriginAttr)) { 199 } else if (match(attributeName, crossoriginAttr)) {
194 setCrossOriginAllowed(attributeValue); 200 setCrossOriginAllowed(attributeValue);
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 336
331 void setCrossOriginAllowed(const String& corsSetting) 337 void setCrossOriginAllowed(const String& corsSetting)
332 { 338 {
333 m_isCORSEnabled = true; 339 m_isCORSEnabled = true;
334 if (!corsSetting.isNull() && equalIgnoringCase(stripLeadingAndTrailingHT MLSpaces(corsSetting), "use-credentials")) 340 if (!corsSetting.isNull() && equalIgnoringCase(stripLeadingAndTrailingHT MLSpaces(corsSetting), "use-credentials"))
335 m_allowCredentials = AllowStoredCredentials; 341 m_allowCredentials = AllowStoredCredentials;
336 else 342 else
337 m_allowCredentials = DoNotAllowStoredCredentials; 343 m_allowCredentials = DoNotAllowStoredCredentials;
338 } 344 }
339 345
346 void setExecAsync(const bool execAsync)
347 {
348 m_execAsync = execAsync;
349 }
350
351 bool execAsync() const
352 {
353 return m_execAsync;
354 }
355
340 const StringImpl* m_tagImpl; 356 const StringImpl* m_tagImpl;
341 String m_urlToLoad; 357 String m_urlToLoad;
342 ImageCandidate m_srcsetImageCandidate; 358 ImageCandidate m_srcsetImageCandidate;
343 String m_charset; 359 String m_charset;
344 bool m_linkIsStyleSheet; 360 bool m_linkIsStyleSheet;
345 bool m_matchedMediaAttribute; 361 bool m_matchedMediaAttribute;
346 bool m_inputIsImage; 362 bool m_inputIsImage;
347 String m_imgSrcUrl; 363 String m_imgSrcUrl;
348 String m_srcsetAttributeValue; 364 String m_srcsetAttributeValue;
349 unsigned m_sourceSize; 365 unsigned m_sourceSize;
350 bool m_sourceSizeSet; 366 bool m_sourceSizeSet;
351 bool m_isCORSEnabled; 367 bool m_isCORSEnabled;
368 bool m_execAsync;
352 StoredCredentials m_allowCredentials; 369 StoredCredentials m_allowCredentials;
353 RefPtr<MediaValues> m_mediaValues; 370 RefPtr<MediaValues> m_mediaValues;
354 }; 371 };
355 372
356 TokenPreloadScanner::TokenPreloadScanner(const KURL& documentURL, PassRefPtr<Med iaValues> mediaValues) 373 TokenPreloadScanner::TokenPreloadScanner(const KURL& documentURL, PassRefPtr<Med iaValues> mediaValues)
357 : m_documentURL(documentURL) 374 : m_documentURL(documentURL)
358 , m_inStyle(false) 375 , m_inStyle(false)
359 , m_inPicture(false) 376 , m_inPicture(false)
377 , m_isBeforeBody(true)
360 , m_templateCount(0) 378 , m_templateCount(0)
361 , m_mediaValues(mediaValues) 379 , m_mediaValues(mediaValues)
362 { 380 {
363 } 381 }
364 382
365 TokenPreloadScanner::~TokenPreloadScanner() 383 TokenPreloadScanner::~TokenPreloadScanner()
366 { 384 {
367 } 385 }
368 386
369 TokenPreloadScannerCheckpoint TokenPreloadScanner::createCheckpoint() 387 TokenPreloadScannerCheckpoint TokenPreloadScanner::createCheckpoint()
370 { 388 {
371 TokenPreloadScannerCheckpoint checkpoint = m_checkpoints.size(); 389 TokenPreloadScannerCheckpoint checkpoint = m_checkpoints.size();
372 m_checkpoints.append(Checkpoint(m_predictedBaseElementURL, m_inStyle, m_temp lateCount)); 390 m_checkpoints.append(Checkpoint(m_predictedBaseElementURL, m_inStyle, m_isBe foreBody, m_templateCount));
373 return checkpoint; 391 return checkpoint;
374 } 392 }
375 393
376 void TokenPreloadScanner::rewindTo(TokenPreloadScannerCheckpoint checkpointIndex ) 394 void TokenPreloadScanner::rewindTo(TokenPreloadScannerCheckpoint checkpointIndex )
377 { 395 {
378 ASSERT(checkpointIndex < m_checkpoints.size()); // If this ASSERT fires, che ckpointIndex is invalid. 396 ASSERT(checkpointIndex < m_checkpoints.size()); // If this ASSERT fires, che ckpointIndex is invalid.
379 const Checkpoint& checkpoint = m_checkpoints[checkpointIndex]; 397 const Checkpoint& checkpoint = m_checkpoints[checkpointIndex];
380 m_predictedBaseElementURL = checkpoint.predictedBaseElementURL; 398 m_predictedBaseElementURL = checkpoint.predictedBaseElementURL;
381 m_inStyle = checkpoint.inStyle; 399 m_inStyle = checkpoint.inStyle;
400 m_isBeforeBody = checkpoint.isBeforeBody;
382 m_templateCount = checkpoint.templateCount; 401 m_templateCount = checkpoint.templateCount;
383 m_cssScanner.reset(); 402 m_cssScanner.reset();
403 m_cssScanner.setIsBeforeBody(m_isBeforeBody);
384 m_checkpoints.clear(); 404 m_checkpoints.clear();
385 } 405 }
386 406
387 void TokenPreloadScanner::scan(const HTMLToken& token, const SegmentedString& so urce, PreloadRequestStream& requests) 407 void TokenPreloadScanner::scan(const HTMLToken& token, const SegmentedString& so urce, PreloadRequestStream& requests)
388 { 408 {
389 scanCommon(token, source, requests); 409 scanCommon(token, source, requests);
390 } 410 }
391 411
392 void TokenPreloadScanner::scan(const CompactHTMLToken& token, const SegmentedStr ing& source, PreloadRequestStream& requests) 412 void TokenPreloadScanner::scan(const CompactHTMLToken& token, const SegmentedStr ing& source, PreloadRequestStream& requests)
393 { 413 {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
426 return; 446 return;
427 const StringImpl* tagImpl = tagImplFor(token.data()); 447 const StringImpl* tagImpl = tagImplFor(token.data());
428 if (match(tagImpl, templateTag)) { 448 if (match(tagImpl, templateTag)) {
429 ++m_templateCount; 449 ++m_templateCount;
430 return; 450 return;
431 } 451 }
432 if (match(tagImpl, styleTag)) { 452 if (match(tagImpl, styleTag)) {
433 m_inStyle = true; 453 m_inStyle = true;
434 return; 454 return;
435 } 455 }
456 if (m_isBeforeBody && match(tagImpl, bodyTag)) {
457 m_isBeforeBody = false;
458 m_cssScanner.setIsBeforeBody(m_isBeforeBody);
459 }
436 if (match(tagImpl, baseTag)) { 460 if (match(tagImpl, baseTag)) {
437 // The first <base> element is the one that wins. 461 // The first <base> element is the one that wins.
438 if (!m_predictedBaseElementURL.isEmpty()) 462 if (!m_predictedBaseElementURL.isEmpty())
439 return; 463 return;
440 updatePredictedBaseURL(token); 464 updatePredictedBaseURL(token);
441 return; 465 return;
442 } 466 }
443 if (RuntimeEnabledFeatures::pictureEnabled() && (match(tagImpl, pictureT ag))) { 467 if (RuntimeEnabledFeatures::pictureEnabled() && (match(tagImpl, pictureT ag))) {
444 m_inPicture = true; 468 m_inPicture = true;
445 m_pictureSourceURL = String(); 469 m_pictureSourceURL = String();
446 return; 470 return;
447 } 471 }
448 472
449 StartTagScanner scanner(tagImpl, m_mediaValues); 473 StartTagScanner scanner(tagImpl, m_mediaValues);
450 scanner.processAttributes(token.attributes()); 474 scanner.processAttributes(token.attributes());
451 if (m_inPicture) 475 if (m_inPicture)
452 scanner.handlePictureSourceURL(m_pictureSourceURL); 476 scanner.handlePictureSourceURL(m_pictureSourceURL);
453 OwnPtr<PreloadRequest> request = scanner.createPreloadRequest(m_predicte dBaseElementURL, source); 477 OwnPtr<PreloadRequest> request = scanner.createPreloadRequest(m_predicte dBaseElementURL, source);
454 if (request) 478 if (request) {
479 request->setIsBeforeBody(m_isBeforeBody);
455 requests.append(request.release()); 480 requests.append(request.release());
481 }
456 return; 482 return;
457 } 483 }
458 default: { 484 default: {
459 return; 485 return;
460 } 486 }
461 } 487 }
462 } 488 }
463 489
464 template<typename Token> 490 template<typename Token>
465 void TokenPreloadScanner::updatePredictedBaseURL(const Token& token) 491 void TokenPreloadScanner::updatePredictedBaseURL(const Token& token)
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
500 if (m_token.type() == HTMLToken::StartTag) 526 if (m_token.type() == HTMLToken::StartTag)
501 m_tokenizer->updateStateFor(attemptStaticStringCreation(m_token.name (), Likely8Bit)); 527 m_tokenizer->updateStateFor(attemptStaticStringCreation(m_token.name (), Likely8Bit));
502 m_scanner.scan(m_token, m_source, requests); 528 m_scanner.scan(m_token, m_source, requests);
503 m_token.clear(); 529 m_token.clear();
504 } 530 }
505 531
506 preloader->takeAndPreload(requests); 532 preloader->takeAndPreload(requests);
507 } 533 }
508 534
509 } 535 }
OLDNEW
« no previous file with comments | « Source/core/html/parser/HTMLPreloadScanner.h ('k') | Source/core/html/parser/HTMLResourcePreloader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698