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

Side by Side Diff: third_party/WebKit/Source/core/loader/LinkLoader.cpp

Issue 2043753002: Declarative resource hints go through mojo IPC to //content Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Use unique_ptr to avoid memory leaks in unit tests Created 4 years, 6 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) 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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698