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 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
260 | 260 |
261 static Resource* preloadIfNeeded(const LinkRelAttribute& relAttribute, | 261 static Resource* preloadIfNeeded(const LinkRelAttribute& relAttribute, |
262 const KURL& href, | 262 const KURL& href, |
263 Document& document, | 263 Document& document, |
264 const String& as, | 264 const String& as, |
265 const String& mimeType, | 265 const String& mimeType, |
266 const String& media, | 266 const String& media, |
267 CrossOriginAttributeValue crossOrigin, | 267 CrossOriginAttributeValue crossOrigin, |
268 LinkCaller caller, | 268 LinkCaller caller, |
269 bool& errorOccurred, | 269 bool& errorOccurred, |
270 ViewportDescription* viewportDescription) { | 270 ViewportDescription* viewportDescription, |
271 ReferrerPolicy referrerPolicy) { | |
271 if (!document.loader() || !relAttribute.isLinkPreload()) | 272 if (!document.loader() || !relAttribute.isLinkPreload()) |
272 return nullptr; | 273 return nullptr; |
273 | 274 |
274 UseCounter::count(document, UseCounter::LinkRelPreload); | 275 UseCounter::count(document, UseCounter::LinkRelPreload); |
275 if (!href.isValid() || href.isEmpty()) { | 276 if (!href.isValid() || href.isEmpty()) { |
276 document.addConsoleMessage(ConsoleMessage::create( | 277 document.addConsoleMessage(ConsoleMessage::create( |
277 OtherMessageSource, WarningMessageLevel, | 278 OtherMessageSource, WarningMessageLevel, |
278 String("<link rel=preload> has an invalid `href` value"))); | 279 String("<link rel=preload> has an invalid `href` value"))); |
279 return nullptr; | 280 return nullptr; |
280 } | 281 } |
(...skipping 25 matching lines...) Expand all Loading... | |
306 | 307 |
307 if (!isSupportedType(resourceType, mimeType)) { | 308 if (!isSupportedType(resourceType, mimeType)) { |
308 document.addConsoleMessage(ConsoleMessage::create( | 309 document.addConsoleMessage(ConsoleMessage::create( |
309 OtherMessageSource, WarningMessageLevel, | 310 OtherMessageSource, WarningMessageLevel, |
310 String("<link rel=preload> has an unsupported `type` value"))); | 311 String("<link rel=preload> has an unsupported `type` value"))); |
311 return nullptr; | 312 return nullptr; |
312 } | 313 } |
313 ResourceRequest resourceRequest(document.completeURL(href)); | 314 ResourceRequest resourceRequest(document.completeURL(href)); |
314 ResourceFetcher::determineRequestContext(resourceRequest, resourceType, | 315 ResourceFetcher::determineRequestContext(resourceRequest, resourceType, |
315 false); | 316 false); |
317 | |
318 if (referrerPolicy != ReferrerPolicyDefault) { | |
319 resourceRequest.setHTTPReferrer(SecurityPolicy::generateReferrer( | |
320 referrerPolicy, href, document.outgoingReferrer())); | |
321 } | |
322 | |
316 FetchRequest linkRequest(resourceRequest, FetchInitiatorTypeNames::link, | 323 FetchRequest linkRequest(resourceRequest, FetchInitiatorTypeNames::link, |
317 document.encodingName()); | 324 document.encodingName()); |
318 | 325 |
319 if (crossOrigin != CrossOriginAttributeNotSet) | 326 if (crossOrigin != CrossOriginAttributeNotSet) |
320 linkRequest.setCrossOriginAccessControl(document.getSecurityOrigin(), | 327 linkRequest.setCrossOriginAccessControl(document.getSecurityOrigin(), |
321 crossOrigin); | 328 crossOrigin); |
322 Settings* settings = document.settings(); | 329 Settings* settings = document.settings(); |
323 if (settings && settings->logPreload()) | 330 if (settings && settings->logPreload()) |
324 document.addConsoleMessage(ConsoleMessage::create( | 331 document.addConsoleMessage(ConsoleMessage::create( |
325 OtherMessageSource, DebugMessageLevel, | 332 OtherMessageSource, DebugMessageLevel, |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
361 preconnectIfNeeded(relAttribute, url, *document, | 368 preconnectIfNeeded(relAttribute, url, *document, |
362 crossOriginAttributeValue(header.crossOrigin()), | 369 crossOriginAttributeValue(header.crossOrigin()), |
363 networkHintsInterface, LinkCalledFromHeader); | 370 networkHintsInterface, LinkCalledFromHeader); |
364 } | 371 } |
365 if (canLoadResources != DoNotLoadResources) { | 372 if (canLoadResources != DoNotLoadResources) { |
366 bool errorOccurred = false; | 373 bool errorOccurred = false; |
367 ViewportDescription* viewportDescription = | 374 ViewportDescription* viewportDescription = |
368 (viewportDescriptionWrapper && viewportDescriptionWrapper->set) | 375 (viewportDescriptionWrapper && viewportDescriptionWrapper->set) |
369 ? &(viewportDescriptionWrapper->description) | 376 ? &(viewportDescriptionWrapper->description) |
370 : nullptr; | 377 : nullptr; |
378 | |
379 ReferrerPolicy referrerPolicy = ReferrerPolicyDefault; | |
380 if (!header.referrerPolicy().isNull()) { | |
381 SecurityPolicy::referrerPolicyFromStringWithLegacyKeywords( | |
382 header.referrerPolicy(), &referrerPolicy); | |
383 } | |
384 | |
371 preloadIfNeeded(relAttribute, url, *document, header.as(), | 385 preloadIfNeeded(relAttribute, url, *document, header.as(), |
372 header.mimeType(), header.media(), | 386 header.mimeType(), header.media(), |
373 crossOriginAttributeValue(header.crossOrigin()), | 387 crossOriginAttributeValue(header.crossOrigin()), |
374 LinkCalledFromHeader, errorOccurred, viewportDescription); | 388 LinkCalledFromHeader, errorOccurred, viewportDescription, |
389 referrerPolicy); | |
375 } | 390 } |
376 // TODO(yoav): Add more supported headers as needed. | 391 // TODO(yoav): Add more supported headers as needed. |
377 } | 392 } |
378 } | 393 } |
379 | 394 |
380 bool LinkLoader::loadLink(const LinkRelAttribute& relAttribute, | 395 bool LinkLoader::loadLink(const LinkRelAttribute& relAttribute, |
381 CrossOriginAttributeValue crossOrigin, | 396 CrossOriginAttributeValue crossOrigin, |
382 const String& type, | 397 const String& type, |
383 const String& as, | 398 const String& as, |
384 const String& media, | 399 const String& media, |
400 const String& referrerPolicy, | |
385 const KURL& href, | 401 const KURL& href, |
386 Document& document, | 402 Document& document, |
387 const NetworkHintsInterface& networkHintsInterface) { | 403 const NetworkHintsInterface& networkHintsInterface) { |
388 // TODO(yoav): Do all links need to load only after they're in document??? | 404 // TODO(yoav): Do all links need to load only after they're in document??? |
389 | 405 |
390 // TODO(yoav): Convert all uses of the CrossOriginAttribute to CrossOriginAttr ibuteValue. crbug.com/486689 | 406 // TODO(yoav): Convert all uses of the CrossOriginAttribute to CrossOriginAttr ibuteValue. crbug.com/486689 |
391 // FIXME(crbug.com/463266): We're ignoring type here, for everything but prelo ad. Maybe we shouldn't. | 407 // FIXME(crbug.com/463266): We're ignoring type here, for everything but prelo ad. Maybe we shouldn't. |
392 dnsPrefetchIfNeeded(relAttribute, href, document, networkHintsInterface, | 408 dnsPrefetchIfNeeded(relAttribute, href, document, networkHintsInterface, |
393 LinkCalledFromMarkup); | 409 LinkCalledFromMarkup); |
394 | 410 |
395 preconnectIfNeeded(relAttribute, href, document, crossOrigin, | 411 preconnectIfNeeded(relAttribute, href, document, crossOrigin, |
396 networkHintsInterface, LinkCalledFromMarkup); | 412 networkHintsInterface, LinkCalledFromMarkup); |
397 | 413 |
398 bool errorOccurred = false; | 414 bool errorOccurred = false; |
399 if (m_client->shouldLoadLink()) | 415 if (m_client->shouldLoadLink()) { |
400 createLinkPreloadResourceClient(preloadIfNeeded( | 416 createLinkPreloadResourceClient(preloadIfNeeded( |
401 relAttribute, href, document, as, type, media, crossOrigin, | 417 relAttribute, href, document, as, type, media, crossOrigin, |
402 LinkCalledFromMarkup, errorOccurred, nullptr)); | 418 LinkCalledFromMarkup, errorOccurred, nullptr, ReferrerPolicyDefault)); |
estark
2016/10/18 04:55:54
This should be `referrerPolicy` instead of `Referr
Yoav Weiss
2016/10/20 23:01:37
yes and yes. (and now that the tests have an expec
| |
419 } | |
403 if (errorOccurred) | 420 if (errorOccurred) |
404 m_linkLoadingErrorTimer.startOneShot(0, BLINK_FROM_HERE); | 421 m_linkLoadingErrorTimer.startOneShot(0, BLINK_FROM_HERE); |
405 | 422 |
406 if (href.isEmpty() || !href.isValid()) | 423 if (href.isEmpty() || !href.isValid()) |
407 released(); | 424 released(); |
408 | 425 |
409 // FIXME(crbug.com/323096): Should take care of import. | 426 // FIXME(crbug.com/323096): Should take care of import. |
410 if (relAttribute.isLinkPrefetch() && href.isValid() && document.frame()) { | 427 if (relAttribute.isLinkPrefetch() && href.isValid() && document.frame()) { |
411 if (!m_client->shouldLoadLink()) | 428 if (!m_client->shouldLoadLink()) |
412 return false; | 429 return false; |
413 UseCounter::count(document, UseCounter::LinkRelPrefetch); | 430 UseCounter::count(document, UseCounter::LinkRelPrefetch); |
414 | 431 |
415 FetchRequest linkRequest(ResourceRequest(document.completeURL(href)), | 432 FetchRequest linkRequest(ResourceRequest(document.completeURL(href)), |
estark
2016/10/18 04:55:54
Presumably we also want to set a referrer policy o
| |
416 FetchInitiatorTypeNames::link); | 433 FetchInitiatorTypeNames::link); |
417 if (crossOrigin != CrossOriginAttributeNotSet) | 434 if (crossOrigin != CrossOriginAttributeNotSet) |
418 linkRequest.setCrossOriginAccessControl(document.getSecurityOrigin(), | 435 linkRequest.setCrossOriginAccessControl(document.getSecurityOrigin(), |
419 crossOrigin); | 436 crossOrigin); |
420 setResource(LinkFetchResource::fetch(Resource::LinkPrefetch, linkRequest, | 437 setResource(LinkFetchResource::fetch(Resource::LinkPrefetch, linkRequest, |
421 document.fetcher())); | 438 document.fetcher())); |
422 } | 439 } |
423 | 440 |
424 if (const unsigned prerenderRelTypes = | 441 if (const unsigned prerenderRelTypes = |
425 prerenderRelTypesFromRelAttribute(relAttribute, document)) { | 442 prerenderRelTypesFromRelAttribute(relAttribute, document)) { |
(...skipping 26 matching lines...) Expand all Loading... | |
452 | 469 |
453 DEFINE_TRACE(LinkLoader) { | 470 DEFINE_TRACE(LinkLoader) { |
454 visitor->trace(m_client); | 471 visitor->trace(m_client); |
455 visitor->trace(m_prerender); | 472 visitor->trace(m_prerender); |
456 visitor->trace(m_linkPreloadResourceClient); | 473 visitor->trace(m_linkPreloadResourceClient); |
457 ResourceOwner<Resource, ResourceClient>::trace(visitor); | 474 ResourceOwner<Resource, ResourceClient>::trace(visitor); |
458 PrerenderClient::trace(visitor); | 475 PrerenderClient::trace(visitor); |
459 } | 476 } |
460 | 477 |
461 } // namespace blink | 478 } // namespace blink |
OLD | NEW |