| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. | 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. |
| 3 * Copyright (C) 2009 Torch Mobile, Inc. http://www.torchmobile.com/ | 3 * Copyright (C) 2009 Torch Mobile, Inc. http://www.torchmobile.com/ |
| 4 * Copyright (C) 2010 Google Inc. All Rights Reserved. | 4 * Copyright (C) 2010 Google Inc. All Rights Reserved. |
| 5 * | 5 * |
| 6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
| 7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
| 8 * are met: | 8 * are met: |
| 9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 #include "core/html/HTMLMetaElement.h" | 44 #include "core/html/HTMLMetaElement.h" |
| 45 #include "core/html/LinkRelAttribute.h" | 45 #include "core/html/LinkRelAttribute.h" |
| 46 #include "core/html/parser/HTMLParserIdioms.h" | 46 #include "core/html/parser/HTMLParserIdioms.h" |
| 47 #include "core/html/parser/HTMLSrcsetParser.h" | 47 #include "core/html/parser/HTMLSrcsetParser.h" |
| 48 #include "core/html/parser/HTMLTokenizer.h" | 48 #include "core/html/parser/HTMLTokenizer.h" |
| 49 #include "core/loader/LinkLoader.h" | 49 #include "core/loader/LinkLoader.h" |
| 50 #include "platform/Histogram.h" | 50 #include "platform/Histogram.h" |
| 51 #include "platform/instrumentation/tracing/TraceEvent.h" | 51 #include "platform/instrumentation/tracing/TraceEvent.h" |
| 52 #include "platform/network/mime/ContentType.h" | 52 #include "platform/network/mime/ContentType.h" |
| 53 #include "platform/network/mime/MIMETypeRegistry.h" | 53 #include "platform/network/mime/MIMETypeRegistry.h" |
| 54 #include "wtf/Optional.h" |
| 54 #include <memory> | 55 #include <memory> |
| 55 | 56 |
| 56 namespace blink { | 57 namespace blink { |
| 57 | 58 |
| 58 namespace { | 59 namespace { |
| 59 | 60 |
| 60 // When adding values to this enum, update histograms.xml as well. | 61 // When adding values to this enum, update histograms.xml as well. |
| 61 enum DocumentWriteGatedEvaluation { | 62 enum DocumentWriteGatedEvaluation { |
| 62 GatedEvaluationScriptTooLong, | 63 GatedEvaluationScriptTooLong, |
| 63 GatedEvaluationNoLikelyScript, | 64 GatedEvaluationNoLikelyScript, |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 if (match(tagImpl, imgTag)) | 114 if (match(tagImpl, imgTag)) |
| 114 return imgTag.localName(); | 115 return imgTag.localName(); |
| 115 if (match(tagImpl, inputTag)) | 116 if (match(tagImpl, inputTag)) |
| 116 return inputTag.localName(); | 117 return inputTag.localName(); |
| 117 if (match(tagImpl, linkTag)) | 118 if (match(tagImpl, linkTag)) |
| 118 return linkTag.localName(); | 119 return linkTag.localName(); |
| 119 if (match(tagImpl, scriptTag)) | 120 if (match(tagImpl, scriptTag)) |
| 120 return scriptTag.localName(); | 121 return scriptTag.localName(); |
| 121 if (match(tagImpl, videoTag)) | 122 if (match(tagImpl, videoTag)) |
| 122 return videoTag.localName(); | 123 return videoTag.localName(); |
| 123 ASSERT_NOT_REACHED(); | 124 NOTREACHED(); |
| 124 return emptyString(); | 125 return emptyString(); |
| 125 } | 126 } |
| 126 | 127 |
| 127 static bool mediaAttributeMatches(const MediaValuesCached& mediaValues, | 128 static bool mediaAttributeMatches(const MediaValuesCached& mediaValues, |
| 128 const String& attributeValue) { | 129 const String& attributeValue) { |
| 129 MediaQuerySet* mediaQueries = MediaQuerySet::create(attributeValue); | 130 MediaQuerySet* mediaQueries = MediaQuerySet::create(attributeValue); |
| 130 MediaQueryEvaluator mediaQueryEvaluator(mediaValues); | 131 MediaQueryEvaluator mediaQueryEvaluator(mediaValues); |
| 131 return mediaQueryEvaluator.eval(mediaQueries); | 132 return mediaQueryEvaluator.eval(mediaQueries); |
| 132 } | 133 } |
| 133 | 134 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 } | 199 } |
| 199 | 200 |
| 200 std::unique_ptr<PreloadRequest> createPreloadRequest( | 201 std::unique_ptr<PreloadRequest> createPreloadRequest( |
| 201 const KURL& predictedBaseURL, | 202 const KURL& predictedBaseURL, |
| 202 const SegmentedString& source, | 203 const SegmentedString& source, |
| 203 const ClientHintsPreferences& clientHintsPreferences, | 204 const ClientHintsPreferences& clientHintsPreferences, |
| 204 const PictureData& pictureData, | 205 const PictureData& pictureData, |
| 205 const ReferrerPolicy documentReferrerPolicy) { | 206 const ReferrerPolicy documentReferrerPolicy) { |
| 206 PreloadRequest::RequestType requestType = | 207 PreloadRequest::RequestType requestType = |
| 207 PreloadRequest::RequestTypePreload; | 208 PreloadRequest::RequestTypePreload; |
| 209 WTF::Optional<Resource::Type> type; |
| 208 if (shouldPreconnect()) { | 210 if (shouldPreconnect()) { |
| 209 requestType = PreloadRequest::RequestTypePreconnect; | 211 requestType = PreloadRequest::RequestTypePreconnect; |
| 210 } else { | 212 } else { |
| 211 if (isLinkRelPreload()) { | 213 if (isLinkRelPreload()) { |
| 212 requestType = PreloadRequest::RequestTypeLinkRelPreload; | 214 requestType = PreloadRequest::RequestTypeLinkRelPreload; |
| 215 type = resourceTypeForLinkPreload(); |
| 216 if (type == WTF::nullopt) |
| 217 return nullptr; |
| 213 } | 218 } |
| 214 if (!shouldPreload()) { | 219 if (!shouldPreload(type)) { |
| 215 return nullptr; | 220 return nullptr; |
| 216 } | 221 } |
| 217 } | 222 } |
| 218 | 223 |
| 219 TextPosition position = | 224 TextPosition position = |
| 220 TextPosition(source.currentLine(), source.currentColumn()); | 225 TextPosition(source.currentLine(), source.currentColumn()); |
| 221 FetchRequest::ResourceWidth resourceWidth; | 226 FetchRequest::ResourceWidth resourceWidth; |
| 222 float sourceSize = m_sourceSize; | 227 float sourceSize = m_sourceSize; |
| 223 bool sourceSizeSet = m_sourceSizeSet; | 228 bool sourceSizeSet = m_sourceSizeSet; |
| 224 if (pictureData.picked) { | 229 if (pictureData.picked) { |
| 225 sourceSizeSet = pictureData.sourceSizeSet; | 230 sourceSizeSet = pictureData.sourceSizeSet; |
| 226 sourceSize = pictureData.sourceSize; | 231 sourceSize = pictureData.sourceSize; |
| 227 } | 232 } |
| 228 if (sourceSizeSet) { | 233 if (sourceSizeSet) { |
| 229 resourceWidth.width = sourceSize; | 234 resourceWidth.width = sourceSize; |
| 230 resourceWidth.isSet = true; | 235 resourceWidth.isSet = true; |
| 231 } | 236 } |
| 232 | 237 |
| 233 Resource::Type type; | 238 if (type == WTF::nullopt) |
| 234 if (!resourceType(type)) | 239 type = resourceType(); |
| 235 return nullptr; | |
| 236 | 240 |
| 237 // The element's 'referrerpolicy' attribute (if present) takes precedence | 241 // The element's 'referrerpolicy' attribute (if present) takes precedence |
| 238 // over the document's referrer policy. | 242 // over the document's referrer policy. |
| 239 ReferrerPolicy referrerPolicy = (m_referrerPolicy != ReferrerPolicyDefault) | 243 ReferrerPolicy referrerPolicy = (m_referrerPolicy != ReferrerPolicyDefault) |
| 240 ? m_referrerPolicy | 244 ? m_referrerPolicy |
| 241 : documentReferrerPolicy; | 245 : documentReferrerPolicy; |
| 242 auto request = PreloadRequest::createIfNeeded( | 246 auto request = PreloadRequest::createIfNeeded( |
| 243 initiatorFor(m_tagImpl), position, m_urlToLoad, predictedBaseURL, type, | 247 initiatorFor(m_tagImpl), position, m_urlToLoad, predictedBaseURL, |
| 244 referrerPolicy, resourceWidth, clientHintsPreferences, requestType); | 248 type.value(), referrerPolicy, resourceWidth, clientHintsPreferences, |
| 249 requestType); |
| 245 if (!request) | 250 if (!request) |
| 246 return nullptr; | 251 return nullptr; |
| 247 | 252 |
| 248 request->setCrossOrigin(m_crossOrigin); | 253 request->setCrossOrigin(m_crossOrigin); |
| 249 request->setNonce(m_nonce); | 254 request->setNonce(m_nonce); |
| 250 request->setCharset(charset()); | 255 request->setCharset(charset()); |
| 251 request->setDefer(m_defer); | 256 request->setDefer(m_defer); |
| 252 request->setIntegrityMetadata(m_integrityMetadata); | 257 request->setIntegrityMetadata(m_integrityMetadata); |
| 253 | 258 |
| 254 return request; | 259 return request; |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 342 m_linkIsImport = rel.isImport(); | 347 m_linkIsImport = rel.isImport(); |
| 343 } else if (match(attributeName, mediaAttr)) { | 348 } else if (match(attributeName, mediaAttr)) { |
| 344 m_matched &= mediaAttributeMatches(*m_mediaValues, attributeValue); | 349 m_matched &= mediaAttributeMatches(*m_mediaValues, attributeValue); |
| 345 } else if (match(attributeName, crossoriginAttr)) { | 350 } else if (match(attributeName, crossoriginAttr)) { |
| 346 setCrossOrigin(attributeValue); | 351 setCrossOrigin(attributeValue); |
| 347 } else if (match(attributeName, nonceAttr)) { | 352 } else if (match(attributeName, nonceAttr)) { |
| 348 setNonce(attributeValue); | 353 setNonce(attributeValue); |
| 349 } else if (match(attributeName, asAttr)) { | 354 } else if (match(attributeName, asAttr)) { |
| 350 m_asAttributeValue = attributeValue.lower(); | 355 m_asAttributeValue = attributeValue.lower(); |
| 351 } else if (match(attributeName, typeAttr)) { | 356 } else if (match(attributeName, typeAttr)) { |
| 352 m_matched &= MIMETypeRegistry::isSupportedStyleSheetMIMEType( | 357 m_typeAttributeValue = attributeValue; |
| 353 ContentType(attributeValue).type()); | |
| 354 } else if (!m_referrerPolicySet && | 358 } else if (!m_referrerPolicySet && |
| 355 match(attributeName, referrerpolicyAttr) && | 359 match(attributeName, referrerpolicyAttr) && |
| 356 !attributeValue.isNull()) { | 360 !attributeValue.isNull()) { |
| 357 m_referrerPolicySet = true; | 361 m_referrerPolicySet = true; |
| 358 SecurityPolicy::referrerPolicyFromString(attributeValue, | 362 SecurityPolicy::referrerPolicyFromString(attributeValue, |
| 359 &m_referrerPolicy); | 363 &m_referrerPolicy); |
| 360 } | 364 } |
| 361 } | 365 } |
| 362 | 366 |
| 363 template <typename NameType> | 367 template <typename NameType> |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 436 } | 440 } |
| 437 | 441 |
| 438 const String& charset() const { | 442 const String& charset() const { |
| 439 // FIXME: Its not clear that this if is needed, the loader probably ignores | 443 // FIXME: Its not clear that this if is needed, the loader probably ignores |
| 440 // charset for image requests anyway. | 444 // charset for image requests anyway. |
| 441 if (match(m_tagImpl, imgTag) || match(m_tagImpl, videoTag)) | 445 if (match(m_tagImpl, imgTag) || match(m_tagImpl, videoTag)) |
| 442 return emptyString(); | 446 return emptyString(); |
| 443 return m_charset; | 447 return m_charset; |
| 444 } | 448 } |
| 445 | 449 |
| 446 bool resourceType(Resource::Type& type) const { | 450 WTF::Optional<Resource::Type> resourceTypeForLinkPreload() const { |
| 451 DCHECK(m_linkIsPreload); |
| 452 return LinkLoader::getResourceTypeFromAsAttribute(m_asAttributeValue); |
| 453 } |
| 454 |
| 455 Resource::Type resourceType() const { |
| 447 if (match(m_tagImpl, scriptTag)) { | 456 if (match(m_tagImpl, scriptTag)) { |
| 448 type = Resource::Script; | 457 return Resource::Script; |
| 449 } else if (match(m_tagImpl, imgTag) || match(m_tagImpl, videoTag) || | 458 } else if (match(m_tagImpl, imgTag) || match(m_tagImpl, videoTag) || |
| 450 (match(m_tagImpl, inputTag) && m_inputIsImage)) { | 459 (match(m_tagImpl, inputTag) && m_inputIsImage)) { |
| 451 type = Resource::Image; | 460 return Resource::Image; |
| 452 } else if (match(m_tagImpl, linkTag) && m_linkIsStyleSheet) { | 461 } else if (match(m_tagImpl, linkTag) && m_linkIsStyleSheet) { |
| 453 type = Resource::CSSStyleSheet; | 462 return Resource::CSSStyleSheet; |
| 454 } else if (m_linkIsPreconnect) { | 463 } else if (m_linkIsPreconnect) { |
| 455 type = Resource::Raw; | 464 return Resource::Raw; |
| 456 } else if (m_linkIsPreload) { | |
| 457 if (!LinkLoader::getResourceTypeFromAsAttribute(m_asAttributeValue, type)) | |
| 458 return false; | |
| 459 } else if (match(m_tagImpl, linkTag) && m_linkIsImport) { | 465 } else if (match(m_tagImpl, linkTag) && m_linkIsImport) { |
| 460 type = Resource::ImportResource; | 466 return Resource::ImportResource; |
| 461 } else { | |
| 462 ASSERT_NOT_REACHED(); | |
| 463 } | 467 } |
| 464 return true; | 468 NOTREACHED(); |
| 469 return Resource::Raw; |
| 465 } | 470 } |
| 466 | 471 |
| 467 bool shouldPreconnect() const { | 472 bool shouldPreconnect() const { |
| 468 return match(m_tagImpl, linkTag) && m_linkIsPreconnect && | 473 return match(m_tagImpl, linkTag) && m_linkIsPreconnect && |
| 469 !m_urlToLoad.isEmpty(); | 474 !m_urlToLoad.isEmpty(); |
| 470 } | 475 } |
| 471 | 476 |
| 472 bool isLinkRelPreload() const { | 477 bool isLinkRelPreload() const { |
| 473 return match(m_tagImpl, linkTag) && m_linkIsPreload && | 478 return match(m_tagImpl, linkTag) && m_linkIsPreload && |
| 474 !m_urlToLoad.isEmpty(); | 479 !m_urlToLoad.isEmpty(); |
| 475 } | 480 } |
| 476 | 481 |
| 477 bool shouldPreload() const { | 482 bool shouldPreloadLink(WTF::Optional<Resource::Type>& type) const { |
| 483 if (m_linkIsStyleSheet) { |
| 484 return m_typeAttributeValue.isEmpty() || |
| 485 MIMETypeRegistry::isSupportedStyleSheetMIMEType( |
| 486 ContentType(m_typeAttributeValue).type()); |
| 487 } else if (m_linkIsPreload) { |
| 488 if (m_typeAttributeValue.isEmpty()) |
| 489 return true; |
| 490 String typeFromAttribute = ContentType(m_typeAttributeValue).type(); |
| 491 if ((type == Resource::Font && |
| 492 !MIMETypeRegistry::isSupportedFontMIMEType(typeFromAttribute)) || |
| 493 (type == Resource::Image && |
| 494 !MIMETypeRegistry::isSupportedImagePrefixedMIMEType( |
| 495 typeFromAttribute)) || |
| 496 (type == Resource::CSSStyleSheet && |
| 497 !MIMETypeRegistry::isSupportedStyleSheetMIMEType( |
| 498 typeFromAttribute))) { |
| 499 return false; |
| 500 } |
| 501 } else if (!m_linkIsImport) { |
| 502 return false; |
| 503 } |
| 504 |
| 505 return true; |
| 506 } |
| 507 |
| 508 bool shouldPreload(WTF::Optional<Resource::Type>& type) const { |
| 478 if (m_urlToLoad.isEmpty()) | 509 if (m_urlToLoad.isEmpty()) |
| 479 return false; | 510 return false; |
| 480 if (!m_matched) | 511 if (!m_matched) |
| 481 return false; | 512 return false; |
| 482 if (match(m_tagImpl, linkTag) && !m_linkIsStyleSheet && !m_linkIsImport && | 513 if (match(m_tagImpl, linkTag)) |
| 483 !m_linkIsPreload) | 514 return shouldPreloadLink(type); |
| 484 return false; | |
| 485 if (match(m_tagImpl, inputTag) && !m_inputIsImage) | 515 if (match(m_tagImpl, inputTag) && !m_inputIsImage) |
| 486 return false; | 516 return false; |
| 487 if (match(m_tagImpl, scriptTag) && | 517 if (match(m_tagImpl, scriptTag) && |
| 488 !ScriptLoader::isValidScriptTypeAndLanguage( | 518 !ScriptLoader::isValidScriptTypeAndLanguage( |
| 489 m_typeAttributeValue, m_languageAttributeValue, | 519 m_typeAttributeValue, m_languageAttributeValue, |
| 490 ScriptLoader::AllowLegacyTypeInTypeAttribute)) { | 520 ScriptLoader::AllowLegacyTypeInTypeAttribute)) { |
| 491 return false; | 521 return false; |
| 492 } | 522 } |
| 493 return true; | 523 return true; |
| 494 } | 524 } |
| (...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 892 defaultViewportMinWidth = document->viewportDefaultMinWidth(); | 922 defaultViewportMinWidth = document->viewportDefaultMinWidth(); |
| 893 viewportMetaZeroValuesQuirk = | 923 viewportMetaZeroValuesQuirk = |
| 894 document->settings() && | 924 document->settings() && |
| 895 document->settings()->getViewportMetaZeroValuesQuirk(); | 925 document->settings()->getViewportMetaZeroValuesQuirk(); |
| 896 viewportMetaEnabled = | 926 viewportMetaEnabled = |
| 897 document->settings() && document->settings()->getViewportMetaEnabled(); | 927 document->settings() && document->settings()->getViewportMetaEnabled(); |
| 898 referrerPolicy = document->getReferrerPolicy(); | 928 referrerPolicy = document->getReferrerPolicy(); |
| 899 } | 929 } |
| 900 | 930 |
| 901 } // namespace blink | 931 } // namespace blink |
| OLD | NEW |