Index: Source/core/loader/LinkHeader.cpp |
diff --git a/Source/core/loader/LinkHeader.cpp b/Source/core/loader/LinkHeader.cpp |
index ab32f759787f5f2c497567f2f74e955487ca0689..158c022e8668f3ae7a476cda8c7d671707901d87 100644 |
--- a/Source/core/loader/LinkHeader.cpp |
+++ b/Source/core/loader/LinkHeader.cpp |
@@ -40,6 +40,11 @@ static bool isValidParameterValueChar(CharType chr) |
return !isWhitespace(chr) && !isValidParameterValueEnd(chr); |
} |
+static bool isExtensionParameter(LinkHeader::LinkParameterName name) |
+{ |
+ return name > LinkHeader::LinkParameterAnchor; |
+} |
+ |
// Before: |
// |
// <cat.jpg>; rel=preload |
@@ -116,6 +121,8 @@ static LinkHeader::LinkParameterName paramterNameFromString(String name) |
return LinkHeader::LinkParameterRel; |
else if (equalIgnoringCase(name, "anchor")) |
return LinkHeader::LinkParameterAnchor; |
+ else if (equalIgnoringCase(name, "crossorigin")) |
+ return LinkHeader::LinkParameterCrossOrigin; |
return LinkHeader::LinkParameterUnknown; |
} |
@@ -137,11 +144,10 @@ static bool parseParameterName(CharType*& position, CharType* end, LinkHeader::L |
skipWhile<CharType, isValidParameterNameChar>(position, end); |
CharType* nameEnd = position; |
skipWhile<CharType, isWhitespace>(position, end); |
- if (!skipExactly<CharType>(position, end, '=')) |
- return false; |
+ bool hasEqual = skipExactly<CharType>(position, end, '='); |
skipWhile<CharType, isWhitespace>(position, end); |
name = paramterNameFromString(String(nameStart, nameEnd - nameStart)); |
- return true; |
+ return hasEqual || isExtensionParameter(name); |
} |
// Before: |
@@ -200,8 +206,10 @@ static bool parseParameterValue(CharType*& position, CharType* end, String& valu |
} |
valueEnd = position; |
skipWhile<CharType, isWhitespace>(position, end); |
- if ((!completeQuotes && valueStart == valueEnd) || (position != end && !isValidParameterValueEnd(*position))) |
+ if ((!completeQuotes && valueStart == valueEnd) || (position != end && !isValidParameterValueEnd(*position))) { |
+ value = String(""); |
return false; |
+ } |
if (hasQuotes) |
++valueStart; |
if (completeQuotes) |
@@ -217,6 +225,8 @@ void LinkHeader::setValue(LinkParameterName name, String value) |
m_rel = value.lower(); |
else if (name == LinkParameterAnchor) |
m_isValid = false; |
+ else if (name == LinkParameterCrossOrigin) |
+ m_crossOrigin = crossOriginAttributeValue(value); |
} |
template <typename CharType> |
@@ -228,7 +238,8 @@ static void findNextHeader(CharType*& position, CharType* end) |
template <typename CharType> |
LinkHeader::LinkHeader(CharType*& position, CharType* end) |
- : m_isValid(true) |
+ : m_crossOrigin(CrossOriginAttributeNotSet) |
+ , m_isValid(true) |
{ |
if (!parseURL(position, end, m_url)) { |
m_isValid = false; |
@@ -250,7 +261,7 @@ LinkHeader::LinkHeader(CharType*& position, CharType* end) |
} |
String parameterValue; |
- if (!parseParameterValue(position, end, parameterValue)) { |
+ if (!parseParameterValue(position, end, parameterValue) && !isExtensionParameter(parameterName)) { |
findNextHeader(position, end); |
m_isValid = false; |
return; |