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

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

Issue 2620993002: Fix HTMLPreloadScanner handling of type in link preload. (Closed)
Patch Set: Created 3 years, 11 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 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698