haikuwebkit/Source/WebCore/loader/HeaderFieldTokenizer.cpp

124 lines
3.4 KiB
C++
Raw Permalink Normal View History

Add the PerformanceServerTiming Interface which makes Server-Timing header timing values available to JavaScript running in the browser. https://bugs.webkit.org/show_bug.cgi?id=175569 Patch by Charles Vazac <cvazac@gmail.com> on 2018-05-15 Reviewed by Youenn Fablet. Tests were imported from web-platform-tests: WebKit/LayoutTests/imported/w3c/web-platform-tests/server-timing/* LayoutTests/imported/w3c: * web-platform-tests/server-timing/cross_origin.html: Added. * web-platform-tests/server-timing/navigation_timing_idl.html: Added. * web-platform-tests/server-timing/navigation_timing_idl.https.html: Added. * web-platform-tests/server-timing/resources/blue.png: Added. * web-platform-tests/server-timing/resources/blue.png.sub.headers: Added. * web-platform-tests/server-timing/resources/blue_tao.png: Added. * web-platform-tests/server-timing/resources/blue_tao.png.sub.headers: Added. * web-platform-tests/server-timing/resources/green.png: Added. * web-platform-tests/server-timing/resources/green.png.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/0.js: Added. * web-platform-tests/server-timing/resources/parsing/0.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/1.js: Added. * web-platform-tests/server-timing/resources/parsing/1.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/10.js: Added. * web-platform-tests/server-timing/resources/parsing/10.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/11.js: Added. * web-platform-tests/server-timing/resources/parsing/11.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/12.js: Added. * web-platform-tests/server-timing/resources/parsing/12.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/13.js: Added. * web-platform-tests/server-timing/resources/parsing/13.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/14.js: Added. * web-platform-tests/server-timing/resources/parsing/14.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/15.js: Added. * web-platform-tests/server-timing/resources/parsing/15.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/16.js: Added. * web-platform-tests/server-timing/resources/parsing/16.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/17.js: Added. * web-platform-tests/server-timing/resources/parsing/17.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/18.js: Added. * web-platform-tests/server-timing/resources/parsing/18.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/19.js: Added. * web-platform-tests/server-timing/resources/parsing/19.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/2.js: Added. * web-platform-tests/server-timing/resources/parsing/2.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/20.js: Added. * web-platform-tests/server-timing/resources/parsing/20.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/21.js: Added. * web-platform-tests/server-timing/resources/parsing/21.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/22.js: Added. * web-platform-tests/server-timing/resources/parsing/22.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/23.js: Added. * web-platform-tests/server-timing/resources/parsing/23.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/24.js: Added. * web-platform-tests/server-timing/resources/parsing/24.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/25.js: Added. * web-platform-tests/server-timing/resources/parsing/25.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/26.js: Added. * web-platform-tests/server-timing/resources/parsing/26.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/27.js: Added. * web-platform-tests/server-timing/resources/parsing/27.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/28.js: Added. * web-platform-tests/server-timing/resources/parsing/28.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/29.js: Added. * web-platform-tests/server-timing/resources/parsing/29.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/3.js: Added. * web-platform-tests/server-timing/resources/parsing/3.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/30.js: Added. * web-platform-tests/server-timing/resources/parsing/30.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/31.js: Added. * web-platform-tests/server-timing/resources/parsing/31.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/32.js: Added. * web-platform-tests/server-timing/resources/parsing/32.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/33.js: Added. * web-platform-tests/server-timing/resources/parsing/33.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/34.js: Added. * web-platform-tests/server-timing/resources/parsing/34.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/35.js: Added. * web-platform-tests/server-timing/resources/parsing/35.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/36.js: Added. * web-platform-tests/server-timing/resources/parsing/36.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/37.js: Added. * web-platform-tests/server-timing/resources/parsing/37.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/38.js: Added. * web-platform-tests/server-timing/resources/parsing/38.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/39.js: Added. * web-platform-tests/server-timing/resources/parsing/39.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/4.js: Added. * web-platform-tests/server-timing/resources/parsing/4.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/40.js: Added. * web-platform-tests/server-timing/resources/parsing/40.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/41.js: Added. * web-platform-tests/server-timing/resources/parsing/41.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/42.js: Added. * web-platform-tests/server-timing/resources/parsing/42.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/43.js: Added. * web-platform-tests/server-timing/resources/parsing/43.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/44.js: Added. * web-platform-tests/server-timing/resources/parsing/44.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/45.js: Added. * web-platform-tests/server-timing/resources/parsing/45.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/46.js: Added. * web-platform-tests/server-timing/resources/parsing/46.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/47.js: Added. * web-platform-tests/server-timing/resources/parsing/47.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/48.js: Added. * web-platform-tests/server-timing/resources/parsing/48.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/49.js: Added. * web-platform-tests/server-timing/resources/parsing/49.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/5.js: Added. * web-platform-tests/server-timing/resources/parsing/5.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/50.js: Added. * web-platform-tests/server-timing/resources/parsing/50.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/51.js: Added. * web-platform-tests/server-timing/resources/parsing/51.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/52.js: Added. * web-platform-tests/server-timing/resources/parsing/52.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/53.js: Added. * web-platform-tests/server-timing/resources/parsing/53.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/54.js: Added. * web-platform-tests/server-timing/resources/parsing/54.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/55.js: Added. * web-platform-tests/server-timing/resources/parsing/55.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/56.js: Added. * web-platform-tests/server-timing/resources/parsing/56.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/57.js: Added. * web-platform-tests/server-timing/resources/parsing/57.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/58.js: Added. * web-platform-tests/server-timing/resources/parsing/58.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/59.js: Added. * web-platform-tests/server-timing/resources/parsing/59.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/6.js: Added. * web-platform-tests/server-timing/resources/parsing/6.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/60.js: Added. * web-platform-tests/server-timing/resources/parsing/60.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/61.js: Added. * web-platform-tests/server-timing/resources/parsing/61.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/62.js: Added. * web-platform-tests/server-timing/resources/parsing/62.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/63.js: Added. * web-platform-tests/server-timing/resources/parsing/63.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/64.js: Added. * web-platform-tests/server-timing/resources/parsing/64.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/65.js: Added. * web-platform-tests/server-timing/resources/parsing/65.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/66.js: Added. * web-platform-tests/server-timing/resources/parsing/66.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/67.js: Added. * web-platform-tests/server-timing/resources/parsing/67.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/68.js: Added. * web-platform-tests/server-timing/resources/parsing/68.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/69.js: Added. * web-platform-tests/server-timing/resources/parsing/69.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/7.js: Added. * web-platform-tests/server-timing/resources/parsing/7.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/70.js: Added. * web-platform-tests/server-timing/resources/parsing/70.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/71.js: Added. * web-platform-tests/server-timing/resources/parsing/71.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/72.js: Added. * web-platform-tests/server-timing/resources/parsing/72.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/73.js: Added. * web-platform-tests/server-timing/resources/parsing/73.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/74.js: Added. * web-platform-tests/server-timing/resources/parsing/74.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/75.js: Added. * web-platform-tests/server-timing/resources/parsing/75.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/76.js: Added. * web-platform-tests/server-timing/resources/parsing/76.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/77.js: Added. * web-platform-tests/server-timing/resources/parsing/77.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/78.js: Added. * web-platform-tests/server-timing/resources/parsing/78.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/79.js: Added. * web-platform-tests/server-timing/resources/parsing/79.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/8.js: Added. * web-platform-tests/server-timing/resources/parsing/8.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/80.js: Added. * web-platform-tests/server-timing/resources/parsing/80.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/81.js: Added. * web-platform-tests/server-timing/resources/parsing/81.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/82.js: Added. * web-platform-tests/server-timing/resources/parsing/82.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/83.js: Added. * web-platform-tests/server-timing/resources/parsing/83.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/9.js: Added. * web-platform-tests/server-timing/resources/parsing/9.js.sub.headers: Added. * web-platform-tests/server-timing/resources/parsing/w3c-import.log: Added. * web-platform-tests/server-timing/resources/w3c-import.log: Added. * web-platform-tests/server-timing/resource_timing_idl.html: Added. * web-platform-tests/server-timing/resource_timing_idl.https.html: Added. * web-platform-tests/server-timing/server_timing_header-parsing.html: Added. * web-platform-tests/server-timing/server_timing_header-parsing.https.html: Added. * web-platform-tests/server-timing/test_server_timing.html: Added. * web-platform-tests/server-timing/test_server_timing.html.sub.headers: Added. * web-platform-tests/server-timing/test_server_timing.https.html: Added. * web-platform-tests/server-timing/test_server_timing.https.html.sub.headers: Added. * web-platform-tests/server-timing/w3c-import.log: Added. Source/WebCore: * Sources.txt: Added references to HeaderFieldTokenizer.cpp, ServerTiming.cpp, and ServerTimingParser.cpp. * WebCore.xcodeproj/project.pbxproj: Added various files. * loader/HeaderFieldTokenizer.cpp: Added. (WebCore::HeaderFieldTokenizer::HeaderFieldTokenizer): Added class for tokenizing header values. (WebCore::HeaderFieldTokenizer::consume): Added method to consume a specified character. (WebCore::HeaderFieldTokenizer::consumeQuotedString): Added method to consume a quote-string. (WebCore::HeaderFieldTokenizer::consumeToken): Added a method to consume a token. (WebCore::HeaderFieldTokenizer::consumeTokenOrQuotedString): Added method to consume a quote-string or quote-string, depending on net character. (WebCore::HeaderFieldTokenizer::skipSpaces): Added method to skip whitespace. (WebCore::HeaderFieldTokenizer::consumeBeforeAnyCharMatch): Added method to advance the cursor up until any of a list of characters. * loader/HeaderFieldTokenizer.h: Added. * loader/HTTPHeaderField.cpp: Expose isTokenCharacter and isWhitespace. * loader/HTTPHeaderField.h: Expose isTokenCharacter and isWhitespace. * loader/PolicyChecker.cpp: Added #include so source compiled on my machine. * loader/ResourceTiming.cpp: (WebCore::ResourceTiming::ResourceTiming): Added call to initServerTiming to parse the header. (WebCore::ResourceTiming::initServerTiming): Added method to parse the header. (WebCore::ResourceTiming::populateServerTiming): Added method to populate the server timing entries on a PerformanceResourceTiming object. (WebCore::ResourceTiming::isolatedCopy const): Added code to copy over the server timing entries. * loader/ResourceTiming.h: (WebCore::ResourceTiming::ResourceTiming): Accept collection of server timing entries in c'tor. * loader/ServerTiming.cpp: Added. (WebCore::ServerTiming::setParameter): Set named parameters, ignoring unrecognized or duplicates. (WebCore::ServerTiming::isolatedCopy const): Return a new pointer to the object. * loader/ServerTiming.h: Added. (WebCore::ServerTiming::ServerTiming): Added struct for the data needed by a server timing entry. (WebCore::ServerTiming::name const): Added name field of a server timing entry. (WebCore::ServerTiming::duration const): Added duration field of a server timing entry. (WebCore::ServerTiming::description const): Added description field of a server timing entry. * loader/ServerTimingParser.cpp: Added. (WebCore::ServerTimingParser::parseServerTiming): Parses the header generating a collection of server timing structs. * loader/ServerTimingParser.h: Added. * loader/WorkerThreadableLoader.h: Fix build. * page/Performance.cpp: (WebCore::Performance::addResourceTiming): Fixed a typo. * page/PerformanceResourceTiming.cpp: (WebCore::PerformanceResourceTiming::PerformanceResourceTiming): Given a ResourceTiming object, populate our collection of PerformanceServerTiming objects. * page/PerformanceResourceTiming.h: Added serverTiming member and getter. * page/PerformanceResourceTiming.idl: Added serverTiming member to interface. * platform/network/HTTPHeaderNames.in: Added "Server-Timing" to the header enum. * platform/network/ResourceResponseBase.cpp: Added "Server-Timing" to isSafeCrossOriginResponseHeader whitelist. LayoutTests: * imported/w3c/web-platform-tests/server-timing/cross_origin-expected.txt: Added. * imported/w3c/web-platform-tests/server-timing/resource_timing_idl-expected.txt: Added. * imported/w3c/web-platform-tests/server-timing/resource_timing_idl.https-expected.txt: Added. * imported/w3c/web-platform-tests/server-timing/server_timing_header-parsing-expected.txt: Added. * imported/w3c/web-platform-tests/server-timing/server_timing_header-parsing.https-expected.txt: Added. Canonical link: https://commits.webkit.org/201126@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@231813 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-05-15 19:24:30 +00:00
/*
* Copyright 2017 The Chromium Authors. All rights reserved.
* Copyright (C) 2018 Akamai Technologies Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "HeaderFieldTokenizer.h"
#include "HTTPHeaderField.h"
#include <wtf/text/StringBuilder.h>
namespace WebCore {
HeaderFieldTokenizer::HeaderFieldTokenizer(const String& headerField)
: m_input(headerField)
{
skipSpaces();
}
bool HeaderFieldTokenizer::consume(UChar c)
{
ASSERT(c != ' ' && c != '\t');
if (isConsumed() || m_input[m_index] != c)
return false;
++m_index;
skipSpaces();
return true;
}
String HeaderFieldTokenizer::consumeQuotedString()
{
StringBuilder builder;
ASSERT(m_input[m_index] == '"');
++m_index;
while (!isConsumed()) {
if (m_input[m_index] == '"') {
String output = builder.toString();
++m_index;
skipSpaces();
return output;
}
if (m_input[m_index] == '\\') {
++m_index;
if (isConsumed())
return String();
}
builder.append(m_input[m_index]);
++m_index;
}
return String();
}
String HeaderFieldTokenizer::consumeToken()
{
auto start = m_index;
while (!isConsumed() && RFC7230::isTokenCharacter(m_input[m_index]))
++m_index;
if (start == m_index)
return String();
String output = m_input.substring(start, m_index - start);
skipSpaces();
return output;
}
String HeaderFieldTokenizer::consumeTokenOrQuotedString()
{
if (isConsumed())
return String();
if (m_input[m_index] == '"')
return consumeQuotedString();
return consumeToken();
}
void HeaderFieldTokenizer::skipSpaces()
{
while (!isConsumed() && RFC7230::isWhitespace(m_input[m_index]))
++m_index;
}
void HeaderFieldTokenizer::consumeBeforeAnyCharMatch(const Vector<UChar>& chars)
{
ASSERT(chars.size() > 0U && chars.size() < 3U);
while (!isConsumed()) {
for (const auto& c : chars) {
if (c == m_input[m_index])
return;
}
++m_index;
}
}
} // namespace WebCore