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

Unified Diff: third_party/WebKit/Source/core/loader/LinkHeader.cpp

Issue 1811163002: Share link header parsing code between blink and content. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@base-optional
Patch Set: rebase Created 4 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/loader/LinkHeader.cpp
diff --git a/third_party/WebKit/Source/core/loader/LinkHeader.cpp b/third_party/WebKit/Source/core/loader/LinkHeader.cpp
deleted file mode 100644
index bbcf3ce3bf3a4d8391fe503f81b9f2e81837d2b6..0000000000000000000000000000000000000000
--- a/third_party/WebKit/Source/core/loader/LinkHeader.cpp
+++ /dev/null
@@ -1,328 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "core/loader/LinkHeader.h"
-
-#include "platform/ParsingUtilities.h"
-
-namespace blink {
-
-// LWSP definition in https://www.ietf.org/rfc/rfc0822.txt
-template <typename CharType>
-static bool isWhitespace(CharType chr)
-{
- return (chr == ' ') || (chr == '\t');
-}
-
-template <typename CharType>
-static bool isValidURLChar(CharType chr)
-{
- return !isWhitespace(chr) && chr != '>';
-}
-
-template <typename CharType>
-static bool isValidParameterNameChar(CharType chr)
-{
- // TODO(yoav): We need to move this function to a central location and possibly rewrite as a lookup table. https://crbug.com/527324
-
- // Alpha-numeric is a valid char.
- // This is likely the common case - bailing early.
- if (isASCIIAlphanumeric(chr))
- return true;
- // A separator or CTL or '%', '*' or '\'' means the char is not valid.
- // So any of: |{}[]/\:;<=>?@,()*'"%
- if (chr <= ' ' || chr > '|' || chr == '{' || chr == ']' || chr == '['
- || chr == '/' || chr == '\\' || (chr <= '@' && chr >= ':') || chr == ','
- || (chr >= '(' && chr <= '*') || chr == '\'' || chr == '"' || chr == '%') {
- return false;
- }
- return true;
-}
-
-template <typename CharType>
-static bool isValidParameterValueEnd(CharType chr)
-{
- return chr == ';' || chr == ',';
-}
-
-template <typename CharType>
-static bool isValidParameterValueChar(CharType chr)
-{
- return !isWhitespace(chr) && !isValidParameterValueEnd(chr);
-}
-
-// Verify that the parameter is a link-extension which according to spec doesn't have to have a value.
-static bool isExtensionParameter(LinkHeader::LinkParameterName name)
-{
- return name >= LinkHeader::LinkParameterUnknown;
-}
-
-// Before:
-//
-// <cat.jpg>; rel=preload
-// ^ ^
-// position end
-//
-// After (if successful: otherwise the method returns false)
-//
-// <cat.jpg>; rel=preload
-// ^ ^
-// position end
-template <typename CharType>
-static bool parseURL(CharType*& position, CharType* end, String& url)
-{
- skipWhile<CharType, isWhitespace>(position, end);
- if (!skipExactly<CharType>(position, end, '<'))
- return false;
- skipWhile<CharType, isWhitespace>(position, end);
-
- CharType* urlStart = position;
- skipWhile<CharType, isValidURLChar>(position, end);
- CharType* urlEnd = position;
- skipUntil<CharType>(position, end, '>');
- if (!skipExactly<CharType>(position, end, '>'))
- return false;
-
- url = String(urlStart, urlEnd - urlStart);
- return true;
-}
-
-template <typename CharType>
-static bool invalidParameterDelimiter(CharType*& position, CharType* end)
-{
- return (!skipExactly<CharType>(position, end, ';') && (position < end) && (*position != ','));
-}
-
-template <typename CharType>
-static bool validFieldEnd(CharType*& position, CharType* end)
-{
- ASSERT(position <= end);
- return (position == end || *position == ',');
-}
-
-// Before:
-//
-// <cat.jpg>; rel=preload
-// ^ ^
-// position end
-//
-// After (if successful: otherwise the method returns false, and modifies the isValid boolean accordingly)
-//
-// <cat.jpg>; rel=preload
-// ^ ^
-// position end
-template <typename CharType>
-static bool parseParameterDelimiter(CharType*& position, CharType* end, bool& isValid)
-{
- isValid = true;
- skipWhile<CharType, isWhitespace>(position, end);
- if (invalidParameterDelimiter(position, end)) {
- isValid = false;
- return false;
- }
- skipWhile<CharType, isWhitespace>(position, end);
- if (validFieldEnd(position, end))
- return false;
- return true;
-}
-
-static LinkHeader::LinkParameterName paramterNameFromString(String name)
-{
- if (equalIgnoringCase(name, "rel"))
- return LinkHeader::LinkParameterRel;
- if (equalIgnoringCase(name, "anchor"))
- return LinkHeader::LinkParameterAnchor;
- if (equalIgnoringCase(name, "crossorigin"))
- return LinkHeader::LinkParameterCrossOrigin;
- if (equalIgnoringCase(name, "title"))
- return LinkHeader::LinkParameterTitle;
- if (equalIgnoringCase(name, "media"))
- return LinkHeader::LinkParameterMedia;
- if (equalIgnoringCase(name, "type"))
- return LinkHeader::LinkParameterType;
- if (equalIgnoringCase(name, "rev"))
- return LinkHeader::LinkParameterRev;
- if (equalIgnoringCase(name, "hreflang"))
- return LinkHeader::LinkParameterHreflang;
- if (equalIgnoringCase(name, "as"))
- return LinkHeader::LinkParameterAs;
- return LinkHeader::LinkParameterUnknown;
-}
-
-// Before:
-//
-// <cat.jpg>; rel=preload
-// ^ ^
-// position end
-//
-// After (if successful: otherwise the method returns false)
-//
-// <cat.jpg>; rel=preload
-// ^ ^
-// position end
-template <typename CharType>
-static bool parseParameterName(CharType*& position, CharType* end, LinkHeader::LinkParameterName& name)
-{
- CharType* nameStart = position;
- skipWhile<CharType, isValidParameterNameChar>(position, end);
- CharType* nameEnd = position;
- skipWhile<CharType, isWhitespace>(position, end);
- bool hasEqual = skipExactly<CharType>(position, end, '=');
- skipWhile<CharType, isWhitespace>(position, end);
- name = paramterNameFromString(String(nameStart, nameEnd - nameStart));
- if (hasEqual)
- return true;
- bool validParameterValueEnd = (position == end) || isValidParameterValueEnd(*position);
- return validParameterValueEnd && isExtensionParameter(name);
-}
-
-// Before:
-//
-// <cat.jpg>; rel="preload"; type="image/jpeg";
-// ^ ^
-// position end
-//
-// After (if the parameter starts with a quote, otherwise the method returns false)
-//
-// <cat.jpg>; rel="preload"; type="image/jpeg";
-// ^ ^
-// position end
-template <typename CharType>
-static bool skipQuotesIfNeeded(CharType*& position, CharType* end, bool& completeQuotes)
-{
- ASSERT(position <= end);
- unsigned char quote;
- completeQuotes = false;
- if (skipExactly<CharType>(position, end, '\''))
- quote = '\'';
- else if (skipExactly<CharType>(position, end, '"'))
- quote = '"';
- else
- return false;
-
- while (!completeQuotes && position < end) {
- skipUntil(position, end, static_cast<CharType>(quote));
- if (*(position - 1) != '\\')
- completeQuotes = true;
- completeQuotes = skipExactly(position, end, static_cast<CharType>(quote)) && completeQuotes;
- }
- return true;
-}
-
-// Before:
-//
-// <cat.jpg>; rel=preload; foo=bar
-// ^ ^
-// position end
-//
-// After (if successful: otherwise the method returns false)
-//
-// <cat.jpg>; rel=preload; foo=bar
-// ^ ^
-// position end
-template <typename CharType>
-static bool parseParameterValue(CharType*& position, CharType* end, String& value)
-{
- CharType* valueStart = position;
- CharType* valueEnd = position;
- bool completeQuotes;
- bool hasQuotes = skipQuotesIfNeeded(position, end, completeQuotes);
- if (!hasQuotes) {
- skipWhile<CharType, isValidParameterValueChar>(position, end);
- }
- valueEnd = position;
- skipWhile<CharType, isWhitespace>(position, end);
- if ((!completeQuotes && valueStart == valueEnd) || (position != end && !isValidParameterValueEnd(*position))) {
- value = String("");
- return false;
- }
- if (hasQuotes)
- ++valueStart;
- if (completeQuotes)
- --valueEnd;
- value = String(valueStart, valueEnd - valueStart);
- return !hasQuotes || completeQuotes;
-}
-
-void LinkHeader::setValue(LinkParameterName name, String value)
-{
- // FIXME: Add support for more header parameters as neccessary.
- if (name == LinkParameterRel && !m_rel)
- m_rel = value.lower();
- else if (name == LinkParameterAnchor)
- m_isValid = false;
- else if (name == LinkParameterCrossOrigin)
- m_crossOrigin = crossOriginAttributeValue(value);
- else if (name == LinkParameterAs)
- m_as = value.lower();
- else if (name == LinkParameterType)
- m_mimeType = value.lower();
- else if (name == LinkParameterMedia)
- m_media = value.lower();
-}
-
-template <typename CharType>
-static void findNextHeader(CharType*& position, CharType* end)
-{
- skipUntil<CharType>(position, end, ',');
- skipExactly<CharType>(position, end, ',');
-}
-
-template <typename CharType>
-LinkHeader::LinkHeader(CharType*& position, CharType* end)
- : m_crossOrigin(CrossOriginAttributeNotSet)
- , m_isValid(true)
-{
- if (!parseURL(position, end, m_url)) {
- m_isValid = false;
- findNextHeader(position, end);
- return;
- }
-
- while (m_isValid && position < end) {
- if (!parseParameterDelimiter(position, end, m_isValid)) {
- findNextHeader(position, end);
- return;
- }
-
- LinkParameterName parameterName;
- if (!parseParameterName(position, end, parameterName)) {
- findNextHeader(position, end);
- m_isValid = false;
- return;
- }
-
- String parameterValue;
- if (!parseParameterValue(position, end, parameterValue) && !isExtensionParameter(parameterName)) {
- findNextHeader(position, end);
- m_isValid = false;
- return;
- }
-
- setValue(parameterName, parameterValue);
- }
- findNextHeader(position, end);
-}
-
-LinkHeaderSet::LinkHeaderSet(const String& header)
-{
- if (header.isNull())
- return;
-
- if (header.is8Bit())
- init(header.characters8(), header.length());
- else
- init(header.characters16(), header.length());
-}
-
-template <typename CharType>
-void LinkHeaderSet::init(CharType* headerValue, unsigned len)
-{
- CharType* position = headerValue;
- CharType* end = headerValue + len;
- while (position < end)
- m_headerSet.append(LinkHeader(position, end));
-}
-
-} // namespace blink
« no previous file with comments | « third_party/WebKit/Source/core/loader/LinkHeader.h ('k') | third_party/WebKit/Source/core/loader/LinkHeaderTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698