Chromium Code Reviews| Index: Source/core/html/parser/HTMLPreloadScanner.cpp |
| diff --git a/Source/core/html/parser/HTMLPreloadScanner.cpp b/Source/core/html/parser/HTMLPreloadScanner.cpp |
| index ce827eea14930617ef8a4b290dead20664eee27b..d52b6d903ab3a9a0fbff831c75a480855bd58ab4 100644 |
| --- a/Source/core/html/parser/HTMLPreloadScanner.cpp |
| +++ b/Source/core/html/parser/HTMLPreloadScanner.cpp |
| @@ -111,6 +111,7 @@ public: |
| StartTagScanner(const StringImpl* tagImpl, PassRefPtr<MediaValues> mediaValues) |
| : m_tagImpl(tagImpl) |
| , m_linkIsStyleSheet(false) |
| + , m_linkIsPreconnect(false) |
| , m_matchedMediaAttribute(true) |
| , m_inputIsImage(false) |
| , m_sourceSize(0) |
| @@ -166,8 +167,21 @@ public: |
| setUrlToLoad(sourceURL, AllowURLReplacement); |
| } |
| - PassOwnPtr<PreloadRequest> createPreloadRequest(const KURL& predictedBaseURL, const SegmentedString& source, const ClientHintsPreferences& clientHintsPreferences) |
| + void preconnectHost(PreconnecterHost* preconnecter, KURL baseURL) |
| { |
| + KURL host(baseURL, m_urlToLoad); |
| + if (!host.isValid()) |
| + return; |
| + // TODO(yoav): Add a real cross attribute value here once it's no longer a no-op. |
|
Mike West
2015/06/02 11:18:33
I see. Ok, yes, please add this TODO to the test a
|
| + preconnecter->preconnect(host, CrossOriginAttributeNotSet); |
| + } |
| + |
| + PassOwnPtr<PreloadRequest> createPreloadRequest(const KURL& predictedBaseURL, const SegmentedString& source, const ClientHintsPreferences& clientHintsPreferences, PreconnecterHost* preconnecter) |
| + { |
| + if (shouldPreconnect()) { |
| + preconnectHost(preconnecter, predictedBaseURL); |
| + return nullptr; |
| + } |
| if (!shouldPreload() || !m_matchedMediaAttribute) |
| return nullptr; |
| @@ -229,7 +243,7 @@ private: |
| if (match(attributeName, hrefAttr)) |
| setUrlToLoad(attributeValue, DisallowURLReplacement); |
| else if (match(attributeName, relAttr)) |
| - m_linkIsStyleSheet = relAttributeIsStyleSheet(attributeValue); |
| + checkRelAttribute(attributeValue, m_linkIsStyleSheet, m_linkIsPreconnect); |
| else if (match(attributeName, mediaAttr)) |
| m_matchedMediaAttribute = mediaAttributeMatches(*m_mediaValues, attributeValue); |
| else if (match(attributeName, crossoriginAttr)) |
| @@ -291,10 +305,11 @@ private: |
| processVideoAttribute(attributeName, attributeValue); |
| } |
| - static bool relAttributeIsStyleSheet(const String& attributeValue) |
| + static void checkRelAttribute(const String& attributeValue, bool& isStyleSheet, bool& isPreconnect) |
| { |
| LinkRelAttribute rel(attributeValue); |
| - return rel.isStyleSheet() && !rel.isAlternate() && rel.iconType() == InvalidIcon && !rel.isDNSPrefetch(); |
| + isStyleSheet = rel.isStyleSheet() && !rel.isAlternate() && rel.iconType() == InvalidIcon && !rel.isDNSPrefetch(); |
|
Mike West
2015/06/02 11:18:33
Is this used anywhere else? I'd rather see it inli
|
| + isPreconnect = rel.isPreconnect(); |
| } |
| void setUrlToLoad(const String& value, URLReplacement replacement) |
| @@ -329,6 +344,11 @@ private: |
| return Resource::Raw; |
| } |
| + bool shouldPreconnect() const |
| + { |
| + return (match(m_tagImpl, linkTag) && m_linkIsPreconnect && !m_urlToLoad.isEmpty()); |
|
Mike West
2015/06/02 11:18:33
Nit: Drop the outer ().
|
| + } |
| + |
| bool shouldPreload() const |
| { |
| if (m_urlToLoad.isEmpty()) |
| @@ -374,6 +394,7 @@ private: |
| ImageCandidate m_srcsetImageCandidate; |
| String m_charset; |
| bool m_linkIsStyleSheet; |
| + bool m_linkIsPreconnect; |
| bool m_matchedMediaAttribute; |
| bool m_inputIsImage; |
| String m_imgSrcUrl; |
| @@ -386,7 +407,7 @@ private: |
| RefPtr<MediaValues> m_mediaValues; |
| }; |
| -TokenPreloadScanner::TokenPreloadScanner(const KURL& documentURL, PassOwnPtr<CachedDocumentParameters> documentParameters) |
| +TokenPreloadScanner::TokenPreloadScanner(const KURL& documentURL, PassOwnPtr<CachedDocumentParameters> documentParameters, PassOwnPtr<PreconnecterHost> preconnecter) |
| : m_documentURL(documentURL) |
| , m_inStyle(false) |
| , m_inPicture(false) |
| @@ -394,6 +415,7 @@ TokenPreloadScanner::TokenPreloadScanner(const KURL& documentURL, PassOwnPtr<Cac |
| , m_isCSPEnabled(false) |
| , m_templateCount(0) |
| , m_documentParameters(documentParameters) |
| + , m_preconnecter(preconnecter) |
| { |
| ASSERT(m_documentParameters.get()); |
| ASSERT(m_documentParameters->mediaValues.get()); |
| @@ -534,7 +556,7 @@ void TokenPreloadScanner::scanCommon(const Token& token, const SegmentedString& |
| scanner.processAttributes(token.attributes()); |
| if (m_inPicture) |
| scanner.handlePictureSourceURL(m_pictureSourceURL); |
| - OwnPtr<PreloadRequest> request = scanner.createPreloadRequest(m_predictedBaseElementURL, source, m_clientHintsPreferences); |
| + OwnPtr<PreloadRequest> request = scanner.createPreloadRequest(m_predictedBaseElementURL, source, m_clientHintsPreferences, m_preconnecter.get()); |
| if (request) |
| requests.append(request.release()); |
| return; |
| @@ -555,8 +577,8 @@ void TokenPreloadScanner::updatePredictedBaseURL(const Token& token) |
| } |
| } |
| -HTMLPreloadScanner::HTMLPreloadScanner(const HTMLParserOptions& options, const KURL& documentURL, PassOwnPtr<CachedDocumentParameters> documentParameters) |
| - : m_scanner(documentURL, documentParameters) |
| +HTMLPreloadScanner::HTMLPreloadScanner(const HTMLParserOptions& options, const KURL& documentURL, PassOwnPtr<CachedDocumentParameters> documentParameters, PassOwnPtr<PreconnecterHost> preconnecter) |
| + : m_scanner(documentURL, documentParameters, preconnecter) |
| , m_tokenizer(HTMLTokenizer::create(options)) |
| { |
| } |