OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2010 Google, Inc. All Rights Reserved. | 2 * Copyright (C) 2010 Google, Inc. All Rights Reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
291 ASSERT(m_parsedChunkQueue); | 291 ASSERT(m_parsedChunkQueue); |
292 | 292 |
293 Vector<std::unique_ptr<ParsedChunk>> pendingChunks; | 293 Vector<std::unique_ptr<ParsedChunk>> pendingChunks; |
294 m_parsedChunkQueue->takeAll(pendingChunks); | 294 m_parsedChunkQueue->takeAll(pendingChunks); |
295 | 295 |
296 if (!isParsing()) | 296 if (!isParsing()) |
297 return; | 297 return; |
298 | 298 |
299 // ApplicationCache needs to be initialized before issuing preloads. | 299 // ApplicationCache needs to be initialized before issuing preloads. |
300 // We suspend preload until HTMLHTMLElement is inserted and | 300 // We suspend preload until HTMLHTMLElement is inserted and |
301 // ApplicationCache is initialized. | 301 // ApplicationCache is initialized. Note: link rel preloads don't follow |
302 // this policy per the spec. These directives should initiate a fetch as | |
303 // fast as possible. | |
302 if (!document()->documentElement()) { | 304 if (!document()->documentElement()) { |
305 PreloadRequestStream linkRelPreloads; | |
303 for (auto& chunk : pendingChunks) { | 306 for (auto& chunk : pendingChunks) { |
304 for (auto& request : chunk->preloads) | 307 for (auto& request : chunk->preloads) { |
Yoav Weiss
2016/07/22 08:43:28
I don't understand why this waiting is necessary f
Charlie Harrison
2016/07/22 14:03:22
My understanding is that the preload scanner just
| |
305 m_queuedPreloads.append(std::move(request)); | 308 if (request->isLinkRelPreload()) |
309 linkRelPreloads.append(std::move(request)); | |
310 else | |
311 m_queuedPreloads.append(std::move(request)); | |
312 } | |
306 for (auto& index : chunk->likelyDocumentWriteScriptIndices) { | 313 for (auto& index : chunk->likelyDocumentWriteScriptIndices) { |
307 const CompactHTMLToken& token = chunk->tokens->at(index); | 314 const CompactHTMLToken& token = chunk->tokens->at(index); |
308 ASSERT(token.type() == HTMLToken::TokenType::Character); | 315 ASSERT(token.type() == HTMLToken::TokenType::Character); |
309 m_queuedDocumentWriteScripts.append(token.data()); | 316 m_queuedDocumentWriteScripts.append(token.data()); |
310 } | 317 } |
311 } | 318 } |
319 m_preloader->takeAndPreload(linkRelPreloads); | |
312 } else { | 320 } else { |
313 // We can safely assume that there are no queued preloads request after | 321 // We can safely assume that there are no queued preloads request after |
314 // the document element is available, as we empty the queue immediately | 322 // the document element is available, as we empty the queue immediately |
315 // after the document element is created in documentElementAvailable(). | 323 // after the document element is created in documentElementAvailable(). |
316 ASSERT(m_queuedPreloads.isEmpty()); | 324 ASSERT(m_queuedPreloads.isEmpty()); |
317 ASSERT(m_queuedDocumentWriteScripts.isEmpty()); | 325 ASSERT(m_queuedDocumentWriteScripts.isEmpty()); |
318 // Loop through the chunks to generate preloads before any | 326 // Loop through the chunks to generate preloads before any |
319 // document.write script evaluation takes place. Preloading these | 327 // document.write script evaluation takes place. Preloading these |
320 // scripts is valuable and comparably cheap, while evaluating JS can be | 328 // scripts is valuable and comparably cheap, while evaluating JS can be |
321 // expensive. | 329 // expensive. |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
462 } | 470 } |
463 | 471 |
464 m_textPosition = it->textPosition(); | 472 m_textPosition = it->textPosition(); |
465 | 473 |
466 constructTreeFromCompactHTMLToken(*it); | 474 constructTreeFromCompactHTMLToken(*it); |
467 | 475 |
468 if (isStopped()) | 476 if (isStopped()) |
469 break; | 477 break; |
470 | 478 |
471 if (!m_triedLoadingLinkHeaders && document()->loader()) { | 479 if (!m_triedLoadingLinkHeaders && document()->loader()) { |
472 String linkHeader = document()->loader()->response().httpHeaderField (HTTPNames::Link); | 480 DCHECK(chunk); |
473 if (!linkHeader.isEmpty()) { | 481 // Note that on commit, the loader dispatched preloads for all the |
474 ASSERT(chunk); | 482 // non-media links. |
475 LinkLoader::loadLinksFromHeader(linkHeader, document()->loader() ->response().url(), | 483 document()->loader()->dispatchLinkHeaderPreloads(&chunk->viewport, L inkLoader::OnlyLoadMedia); |
476 document(), NetworkHintsInterfaceImpl(), LinkLoader::OnlyLoa dResources, &(chunk->viewport)); | 484 m_triedLoadingLinkHeaders = true; |
477 m_triedLoadingLinkHeaders = true; | |
478 } | |
479 } | 485 } |
480 | 486 |
481 if (isWaitingForScripts()) { | 487 if (isWaitingForScripts()) { |
482 ASSERT(it + 1 == tokens->end()); // The </script> is assumed to be t he last token of this bunch. | 488 ASSERT(it + 1 == tokens->end()); // The </script> is assumed to be t he last token of this bunch. |
483 runScriptsForPausedTreeBuilder(); | 489 runScriptsForPausedTreeBuilder(); |
484 validateSpeculations(std::move(chunk)); | 490 validateSpeculations(std::move(chunk)); |
485 break; | 491 break; |
486 } | 492 } |
487 | 493 |
488 if (it->type() == HTMLToken::EndOfFile) { | 494 if (it->type() == HTMLToken::EndOfFile) { |
(...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1150 (*WTF::bind(function, std::forward<Ps>(parameters)...))(); | 1156 (*WTF::bind(function, std::forward<Ps>(parameters)...))(); |
1151 return; | 1157 return; |
1152 case Asynchronous: | 1158 case Asynchronous: |
1153 m_loadingTaskRunner->postTask(BLINK_FROM_HERE, WTF::bind(function, std:: forward<Ps>(parameters)...)); | 1159 m_loadingTaskRunner->postTask(BLINK_FROM_HERE, WTF::bind(function, std:: forward<Ps>(parameters)...)); |
1154 return; | 1160 return; |
1155 } | 1161 } |
1156 NOTREACHED(); | 1162 NOTREACHED(); |
1157 } | 1163 } |
1158 | 1164 |
1159 } // namespace blink | 1165 } // namespace blink |
OLD | NEW |