OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 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 are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 27 matching lines...) Expand all Loading... |
38 #include "core/fetch/FetchRequest.h" | 38 #include "core/fetch/FetchRequest.h" |
39 #include "core/fetch/LinkFetchResource.h" | 39 #include "core/fetch/LinkFetchResource.h" |
40 #include "core/fetch/ResourceFetcher.h" | 40 #include "core/fetch/ResourceFetcher.h" |
41 #include "core/frame/Settings.h" | 41 #include "core/frame/Settings.h" |
42 #include "core/frame/UseCounter.h" | 42 #include "core/frame/UseCounter.h" |
43 #include "core/html/CrossOriginAttribute.h" | 43 #include "core/html/CrossOriginAttribute.h" |
44 #include "core/html/LinkRelAttribute.h" | 44 #include "core/html/LinkRelAttribute.h" |
45 #include "core/html/parser/HTMLPreloadScanner.h" | 45 #include "core/html/parser/HTMLPreloadScanner.h" |
46 #include "core/inspector/ConsoleMessage.h" | 46 #include "core/inspector/ConsoleMessage.h" |
47 #include "core/loader/DocumentLoader.h" | 47 #include "core/loader/DocumentLoader.h" |
48 #include "core/loader/NetworkHintsInterface.h" | |
49 #include "core/loader/PrerenderHandle.h" | 48 #include "core/loader/PrerenderHandle.h" |
50 #include "platform/MIMETypeRegistry.h" | 49 #include "platform/MIMETypeRegistry.h" |
51 #include "platform/Prerender.h" | 50 #include "platform/Prerender.h" |
52 #include "platform/RuntimeEnabledFeatures.h" | 51 #include "platform/RuntimeEnabledFeatures.h" |
53 #include "platform/network/LinkHeader.h" | 52 #include "platform/network/LinkHeader.h" |
54 #include "platform/network/NetworkHints.h" | 53 #include "public/platform/Platform.h" |
55 #include "public/platform/WebPrerender.h" | 54 #include "public/platform/WebPrerender.h" |
56 | 55 |
57 namespace blink { | 56 namespace blink { |
58 | 57 |
59 static unsigned prerenderRelTypesFromRelAttribute(const LinkRelAttribute& relAtt
ribute, Document& document) | 58 static unsigned prerenderRelTypesFromRelAttribute(const LinkRelAttribute& relAtt
ribute, Document& document) |
60 { | 59 { |
61 unsigned result = 0; | 60 unsigned result = 0; |
62 if (relAttribute.isLinkPrerender()) { | 61 if (relAttribute.isLinkPrerender()) { |
63 result |= PrerenderRelTypePrerender; | 62 result |= PrerenderRelTypePrerender; |
64 UseCounter::count(document, UseCounter::LinkRelPrerender); | 63 UseCounter::count(document, UseCounter::LinkRelPrerender); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 void LinkLoader::didSendDOMContentLoadedForPrerender() | 127 void LinkLoader::didSendDOMContentLoadedForPrerender() |
129 { | 128 { |
130 m_client->didSendDOMContentLoadedForLinkPrerender(); | 129 m_client->didSendDOMContentLoadedForLinkPrerender(); |
131 } | 130 } |
132 | 131 |
133 enum LinkCaller { | 132 enum LinkCaller { |
134 LinkCalledFromHeader, | 133 LinkCalledFromHeader, |
135 LinkCalledFromMarkup, | 134 LinkCalledFromMarkup, |
136 }; | 135 }; |
137 | 136 |
138 | 137 static void dnsPrefetchIfNeeded(const LinkRelAttribute& relAttribute, const KURL
& href, Document& document, LinkCaller caller) |
139 static void dnsPrefetchIfNeeded(const LinkRelAttribute& relAttribute, const KURL
& href, Document& document, const NetworkHintsInterface& networkHintsInterface,
LinkCaller caller) | |
140 { | 138 { |
141 if (relAttribute.isDNSPrefetch()) { | 139 if (relAttribute.isDNSPrefetch()) { |
142 UseCounter::count(document, UseCounter::LinkRelDnsPrefetch); | 140 UseCounter::count(document, UseCounter::LinkRelDnsPrefetch); |
143 if (caller == LinkCalledFromHeader) | 141 if (caller == LinkCalledFromHeader) |
144 UseCounter::count(document, UseCounter::LinkHeaderDnsPrefetch); | 142 UseCounter::count(document, UseCounter::LinkHeaderDnsPrefetch); |
145 Settings* settings = document.settings(); | 143 Settings* settings = document.settings(); |
146 // FIXME: The href attribute of the link element can be in "//hostname"
form, and we shouldn't attempt | 144 // FIXME: The href attribute of the link element can be in "//hostname"
form, and we shouldn't attempt |
147 // to complete that as URL <https://bugs.webkit.org/show_bug.cgi?id=4885
7>. | 145 // to complete that as URL <https://bugs.webkit.org/show_bug.cgi?id=4885
7>. |
148 if (settings && settings->dnsPrefetchingEnabled() && href.isValid() && !
href.isEmpty()) { | 146 if (settings && settings->dnsPrefetchingEnabled() && href.isValid() && !
href.isEmpty()) { |
149 if (settings->logDnsPrefetchAndPreconnect()) | 147 if (settings->logDnsPrefetchAndPreconnect()) |
150 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSo
urce, DebugMessageLevel, String("DNS prefetch triggered for " + href.host()))); | 148 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSo
urce, DebugMessageLevel, String("DNS prefetch triggered for " + href.host()))); |
151 networkHintsInterface.dnsPrefetchHost(href.host()); | 149 Platform::current()->preresolve(href); |
152 } | 150 } |
153 } | 151 } |
154 } | 152 } |
155 | 153 |
156 static void preconnectIfNeeded(const LinkRelAttribute& relAttribute, const KURL&
href, Document& document, const CrossOriginAttributeValue crossOrigin, const Ne
tworkHintsInterface& networkHintsInterface, LinkCaller caller) | 154 static void preconnectIfNeeded(const LinkRelAttribute& relAttribute, const KURL&
href, Document& document, const CrossOriginAttributeValue crossOrigin, LinkCall
er caller) |
157 { | 155 { |
158 if (relAttribute.isPreconnect() && href.isValid() && href.protocolIsInHTTPFa
mily()) { | 156 if (relAttribute.isPreconnect() && href.isValid() && href.protocolIsInHTTPFa
mily()) { |
159 UseCounter::count(document, UseCounter::LinkRelPreconnect); | 157 UseCounter::count(document, UseCounter::LinkRelPreconnect); |
160 if (caller == LinkCalledFromHeader) | 158 if (caller == LinkCalledFromHeader) |
161 UseCounter::count(document, UseCounter::LinkHeaderPreconnect); | 159 UseCounter::count(document, UseCounter::LinkHeaderPreconnect); |
162 ASSERT(RuntimeEnabledFeatures::linkPreconnectEnabled()); | 160 ASSERT(RuntimeEnabledFeatures::linkPreconnectEnabled()); |
163 Settings* settings = document.settings(); | 161 Settings* settings = document.settings(); |
164 if (settings && settings->logDnsPrefetchAndPreconnect()) { | 162 if (settings && settings->logDnsPrefetchAndPreconnect()) { |
165 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSource
, DebugMessageLevel, String("Preconnect triggered for ") + href.getString())); | 163 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSource
, DebugMessageLevel, String("Preconnect triggered for ") + href.getString())); |
166 if (crossOrigin != CrossOriginAttributeNotSet) { | 164 if (crossOrigin != CrossOriginAttributeNotSet) { |
167 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSo
urce, DebugMessageLevel, | 165 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSo
urce, DebugMessageLevel, |
168 String("Preconnect CORS setting is ") + String((crossOrigin
== CrossOriginAttributeAnonymous) ? "anonymous" : "use-credentials"))); | 166 String("Preconnect CORS setting is ") + String((crossOrigin
== CrossOriginAttributeAnonymous) ? "anonymous" : "use-credentials"))); |
169 } | 167 } |
170 } | 168 } |
171 networkHintsInterface.preconnectHost(href, crossOrigin); | 169 Platform::current()->preconnect(href, crossOrigin != CrossOriginAttribut
eAnonymous, 1); |
172 } | 170 } |
173 } | 171 } |
174 | 172 |
175 bool LinkLoader::getResourceTypeFromAsAttribute(const String& as, Resource::Type
& type) | 173 bool LinkLoader::getResourceTypeFromAsAttribute(const String& as, Resource::Type
& type) |
176 { | 174 { |
177 ASSERT(as.lower() == as); | 175 ASSERT(as.lower() == as); |
178 if (as == "image") { | 176 if (as == "image") { |
179 type = Resource::Image; | 177 type = Resource::Image; |
180 } else if (as == "script") { | 178 } else if (as == "script") { |
181 type = Resource::Script; | 179 type = Resource::Script; |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
294 linkRequest.setCrossOriginAccessControl(document.getSecurityOrigin(), cr
ossOrigin); | 292 linkRequest.setCrossOriginAccessControl(document.getSecurityOrigin(), cr
ossOrigin); |
295 Settings* settings = document.settings(); | 293 Settings* settings = document.settings(); |
296 if (settings && settings->logPreload()) | 294 if (settings && settings->logPreload()) |
297 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSource, De
bugMessageLevel, String("Preload triggered for " + href.host() + href.path()))); | 295 document.addConsoleMessage(ConsoleMessage::create(OtherMessageSource, De
bugMessageLevel, String("Preload triggered for " + href.host() + href.path()))); |
298 linkRequest.setForPreload(true, monotonicallyIncreasingTime()); | 296 linkRequest.setForPreload(true, monotonicallyIncreasingTime()); |
299 linkRequest.setLinkPreload(true); | 297 linkRequest.setLinkPreload(true); |
300 linkRequest.setPriority(document.fetcher()->loadPriority(resourceType, linkR
equest)); | 298 linkRequest.setPriority(document.fetcher()->loadPriority(resourceType, linkR
equest)); |
301 return document.loader()->startPreload(resourceType, linkRequest); | 299 return document.loader()->startPreload(resourceType, linkRequest); |
302 } | 300 } |
303 | 301 |
304 void LinkLoader::loadLinksFromHeader(const String& headerValue, const KURL& base
URL, Document* document, const NetworkHintsInterface& networkHintsInterface, | 302 void LinkLoader::loadLinksFromHeader(const String& headerValue, const KURL& base
URL, Document* document, CanLoadResources canLoadResources, ViewportDescriptionW
rapper* viewportDescriptionWrapper) |
305 CanLoadResources canLoadResources, ViewportDescriptionWrapper* viewportDescr
iptionWrapper) | |
306 { | 303 { |
307 if (!document || headerValue.isEmpty()) | 304 if (!document || headerValue.isEmpty()) |
308 return; | 305 return; |
309 LinkHeaderSet headerSet(headerValue); | 306 LinkHeaderSet headerSet(headerValue); |
310 for (auto& header : headerSet) { | 307 for (auto& header : headerSet) { |
311 if (!header.valid() || header.url().isEmpty() || header.rel().isEmpty()) | 308 if (!header.valid() || header.url().isEmpty() || header.rel().isEmpty()) |
312 continue; | 309 continue; |
313 | 310 |
314 LinkRelAttribute relAttribute(header.rel()); | 311 LinkRelAttribute relAttribute(header.rel()); |
315 KURL url(baseURL, header.url()); | 312 KURL url(baseURL, header.url()); |
316 if (canLoadResources != OnlyLoadResources) { | 313 if (canLoadResources != OnlyLoadResources) { |
317 if (RuntimeEnabledFeatures::linkHeaderEnabled()) | 314 if (RuntimeEnabledFeatures::linkHeaderEnabled()) |
318 dnsPrefetchIfNeeded(relAttribute, url, *document, networkHintsIn
terface, LinkCalledFromHeader); | 315 dnsPrefetchIfNeeded(relAttribute, url, *document, LinkCalledFrom
Header); |
319 | 316 |
320 if (RuntimeEnabledFeatures::linkPreconnectEnabled()) | 317 if (RuntimeEnabledFeatures::linkPreconnectEnabled()) |
321 preconnectIfNeeded(relAttribute, url, *document, crossOriginAttr
ibuteValue(header.crossOrigin()), networkHintsInterface, LinkCalledFromHeader); | 318 preconnectIfNeeded(relAttribute, url, *document, crossOriginAttr
ibuteValue(header.crossOrigin()), LinkCalledFromHeader); |
322 } | 319 } |
323 if (canLoadResources != DoNotLoadResources) { | 320 if (canLoadResources != DoNotLoadResources) { |
324 bool errorOccurred = false; | 321 bool errorOccurred = false; |
325 if (RuntimeEnabledFeatures::linkPreloadEnabled()) { | 322 if (RuntimeEnabledFeatures::linkPreloadEnabled()) { |
326 ViewportDescription* viewportDescription = (viewportDescriptionW
rapper && viewportDescriptionWrapper->set) ? &(viewportDescriptionWrapper->descr
iption) : nullptr; | 323 ViewportDescription* viewportDescription = (viewportDescriptionW
rapper && viewportDescriptionWrapper->set) ? &(viewportDescriptionWrapper->descr
iption) : nullptr; |
327 preloadIfNeeded(relAttribute, url, *document, header.as(), heade
r.mimeType(), header.media(), crossOriginAttributeValue(header.crossOrigin()), L
inkCalledFromHeader, errorOccurred, viewportDescription); | 324 preloadIfNeeded(relAttribute, url, *document, header.as(), heade
r.mimeType(), header.media(), crossOriginAttributeValue(header.crossOrigin()), L
inkCalledFromHeader, errorOccurred, viewportDescription); |
328 } | 325 } |
329 } | 326 } |
330 // TODO(yoav): Add more supported headers as needed. | 327 // TODO(yoav): Add more supported headers as needed. |
331 } | 328 } |
332 } | 329 } |
333 | 330 |
334 bool LinkLoader::loadLink(const LinkRelAttribute& relAttribute, CrossOriginAttri
buteValue crossOrigin, const String& type, | 331 bool LinkLoader::loadLink(const LinkRelAttribute& relAttribute, CrossOriginAttri
buteValue crossOrigin, const String& type, |
335 const String& as, const String& media, const KURL& href, Document& document,
const NetworkHintsInterface& networkHintsInterface) | 332 const String& as, const String& media, const KURL& href, Document& document) |
336 { | 333 { |
337 // TODO(yoav): Do all links need to load only after they're in document??? | 334 // TODO(yoav): Do all links need to load only after they're in document??? |
338 | 335 |
339 // TODO(yoav): Convert all uses of the CrossOriginAttribute to CrossOriginAt
tributeValue. crbug.com/486689 | 336 // TODO(yoav): Convert all uses of the CrossOriginAttribute to CrossOriginAt
tributeValue. crbug.com/486689 |
340 // FIXME(crbug.com/463266): We're ignoring type here, for everything but pre
load. Maybe we shouldn't. | 337 // FIXME(crbug.com/463266): We're ignoring type here, for everything but pre
load. Maybe we shouldn't. |
341 dnsPrefetchIfNeeded(relAttribute, href, document, networkHintsInterface, Lin
kCalledFromMarkup); | 338 dnsPrefetchIfNeeded(relAttribute, href, document, LinkCalledFromMarkup); |
342 | 339 |
343 preconnectIfNeeded(relAttribute, href, document, crossOrigin, networkHintsIn
terface, LinkCalledFromMarkup); | 340 preconnectIfNeeded(relAttribute, href, document, crossOrigin, LinkCalledFrom
Markup); |
344 | 341 |
345 bool errorOccurred = false; | 342 bool errorOccurred = false; |
346 if (m_client->shouldLoadLink()) | 343 if (m_client->shouldLoadLink()) |
347 createLinkPreloadResourceClient(preloadIfNeeded(relAttribute, href, docu
ment, as, type, media, crossOrigin, LinkCalledFromMarkup, errorOccurred, nullptr
)); | 344 createLinkPreloadResourceClient(preloadIfNeeded(relAttribute, href, docu
ment, as, type, media, crossOrigin, LinkCalledFromMarkup, errorOccurred, nullptr
)); |
348 if (errorOccurred) | 345 if (errorOccurred) |
349 m_linkLoadingErrorTimer.startOneShot(0, BLINK_FROM_HERE); | 346 m_linkLoadingErrorTimer.startOneShot(0, BLINK_FROM_HERE); |
350 | 347 |
351 if (href.isEmpty() || !href.isValid()) | 348 if (href.isEmpty() || !href.isValid()) |
352 released(); | 349 released(); |
353 | 350 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
393 DEFINE_TRACE(LinkLoader) | 390 DEFINE_TRACE(LinkLoader) |
394 { | 391 { |
395 visitor->trace(m_client); | 392 visitor->trace(m_client); |
396 visitor->trace(m_prerender); | 393 visitor->trace(m_prerender); |
397 visitor->trace(m_linkPreloadResourceClient); | 394 visitor->trace(m_linkPreloadResourceClient); |
398 ResourceOwner<Resource, ResourceClient>::trace(visitor); | 395 ResourceOwner<Resource, ResourceClient>::trace(visitor); |
399 PrerenderClient::trace(visitor); | 396 PrerenderClient::trace(visitor); |
400 } | 397 } |
401 | 398 |
402 } // namespace blink | 399 } // namespace blink |
OLD | NEW |