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 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
175 String("Preconnect CORS setting is ") + | 175 String("Preconnect CORS setting is ") + |
176 String((crossOrigin == CrossOriginAttributeAnonymous) | 176 String((crossOrigin == CrossOriginAttributeAnonymous) |
177 ? "anonymous" | 177 ? "anonymous" |
178 : "use-credentials"))); | 178 : "use-credentials"))); |
179 } | 179 } |
180 } | 180 } |
181 networkHintsInterface.preconnectHost(href, crossOrigin); | 181 networkHintsInterface.preconnectHost(href, crossOrigin); |
182 } | 182 } |
183 } | 183 } |
184 | 184 |
185 bool LinkLoader::getResourceTypeFromAsAttribute(const String& as, | 185 WTF::Optional<Resource::Type> LinkLoader::getResourceTypeFromAsAttribute( |
186 Resource::Type& type) { | 186 const String& as) { |
187 DCHECK_EQ(as.lower(), as); | 187 DCHECK_EQ(as.lower(), as); |
188 if (as == "image") { | 188 if (as == "image") { |
189 type = Resource::Image; | 189 return Resource::Image; |
190 } else if (as == "script") { | 190 } else if (as == "script") { |
191 type = Resource::Script; | 191 return Resource::Script; |
192 } else if (as == "style") { | 192 } else if (as == "style") { |
193 type = Resource::CSSStyleSheet; | 193 return Resource::CSSStyleSheet; |
194 } else if (as == "media") { | 194 } else if (as == "media") { |
195 type = Resource::Media; | 195 return Resource::Media; |
196 } else if (as == "font") { | 196 } else if (as == "font") { |
197 type = Resource::Font; | 197 return Resource::Font; |
198 } else if (as == "track") { | 198 } else if (as == "track") { |
199 type = Resource::TextTrack; | 199 return Resource::TextTrack; |
200 } else { | 200 } else { |
201 type = Resource::Raw; | |
202 if (!as.isEmpty()) | 201 if (!as.isEmpty()) |
Charlie Harrison
2017/01/10 14:35:06
Can this condition be an "else if" in the outer el
Yoav Weiss
2017/01/11 05:14:36
Yeah (more or less). done
| |
203 return false; | 202 return WTF::nullopt; |
203 return Resource::Raw; | |
204 } | 204 } |
205 return true; | |
206 } | 205 } |
207 | 206 |
208 void LinkLoader::createLinkPreloadResourceClient(Resource* resource) { | 207 void LinkLoader::createLinkPreloadResourceClient(Resource* resource) { |
209 if (!resource) | 208 if (!resource) |
210 return; | 209 return; |
211 switch (resource->getType()) { | 210 switch (resource->getType()) { |
212 case Resource::Image: | 211 case Resource::Image: |
213 m_linkPreloadResourceClient = LinkPreloadImageResourceClient::create( | 212 m_linkPreloadResourceClient = LinkPreloadImageResourceClient::create( |
214 this, toImageResource(resource)); | 213 this, toImageResource(resource)); |
215 break; | 214 break; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
293 } | 292 } |
294 | 293 |
295 // Preload only if media matches | 294 // Preload only if media matches |
296 MediaQuerySet* mediaQueries = MediaQuerySet::create(media); | 295 MediaQuerySet* mediaQueries = MediaQuerySet::create(media); |
297 MediaQueryEvaluator evaluator(*mediaValues); | 296 MediaQueryEvaluator evaluator(*mediaValues); |
298 if (!evaluator.eval(mediaQueries)) | 297 if (!evaluator.eval(mediaQueries)) |
299 return nullptr; | 298 return nullptr; |
300 } | 299 } |
301 if (caller == LinkCalledFromHeader) | 300 if (caller == LinkCalledFromHeader) |
302 UseCounter::count(document, UseCounter::LinkHeaderPreload); | 301 UseCounter::count(document, UseCounter::LinkHeaderPreload); |
303 Resource::Type resourceType; | 302 Optional<Resource::Type> resourceType = |
304 if (!LinkLoader::getResourceTypeFromAsAttribute(as, resourceType)) { | 303 LinkLoader::getResourceTypeFromAsAttribute(as); |
304 if (resourceType == WTF::nullopt) { | |
305 document.addConsoleMessage(ConsoleMessage::create( | 305 document.addConsoleMessage(ConsoleMessage::create( |
306 OtherMessageSource, WarningMessageLevel, | 306 OtherMessageSource, WarningMessageLevel, |
307 String("<link rel=preload> must have a valid `as` value"))); | 307 String("<link rel=preload> must have a valid `as` value"))); |
308 errorOccurred = true; | 308 errorOccurred = true; |
309 return nullptr; | 309 return nullptr; |
310 } | 310 } |
311 | 311 |
312 if (!isSupportedType(resourceType, mimeType)) { | 312 if (!isSupportedType(resourceType.value(), mimeType)) { |
313 document.addConsoleMessage(ConsoleMessage::create( | 313 document.addConsoleMessage(ConsoleMessage::create( |
314 OtherMessageSource, WarningMessageLevel, | 314 OtherMessageSource, WarningMessageLevel, |
315 String("<link rel=preload> has an unsupported `type` value"))); | 315 String("<link rel=preload> has an unsupported `type` value"))); |
316 return nullptr; | 316 return nullptr; |
317 } | 317 } |
318 ResourceRequest resourceRequest(document.completeURL(href)); | 318 ResourceRequest resourceRequest(document.completeURL(href)); |
319 ResourceFetcher::determineRequestContext(resourceRequest, resourceType, | 319 ResourceFetcher::determineRequestContext(resourceRequest, |
320 false); | 320 resourceType.value(), false); |
321 | 321 |
322 if (referrerPolicy != ReferrerPolicyDefault) { | 322 if (referrerPolicy != ReferrerPolicyDefault) { |
323 resourceRequest.setHTTPReferrer(SecurityPolicy::generateReferrer( | 323 resourceRequest.setHTTPReferrer(SecurityPolicy::generateReferrer( |
324 referrerPolicy, href, document.outgoingReferrer())); | 324 referrerPolicy, href, document.outgoingReferrer())); |
325 } | 325 } |
326 | 326 |
327 FetchRequest linkRequest(resourceRequest, FetchInitiatorTypeNames::link, | 327 FetchRequest linkRequest(resourceRequest, FetchInitiatorTypeNames::link, |
328 document.encodingName()); | 328 document.encodingName()); |
329 | 329 |
330 if (crossOrigin != CrossOriginAttributeNotSet) { | 330 if (crossOrigin != CrossOriginAttributeNotSet) { |
331 linkRequest.setCrossOriginAccessControl(document.getSecurityOrigin(), | 331 linkRequest.setCrossOriginAccessControl(document.getSecurityOrigin(), |
332 crossOrigin); | 332 crossOrigin); |
333 } | 333 } |
334 Settings* settings = document.settings(); | 334 Settings* settings = document.settings(); |
335 if (settings && settings->getLogPreload()) { | 335 if (settings && settings->getLogPreload()) { |
336 document.addConsoleMessage(ConsoleMessage::create( | 336 document.addConsoleMessage(ConsoleMessage::create( |
337 OtherMessageSource, DebugMessageLevel, | 337 OtherMessageSource, DebugMessageLevel, |
338 String("Preload triggered for " + href.host() + href.path()))); | 338 String("Preload triggered for " + href.host() + href.path()))); |
339 } | 339 } |
340 linkRequest.setForPreload(true, monotonicallyIncreasingTime()); | 340 linkRequest.setForPreload(true, monotonicallyIncreasingTime()); |
341 linkRequest.setLinkPreload(true); | 341 linkRequest.setLinkPreload(true); |
342 return document.loader()->startPreload(resourceType, linkRequest); | 342 return document.loader()->startPreload(resourceType.value(), linkRequest); |
343 } | 343 } |
344 | 344 |
345 static Resource* prefetchIfNeeded(Document& document, | 345 static Resource* prefetchIfNeeded(Document& document, |
346 const KURL& href, | 346 const KURL& href, |
347 const LinkRelAttribute& relAttribute, | 347 const LinkRelAttribute& relAttribute, |
348 CrossOriginAttributeValue crossOrigin, | 348 CrossOriginAttributeValue crossOrigin, |
349 ReferrerPolicy referrerPolicy) { | 349 ReferrerPolicy referrerPolicy) { |
350 if (relAttribute.isLinkPrefetch() && href.isValid() && document.frame()) { | 350 if (relAttribute.isLinkPrefetch() && href.isValid() && document.frame()) { |
351 UseCounter::count(document, UseCounter::LinkRelPrefetch); | 351 UseCounter::count(document, UseCounter::LinkRelPrefetch); |
352 | 352 |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
487 | 487 |
488 DEFINE_TRACE(LinkLoader) { | 488 DEFINE_TRACE(LinkLoader) { |
489 visitor->trace(m_client); | 489 visitor->trace(m_client); |
490 visitor->trace(m_prerender); | 490 visitor->trace(m_prerender); |
491 visitor->trace(m_linkPreloadResourceClient); | 491 visitor->trace(m_linkPreloadResourceClient); |
492 ResourceOwner<Resource, ResourceClient>::trace(visitor); | 492 ResourceOwner<Resource, ResourceClient>::trace(visitor); |
493 PrerenderClient::trace(visitor); | 493 PrerenderClient::trace(visitor); |
494 } | 494 } |
495 | 495 |
496 } // namespace blink | 496 } // namespace blink |
OLD | NEW |